Skip to content
Snippets Groups Projects
Verified Commit 49416f35 authored by Romain De Laage De Bellefaye's avatar Romain De Laage De Bellefaye
Browse files

[CodiMD] Add frech dictionary

parent 3b9aa88f
No related branches found
No related tags found
No related merge requests found
......@@ -12,7 +12,9 @@ RUN apk add --no-cache --virtual .gyp libressl-dev git bash python make && \
wget https://github.com/aptible/supercronic/releases/download/$SCVERSION/supercronic-linux-amd64 && \
chmod +x supercronic-linux-amd64 && \
mv supercronic-linux-amd64 /opt/codimd/supercronic
COPY fr.dic /opt/codimd/public/vendor/codemirror-spell-checker/fr.dic
COPY fr.aff /opt/codimd/public/vendor/codemirror-spell-checker/fr.aff
COPY spellcheck.js /opt/codimd/public/js/lib/editor/spellcheck.js
RUN cd /opt/codimd && npm install && \
npm run build && \
cp ./deployments/docker-entrypoint.sh ./ && \
......@@ -37,21 +39,12 @@ RUN addgroup --gid 5010 codimd && \
tar xvf portchecker-linux-amd64.tar.gz -C /usr/local/bin && \
mv /usr/local/bin/portchecker-linux-amd64 /usr/local/bin/pcheck && \
rm portchecker-linux-amd64.tar.gz
USER codimd
WORKDIR /home/codimd/app
COPY --chown=5010:5010 --from=BUILD /opt/codimd .
COPY --chown=5010:5010 deleteOldPad.py .
RUN npm install --production && npm cache clean --force && rm -rf /tmp/{core-js-banners,phantomjs}
COPY entrypoint.sh .
COPY features.md /home/codimd/app/public/docs/features.md
EXPOSE 3000
ENTRYPOINT ["./entrypoint.sh"]
......@@ -19,3 +19,7 @@ Elle s'effectue via l'environnement, dans le fichier Compose. Voir les valeurs d
## Mettre à jour
Pour mettre à jour l'image il suffit de modifier le fichier `Dockerfile` pour changer la valeur de l'argument `VERSION`. Il faut aussi penser à changer la valeur du tag dans le fichier `docker-compose.yml`.
## Dictionnaires
Les dictionnaires proviennent de [freeoffice](https://www.freeoffice.com/fr/telecharger/dictionnaires), ils sont sous licence *MPL*, le fichier de licence est dans le dépôt, il s'agit de la version française toutes variantes.
_______________________________________________________________________________
DICTIONNAIRES ORTHOGRAPHIQUES FRANÇAIS
version 5.7
Olivier R. - dicollecte<at>free<dot>fr
Dicollecte : http://www.dicollecte.org/
Licence :
MPL : Mozilla Public License
version 2.0 -- http://www.mozilla.org/MPL/2.0/
Ce dictionnaire ne peut fonctionner qu’avec un logiciel utilisant le
correcteur Hunspell : OpenOffice.org 3.2+, Firefox 4+, Thunderbird 5+
Principaux contributeurs :
- Jean-Luc T. ;
- Sylvain P. ;
- Laurent Dubois ;
- Dominique Pellé ;
- Pierre Poisson ;
- Pierre-Yves ;
- Pierre Choffardet ;
- Leywen ;
- Romain Muller et Serge Bibauw, de l’association RENOUVO, grâce à qui
la nouvelle orthographe et ses anciennes variantes ont pu être établies ;
- Chantal Contant, pour ses recherches sur la réforme de 1990 ;
- Benoît Sagot, qui nous a autorisé à comparer notre lexique avec Lefff,
ce qui a mis en évidence des dizaines d’erreurs d’étiquetage grammatical ;
- Philipp Burgess, pour la normalisation Unicode avec Hunspell.
Merci aussi à tous ceux qui ont apporté leur pierre à l’édifice.
http://www.dicollecte.org/members.php?prj=fr
Pour participer à l’amélioration du dictionnaire, allez sur :
http://www.dicollecte.org/home.php?prj=fr
_______________________________________________________________________________
À propos des différents dictionnaires français
_______________________________________________________________________________
En 1990, le Conseil supérieur à la langue française et l’Académie française
ont proposé une réforme de l’orthographe qui concerne plusieurs milliers de
mots. L’emploi des nouvelles graphies n’est pas obligatoire. Les anciennes
comme les nouvelles sont considérées comme correctes.
Pour en savoir plus sur la réforme de 1990 :
http://www.renouvo.org/regles.php
http://www.orthographe-recommandee.info/
Malgré les rectifications modestes apportées par cette réforme, la nouvelle
orthographe suscite beaucoup de polémiques. Afin de satisfaire les exigences
de chacun, quatre dictionnaires existent, respectant différemment cette
réforme.
Dictionnaire “Moderne”
Ce dictionnaire propose une sélection des graphies classiques et
réformées, suivant la lente évolution de l’orthographe actuelle. Ce
dictionnaire contient les graphies les moins polémiques de la réforme.
Dictionnaire “Classique” [recommandé]
Ce dictionnaire est une extension du dictionnaire «Moderne» et propose
en sus des graphies alternatives, parfois encore très usitées, parfois
tombées en désuétude.
Dictionnaire “Réforme 1990”
Ce dictionnaire ne connaît que les graphies nouvelles des mots concernés
par la réforme de 1990.
Dictionnaire “Toutes variantes”
Ce dictionnaire contient les nouvelles et les anciennes graphies des
mots concernés par la réforme de 1990.
This diff is collapsed.
This diff is collapsed.
/* eslint-env browser */
// Modified from https://github.com/sparksuite/codemirror-spell-checker
import Typo from 'typo-js'
import { serverurl } from '../config'
export const supportLanguages = [
{
name: 'Français',
value: 'fr_FR',
aff: {
url: `${serverurl}/vendor/codemirror-spell-checker/fr.aff`,
cdnUrl: `${serverurl}/vendor/codemirror-spell-checker/fr.aff`
},
dic: {
url: `${serverurl}/vendor/codemirror-spell-checker/fr.dic`,
cdnUrl: `${serverurl}/vendor/codemirror-spell-checker/fr.dic`
}
},
{
name: 'English (United States)',
value: 'en_US',
aff: {
url: `${serverurl}/vendor/codemirror-spell-checker/en_US.aff`,
cdnUrl: `${serverurl}/vendor/codemirror-spell-checker/en_US.aff`
},
dic: {
url: `${serverurl}/vendor/codemirror-spell-checker/en_US.dic`,
cdnUrl: `${serverurl}/vendor/codemirror-spell-checker/en_US.dic`
}
},
{
name: 'English (United Kingdom)',
value: 'en_GB',
aff: {
url: `${serverurl}/build/dictionary-en-gb/index.aff`,
cdnUrl: 'https://cdn.jsdelivr.net/npm/dictionary-en-gb@2.2.2/index.aff'
},
dic: {
url: `${serverurl}/build/dictionary-en-gb/index.dic`,
cdnUrl: 'https://cdn.jsdelivr.net/npm/dictionary-en-gb@2.2.2/index.dic'
}
},
{
name: 'German',
value: 'de',
aff: {
url: `${serverurl}/build/dictionary-de/index.aff`,
cdnUrl: 'https://cdn.jsdelivr.net/npm/dictionary-de@2.0.3/index.aff'
},
dic: {
url: `${serverurl}/build/dictionary-de/index.dic`,
cdnUrl: 'https://cdn.jsdelivr.net/npm/dictionary-de@2.0.3/index.dic'
}
},
{
name: 'German (Austria)',
value: 'de_AT',
aff: {
url: `${serverurl}/build/dictionary-de-at/index.aff`,
cdnUrl: 'https://cdn.jsdelivr.net/npm/dictionary-de-at@2.0.3/index.aff'
},
dic: {
url: `${serverurl}/build/dictionary-de-at/index.dic`,
cdnUrl: 'https://cdn.jsdelivr.net/npm/dictionary-de-at@2.0.3/index.dic'
}
},
{
name: 'German (Switzerland)',
value: 'de_CH',
aff: {
url: `${serverurl}/build/dictionary-de-ch/index.aff`,
cdnUrl: 'https://cdn.jsdelivr.net/npm/dictionary-de-ch@2.0.3/index.aff'
},
dic: {
url: `${serverurl}/build/dictionary-de-ch/index.dic`,
cdnUrl: 'https://cdn.jsdelivr.net/npm/dictionary-de-ch@2.0.3/index.dic'
}
}
]
export const supportLanguageCodes = supportLanguages.map(lang => lang.value)
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))
})
}
function createTypo (lang, affData, dicData) {
return new Typo(lang, affData, dicData, { platform: 'any' })
}
const typoMap = new Map()
let fetching = false
async function findOrCreateTypoInstance (lang) {
if (!lang) {
return
}
// find existing typo instance
let typo = typoMap.get(lang)
if (typo) {
return typo
}
let dict = supportLanguages.find(l => l.value === lang)
if (!dict) {
console.error(`Dictionary not found for "${lang}"\n Fallback to default English spellcheck`)
dict = supportLanguages[0]
}
let affUrl
let dicUrl
if (window.USE_CDN) {
affUrl = dict.aff.cdnUrl
dicUrl = dict.dic.cdnUrl
} else {
affUrl = dict.aff.url
dicUrl = dict.dic.url
}
if (fetching) {
return typo
}
try {
fetching = true
const [affData, dicData] = await mapSeriesP([affUrl, dicUrl], request)
typo = createTypo(lang, affData, dicData)
typoMap.set(lang, typo)
} catch (err) {
console.error(err)
} finally {
fetching = false
}
return typo
}
class CodeMirrorSpellChecker {
/**
* @param {CodeMirror} cm
* @param {string} lang
*/
constructor (cm, lang, editor) {
// Verify
if (typeof cm !== 'function' || typeof cm.defineMode !== 'function') {
console.log(
'CodeMirror Spell Checker: You must provide an instance of CodeMirror via the option `codeMirrorInstance`'
)
return
}
this.typo = undefined
this.defineSpellCheckerMode(cm, lang)
this.editor = editor
}
setDictLang (lang) {
findOrCreateTypoInstance(lang).then(typo => {
this.typo = typo
// re-enable overlay mode to refresh spellcheck
this.editor.setOption('mode', 'gfm')
this.editor.setOption('mode', 'spell-checker')
})
}
defineSpellCheckerMode (cm, lang) {
// Load AFF/DIC data async ASAP
this.setDictLang(lang)
cm.defineMode('spell-checker', config => {
// Define what separates a word
const regexWord = '!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~ '
// Create the overlay and such
const overlay = {
token: (stream) => {
let ch = stream.peek()
let word = ''
if (regexWord.includes(ch)) {
stream.next()
return null
}
while ((ch = stream.peek()) != null && !regexWord.includes(ch)) {
word += ch
stream.next()
}
if (this.typo && !this.typo.check(word)) {
return 'spell-error' // CSS class: cm-spell-error
}
return null
}
}
const mode = cm.getMode(config, config.backdrop || 'text/plain')
return cm.overlayMode(mode, overlay, true)
})
}
}
export default CodeMirrorSpellChecker
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment