diff --git a/CHANGELOG.md b/CHANGELOG.md
index 01e8b05..2198fb8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,16 +1,26 @@
+## v0.5.0, 2019-07-25
+
+### 🏭 Нові можливості
+- Реалізовано підсвічування речень з вибраним терміном в елементі `#sents_from_text` та `#text-content` з використанням бібліотеки [mark.js](https://markjs.io/)
+
+### 🔴 Виправлення помилок
+- Дрібні виправлення інтерфейсу.
+- Дрібні виправлення серверної частини:
+ змінено роботу нормалізації тексту (відключено `line = re.sub(r'\W', ' ', line, flags=re.I)`).
+
## v0.4.2, 2019-07-23
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Виправлено номер версії в елементі `title`.
## v0.4.1, 2019-07-23
-👍 Покращення
+### 👍 Покращення
- Додано номер поточної версії KEn до елементу `title`.
## v0.4.0, 2019-07-23
-🏭 Нові можливості
+### 🏭 Нові можливості
- Реалізовано відображення показників частоти термінів за допомоги спливаючої підказки `title` для кожного терміну елементу `#uploadResultList`.
Реалізовано можливість сортування термінів в елементі `#uploadResultList` згідно:
- частоти (за збільшенням);
@@ -19,18 +29,18 @@
- за черговою появою в тексті;
- Реалізовано елемент `#sort-select` для обрання відповідного типу сортування.
-👍 Покращення
+### 👍 Покращення
- Рефакторинг програмного коду.
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Дрібні виправлення.
-📚 Документація
+### 📚 Документація
- Оновлено розділи `Системні вимоги` згідно нових мінімальних системних вимог, україномовної частини `README.md`.
## v0.3.0, 2019-07-22
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Виправлено помилку `UnicodeDecodeError: 'utf8' codec can't decode byte`.
Декодовано файл як `UTF-8`, ігноруючи будь-які символи які закодовані в неправильному кодуванні
@@ -55,14 +65,14 @@ setattr(laparams, 'all_texts', True)
## v0.2.8, 2019-07-20
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Реалізовано видалення символу `°` на етапі нормалізації тексту.
- Реалізовано видалення всіх не словникових символів (`\W` non-alphanumeric characters) на етапі нормалізації тексту.
- Реалізовано видалення всіх слів, що містять числа при нормалізації тексту.
## v0.2.7, 2019-07-19
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Вимкнено появу стандартного контекстного меню на елементі `#projectFileList` при евенті видалення файлів проекту за кліком правої кнопки миші.
- Збільшено максимально допустимий розмір тіла запиту клієнта до **50 мегабайт**: `client_max_body_size 50M`.
@@ -71,18 +81,18 @@ setattr(laparams, 'all_texts', True)
## v0.2.6, 2019-07-18
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Виправлено скролінг в елементах класу `.col-md-6`.
-👍 Покращення
+### 👍 Покращення
- Додано вкладку "Блокнот" з елементом textarea до `.col-md-6`.
## v0.2.5, 2019-07-18
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Дрібні виправлення.
-👍 Покращення
+### 👍 Покращення
- Видалено тег версій з кінцевих точок API:
було:
`host[:port]/ken/api/**v1.0**/en/file/allterms`
@@ -93,96 +103,97 @@ setattr(laparams, 'all_texts', True)
- Оновлено структуру проекту.
- Рефакторинг програмного коду.
-📚 Документація
+### 📚 Документація
- Додана настанова користувача Як зберегти Docker image в файл (резервне копіювання) для подальшого використання на іншому сервері.
- Виправлено **виділення** термінів на **виокремлення** термінів.
- Оновлення україномовної частини `README.md`.
## v0.2.4, 2019-07-08
-🔴 Bug fixes
+### 🔴 Bug fixes
- Fix sentence duplication in `id="text-content"`.
- Fix `id="sents_from_text"` area to update for a new text.
- Fix add text from last file to `id="sents_from_text"` area.
- Fix add text to `id="sents_from_text"` area when selecting files from `id="projectFileList"` select list.
-👍 Improvements
+### 👍 Improvements
- Update project structure.
- Clean up source code.
-📚 Tutorial and doc improvements
+### 📚 Tutorial and doc improvements
- Update UA part of `README.md`.
-----
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Виправлено дублювання речення в елементі `id =" text-content "`.
- Виправлено оновлення елементу `id="sents_from_text"` згідно нового тексту.
- Виправлено додавання тексту з останнього опрацьованого файлу в область `id =" sents_from_text ".
- Виправлено додавання тексту в елемент `id="sents_from_text"` при виборі відповідного файлу зі списку елементу `id="projectFileList"`.
- Дрібні виправлення.
-👍 Покращення
+### 👍 Покращення
- Оновлено структуру проекту.
- Рефакторинг програмного коду.
-📚 Документація
+### 📚 Документація
- Оновлення україномовної частини `README.md`.
## v0.2.3, 2019-06-25
-👍 Improvements
+### 👍 Improvements
- Remove (comment) dependencies for language_check.
- Clean up source code.
-📚 Tutorial and doc improvements
+### 📚 Tutorial and doc improvements
- Update UA part of README.md.
-----
-👍 Покращення
+### 👍 Покращення
- Видалено залежності для ` language_check`.
- Рефакторинг програмного коду.
-📚 Документація
+### 📚 Документація
- Оновлення україномовної частини `README.md`.
## v0.2.2, 2019-06-23
-👍 Improvements
+### 👍 Improvements
- Fix Highlighting terms in text area `id="text-content"`.
- Fix `loader` colour.
-----
-👍 Покращення
+
+### 👍 Покращення
- Виправлено підсвічування виокремлених термінів у `id="text-content"`.
- Змінено колір елементу `loader`.
## v0.2.1, 2019-06-23
-👍 Improvements
+### 👍 Improvements
- Add save to `csv`.
- Add save of all lists (terms, NER, files).
- Add new notifications.
- Fix titles.
-🔴 Bug fixes
+### 🔴 Bug fixes
- Various bug fixes.
-📚 Tutorial and doc improvements
+### 📚 Tutorial and doc improvements
- Update UA part of `README.md`.
-----
-👍 Покращення
+### 👍 Покращення
- Додано збереження в формат `csv`.
- Додано можливість збереження списків (terms, NER, files).
- Додні нотифікації про виконання процесів.
- Виправлені елементи title.
-🔴 Виправлення помилок
+### 🔴 Виправлення помилок
- Дрібні виправлення.
-📚 Документація
+### 📚 Документація
- Оновлення україномовної частини `README.md`.
## v0.2.0, 2019-06-21
@@ -198,7 +209,7 @@ setattr(laparams, 'all_texts', True)
### 🔴 Bug fixes
- Various bug fixes.
-📚 Tutorial and doc improvements
+### 📚 Tutorial and doc improvements
- Update UA part of `README.md`.
-----
@@ -214,13 +225,13 @@ setattr(laparams, 'all_texts', True)
### 🔴 Виправлення помилок
- Різні дрібні виправлення.
-📚 Документація
+### 📚 Документація
- Оновлення україномовної частини `README.md`.
## v0.1.1, 2019-06-02
-🌟 Початковий попередній реліз
+### 🌟 Початковий попередній реліз
-----
-🌟 Initial pre-release
\ No newline at end of file
+### 🌟 Initial pre-release
\ No newline at end of file
diff --git a/ken.py b/ken.py
index 8646f33..ec514f0 100644
--- a/ken.py
+++ b/ken.py
@@ -35,6 +35,7 @@
import pickle
import codecs
import logging
+# logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG)
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.ERROR)
@@ -106,6 +107,41 @@ class XMLResponse(Response):
app.secret_key = os.urandom(42)
"""
+# ------------------------------------------------------------------------------------------------------
+# DEBUG functions
+# ------------------------------------------------------------------------------------------------------
+# """
+
+# https://habr.com/ru/post/427909/
+# Measure the Real Size of Any Python Object
+# https://goshippo.com/blog/measure-real-size-any-python-object/
+def get_size(obj, seen=None):
+ """Recursively finds size of objects"""
+ size = sys.getsizeof(obj)
+ if seen is None:
+ seen = set()
+ obj_id = id(obj)
+ if obj_id in seen:
+ return 0
+ # Important mark as seen *before* entering recursion to gracefully handle
+ # self-referential objects
+ seen.add(obj_id)
+ if isinstance(obj, dict):
+ size += sum([get_size(v, seen) for v in obj.values()])
+ size += sum([get_size(k, seen) for k in obj.keys()])
+ elif hasattr(obj, '__dict__'):
+ size += get_size(obj.__dict__, seen)
+ elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
+ size += sum([get_size(i, seen) for i in obj])
+ return size
+
+"""
+# ------------------------------------------------------------------------------------------------------
+# DEBUG functions
+# ------------------------------------------------------------------------------------------------------
+# """
+"""
+
# ------------------------------------------------------------------------------------------------------
# secondary functions
# ------------------------------------------------------------------------------------------------------
@@ -134,7 +170,9 @@ def text_normalization_default(raw_text):
If UNICODE is set, this will match anything other than [0-9_] plus characters classified as not alphanumeric in the Unicode character properties database.
To remove all the non-word characters, the \W pattern can be used as follows:
"""
- line = re.sub(r'\W', ' ', line, flags=re.I)
+ # line = re.sub(r'\W', ' ', line, flags=re.I)
+ # remove all non-words except punctuation
+ # line = re.sub('[^\w.,;!?-]', ' ', line)
# remove all words which contains number
line = re.sub(r'\w*\d\w*', ' ', line)
# remove ° symbol
@@ -297,6 +335,8 @@ def parcexml_Generator():
# default sentence normalization + spaCy doc init
doc = NLP_EN(text_normalized)
+ # Measure the Size of doc Python Object
+ logging.info("%s byte", get_size(doc))
"""
# create the file structure
@@ -327,6 +367,8 @@ def parcexml_Generator():
new_sentence_element.append(new_sent_element)
doc_for_lemmas = NLP_EN(sentence_clean)
+ # Measure the Size of doc_for_lemmas Python Object
+ logging.info("%s byte", get_size(doc_for_lemmas))
# create amd append ,
# NER labels description https://spacy.io/api/annotation#named-entities
@@ -473,6 +515,8 @@ def get_terms_list():
try:
# spaCy doc init + default sentence normalization
doc = NLP_EN(text_normalization_default(raw_text))
+ # Measure the Size of doc Python Object
+ logging.info("%s byte", get_size(doc))
"""
# create the file structure
@@ -520,11 +564,15 @@ def get_terms_list():
# for processing specific sentence
doc_for_chunks = NLP_EN(sentence_clean)
+ # Measure the Size of doc_for_chunks Python Object
+ logging.info("%s byte", get_size(doc_for_chunks))
# sentence NP shallow parsing cycle
for chunk in doc_for_chunks.noun_chunks:
doc_for_tokens = NLP_EN(chunk.text)
+ # Measure the Size of doc_for_tokens Python Object
+ logging.info("%s byte", get_size(doc_for_tokens))
'''
# EXTRACT ONE-WORD TERMS ----------------------------------------------------------------------
@@ -1038,6 +1086,8 @@ def get_dep_parse():
def get_ner():
req_data_JSON = json.loads(request.get_data(as_text=True))
doc = NLP_EN(' '.join(e for e in req_data_JSON))
+ # Measure the Size of doc Python Object
+ logging.info("%s byte", get_size(doc))
# colors = {"ORG": "linear-gradient(90deg, #b0fb5a, #ffffff)"}
# options = {"colors": colors}
# html = displacy.render(doc, style="ent", options=options)
diff --git a/static/javascripts/jquery.mark.min.js b/static/javascripts/jquery.mark.min.js
new file mode 100755
index 0000000..72813bd
--- /dev/null
+++ b/static/javascripts/jquery.mark.min.js
@@ -0,0 +1,13 @@
+/*!***************************************************
+* mark.js v9.0.0
+* https://markjs.io/
+* Copyright (c) 2014–2018, Julian Kühnel
+* Released under the MIT license https://git.io/vwTVl
+*****************************************************/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):e.Mark=t(e.jQuery)}(this,function(e){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;n(this,e),this.ctx=t,this.iframes=r,this.exclude=o,this.iframesTimeout=i}return o(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){};try{var o=e.contentWindow;if(n=o.document,!o||!n)throw new Error("iframe inaccessible")}catch(e){r()}n&&t(n)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,o=!1,i=null,a=function a(){if(!o){o=!0,clearTimeout(i);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),i=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var o=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&i(c)};s||u(),a.forEach(function(t){e.matches(t,o.exclude)?u():o.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var o=!1,i=!1;return r.forEach(function(e,t){e.val===n&&(o=t,i=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==o||i?!1===o||i||(r[o].handled=!0):r.push({val:n,handled:!0}),!0):(!1===o&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var o=this;e.forEach(function(e){e.handled||o.getIframeContents(e.val,function(e){o.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,o){for(var i,a,s,c=this,u=this.createIterator(t,e,r),l=[],h=[];s=void 0,s=c.getIteratorNode(u),a=s.prevNode,i=s.node;)this.iframes&&this.forEachIframe(t,function(e){return c.checkIframeFilter(i,a,e,l)},function(t){c.createInstanceOnIframe(t).forEachNode(e,function(e){return h.push(e)},r)}),h.push(i);h.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(l,e,n,r),o()}},{key:"forEachNode",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=this.getContexts(),a=i.length;a||o(),i.forEach(function(i){var s=function(){r.iterateThroughNodes(e,i,t,n,function(){--a<=0&&o()})};r.iframes?r.waitForIframes(i,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var o=!1;return n.every(function(t){return!r.call(e,t)||(o=!0,!1)}),o}return!1}}]),e}(),s=
+/* */
+function(){function e(t){n(this,e),this.opt=i({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},t)}return o(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm".concat(this.opt.caseSensitive?"":"i"))}},{key:"sortByLength",value:function(e){return e.sort(function(e,t){return e.length===t.length?e>t?1:-1:t.length-e.length})}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this,n=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",o=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in n)if(n.hasOwnProperty(i)){var a=Array.isArray(n[i])?n[i]:[n[i]];a.unshift(i),(a=this.sortByLength(a).map(function(e){return"disabled"!==t.opt.wildcards&&(e=t.setupWildcardsRegExp(e)),e=t.escapeStr(e)}).filter(function(e){return""!==e})).length>1&&(e=e.replace(new RegExp("(".concat(a.map(function(e){return t.escapeStr(e)}).join("|"),")"),"gm".concat(r)),o+"(".concat(a.map(function(e){return t.processSynonyms(e)}).join("|"),")")+o))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("[".concat(t.join(""),"]*")):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(o){n.every(function(n){if(-1!==n.indexOf(o)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("[".concat(n,"]"),"gm".concat(t)),"[".concat(n,"]")),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,o="string"==typeof n?[]:n.limiters,i="";switch(o.forEach(function(e){i+="|".concat(t.escapeStr(e))}),r){case"partially":default:return"()(".concat(e,")");case"complementary":return i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")),"()([^".concat(i,"]*").concat(e,"[^").concat(i,"]*)");case"exactly":return"(^|\\s".concat(i,")(").concat(e,")(?=$|\\s").concat(i,")")}}}]),e}(),c=
+/* */
+function(){function e(t){n(this,e),this.ctx=t,this.ie=!1;var r=window.navigator.userAgent;(r.indexOf("MSIE")>-1||r.indexOf("Trident")>-1)&&(this.ie=!0)}return o(e,[{key:"log",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===t(r)&&"function"==typeof r[n]&&r[n]("mark.js: ".concat(e))}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var o=t.callNoMatchOnInvalidRanges(e,r),i=o.start,a=o.end;o.valid&&(e.start=i,e.length=a-i,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n,r,o=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?o=!0:(this.log("Ignoring invalid or overlapping range: "+"".concat(JSON.stringify(e))),this.opt.noMatch(e))):(this.log("Ignoring invalid range: ".concat(JSON.stringify(e))),this.opt.noMatch(e)),{start:n,end:r,valid:o}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r,o=!0,i=n.length,a=t-i,s=parseInt(e.start,10)-a;return(r=(s=s>i?i:s)+parseInt(e.length,10))>i&&(r=i,this.log("End range automatically set to the max value of ".concat(i))),s<0||r-s<0||s>i||r>i?(o=!1,this.log("Invalid range: ".concat(JSON.stringify(e))),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(o=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:o}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return a.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",o=e.splitText(t),i=o.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=o.textContent,o.parentNode.replaceChild(a,o),i}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,o){var i=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=i.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,o(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,o){for(var i=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,o))}return e}},{key:"wrapMatches",value:function(e,t,n,r,o){var i=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){var o;for(t=t.node;null!==(o=e.exec(t.textContent))&&""!==o[a];){if(i.opt.separateGroups)t=i.separateGroups(t,o,a,n,r);else{if(!n(o[a],t))continue;var s=o.index;if(0!==a)for(var c=1;c' + sent_element + '
')
}
}
@@ -379,7 +379,7 @@ function fetchFileToRecapService() {
$sents_from_text.text('');
// add to textarea id="sents_from_text"
for (let sent_element of resJSON.termsintext.sentences.sent) {
- $sents_from_text.append(sent_element + '\n\n')
+ $sents_from_text.append('' + sent_element + '
')
}
});
})
@@ -483,17 +483,22 @@ function forUploadResultListClickAndEnterPressEvents() {
// inserting sentences with selected terms in textArea #textContent
if (Array.isArray(resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos)) {
let sentIndex = [];
+ let sentsForMark = [];
for (let elementForUploadResultListDbClickAndEnterPress of resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos) {
if (!sentIndex.includes(parseInt(elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1))) {
- $textContent.append('\n' + resJSON.termsintext.sentences.sent[elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1] + '\n');
+ $textContent.append('' + resJSON.termsintext.sentences.sent[elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1] + '
');
+ sentsForMark.push(resJSON.termsintext.sentences.sent[elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1]);
sentIndex.push(parseInt(elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1));
}
}
+ mark(sentsForMark);
}
if (Array.isArray(resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos) == false) {
- $textContent.append('\n' + resJSON.termsintext.sentences.sent[resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos.substring(0, resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos.indexOf("/")) - 1] + '\n');
+ $textContent.append('' + resJSON.termsintext.sentences.sent[resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos.substring(0, resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos.indexOf("/")) - 1] + '
');
+
+ mark(resJSON.termsintext.sentences.sent[resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos.substring(0, resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos.indexOf("/")) - 1]);
}
// inserting terms in tree #termTree
@@ -548,19 +553,14 @@ function forUploadResultListClickAndEnterPressEvents() {
// Highlight-within-textarea
// https://github.com/lonekorean/highlight-within-textarea
- // function onInput(input) {
- // //return /\d+/g; // highlight all digits
- // var regex = new RegExp($uploadResultList.prop('value').substring(0, 4), 'gi');
- // return regex;
- // }
- // $textContent.highlightWithinTextarea(onInput);
-
- function onInput(input) {
+/* function onInput(input) {
let term = $("#uploadResultList option:selected").text().replace(/\s?([-])\s?/g,'-');
var regex = new RegExp('\\b(\\w*' + term + '\\w*)\\b', 'gi');
return regex;
}
- $textContent.highlightWithinTextarea(onInput);
+ $textContent.highlightWithinTextarea(onInput); */
+
+ markTerms($("#uploadResultList option:selected").text().replace(/\s?([-])\s?/g,'-'));
// visualize noun chunk / term
let displacy = new displaCy('/ken/api/en/html/depparse/nounchunk', {
@@ -619,7 +619,7 @@ function forProjectFileListClickAndEnterPressEvents() {
$sents_from_text.text('');
// add to textarea id="sents_from_text"
for (let sent_element of resJSON.termsintext.sentences.sent) {
- $sents_from_text.append(sent_element + '\n\n')
+ $sents_from_text.append('
' + sent_element + '
')
}
iziToast.info({
@@ -827,4 +827,44 @@ $sortSelect.on('change', function (e) {
}
}
});
-// Sort terms ---------------------------------------------------------------------------------------------------------
\ No newline at end of file
+// Sort terms ---------------------------------------------------------------------------------------------------------
+
+// mark.js
+
+function mark(text) {
+ // Determine selected options for mark.js
+ var options = {
+ "each": function (element) {
+ setTimeout(function () {
+ $(element).addClass("animate");
+ }, 250);
+ },
+ "separateWordSearch": false,
+ "accuracy": "complementary",
+ "diacritics": true
+ };
+ $("#sents_from_text").unmark({
+ done: function () {
+ $("#sents_from_text").mark(text, options);
+ }
+ });
+}
+
+function markTerms(term) {
+ // Determine selected options for mark.js
+ var options = {
+ "each": function (element) {
+ setTimeout(function () {
+ $(element).addClass("animate");
+ }, 250);
+ },
+ "separateWordSearch": false,
+ "accuracy": "complementary",
+ "diacritics": true
+ };
+ $("#text-content").unmark({
+ done: function () {
+ $("#text-content").mark(term, options);
+ }
+ });
+}
\ No newline at end of file
diff --git a/static/stylesheets/style.css b/static/stylesheets/style.css
index 33858fb..8827673 100644
--- a/static/stylesheets/style.css
+++ b/static/stylesheets/style.css
@@ -84,17 +84,34 @@ body {
background-color: #8BC34A;
}
-#text-content, .hwt-container {
+#text-content-panel {
+ display: block;
+ overflow-y: scroll;
+ height: 50%;
+}
+
+#text-content-panel-body {
+ height: 50%;
+}
+
+#text-content {
width: 100%;
- min-height: 350px;
+ height: 50%;
+ margin-bottom: 5px;
+}
+
+.panel {
+ height: max-content;
margin-bottom: 5px;
- border-color: #8BC34A;
- resize: none;
+}
+
+.panel-body {
+ padding: 5px;
}
#term-tree {
border: 1px solid #8BC34A;
- height: 100%;
+ height: 50%;
overflow-y: scroll;
overflow-x: scroll;
}
@@ -187,10 +204,26 @@ select {
flex-direction: column;
overflow-y: auto;
}
+ /* mark.js */
+ mark {
+ padding: 0;
+ background: transparent;
+ background: linear-gradient(to right, #f0ad4e 50%, transparent 50%);
+ background-position: right bottom;
+ background-size: 200% 100%;
+ transition: all .5s ease;
+ color: #fff;
+ }
+
+ mark.animate {
+ background-position: left bottom;
+ color: #000;
+ }
+ /* mark.js */
#sents_from_text {
- height: 100vh;
- width: 100vw;
+ height: auto;
+ width: auto;
border-color: #8BC34A;
}
diff --git a/static/stylesheets/textAreaHighlight.css b/static/stylesheets/textAreaHighlight.css
index 1a774ec..7168048 100644
--- a/static/stylesheets/textAreaHighlight.css
+++ b/static/stylesheets/textAreaHighlight.css
@@ -1,8 +1,3 @@
-/* background and positioning */
-/*.hwt-container {*/
- /*background-color: #fff;*/
-/*}*/
-
/* size and formatting */
.hwt-content {
width: 500px;
@@ -10,15 +5,4 @@
padding: 5px;
color: #555;
/*font: 18px/25px 'Roboto Mono', sans-serif;*/
-}
-
-/* highlights */
-/*.hwt-content mark {*/
- /*border-radius: 3px;*/
-/*}*/
-/*.hwt-content mark:nth-of-type(2n) {*/
- /*background-color: #cfdeab;*/
-/*}*/
-/*.hwt-content mark:nth-of-type(2n+1) {*/
- /*background-color: #b1d5e5;*/
-/*}*/
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/templates/index.html b/templates/index.html
index 9bbb28c..8b6c98f 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -2,7 +2,7 @@
- Конспект 2019 - v0.4.2
+ Конспект 2019 - v0.5.0
@@ -21,7 +21,12 @@
-
+
+
@@ -118,7 +123,12 @@