X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/0788c4247ca8ea24d8238a910a68efb9e7e3a04a..e9b44cdb431c531fa34832ebee1870e1a301db0a:/writer.js diff --git a/writer.js b/writer.js index 450a8f2..e9b86fe 100644 --- a/writer.js +++ b/writer.js @@ -1,34 +1,159 @@ 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; + // insert another empty input element option + 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; + if (wplang == 'la') wplang = 'en'; // most likely presence of scientific names + 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; + + let wptext = json.parse.text['*']; + let transrow = document.getElementById('trans-la'); + if (transrow && !transrow.value && wptext) { + transrow.value = wptext + .match(/ class="binomial">.*?(.*?)<\/i>/)[1]; + } + + // 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 + ']'; + }); + }); + + // copy first paragraph to story + let storyinput = document.getElementById('story'); + if (storyinput && !storyinput.value && wptext) { + storyinput.value = wptext + .replace(//sg, '') // ignore infobox + .match(/

(.*?)<\/p>/s)[0] // first paragraph + .replace(/<[^>]*>/g, '') // strip html tags + } + + // list images in article html + let imginput = document.getElementById('source'); + if (!imginput || imginput.value) return; + let wpimages = wptext.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 = + wplang == 'la' ? `https://species.wikimedia.org/wiki/${wptitle}` : + `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'); + previewbutton.onclick = () => { + previewbutton.childNodes[0].nodeValue = imgpreview.hidden ? 'Hide' : 'View'; + imgpreview.hidden = !imgpreview.hidden; + }; + } + + let thumbpreview = document.getElementById('thumbpreview'); + if (thumbpreview && imgpreview) { + thumbpreview.onclick = e => { + let imgselect = imgpreview; /* TODO clone */ + imgselect.hidden = false; + imgselect.classList.add('popup'); + imgselect.onmousemove = e => { + let border = imgselect.getBoundingClientRect(); + let pos = [ + Math.round(1000 * (e.clientX - border.x) / border.width), + Math.round(1000 * (e.clientY - border.y) / border.height) + ]; + return pos; + }; + imgselect.onclick = e => { + let imgoption = document.getElementById('thumb'); + imgoption.value += (imgoption.value && '-') + imgselect.onmousemove(e); + imgselect.hidden = true; + imgselect.classList.remove('popup'); + }; + }; + } + + 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(); + }; + } });