mirror of https://github.com/status-im/codimd.git
Refactor dictionary loading method
Signed-off-by: Yukai Huang <yukaihuangtw@gmail.com>
This commit is contained in:
parent
aef2c780c8
commit
bc3fe7ca8d
|
@ -12,6 +12,56 @@ const dictionaryDownloadUrls = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const typoMap = new Map()
|
||||||
|
|
||||||
|
function createTypo (lang, affData, dicData) {
|
||||||
|
const typo = new Typo(lang, affData, dicData, { platform: 'any' })
|
||||||
|
typoMap.set(lang, typo)
|
||||||
|
return typo
|
||||||
|
}
|
||||||
|
|
||||||
|
function request (url) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
const req = new XMLHttpRequest()
|
||||||
|
req.open('GET', url, true)
|
||||||
|
req.onload = () => {
|
||||||
|
if (req.readyState === 4 && req.status === 200) {
|
||||||
|
resolve(req.responseText)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req.send(null)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function runSeriesP (iterables, fn) {
|
||||||
|
const results = []
|
||||||
|
for (const iterable of iterables) {
|
||||||
|
results.push(await fn(iterable))
|
||||||
|
}
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
||||||
|
function mapSeriesP (iterables, fn) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
resolve(runSeriesP(iterables, fn))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function findOrCreateTypoInstance (lang) {
|
||||||
|
// find existing typo instance
|
||||||
|
const typo = typoMap.get(lang)
|
||||||
|
if (typo) {
|
||||||
|
return typo
|
||||||
|
}
|
||||||
|
|
||||||
|
const [affData, dicData] = await mapSeriesP([
|
||||||
|
dictionaryDownloadUrls[lang].aff,
|
||||||
|
dictionaryDownloadUrls[lang].dic
|
||||||
|
], request)
|
||||||
|
|
||||||
|
return createTypo(lang, affData, dicData)
|
||||||
|
}
|
||||||
|
|
||||||
class CodeMirrorSpellChecker {
|
class CodeMirrorSpellChecker {
|
||||||
/**
|
/**
|
||||||
* @param {CodeMirror} cm
|
* @param {CodeMirror} cm
|
||||||
|
@ -26,53 +76,14 @@ class CodeMirrorSpellChecker {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
this.numLoaded = 0
|
|
||||||
this.affLoading = false
|
|
||||||
this.dicLoading = false
|
|
||||||
this.affData = ''
|
|
||||||
this.dicData = ''
|
|
||||||
this.typo = undefined
|
this.typo = undefined
|
||||||
|
this.setupCM(cm, lang)
|
||||||
this.setupCM.bind(this)(cm, lang)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setupCM (cm, lang) {
|
setupCM (cm, lang) {
|
||||||
cm.defineMode('spell-checker', config => {
|
cm.defineMode('spell-checker', config => {
|
||||||
// Load AFF/DIC data
|
// Load AFF/DIC data async
|
||||||
if (!this.affLoading) {
|
findOrCreateTypoInstance(lang).then(typo => { this.typo = typo })
|
||||||
this.affLoading = true
|
|
||||||
|
|
||||||
const xhrAff = new XMLHttpRequest()
|
|
||||||
xhrAff.open('GET', dictionaryDownloadUrls[lang].aff, true)
|
|
||||||
xhrAff.onload = () => {
|
|
||||||
if (xhrAff.readyState === 4 && xhrAff.status === 200) {
|
|
||||||
this.affData = xhrAff.responseText
|
|
||||||
this.numLoaded++
|
|
||||||
|
|
||||||
if (this.numLoaded === 2) {
|
|
||||||
this.typo = new Typo(lang, this.affData, this.dicData, { platform: 'any' })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xhrAff.send(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.dicLoading) {
|
|
||||||
this.dicLoading = true
|
|
||||||
const xhrDic = new XMLHttpRequest()
|
|
||||||
xhrDic.open('GET', dictionaryDownloadUrls[lang].dic, true)
|
|
||||||
xhrDic.onload = () => {
|
|
||||||
if (xhrDic.readyState === 4 && xhrDic.status === 200) {
|
|
||||||
this.dicData = xhrDic.responseText
|
|
||||||
this.numLoaded++
|
|
||||||
|
|
||||||
if (this.numLoaded === 2) {
|
|
||||||
this.typo = new Typo(lang, this.affData, this.dicData, { platform: 'any' })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xhrDic.send(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Define what separates a word
|
// Define what separates a word
|
||||||
const regexWord = '!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~ '
|
const regexWord = '!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~ '
|
||||||
|
@ -108,5 +119,4 @@ class CodeMirrorSpellChecker {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Export
|
|
||||||
export default CodeMirrorSpellChecker
|
export default CodeMirrorSpellChecker
|
||||||
|
|
Loading…
Reference in New Issue