X-Git-Url: http://git.shiar.net/sheet.git/blobdiff_plain/cae266f89c2f8b9c192dfbe9b9126ef9ac144e6f..74d561810b2bf81617b84bc1581d8b59c359d5c9:/writer.js diff --git a/writer.js b/writer.js index e21b684..6470a39 100644 --- a/writer.js +++ b/writer.js @@ -1,40 +1,77 @@ document.addEventListener('DOMContentLoaded', () => { - var wpinput = document.getElementById('wptitle'); - var wpbutton = wpinput.parentNode.appendChild(document.createElement('button')); - wpbutton.type = 'button'; - wpbutton.append('Copy'); - wpbutton.onclick = () => { - let wptitle = wpinput.value || document.getElementById('form').value; - let wplang = document.getElementById('lang').value.substr(0, 2); // crude iso-639-3→2 - let wpapi = `https://${wplang}.wikipedia.org/w/api.php`; - let wppage = wpapi+'?action=parse&format=json&origin=*&prop=text&page='+wptitle; - fetch(wppage).then(res => res.json()).then(json => { - if (json.error) throw `error returned: ${json.error.info}`; - wpinput.value = json.parse.title; - let imginput = document.getElementById('source'); - if (imginput.value) return; - let wpimages = json.parse.text['*'].match(/]+>/g); - let wpselect = wpinput.parentNode.appendChild(document.createElement('ul')); - wpselect.className = 'popup'; - wpimages.forEach(img => { - let selectitem = wpselect.appendChild(document.createElement('li')); - selectitem.insertAdjacentHTML('beforeend', img); - selectitem.onclick = e => { - let imgsrc = e.target.src - .replace(/^(?=\/\/)/, 'https:') - .replace(/\/thumb(\/.+)\/[^\/]+$/, '$1'); - imginput.value = imgsrc; - wpselect.remove(); - return false; - }; - }); - }).catch(error => alert(error)); - return false; - }; + document.querySelectorAll('.multiinput > input[id]').forEach(el => { + el.oninput = e => { + if (e.target.value == '') return; + let add = e.target.cloneNode(true); + add.value = ''; + add.oninput = e.target.oninput; + e.target.parentNode.appendChild(add); + e.target.oninput = undefined; + e.target.removeAttribute('id'); + }; + }); + + let wpinput = document.getElementById('wptitle'); + if (wpinput) { + let wpbutton = wpinput.parentNode.appendChild(document.createElement('button')); + wpbutton.type = 'button'; + wpbutton.append('Download'); + wpbutton.onclick = () => { + let wptitle = wpinput.value || document.getElementById('form').value; + let wplang = document.getElementById('lang').value; + let wpapi = `https://${wplang}.wikipedia.org/w/api.php`; + let wppage = wpapi+'?action=parse&format=json&origin=*&prop=text|langlinks&page='+wptitle; + fetch(wppage).then(res => res.json()).then(json => { + if (json.error) throw `error returned: ${json.error.info}`; + wpinput.value = json.parse.title; + + // translations from language links + let wplangs = json.parse.langlinks; + if (wplangs) wplangs.forEach(wptrans => { + let transrow = document.getElementById('trans-' + wptrans.lang); + if (!transrow || transrow.value) return; + transrow.value = wptrans['*'].replace(/([^,(]*).*/, (link, short) => { + return short.toLocaleLowerCase(wptrans.lang).trimEnd() + ' [' + link + ']'; + }); + }); + + // list images in article html + let imginput = document.getElementById('source'); + if (!imginput || imginput.value) return; + let wpimages = json.parse.text['*'].match(/]+>/g); + let wpselect = wpinput.parentNode.appendChild(document.createElement('ul')); + wpselect.className = 'popup'; + wpimages.forEach(img => { + let selectitem = wpselect.appendChild(document.createElement('li')); + selectitem.insertAdjacentHTML('beforeend', img); + selectitem.onclick = e => { + let imgsrc = e.target.src + .replace(/^(?=\/\/)/, 'https:') + .replace(/\/thumb(\/.+)\/[^\/]+$/, '$1'); + imginput.value = imgsrc; + wpselect.remove(); + return false; + }; + }); + }).catch(error => alert(error)); + return false; + }; + wpbutton = wpinput.parentNode.appendChild(document.createElement('button')); + wpbutton.type = 'button'; + wpbutton.append('Visit'); + wpbutton.onclick = () => { + let wptitle = wpinput.value || document.getElementById('form').value; + let wplang = document.getElementById('lang').value; + let wpurl = `https://${wplang}.wikipedia.org/wiki/${wptitle}`; + window.open(wpurl, 'sheet-wikipedia').focus(); + return false; + }; + } let imgpreview = document.getElementById('sourcepreview'); if (imgpreview) { let imginput = document.getElementById('source'); + imginput.parentNode.parentNode.append(imgpreview); // separate row let previewbutton = imginput.parentNode.appendChild(document.createElement('button')); previewbutton.type = 'button'; previewbutton.append('View'); @@ -43,4 +80,36 @@ document.addEventListener('DOMContentLoaded', () => { imgpreview.hidden = !imgpreview.hidden; }; } + + let translist = document.getElementById('trans'); + if (translist) { + let langoptions = Array.prototype.filter.call(document.getElementById('lang').options, opt => { + if (document.getElementById('trans-' + opt.value)) return; + if (document.getElementById('lang').value == opt.value) return; + return true; + }); + if (!langoptions.length) return; + + let transadd = translist.appendChild(document.createElement('li')); + let transselect = transadd.appendChild(document.createElement('select')); + transselect.appendChild(document.createElement('option')); + for (let langoption of langoptions) { + let transoption = document.createElement('option'); + transoption.value = langoption.value; + transoption.append(langoption.label); + transselect.appendChild(transoption); + } + transselect.onchange = e => { + let inputlang = e.target.selectedOptions[0]; + let transadded = translist.insertBefore(document.createElement('li'), transadd); + let translabel = transadded.appendChild(document.createElement('label')); + translabel.append(inputlang.label.replace(/ (.+)/, ' ')); //TODO title = $1 + let transinput = transadded.appendChild(document.createElement('input')); + transinput.name = 'trans-'+inputlang.value; + translabel.setAttribute('for', transinput.id = transinput.name); + inputlang.remove(); + if (e.target.length <= 1) e.target.remove(); + transinput.focus(); + }; + } });