{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/external/codemirror-spellcheck.js"],"names":["loadDict","name","aff","dic","Promise","resolve","affData","fetch","then","r","text","wordsData","dictionary","Typo","current","loadDictLang","lang","lively4url","loadIgnoreDict","getItem","spellCheckKey","saveIgnoreDict","dict","setItem","startSpellCheck","cm","typo","ignoreDict","rx_word","spellcheckOverlay","removeOverlay","token","stream","state","ch","peek","word","includes","next","test","check","addOverlay","box","document","getElementById","remove","sbox","lively","removeEventListener","getWrapperElement","addEventListener","e","preventDefault","stopPropagation","suggest","getSuggestionBox","sboxShow","items","x","y","hourglass","selwidget","children","isSafari","navigator","vendor","indexOf","userAgent","match","separator","length","options","forEach","s","indexInParent","slice","call","parentElement","innerHTML","fontSize","window","getComputedStyle","getPropertyValue","style","size","value","cmrect","getBoundingClientRect","left","top","offsetHeight","body","scrollTop","widgetRect","right","width","bottom","height","sboxHide","createElement","zIndex","id","position","multiple","appendChild","target","classList","contains","innerText","codeMirror","screenPos","pageX","pageY","tokenRect","start","coordsChar","end","cmpos","line","results","all","push","onmouseout","related","relatedTarget","tagName","onchange","correction","setOption","maxHighlightLength","replaceRange","focus","setCursor","focalStorage","dictionaries"],"mappings":"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","file":"codemirror-spellcheck.js","sourcesContent":["import Typo from \"src/external/typo.js\"\nimport focalStorage from \"src/external/focalStorage.js\"\n\nexport var dictionaries = {}\n\nexport async function loadDict(name, aff, dic) {\n  if (!dictionaries[name]) {\n    dictionaries[name] = new Promise(async resolve => {\n      var affData = await fetch(aff).then(r => r.text())\n      var wordsData = await fetch(dic).then(r => r.text())\n      var dictionary = new Typo( name, affData, wordsData);\t\n      resolve(dictionary)\n    })\n  }   \n  return dictionaries[name]\n}\n\nexport function current() {\n  return loadDictLang(\"en_US\")\n}\n\nexport function loadDictLang(lang=\"en_US\") {\n  return loadDict(\n    lang,\n    lively4url + `/src/external/dicts/${lang}.aff`,\n    lively4url + `/src/external/dicts/${lang}.dic`)  \n}\n\n\ncurrent()\n\n// copied from kofifus/ Codemirror spellchecker with typo corrections\n// https://gist.github.com/kofifus/4b2f79cadc871a29439d919692099406\n\n\nvar spellCheckKey = \"SpellcheckIngoreWords\"\nasync function loadIgnoreDict() {\n  return (await focalStorage.getItem(spellCheckKey)) || {};\n}\n\nasync function saveIgnoreDict(dict) { \n  return (await focalStorage.setItem(spellCheckKey, dict));\n}\n\nexport var ignoreDict\n\nexport async  function startSpellCheck(cm, typo) {\n  // console.log(\"start spellcheck \" + typo.dictionary)\n  \n\tif (!cm || !typo) return; // sanity\n\n\t// ignoreDict = {}; // dictionary of ignored words\n  if (!ignoreDict ) {\n    ignoreDict = await loadIgnoreDict()\n  }\n  \n\t// Define what separates a word\n\tvar rx_word = '!\\'\\\"#$%&()*+,-./:;<=>?@[\\\\]^_`{|}~ ';\n\n  if (cm.spellcheckOverlay) {\n    // console.log(\"remove spellcheck overlay\")\n    cm.removeOverlay(\"spellcheck\");\n  }\n  \n\tcm.spellcheckOverlay = {\n    name: \"spellcheck\",\n\t\ttoken: function(stream, state) {\n      \n\t\t\tvar ch = stream.peek();\n\t\t\tvar word = \"\";\n\t\t\tif (rx_word.includes(ch) || ch === '\\uE000' || ch === '\\uE001') {\n\t\t\t\tstream.next();\n\t\t\t\treturn null;\n\t\t\t}\n      \n      while ((ch = stream.peek()) && !rx_word.includes(ch)) {\n\t\t\t\tword += ch;\n\t\t\t\tstream.next();\n\t\t\t}\n      // cm.doc.findMarksAt(\n      // var cm = that.editor\n      \n      \n\t\t\tif (!/[a-zöäüß]/i.test(word)) return null; // no letters\n\t\t\t\n      // console.log(\"w\", word, \"stream \", stream)\n      // var token = cm.getTokenAt(cm.doc.posFromIndex(stream.pos))\n      // console.log(\"w\", word, \"type \", token.type)\n      // if (token.type && token.type.match(\"url\")) return null; \n\n      if (ignoreDict && ignoreDict[word]) return null;\n      // console.log(\"check \" + word + \" in \" + typo.dictionary + \" \" + typo.check(word))\n\t\t\tif (!typo.check(word)) return \"spell-error\"; // CSS class: cm-spell-error\n\t\t}\n\t}\n\tcm.addOverlay(cm.spellcheckOverlay);\n\n  \n  var box = document.getElementById('suggestBox');\n  if (box) box.remove()\n  \n\t// initialize the suggestion box\n\tvar sbox = getSuggestionBox(typo);\n  // console.log(\"register context menu spell checker\")\n  lively.removeEventListener(\"spellcheck\", cm.getWrapperElement(), \"contextmenu\")\n\tlively.addEventListener(\"spellcheck\", cm.getWrapperElement(), \"contextmenu\", e => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tsbox.suggest(cm, e);\n\t\treturn false;\n\t});\n}\n\nexport function getSuggestionBox(typo) {\n\tfunction sboxShow(cm, sbox, items, x, y, hourglass) {\n    // console.log(\"get suggestion box \" + typo.dictionary)\n\t\tlet selwidget = sbox.children[0];\n\n\t\tvar isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 &&  navigator.userAgent && !navigator.userAgent.match('CriOS');\n\t\tlet separator=(!isSafari && (hourglass || items.length>0)); // separator line does not work well on safari\n\n\t\tlet options = '';\n\t\titems.forEach(s => options += '<option value=\"' + s + '\">' + s + '</option>');\n\t\tif (hourglass) options += '<option disabled=\"disabled\">&nbsp;&nbsp;&nbsp;&#8987;</option>';\n\t\tif (separator) options += '<option style=\"min-height:1px; max-height:1px; padding:0; background-color: #000000;\" disabled>&nbsp;</option>';\n\t\toptions += `<option value=\"##ignoreall##\">Ignore&nbsp;all&nbsp;${typo.dictionary}</option>`;\n\n\t\tlet indexInParent=[].slice.call(selwidget.parentElement.children).indexOf(selwidget);\n\t\tselwidget.innerHTML=options;\n\t\tselwidget=selwidget.parentElement.children[indexInParent];\n\t\t\n\t\tlet fontSize=window.getComputedStyle(cm.getWrapperElement(), null).getPropertyValue('font-size');\n\t\tselwidget.style.fontSize=fontSize;\n\t\tselwidget.size = selwidget.length;\n\t\tif (separator) selwidget.size--;\n\t\tselwidget.value = -1;\n\n\t\t// position widget inside cm\n\t\tlet cmrect = cm.getWrapperElement().getBoundingClientRect();\n    sbox.style.left = x + 'px';\n\t\tsbox.style.top = ((y - sbox.offsetHeight / 2) - document.body.parentElement.scrollTop) + 'px';\n\t\tlet widgetRect = sbox.getBoundingClientRect();\n\t\tif (widgetRect.top < cmrect.top) sbox.style.top = (cmrect.top + 2) + 'px';\n\t\tif (widgetRect.right > cmrect.right) sbox.style.left = (cmrect.right - widgetRect.width - 2) + 'px';\n\t\tif (widgetRect.bottom > cmrect.bottom) sbox.style.top = (cmrect.bottom - widgetRect.height - 2) + 'px';\n  \n\t}\n\n\tfunction sboxHide(sbox) {\n\t\tsbox.style.top = sbox.style.left = '-1000px';\n\t\t// typo.suggest(); // disable any running suggeations search\n\t}\n\n\t// create suggestions widget\n\tlet sbox = document.getElementById('suggestBox');\n\tif (!sbox) {\n\t\tsbox = document.createElement('div');\n\t\tsbox.style.zIndex = 100000;\n\t\tsbox.id = 'suggestBox';\n\t\tsbox.style.position = 'fixed';\n\t\tsboxHide(sbox);\n\n\t\tlet selwidget = document.createElement('select');\n\t\tselwidget.multiple = 'yes';\n\t\tsbox.appendChild(selwidget);\n\n\t\tsbox.suggest = (async (cm, e) => { // e is the event from cm contextmenu event\n\t\t\tif (!e.target.classList.contains('cm-spell-error')) return false; // not on typo\n\n\t\t\tlet token = e.target.innerText;\n\t\t\tif (!token) return false; // sanity\n\n\t\t\t// save cm instance, token, token coordinates in sbox\n\t\t\tsbox.codeMirror = cm;\n\t\t\tsbox.token = token;\n\t\t\tsbox.screenPos={ x: e.pageX, y: e.pageY }\n\t\t\tlet tokenRect = e.target.getBoundingClientRect();\n\t\t\tlet start=cm.coordsChar({left: tokenRect.left+1, top: tokenRect.top+1});\n\t\t\tlet end=cm.coordsChar({left: tokenRect.right-1, top: tokenRect.top+1});\n\t\t\tsbox.cmpos={ line: start.line, start: start.ch, end: end.ch};\n\n\t\t\t// show hourglass\n\t\t\t// sboxShow(cm, sbox, [], e.pageX, e.pageY, true);\n      \n\t\t\tvar results = [];\n\t\n      // async \n\t\t\ttypo.suggest(token, null, all => {\n\t\t\t\t//console.log('done');\n\t\t\t\tsboxShow(cm, sbox, results, e.pageX, e.pageY);\n\t\t\t}, next => {\n\t\t\t\t//console.log('found '+next);\n\t\t\t\tresults.push(next);\n\t\t\t\tsboxShow(cm, sbox, results, e.pageX, e.pageY, true);\n\t\t\t});\n\n\t\t\t// non async \n\t\t\t// sboxShow(cm, sbox, typo.suggest(token), e.pageX, e.pageY);\n\n\t\t\te.preventDefault();\n\n\t\t\treturn false;\n\t\t});\n\n\t\tsbox.onmouseout = (e => {\n\t\t\tlet related=(e.relatedTarget ? e.relatedTarget.tagName : null);\n\t\t\tif (related!=='SELECT' && related!=='OPTION') sboxHide(sbox)\n\t\t});\n\n\t\tselwidget.onchange = (e => {\n\t\t\tsboxHide(sbox)\n\t\t\tlet cm = sbox.codeMirror, correction = e.target.value;\n\t\t\tif (correction == '##ignoreall##') {\n        \n\t\t\t\tignoreDict[sbox.token] = true;\n        saveIgnoreDict(ignoreDict);\n\t\t\t\tcm.setOption('maxHighlightLength', (--cm.options.maxHighlightLength) + 1); // ugly hack to rerun overlays\n\t\t\t} else {\n\t\t\t\tcm.replaceRange(correction, { line: sbox.cmpos.line, ch: sbox.cmpos.start}, { line: sbox.cmpos.line, ch: sbox.cmpos.end});\n\t\t\t\tcm.focus();\n\t\t\t\tcm.setCursor({line: sbox.cmpos.line, ch: sbox.cmpos.start+correction.length});\n\t\t\t}\n\t\t});\n\n\t\tdocument.body.appendChild(sbox);\n\t}\n\n\treturn sbox;\n}"]}