diff --git a/public/index.htm b/public/index.htm index d293125..b31e768 100644 --- a/public/index.htm +++ b/public/index.htm @@ -7,7 +7,7 @@ - + @@ -32,8 +32,8 @@ - - + + \ No newline at end of file diff --git a/public/static/js/qa.js b/public/static/js/qa.js index 07d8c21..530c8b4 100644 --- a/public/static/js/qa.js +++ b/public/static/js/qa.js @@ -284,12 +284,13 @@ class ConcPage { const resultsWrap = document.createElement("div"); convertB.addEventListener('click', function() { - let lines = []; let keysAreNumeric = false; if (listOptions[1] !== undefined && listOptions[1] !== null) { keysAreNumeric = true; } + // First gather lines by target type for rough sorting + let linesByType = {}; for (let m of matchSelects) { let line = ("'" + m.getAttribute("data-input") + "'").padEnd(40, " ") + " => "; @@ -300,11 +301,24 @@ class ConcPage { line += "'" + m.value + "',"; } line += ' // ' + listOptionsEn[m.value]; - lines.push(line); + + // A + if (linesByType[m.value] === undefined) { + linesByType[m.value] = []; + } + linesByType[m.value].push(line); m.setAttribute("readonly", "readonly"); } + // Then put the lines together so they can be joined + let lines = []; + for (let key in linesByType) { + for (let l of linesByType[key]) { + lines.push(l); + } + } + const output = " ".repeat(8) + lines.join("\n" + " ".repeat(8)); console.log(output); diff --git a/public/static/js/qa.min.js b/public/static/js/qa.min.js index 0c23834..6261d88 100644 --- a/public/static/js/qa.min.js +++ b/public/static/js/qa.min.js @@ -1 +1 @@ -"use strict";const MAX_INPUT_SIZE=1048576;'serviceWorker'in navigator&&(console.log("Registering service worker"),navigator.serviceWorker.register('/sw.js'));class ConcPage{lang;tls;domWrapper;domUploaderWrapper;domResultsWrapper;domMainWrapper;constructor(d,e){this.lang=d,this.tls=Object.freeze(e);let c=document.createElement("div");c.id="contentWrapper",this.domWrapper=c;let a=document.createElement("div");a.id="uploader",a.classList.add("uploader"),this.domUploaderWrapper=a;let b=document.createElement("div");b.id="results",b.classList.add("results"),this.domResultsWrapper=b;let f=document.createElement("main");this.domMainWrapper=f}downloadFromString(b,c){const d=new Blob([c],{type:"text/plain"}),a=document.createElement("a");a.download=b,a.href=window.URL.createObjectURL(d),a.dataset.downloadurl=["text/plain",a.download,a.href].join(":");const e=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0});a.dispatchEvent(e),a.remove()}renderGenHeader(){const b=document.createElement("header");b.id="mainHeader";const a=document.createElement("a");a.id="logoArea",a.href="https://www.museum-digital.org/";const d=document.createElement("img");d.src="/static/img/mdlogo-code.svg",d.alt="Logo of museum-digital",a.appendChild(d);const l=document.createElement("h2");l.textContent="museum-digital",a.appendChild(l),b.appendChild(a);const c=document.createElement("nav"),f=document.createElement("a");f.href="https://en.about.museum-digital.org/about",f.textContent=this.tls.about,c.appendChild(f);const g=document.createElement("div"),h=document.createElement("a");h.textContent=this.tls.contact,h.href="https://en.about.museum-digital.org/contact/",g.appendChild(h);const i=document.createElement("div"),e=document.createElement("a");e.textContent=this.tls.imprint,e.href="https://en.about.museum-digital.org/impressum",i.appendChild(e);const j=document.createElement("a");j.textContent=this.tls.privacy_policy,j.href="https://en.about.museum-digital.org/privacy/",i.appendChild(j),g.appendChild(i),c.appendChild(g);const k=document.createElement("a");k.textContent=this.tls.news,k.href="https://blog.museum-digital.org/",c.appendChild(k),b.appendChild(c),document.body.appendChild(b)}renderHeader(){const b=document.createElement("header");b.id="appHeader";const c=document.createElement("h1"),a=document.createElement("img");a.width="70",a.height="70",a.src="/static/img/mdlogo-code.svg",a.alt="",c.appendChild(a),c.appendChild(this.createPlainTextElem("span","museum-digital:"+this.tls.concordance_checker)),b.appendChild(c),document.body.appendChild(b)}createP(b){const a=document.createElement("p");return a.textContent=b,a}createPlainTextElem(b,c){const a=document.createElement(b);return a.textContent=c,a}renderText(){const a=document.createElement("h2");a.textContent=this.tls.quality_assessment_tools,this.domMainWrapper.appendChild(a),this.domMainWrapper.appendChild(this.createP(this.tls.intro)),this.domWrapper.appendChild(this.domMainWrapper)}generateBoilerplateForTableSection(f){const a=document.createElement("div"),c=document.createElement("h3");c.textContent=f,a.appendChild(c);const b=document.createElement("table"),d=document.createElement("thead");b.appendChild(d);const e=document.createElement("tbody");return b.appendChild(e),a.appendChild(b),{section:a,thead:d,tbody:e}}generateListResponse(d,e,a,b){while(this.domResultsWrapper.firstChild)this.domResultsWrapper.removeChild(this.domResultsWrapper.firstChild);if(b.passed.length===void 0){const c=this.generateBoilerplateForTableSection(this.tls.passed),d=document.createElement("tr");for(const b of['Input','Match']){const a=document.createElement("th");a.textContent=b,d.appendChild(a)}c.thead.appendChild(d);for(const f in b.passed){const d=b.passed[f],e=document.createElement("tr");e.appendChild(this.createPlainTextElem("td",f)),a[d]?e.appendChild(this.createPlainTextElem("td",a[d])):(valueTd.textContent=d,e.appendChild(this.createPlainTextElem("td",d))),c.tbody.appendChild(e)}this.domResultsWrapper.appendChild(c.section)}const c=this;if(b.not_passed.length!==0){const f=this.generateBoilerplateForTableSection(this.tls.not_yet_matched),h=document.createElement("tr");for(const b of['Input','Select Your Match']){const a=document.createElement("th");a.textContent=b,h.appendChild(a)}f.thead.appendChild(h);let i=[];for(let e of b.not_passed){const d=document.createElement("tr");d.appendChild(this.createPlainTextElem("td",e));const g=document.createElement("td"),c=document.createElement("select");c.setAttribute('data-input',e);for(const d in a){const b=document.createElement("option");b.value=d,b.textContent=a[d],c.appendChild(b)}i.push(c),g.appendChild(c),d.appendChild(g),f.tbody.appendChild(d)}this.domResultsWrapper.appendChild(f.section);const g=document.createElement("button");g.textContent=this.tls.generate_code_snippet,f.section.appendChild(g);const j=document.createElement("div");g.addEventListener('click',function(){let g=[],h=!1;a[1]!==void 0&&a[1]!==null&&(h=!0);for(let a of i){let b=("'"+a.getAttribute("data-input")+"'").padEnd(40," ")+" => ";h===!0?b+=a.value+",":b+="'"+a.value+"',",b+=' // '+e[a.value],g.push(b),a.setAttribute("readonly","readonly")}const f=" ".repeat(8)+g.join("\n"+" ".repeat(8));console.log(f);const b=c.createP(f);b.id="resultsP",b.style.fontFamily="Monospace, Courier",b.style.whiteSpace="pre-wrap",j.appendChild(b),b.scrollIntoView({block:"start",behavior:"smooth"}),c.downloadFromString("new-concordance-"+d+'.htm',f)}),this.domResultsWrapper.appendChild(j)}this.domResultsWrapper.scrollIntoView({block:"start",behavior:"smooth"})}renderUploader(){const a=document.createElement("select"),e=document.documentElement.getAttribute("data-lists").split(',');for(const c of e){const b=document.createElement("option");b.textContent=this.tls[c],b.value=c,a.appendChild(b)}this.domUploaderWrapper.appendChild(a);const b=document.createElement("textarea");b.placeholder=this.tls.one_line_per_entry,this.domUploaderWrapper.appendChild(b);const c=document.createElement("button");c.textContent=this.tls.submit,this.domUploaderWrapper.appendChild(c);const d=this;c.addEventListener('click',async function(h){h.stopPropagation(),h.preventDefault();const e=await window.fetch('/static/json/tls.'+a.value+'.en.json',{method:'GET',cache:'no-cache'});if(e.status!==200){const a=await c.text();window.alert(a)}const i=await e.json(),f=await window.fetch('/static/json/tls.'+a.value+'.'+d.lang+'.json',{method:'GET',cache:'no-cache'});if(f.status!==200){const a=await c.text();window.alert(a)}const j=await f.json();let g=[];g.push('terms='+encodeURIComponent(b.value));const c=await window.fetch('/api/evaluate/'+a.value,{method:'POST',cache:'no-cache',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:g.join("&")});if(c.status!==200){const a=await c.text();window.alert(a)}const k=await c.json();d.generateListResponse(a.value,i,j,k)}),this.domWrapper.appendChild(this.domUploaderWrapper),this.domWrapper.appendChild(this.domResultsWrapper)}renderFooter(){const e=document.createElement("footer"),c=document.createElement("div");if('serviceWorker'in navigator){const a=document.createElement("span");a.textContent=this.tls.reload_application,a.setAttribute("tabindex",1),a.addEventListener('click',function(a){Promise.all(['conc-cache-v1'].map(function(a){caches.has(a).then(function(b){b===!0&&caches.delete(a).then(function(a){})})})),location.reload()},{passive:!0,once:!0}),c.appendChild(a)}const h=document.documentElement.getAttribute("data-allowed-langs").split(','),f=document.createElement("div");for(let b of h){const a=document.createElement("a");a.href="#"+b,a.textContent=b,a.style.textTranform="uppercase",a.addEventListener('click',function(a){a.preventDefault(),sessionStorage.setItem("lang",b),location.reload()}),f.appendChild(a)}c.appendChild(f),e.appendChild(c);const a=document.createElement("p"),d=document.createElement("a");d.textContent="MIT-Licensed",d.href="https://opensource.org/license/mit",a.appendChild(d),a.appendChild(this.createPlainTextElem("span"," @ "));const b=document.createElement("a");b.textContent="Joshua Ramon Enslin",b.href="https://www.jrenslin.de",b.setAttribute("rel","author"),a.appendChild(b),a.appendChild(this.createPlainTextElem("span",", "));const g=document.createElement("span");g.textContent="2025",a.appendChild(g),e.appendChild(a),document.body.appendChild(e)}}(async function(){function c(){const c=document.documentElement.getAttribute("data-allowed-langs").split(','),a=sessionStorage.getItem("lang");if(a!==void 0&&c.includes(a))return a;if(navigator.language===void 0)return'en';const b=navigator.language.toLowerCase().substr(0,2);return console.log(b),c.includes(b)?b:'en'}const a=c();document.documentElement.setAttribute("lang",a),document.body.classList.add("loading");let e=0,b;function d(){document.body.classList.remove("loading");const c=new ConcPage(a,b);c.renderGenHeader(),c.renderHeader(),c.renderText(),c.renderUploader(),document.body.appendChild(c.domWrapper),c.renderFooter()}window.fetch('/static/json/tls.'+a+'.json',{method:'GET',cache:'no-cache',credentials:'same-origin'}).then(function(a){return a.json()}).then(function(a){b=a,d()})})() \ No newline at end of file +"use strict";const MAX_INPUT_SIZE=1048576;'serviceWorker'in navigator&&(console.log("Registering service worker"),navigator.serviceWorker.register('/sw.js'));class ConcPage{lang;tls;domWrapper;domUploaderWrapper;domResultsWrapper;domMainWrapper;constructor(d,e){this.lang=d,this.tls=Object.freeze(e);let c=document.createElement("div");c.id="contentWrapper",this.domWrapper=c;let a=document.createElement("div");a.id="uploader",a.classList.add("uploader"),this.domUploaderWrapper=a;let b=document.createElement("div");b.id="results",b.classList.add("results"),this.domResultsWrapper=b;let f=document.createElement("main");this.domMainWrapper=f}downloadFromString(b,c){const d=new Blob([c],{type:"text/plain"}),a=document.createElement("a");a.download=b,a.href=window.URL.createObjectURL(d),a.dataset.downloadurl=["text/plain",a.download,a.href].join(":");const e=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0});a.dispatchEvent(e),a.remove()}renderGenHeader(){const b=document.createElement("header");b.id="mainHeader";const a=document.createElement("a");a.id="logoArea",a.href="https://www.museum-digital.org/";const d=document.createElement("img");d.src="/static/img/mdlogo-code.svg",d.alt="Logo of museum-digital",a.appendChild(d);const l=document.createElement("h2");l.textContent="museum-digital",a.appendChild(l),b.appendChild(a);const c=document.createElement("nav"),f=document.createElement("a");f.href="https://en.about.museum-digital.org/about",f.textContent=this.tls.about,c.appendChild(f);const g=document.createElement("div"),h=document.createElement("a");h.textContent=this.tls.contact,h.href="https://en.about.museum-digital.org/contact/",g.appendChild(h);const i=document.createElement("div"),e=document.createElement("a");e.textContent=this.tls.imprint,e.href="https://en.about.museum-digital.org/impressum",i.appendChild(e);const j=document.createElement("a");j.textContent=this.tls.privacy_policy,j.href="https://en.about.museum-digital.org/privacy/",i.appendChild(j),g.appendChild(i),c.appendChild(g);const k=document.createElement("a");k.textContent=this.tls.news,k.href="https://blog.museum-digital.org/",c.appendChild(k),b.appendChild(c),document.body.appendChild(b)}renderHeader(){const b=document.createElement("header");b.id="appHeader";const c=document.createElement("h1"),a=document.createElement("img");a.width="70",a.height="70",a.src="/static/img/mdlogo-code.svg",a.alt="",c.appendChild(a),c.appendChild(this.createPlainTextElem("span","museum-digital:"+this.tls.concordance_checker)),b.appendChild(c),document.body.appendChild(b)}createP(b){const a=document.createElement("p");return a.textContent=b,a}createPlainTextElem(b,c){const a=document.createElement(b);return a.textContent=c,a}renderText(){const a=document.createElement("h2");a.textContent=this.tls.quality_assessment_tools,this.domMainWrapper.appendChild(a),this.domMainWrapper.appendChild(this.createP(this.tls.intro)),this.domWrapper.appendChild(this.domMainWrapper)}generateBoilerplateForTableSection(f){const a=document.createElement("div"),c=document.createElement("h3");c.textContent=f,a.appendChild(c);const b=document.createElement("table"),d=document.createElement("thead");b.appendChild(d);const e=document.createElement("tbody");return b.appendChild(e),a.appendChild(b),{section:a,thead:d,tbody:e}}generateListResponse(d,e,a,b){while(this.domResultsWrapper.firstChild)this.domResultsWrapper.removeChild(this.domResultsWrapper.firstChild);if(b.passed.length===void 0){const c=this.generateBoilerplateForTableSection(this.tls.passed),d=document.createElement("tr");for(const b of['Input','Match']){const a=document.createElement("th");a.textContent=b,d.appendChild(a)}c.thead.appendChild(d);for(const f in b.passed){const d=b.passed[f],e=document.createElement("tr");e.appendChild(this.createPlainTextElem("td",f)),a[d]?e.appendChild(this.createPlainTextElem("td",a[d])):(valueTd.textContent=d,e.appendChild(this.createPlainTextElem("td",d))),c.tbody.appendChild(e)}this.domResultsWrapper.appendChild(c.section)}const c=this;if(b.not_passed.length!==0){const f=this.generateBoilerplateForTableSection(this.tls.not_yet_matched),h=document.createElement("tr");for(const b of['Input','Select Your Match']){const a=document.createElement("th");a.textContent=b,h.appendChild(a)}f.thead.appendChild(h);let i=[];for(let e of b.not_passed){const d=document.createElement("tr");d.appendChild(this.createPlainTextElem("td",e));const g=document.createElement("td"),c=document.createElement("select");c.setAttribute('data-input',e);for(const d in a){const b=document.createElement("option");b.value=d,b.textContent=a[d],c.appendChild(b)}i.push(c),g.appendChild(c),d.appendChild(g),f.tbody.appendChild(d)}this.domResultsWrapper.appendChild(f.section);const g=document.createElement("button");g.textContent=this.tls.generate_code_snippet,f.section.appendChild(g);const j=document.createElement("div");g.addEventListener('click',function(){let h=!1;a[1]!==void 0&&a[1]!==null&&(h=!0);let b={};for(let a of i){let c=("'"+a.getAttribute("data-input")+"'").padEnd(40," ")+" => ";h===!0?c+=a.value+",":c+="'"+a.value+"',",c+=' // '+e[a.value],b[a.value]===void 0&&(b[a.value]=[]),b[a.value].push(c),a.setAttribute("readonly","readonly")}let k=[];for(let a in b)for(let c of b[a])k.push(c);const g=" ".repeat(8)+k.join("\n"+" ".repeat(8));console.log(g);const f=c.createP(g);f.id="resultsP",f.style.fontFamily="Monospace, Courier",f.style.whiteSpace="pre-wrap",j.appendChild(f),f.scrollIntoView({block:"start",behavior:"smooth"}),c.downloadFromString("new-concordance-"+d+'.htm',g)}),this.domResultsWrapper.appendChild(j)}this.domResultsWrapper.scrollIntoView({block:"start",behavior:"smooth"})}renderUploader(){const a=document.createElement("select"),e=document.documentElement.getAttribute("data-lists").split(',');for(const c of e){const b=document.createElement("option");b.textContent=this.tls[c],b.value=c,a.appendChild(b)}this.domUploaderWrapper.appendChild(a);const b=document.createElement("textarea");b.placeholder=this.tls.one_line_per_entry,this.domUploaderWrapper.appendChild(b);const c=document.createElement("button");c.textContent=this.tls.submit,this.domUploaderWrapper.appendChild(c);const d=this;c.addEventListener('click',async function(h){h.stopPropagation(),h.preventDefault();const e=await window.fetch('/static/json/tls.'+a.value+'.en.json',{method:'GET',cache:'no-cache'});if(e.status!==200){const a=await c.text();window.alert(a)}const i=await e.json(),f=await window.fetch('/static/json/tls.'+a.value+'.'+d.lang+'.json',{method:'GET',cache:'no-cache'});if(f.status!==200){const a=await c.text();window.alert(a)}const j=await f.json();let g=[];g.push('terms='+encodeURIComponent(b.value));const c=await window.fetch('/api/evaluate/'+a.value,{method:'POST',cache:'no-cache',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:g.join("&")});if(c.status!==200){const a=await c.text();window.alert(a)}const k=await c.json();d.generateListResponse(a.value,i,j,k)}),this.domWrapper.appendChild(this.domUploaderWrapper),this.domWrapper.appendChild(this.domResultsWrapper)}renderFooter(){const e=document.createElement("footer"),c=document.createElement("div");if('serviceWorker'in navigator){const a=document.createElement("span");a.textContent=this.tls.reload_application,a.setAttribute("tabindex",1),a.addEventListener('click',function(a){Promise.all(['conc-cache-v1'].map(function(a){caches.has(a).then(function(b){b===!0&&caches.delete(a).then(function(a){})})})),location.reload()},{passive:!0,once:!0}),c.appendChild(a)}const h=document.documentElement.getAttribute("data-allowed-langs").split(','),f=document.createElement("div");for(let b of h){const a=document.createElement("a");a.href="#"+b,a.textContent=b,a.style.textTranform="uppercase",a.addEventListener('click',function(a){a.preventDefault(),sessionStorage.setItem("lang",b),location.reload()}),f.appendChild(a)}c.appendChild(f),e.appendChild(c);const a=document.createElement("p"),d=document.createElement("a");d.textContent="MIT-Licensed",d.href="https://opensource.org/license/mit",a.appendChild(d),a.appendChild(this.createPlainTextElem("span"," @ "));const b=document.createElement("a");b.textContent="Joshua Ramon Enslin",b.href="https://www.jrenslin.de",b.setAttribute("rel","author"),a.appendChild(b),a.appendChild(this.createPlainTextElem("span",", "));const g=document.createElement("span");g.textContent="2025",a.appendChild(g),e.appendChild(a),document.body.appendChild(e)}}(async function(){function c(){const c=document.documentElement.getAttribute("data-allowed-langs").split(','),a=sessionStorage.getItem("lang");if(a!==void 0&&c.includes(a))return a;if(navigator.language===void 0)return'en';const b=navigator.language.toLowerCase().substr(0,2);return console.log(b),c.includes(b)?b:'en'}const a=c();document.documentElement.setAttribute("lang",a),document.body.classList.add("loading");let e=0,b;function d(){document.body.classList.remove("loading");const c=new ConcPage(a,b);c.renderGenHeader(),c.renderHeader(),c.renderText(),c.renderUploader(),document.body.appendChild(c.domWrapper),c.renderFooter()}window.fetch('/static/json/tls.'+a+'.json',{method:'GET',cache:'no-cache',credentials:'same-origin'}).then(function(a){return a.json()}).then(function(a){b=a,d()})})() \ No newline at end of file