French spelling dictionary
==========================

The word list in `fr.dic.gz` and the suggestion directives in `fr.aff` are
derived from the Dicollecte / Grammalecte Hunspell dictionary for French
(`fr.aff` / `fr.dic`), as packaged by Debian/Ubuntu in
`hunspell-fr-comprehensive`.

    Copyright (C) 2007-2018  the Dicollecte contributors
                             (full list at
                             https://grammalecte.net/members.php?prj=fr)
                             Dictionary author: Olivier R.

    License: MPL-2.0
             This Source Code Form is subject to the terms of the Mozilla
             Public License, v. 2.0. If a copy of the MPL was not distributed
             with this file, You can obtain one at
             http://mozilla.org/MPL/2.0/.

Upstream: https://grammalecte.net/home.php?prj=fr

Which of the three
------------------

Debian packages this dictionary three ways, by how it treats the 1990 spelling
reform: `hunspell-fr-classical` (traditional spellings), `hunspell-fr-revised`
(reform spellings) and `hunspell-fr-comprehensive` (both). Petal ships the
**comprehensive** one, because Petal never corrects her French — the only thing
this dictionary can do is underline something, and *coût* and *cout* are both
correct French. The regional packages (`fr_FR`, `fr_CA`, `fr_BE`, `fr_CH`,
`fr_LU`, `fr_MC`) are all symlinks to the same word list, so there is no
regional choice being made here.

What Petal changed
------------------

`scripts/build_hunspell_dictionary.py` applies the upstream affix rules ahead of
time — Hunspell's PFX/SFX expansion run once at build time instead of once per
browser — and writes the resulting 473,326 surface forms as a flat word list.
The shipped `.aff` keeps only upstream's TRY/KEY/REP/MAP/WORDCHARS lines, which
shape *corrections* rather than membership.

One thing about membership did change, and it is reversible at lookup rather
than lost: the elided forms (`l'arbre`, `qu'elle`, `jusqu'ici`) are **not** in
the word list. Expanding them costs 8.25 MB gzipped against 1.19 MB, and they
are not new words — they are thirteen clitics glued to words already present —
so `withElision` in `web/src/hooks/useSpellChecker.ts` splits the token and
checks the remainder instead. Stems that carry an apostrophe of their own
(`aujourd'hui`, `quelqu'un`, `presqu'île`, `prud'homme`) are kept verbatim.
