diff --git a/app/corpora/CQiWrapper/CQiWrapper.py b/app/corpora/CQiWrapper/CQiWrapper.py index d96c5ed99e0db86c5d136dc819eaa521d043398f..0a5770b9c3ba989959880abd784c8c6b27316d74 100644 --- a/app/corpora/CQiWrapper/CQiWrapper.py +++ b/app/corpora/CQiWrapper/CQiWrapper.py @@ -287,12 +287,14 @@ class CQiWrapper(CQiClient): first_cpos, last_cpos = match_cpos_list[0], match_cpos_list[-1] context_sentences = {} s_ids = self.cl_cpos2struc(key, [first_cpos, last_cpos]) + logger.warning('s id match: {}'.format(s_ids)) for s_id in s_ids: s_start, s_end = self.cl_struc2cpos(key, s_id) s_cpos = list(range(s_start, s_end + 1)) context_sentences[s_id] = s_cpos if get_surrounding_s: - max_s_id = self.cl_attribute_size(key) + max_s_id = self.cl_attribute_size(key) - 1 + logger.warning('max sid: {}'.format(max_s_id)) additional_s_ids = [] additional_s = list(range(max(s_ids[0] - l_r_s_context_additional_len, @@ -302,6 +304,7 @@ class CQiWrapper(CQiClient): max_s_id) + 1)) additional_s_ids.extend(additional_s) for s_id in additional_s_ids: + logger.warning('s id additional: {}'.format(s_id)) s_start, s_end = self.cl_struc2cpos(key, s_id) s_cpos = list(range(s_start, s_end + 1)) context_sentences[s_id] = s_cpos diff --git a/app/static/css/nopaque.css b/app/static/css/nopaque.css index 9094c45177db5b176b625a0df1d293fcb10d1f10..a86502e0739389ff70b4b4b339a4fb9d5f1db6ec 100644 --- a/app/static/css/nopaque.css +++ b/app/static/css/nopaque.css @@ -38,6 +38,11 @@ main { } /* ### End sidenav-fixed offset ### */ +/* add custom bold class */ +.bold { + font-weight: bold; +} + /* CSS for clickable th elements in tables. Needed for sortable table data with list js. On click on th header elements will be sorted accordingly. Also a caret indicator will show up how the column is sorted right now.; */ @@ -87,6 +92,7 @@ indicator will show up how the column is sorted right now.; */ z-index: 999; /* tmp fix */ } +/* styles for resource lists */ .service[data-service]:before { content: "help"; } diff --git a/app/static/js/nopaque.js b/app/static/js/nopaque.js index 35fae36b6acfa5906400cae49a8208df8e4b212e..3c3d9309b878a878c2c85e8dd596f7e9300e1d74 100644 --- a/app/static/js/nopaque.js +++ b/app/static/js/nopaque.js @@ -164,6 +164,42 @@ nopaque.socket.on("foreign_jobs_update", function(msg) { for (let subscriber of nopaque.foreignJobsSubscribers) {subscriber._update(patch);} }); +// get context of one match if inspected +nopaque.socket.on("match_context", function(message) { + console.log("### match_context ###"); + console.log(message); + contextResultsElement.innerHTML = "<p> </p>"; + document.getElementById("context-modal-loading").classList.add("hide"); + document.getElementById("context-modal-ready").classList.remove("hide"); + + let sentenceElement, token, tokenElement; + + lookup["cpos"] = {...lookup["cpos"], ...message["cpos_lookup"]}; + lookup["s"] = message["context_s_cpos"]; + lookup["text"] = {...lookup["text"], ...message["text_lookup"]}; + + for (let [key, value] of Object.entries(message['context_s_cpos'])) { + sentenceElement = document.createElement("p"); + for (cpos of value) { + token = lookup["cpos"][cpos]; + tokenElement = document.createElement("span"); + tokenElement.classList.add("token"); + if (message["match_cpos_list"].includes(cpos)) { + tokenElement.classList.add("bold"); + } + tokenElement.dataset.cpos = cpos; + tokenElement.innerText = token["word"]; + // if (expertModeSwitchElement.checked) { + // tokenElement.classList.add("chip"); + // addToolTipToTokenElement(tokenElement, token); + // } + // tokenElements.add(tokenElement); + sentenceElement.append(tokenElement); + sentenceElement.append(document.createTextNode(" ")); + } + contextResultsElement.append(sentenceElement); + } +}); document.addEventListener("DOMContentLoaded", function() { M.AutoInit(); diff --git a/app/static/js/nopaque.lists.js b/app/static/js/nopaque.lists.js index da255d30d21bd27734ef220cd7e777bd7f8588f0..86ead2ed62ce74ed4f7654c26ac57b04ecc90e02 100644 --- a/app/static/js/nopaque.lists.js +++ b/app/static/js/nopaque.lists.js @@ -93,66 +93,55 @@ RessourceList.options = { class ResultList extends List { createResultRowElement(item, chunk) { - let values, cpos, matchRowElement, lcCellElement, lcTokenElement, token; + let values, cpos, token, matchRowElement, lcCellElement, hitCellElement, rcCellElement, textTitlesCellElement; // gather values from item values = item.values(); console.log("CHONK"); console.log(chunk); + // get infos for full match row matchRowElement = document.createElement("tr"); + matchRowElement.setAttribute("data-index", values["index"]) + lcCellElement = document.createElement("td"); + lcCellElement.classList.add("left-context"); + matchRowElement.appendChild(lcCellElement); for (cpos of values["lc"]) { - console.log(cpos); - lcCellElement = document.createElement("td"); - lcTokenElement = document.createElement("span"); - lcTokenElement.classList.add("token"); - lcTokenElement.dataset.cpos = cpos; token = chunk["cpos_lookup"][cpos]; - lcTokenElement.innerText = token["word"]; - lcCellElement.appendChild(lcTokenElement); - // let hit_tokens = ""; + lcCellElement.insertAdjacentHTML("beforeend", `<span class="token" data-cpos="${cpos}">${token["word"]} </span>`); } - matchRowElement.appendChild(lcCellElement); - // // get infos of match - // let textTitles = new Set(); - // for (cpos of match["hit"]) { - // tokenElement = document.createElement("span"); - // tokenElement.classList.add("token"); - // tokenElement.dataset.cpos = cpos; - // token = chunk["cpos_lookup"][cpos]; - // tokenElement.innerText = token["word"]; - // hit_tokens += " " + tokenElement.outerHTML; - // // get text titles of every hit cpos token - // textTitles.add(chunk["text_lookup"][token["text"]]["title"]); - // } - // // add button to trigger more context to every match td - // var inspectBtn = document.createElement("a"); - // inspectBtn.setAttribute("class", "btn-floating btn-flat waves-effect waves-light grey right inspect"); - // inspectBtn.onclick = function() {inspect()}; - // inspectBtn.innerHTML = '<i class="material-icons">search</i>'; - // hit_tokens += "<p>" + inspectBtn.outerHTML + "</p>"; - // // get infos for right context of match - // let rc_tokens = ""; - // for (cpos of match["rc"]) { - // tokenElement = document.createElement("span"); - // tokenElement.classList.add("token"); - // tokenElement.dataset.cpos = cpos; - // token = chunk["cpos_lookup"][cpos]; - // tokenElement.innerText = token["word"]; - // rc_tokens += " " + tokenElement.outerHTML; - // } - // // put all infos into an javascribt object - // textTitleElement = document.createElement("span"); - // textTitleElement.classList.add("text-titles"); - // textTitles = [...textTitles].join(","); - // textTitleElement.innerText = textTitles; - // - // matchRowElement.appendChild(textTitleElement); - // // matchRowElement.appendChild(lc_tokens); - // // matchRowElement.appendChild(hit_tokens); - // // matchRowElement.appendChild(rc_tokens); - // // matchRowElement.appendChild(index); - // } - console.log(matchRowElement.outerHTML); + + // get infos for hit of match + let textTitles = new Set(); + hitCellElement = document.createElement("td"); + hitCellElement.classList.add("match-hit"); + textTitlesCellElement = document.createElement("td"); + textTitlesCellElement.classList.add("titles"); + matchRowElement.appendChild(hitCellElement); + for (cpos of values["hit"]) { + token = chunk["cpos_lookup"][cpos]; + hitCellElement.insertAdjacentHTML("beforeend", `<span class="token" data-cpos="${cpos}">${token["word"]} </span>`); + // get text titles of every hit cpos token + textTitles.add(chunk["text_lookup"][token["text"]]["title"]); + // add button to trigger more context to every match td + var inspectBtn = document.createElement("a"); + inspectBtn.setAttribute("class", "btn-floating btn-flat waves-effect waves-light grey right inspect"); + inspectBtn.innerHTML = '<i class="material-icons">search</i>'; + inspectBtn.onclick = function () {inspect(values["index"])}; + } + // add text titles at front as first td of one row + hitCellElement.appendChild(inspectBtn); + textTitlesCellElement.innerText = [...textTitles].join(", "); + matchRowElement.insertAdjacentHTML("afterbegin", textTitlesCellElement.outerHTML); + + // get infos for right context of match + rcCellElement = document.createElement("td"); + rcCellElement.classList.add("right-context"); + matchRowElement.appendChild(rcCellElement); + for (cpos of values["rc"]) { + token = chunk["cpos_lookup"][cpos]; + rcCellElement.insertAdjacentHTML("beforeend", `<span class="token" data-cpos="${cpos}">${token["word"]} </span>`); + } + console.log(matchRowElement); return matchRowElement } } diff --git a/app/templates/corpora/analyse_corpus.html.j2 b/app/templates/corpora/analyse_corpus.html.j2 index 382418ab5fd04a53636b52a2caef363215079a59..1357bc9c0a11e105a652c09c5572b52b8e99251a 100644 --- a/app/templates/corpora/analyse_corpus.html.j2 +++ b/app/templates/corpora/analyse_corpus.html.j2 @@ -378,13 +378,16 @@ resultList.add(resultItems, items => { for (let item of items) { item.elm = resultList.createResultRowElement(item, chunk);} + resultList.update(); }); - resultList.update(); }); // inspect match functions - function inspect() { - console.log("Inspect!") + function inspect(dataIndex) { + console.log("Inspect!"); + console.log(result["matches"][dataIndex]["hit"]); + contextModal.open(); + nopaque.socket.emit("inspect_match", {"cpos": result["matches"][dataIndex]["hit"]}); } // Function to download data to a file @@ -441,45 +444,6 @@ "position": "top", "transitionMovement": 0}); } - - - nopaque.socket.on("match_context", function(message) { - console.log("### match_context ###"); - console.log(message); - contextResultsElement.innerHTML = "<p> </p>"; - document.getElementById("context-modal-loading").classList.add("hide"); - document.getElementById("context-modal-ready").classList.remove("hide"); - - var sentenceElement; - var token; - var tokenElement; - - lookup["cpos"] = {...lookup["cpos"], ...message["cpos_lookup"]}; - lookup["s"] = message["context_s_cpos"]; - lookup["text"] = {...lookup["text"], ...message["text_lookup"]}; - - for (let [key, value] of Object.entries(message['context_s_cpos'])) { - sentenceElement = document.createElement("p"); - for (cpos of value) { - token = lookup["cpos"][cpos]; - tokenElement = document.createElement("span"); - tokenElement.classList.add("token"); - if (message["match_cpos_list"].includes(cpos)) { - tokenElement.classList.add("bold"); - } - tokenElement.dataset.cpos = cpos; - tokenElement.innerText = token["word"]; - if (expertModeSwitchElement.checked) { - tokenElement.classList.add("chip"); - addToolTipToTokenElement(tokenElement, token); - } - tokenElements.add(tokenElement); - sentenceElement.append(tokenElement); - sentenceElement.append(document.createTextNode(" ")); - } - contextResultsElement.append(sentenceElement); - } - }); // collapsible display options var elem = document.querySelector('.collapsible.expandable'); </script>