1 {-# LANGUAGE OverloadedLists #-}
 
   2 {-# LANGUAGE OverloadedStrings #-}
 
   4 module Language.FrenchSpec where
 
   6 import Data.ByteString.Builder qualified as ByteString.Builder
 
   7 import Data.Char qualified as Char
 
   8 import Data.GenValidity.Map ()
 
   9 import Data.GenValidity.Sequence ()
 
  10 import Data.GenValidity.Set ()
 
  11 import Data.GenValidity.Text ()
 
  12 import Data.List qualified as List
 
  13 import Data.Map.Strict qualified as Map
 
  14 import Data.Set qualified as Set
 
  15 import Data.Text qualified as Text
 
  16 import Data.Text.Encoding qualified as Text
 
  17 import Data.Text.Lazy.Encoding qualified as Text.Lazy
 
  18 import Data.Text.Short qualified as ShortText
 
  19 import Data.Validity.Map ()
 
  20 import Data.Validity.Set ()
 
  21 import Data.Validity.Text ()
 
  23 import Language.French qualified as French
 
  24 import Language.Pronunciation (ExampleLiteral (..), Lexeme (..), Rule (..), RuleLexemes, after, before, begining, ending, meaning, occurence, rule, silent, word)
 
  25 import Language.Pronunciation qualified as Pron
 
  26 import Paths_worksheets qualified as Self
 
  27 import System.Directory qualified as IO
 
  28 import System.FilePath (joinPath, pathSeparator, (<.>), (</>))
 
  29 import System.FilePath.Posix qualified as File
 
  30 import System.IO qualified as IO
 
  32 import Text.Blaze.Html5.Attributes qualified as HA
 
  33 import Utils.Pronunciation qualified as Pron
 
  35 import Wiktionary qualified
 
  36 import Worksheets.Utils.HTML (Html, className, classes, cm, styles, (!))
 
  37 import Worksheets.Utils.HTML qualified as HTML
 
  38 import Worksheets.Utils.IPA qualified as IPA
 
  39 import Worksheets.Utils.Paper qualified as Paper
 
  40 import Worksheets.Utils.Prelude
 
  41 import Worksheets.Utils.SQL qualified as SQL
 
  42 import Prelude (error, even, mod)
 
  45 instance IsString Rule where
 
  46   fromString s = rule {ruleLexemes = fromString s}
 
  47   [ ful "de" := single "də" ["de" & occurence]
 
  48   , inf "'" := single "" []
 
  49   , inf "-" := single "" []
 
  50   , inf "," := single "" []
 
  51   , inf "?" := single "" []
 
  52   , inf "!" := single "" []
 
  53   , inf borderLeftText := single "" []
 
  54   , inf borderRightText := single "" []
 
  56   , inf "demi" := single "dəmi" ["demi" & occurence]
 
  57   , -- , inf "amb" := single "ɑ̃b" ["amb" & occurence, "ulance"]
 
  58     -- , inf "amp" := single "ɑ̃p" ["amp" & occurence, "oule"]
 
  59     -- , inf "amph" := single "ɑ̃f" ["amph" & occurence, "ithéâtre"]
 
  60     -- , inf "an" := multi
 
  61     --    [ [PronContextBeforeBorder] := LexemePron{lexemePronunciation="ɑ̃", lexemeExample=["pl", "an" & occurence]}
 
  62     --    , [PronContextBeforeAnyVowel] := LexemePron{lexemePronunciation="an", lexemeExample=["an" & occurence, "imal"]}
 
  63     --    , [PronContextBeforeAny] := LexemePron{lexemePronunciation="ɑ̃", lexemeExample=["an" & occurence, "tilope"]}
 
  65   , -- , inf "coin" := single "kwɛ̃" ["coin" & occurence, "cer"]
 
  69     --      [ [PronContextBeforeBorder] := LexemePron{lexemePronunciation = "", lexemeExample = }
 
  70     --      , [PronContextBeforeAnyVowel] := LexemePron{lexemePronunciation = "im", lexemeExample = ["im" & occurence, "ortel"]}
 
  71     --      , [PronContextBeforeAny] := LexemePron{lexemePronunciation = "ɛ̃", lexemeExample = ["im" & occurence, "primer"]}
 
  73   , -- , inf "in" := single "ɛ̃" ["merl", "in" & occurence]
 
  74     -- , inf "ina" := single "ina" ["ord", "ina" & occurence, "teur"]
 
  75     -- , inf "ine" := single "in" ["rout", "ine" & occurence]
 
  76     -- , inf "inent" := single "in" ["dess", "inent" & occurence]
 
  77     -- , inf "iner" := single "inɛʁ" ["iner" & occurence, "tie"]
 
  78     -- , inf "inex" := single "inɛgz" ["inex" & occurence, "istant"]
 
  79     -- , inf "inexp" := single "inɛksp" ["inexp" & occurence, "licable"]
 
  80     -- , inf "inima" := single "inima" ["inima" & occurence, "ginable"]
 
  81     -- , inf "inimi" := single "inimi" ["inimi" & occurence, "table"]
 
  82     -- , inf "inimp" := single "inimp" ["inimp" & occurence, "ortant"]
 
  83     -- , inf "ininf" := single "inɛ̃" ["ininf" & occurence, "lammation"]
 
  84     -- , inf "inint" := single "inɛ̃t" ["inint" & occurence, "éressant"]
 
  85     -- , inf "inn" := single "in" ["inn" & occurence, "ocent"]
 
  86     -- , inf "ino" := single "ino" ["ino" & occurence, "dore"]
 
  87     -- , inf "inu" := single "inu" ["inu" & occurence, "tile"]
 
  88     -- , inf "ix" := single "iks" ["phén", "ix" & occurence]
 
  89     -- , inf "gine" := single "ʒin" ["an", "gine" & occurence]
 
  90   -- , inf "era" := single "əʁa" ["s", "era" & occurence]
 
  91   -- , inf "erai" := single "əʁɛ" ["s", "erai" & occurence]
 
  94         [ [PronContextBeforeAnyVowel] := LexemePron{lexemePronunciation = "əʁ", lexemeExample = ["mer" & occurence, "ingue"]}
 
  95         , [PronContextBeforeAny] := LexemePron{lexemePronunciation = "ɛʁ", lexemeExample = ["mer" & occurence, "le"]}
 
  97   , inf "erin" := single "əʁɛ̃" ["m", "erin" & occurence, "gue"]
 
 100         [ [PronContextBeforeAnyVowel] := LexemePron{lexemePronunciation = "z", lexemeExample = ["ti", "s" & occurence, "ane"]}
 
 101         , [PronContextBeforeAnySemiVowel] := LexemePron{lexemePronunciation = "z", lexemeExample = ["pari", "s" & occurence, "ienne"]}
 
 102         , [PronContextBeforeAny] := LexemePron{lexemePronunciation = "s", lexemeExample = ["s", "a" & occurence]}
 
 104   , -- , inf "shirt" := single "ʃœʁt" ["shirt" & occurence]
 
 105   , -- , inf "teau" := single "to" ["teau" & occurence]
 
 106     -- , inf "ti" := single "ti" ["ti" & occurence, "gre"]
 
 107   , pre "ukulele" := single "jukulele" ["ukulele" & occurence]
 
 108   , -- , inf "ui" := single "ɥi" ["ling", "ui" & occurence, "stique"]
 
 109   , pre "abrivent" := single "abʁivɑ̃" ["abrivent" & occurence]
 
 110   , pre "adjuvent" := single "adʒyvɑ̃" ["adjuvent" & occurence]
 
 111   , pre "antivent" := single "ɑ̃tivɑ̃" ["antivent" & occurence]
 
 112   , pre "auvent" := single "ovɑ̃" ["auvent" & occurence]
 
 113   , pre "avent" := single "avɑ̃" ["avent" & occurence]
 
 114   , pre "aï" := single "ai" ["c", "aï" & occurence, "man"]
 
 115   , pre "bavent" := single "bavɑ̃" ["bavent" & occurence]
 
 116   , pre "boutavent" := single "butavɑ̃" ["boutavent" & occurence]
 
 117   , pre "bouvent" := single "buvɑ̃" ["bouvent" & occurence]
 
 118   , pre "bénévent" := single "benevɑ̃" ["bénévent" & occurence]
 
 119   , pre "connivent" := single "konivɑ̃" ["connivenr" & occurence]
 
 120   , pre "contrevent" := single "kɔ̃tʁəvɑ̃" ["contrevent" & occurence]
 
 121   , pre "convent" := single "kɔ̃vɑ̃" ["convent" & occurence]
 
 122   , pre "couvent" := single "kuvɑ̃" ["couvent" & occurence]
 
 123   , pre "couvents" := single "kuvɑ̃" ["couvents" & occurence]
 
 124   , pre "engoulevent" := single "ɑ̃gulvɑ̃" ["engoulevent" & occurence]
 
 125   , pre "fervent" := single "fɛʁvɑ̃" ["fervent" & occurence]
 
 126   , pre "frévent" := single "fʁevɑ̃" ["frévent" & occurence]
 
 127   , pre "heurtevent" := single "œʁtəvɑ̃" ["heurtevent" & occurence]
 
 128   , pre "her" := single "ɛʁ" ["her" & occurence, "be"]
 
 129   , pre "hi" := single "i" ["hi" & occurence, "ver"]
 
 130   , pre "ill" := single "il" ["ill" & occurence, "étrisme"]
 
 131   , pre "jack" := single "dʒak" ["jack" & occurence]
 
 132   , pre "jazz" := single "dʒaz" ["jazz" & occurence]
 
 133   , pre "montsurvent" := single "mɔ̃syʁvɑ̃" ["montsurvent" & occurence]
 
 134   , -- , pre "ni" := single "ni" ["ni" & occurence, "ais"]
 
 135     pre "niai" := single "njɛ" ["niai" & occurence, "s"]
 
 136   , pre "paravent" := single "paʁavɑ̃" ["paravent" & occurence]
 
 139         [ [PronContextBeforeAny] := LexemePron{lexemePronunciation = "sɑ̃", lexemeExample = ["sen" & occurence, "t"]}
 
 140         , [PronContextBeforeAnyVowel] := LexemePron{lexemePronunciation = "sen", lexemeExample = ["sen" & occurence, "a"]}
 
 141         -- , inf "a" := LexemePron{lexemePronunciation="sen", lexemeExample=["sen" & occurence, "a"]}
 
 142         -- , inf "e" := LexemePron{lexemePronunciation="sən", lexemeExample=["sen" & occurence, "estre"]}
 
 143         -- , inf "i" := LexemePron{lexemePronunciation="sen", lexemeExample=["sen" & occurence, "ior"]}
 
 144         -- , inf "o" := LexemePron{lexemePronunciation="sen", lexemeExample=["Sen" & occurence, "oueix"]}
 
 145         -- , inf "u" := LexemePron{lexemePronunciation="sen", lexemeExample=[]}
 
 147   , pre "souvent" := single "suvɑ̃" ["souvent" & occurence]
 
 148   , pre "taillevent" := single "tɑjvɑ̃" ["taillevent" & occurence]
 
 149   , pre "tournevent" := single "tuʁnəvɑ̃" ["tournevent" & occurence]
 
 150   , pre "vent" := single "vɑ̃" ["vent" & occurence]
 
 151   , pre "virevent" := single "viʁvɑ̃" ["virevent" & occurence]
 
 152   , pre "volvent" := single "vɔlvɑ̃" ["volvent" & occurence]
 
 153   , pre "évent" := single "evɑ̃" ["évent" & occurence]
 
 154   , pre "œ" := single "œ" ["œ" & occurence, "uf"]
 
 155   , pre "fier" := single "fjɛʁ" ["fier" & occurence]
 
 156   , pre "tier" := single "tjɛʁ" ["tier" & occurence]
 
 160     & foldMap (\(ks, v) -> [(k, v) | k <- ks])
 
 161     & mapFromListCheckingDuplicates
 
 164       Map.singleton PronContextBeforeAny $ LexemePron{lexemePronunciation = pron, lexemeExample = exs}
 
 168         & foldMap (\(ks, v) -> [(k, v) | k <- ks])
 
 169         & mapFromListCheckingDuplicates
 
 172 spec :: HasCallStack => Spec
 
 174   -- Pron.lexerRender $ French.pronunciationDict
 
 175   describe "pronunciation" do
 
 176     -- describe "decomposition" do
 
 177     --  forM_ sentences \sentence ->
 
 178     --    Pron.pronunciationDecompositionTest French.pronunciationDict $ sentence & Text.unpack
 
 179     -- describe "result" do
 
 180     --  forM_ sentences \sentence ->
 
 181     --    Pron.pronunciationResultTest French.pronunciationDict $ sentence & Text.unpack
 
 183       Pron.pronunciationParserTest pronunciationRules sentences
 
 188     around (\k -> SQL.withConnection "data/langs/français/kaikki/wiktionary=fr.lang=fr.sqlite3" k) do
 
 189       outDB <- goldenPath "wiktionary" "sqlite"
 
 190       outDBExists <- IO.doesFileExist outDB & liftIO
 
 191       when (outDBExists) do
 
 192         IO.removeFile outDB & liftIO
 
 195             SQL.withConnection outDB \outConn ->
 
 196               k (wiktConn, outConn)
 
 199           it "check-against-wiktionary" \(wiktConn, outConn) -> do
 
 200             SQL.execute_ outConn $ "PRAGMA journal_mode = OFF"
 
 201             SQL.execute_ outConn $ "PRAGMA synchronous = OFF"
 
 202             SQL.execute_ outConn $ "CREATE TABLE IF NOT EXISTS results (exprLit TEXT NON NULL, wiktBroad TEXT NON NULL, wiktBroadSegments TEXT NON NULL, synthBroad TEXT NON NULL, synthExplain TEXT NON NULL)"
 
 203             SQL.execute_ outConn $ "CREATE INDEX results__exprLit ON results (exprLit);"
 
 204             SQL.execute_ outConn $ "CREATE INDEX results__wiktBroad ON results (wiktBroad);"
 
 205             SQL.execute_ outConn $ "CREATE INDEX results__synthBroad ON results (synthBroad);"
 
 206             SQL.execute_ outConn $ "CREATE TABLE IF NOT EXISTS errors (exprId INTEGER NON NULL, exprLit TEXT NON NULL, error TEXT NON NULL)"
 
 209               "SELECT id,word,sounds FROM wiktionary WHERE lang_code='fr' LIMIT 1000"
 
 214                   , maybeWord :: Maybe Text
 
 215                   , sounds :: [Wiktionary.Sound]
 
 220                       case exprLit & Pron.run French.pronunciationRules of
 
 224                             "INSERT INTO errors (exprId, exprLit, error) VALUES (?,?,?)"
 
 230                           let synthExplain = lexemes <&> (\Pron.Pron{pronInput, pronRule} -> Pron.chars pronInput <> " → " <> show (Pron.rulePron pronRule)) & List.intercalate "; "
 
 231                           let synthBroad = lexemes & foldMap (Pron.pronRule >>> Pron.rulePron >>> Pron.pronunciationText)
 
 232                           forM_ sounds \Wiktionary.Sound{..} -> do
 
 233                             -- IO.hPrint IO.stderr (i, ident::Int, maybeWord)
 
 235                               Just (IPA.IPAPhons exprIPAs) -> do
 
 237                                   IPA.IPAPhonemic exprBroad -> do
 
 238                                     when (i `mod` 5000 == 0) do
 
 239                                       IO.hPrint IO.stderr (i, exprLit, exprBroad)
 
 242                                       "INSERT INTO results(exprLit, wiktBroad, wiktBroadSegments, synthBroad, synthExplain) VALUES(?,?,?,?,?);"
 
 244                                       , exprBroad & IPA.ipaWordsToText Nothing
 
 245                                       , exprBroad & IPA.dropSupraSegmentalFeatures & IPA.ipaWordsToText Nothing
 
 249                                   IPA.IPAPhonError (_errMsg, _err) -> return ()
 
 257 mangleSupraSegmentalFeatures :: [IPA.Syllable []] -> [[IPA.Segment]]
 
 258 mangleSupraSegmentalFeatures = \case
 
 260   IPA.Syllable syl : ts -> syl : mangleSupraSegmentalFeatures ts
 
 261   IPA.WithSuprasegmentalFeature IPA.Linking syl : ts ->
 
 262     case mangleSupraSegmentalFeatures ts of
 
 263       [] -> [dropSupraSegmentalFeatures syl]
 
 264       x : xs -> (dropSupraSegmentalFeatures syl <> x) : xs
 
 265   IPA.WithSuprasegmentalFeature _feat syl : xs ->
 
 266     mangleSupraSegmentalFeatures (syl : xs)
 
 269 -- cardsHtml "syllabes" $ French.syllablesTable & French.syllablesTableToHTML
 
 271 sentences :: Map Pron.InputLexemes Pron.Pronunciation
 
 277     -- , ["couvent"{exampleLiteralMeaning = "couver"}]
 
 278     -- , ["couvent"{exampleLiteralMeaning = "monastère"}]
 
 285     & Map.unionsWith (curry errorShow)
 
 286 pronunciationRules :: Pron.Table
 
 288   [ "Escherichia" := Rule{rulePron = ["E" := "ɛ", "sche" := "ʃe", "ri" := "ʁi", "chia" := "ʃja"], ruleExamples = ["Escherichia" := "ɛ.ʃe.ʁi.ʃja"]}
 
 289   , "Maël" := Rule{rulePron = ["ma" := "ma", "ël" := "ɛl"], ruleExamples = ["Maël" := "ma.ɛl"]}
 
 290   , "a" := Rule{rulePron = ["a" := "a"], ruleExamples = ["allume" := "a.lym"]}
 
 291   , "au" := Rule{rulePron = ["au" := "o"], ruleExamples = ["au" := "o"]}
 
 292   , "à" := Rule{rulePron = ["à" := "a"], ruleExamples = ["à" := "a"]}
 
 293   , "arc" := Rule{rulePron = ["arc" := "aʁk"], ruleExamples = ["arc" := "aʁk"]}
 
 294   , word "l" := Rule{rulePron = ["l" := "l"], ruleExamples = ["l" := "l"]}
 
 295   , "ancrage" := Rule{rulePron = ["an" := "ɑ̃", "crage" := "kʁaʒ"], ruleExamples = ["ancrage" := "ɑ̃.kʁaʒ"]}
 
 296   , "ancre" := Rule{rulePron = ["ancre" := "ɑ̃kʁ"], ruleExamples = ["ancre" := "ɑ̃kʁ"]}
 
 297   , "ba" := Rule{rulePron = ["ba" := "ba"], ruleExamples = ["bateau" := "ba.to"]}
 
 298   , "bi" := Rule{rulePron = ["bi" := "bi"], ruleExamples = ["biberon" := "bi.bə.ʁɔ̃"]}
 
 299   , "be" := Rule{rulePron = ["be" := "bə"], ruleExamples = ["biberon" := "bi.bə.ʁɔ̃"]}
 
 300   , "bam" <> [LexemeConsonant] := Rule{rulePron = ["bam" <> [LexemeConsonant] := "bɑ̃"], ruleExamples = ["bambi" := "bɑ̃.bi"]}
 
 301   , "bal" := Rule{rulePron = ["bal" := "bal"], ruleExamples = ["bal" := "bal"]}
 
 302   , "balle" := Rule{rulePron = ["balle" := "bal"], ruleExamples = ["balle" := "bal"]}
 
 303   , "bain" := Rule{rulePron = ["bain" := "bɛ̃"], ruleExamples = ["bain" := "bɛ̃"]}
 
 304   , "bile" := Rule{rulePron = ["bile" := "bil"], ruleExamples = ["immobile" := "i.mɔ.bil"]}
 
 305   , "bo" := Rule{rulePron = ["bo" := "bɔ"], ruleExamples = ["bobo" := "bɔ.bo"]}
 
 306   , "boi" := Rule{rulePron = ["boi" := "bwa"], ruleExamples = ["boit" := "bwa"]}
 
 307   , "boué" := Rule{rulePron = ["boué" := "bwe"], ruleExamples = ["boué" := "bwe"]}
 
 308   , "bra" := Rule{rulePron = ["bra" := "bʁa"], ruleExamples = ["braguette" := "bʁa.gɛt"]}
 
 309   , "brachio" := Rule{rulePron = ["bra" := "bʁa", "chio" := "kjo"], ruleExamples = ["brachiosaure" := "bʁa.kjo.zɔʁ"]}
 
 310   , "guette" := Rule{rulePron = ["guette" := "gɛt"], ruleExamples = ["braguette" := "bʁa.gɛt"]}
 
 311   , "bri" := Rule{rulePron = ["bri" := "bʁi"], ruleExamples = ["sabrina" := "sa.bʁi.na"]}
 
 312   , "brou" := Rule{rulePron = ["brou" := "bʁu"], ruleExamples = ["brouette" := "bʁu.ɛt"]}
 
 313   , "ca" := Rule{rulePron = ["ca" := "ka"], ruleExamples = ["calla" := "ka.la"]}
 
 314   , "cha" := Rule{rulePron = ["cha" := "ʃa"], ruleExamples = ["chamotté" := "ʃa.mɔ.te"]}
 
 315   , "cham" <> [LexemeConsonant] := Rule{rulePron = ["cham" := "ʃɑ̃"], ruleExamples = ["champignon" := "ʃɑ̃.pi.ɲɔ̃"]}
 
 316   , "chon" := Rule{rulePron = ["chon" := "ʃɔ̃"], ruleExamples = ["cochon" := "kɔ.ʃɔ̃"]}
 
 317   , "ron" := Rule{rulePron = ["ron" := "ʁɔ̃"], ruleExamples = ["biberon" := "bi.bə.ʁɔ̃"]}
 
 318   , "rap" := Rule{rulePron = ["rap" := "ʁap"], ruleExamples = ["raptor" := "ʁap.tɔʁ"]}
 
 319   , "chry" := Rule{rulePron = ["chry" := "kʁi"], ruleExamples = ["chrysanthème" := "kʁi.zɑ̃.tɛm"]}
 
 320   , "ci" := Rule{rulePron = ["ci" := "si"], ruleExamples = ["mucidule" := "my.si.dyl"]}
 
 321   , "cla" := Rule{rulePron = ["cla" := "kla"], ruleExamples = ["éclat" := "e.kla"]}
 
 322   , "clate" := Rule{rulePron = ["clate" := "klat"], ruleExamples = ["éclate" := "e.klat"]}
 
 323   , "clatent" := Rule{rulePron = ["clatent" := "klat"], ruleExamples = ["éclatent" := "e.klat"]}
 
 324   , "cinthe" := Rule{rulePron = ["cinthe" := "sɛ̃t"], ruleExamples = ["jacinthe" := "ʒa.sɛ̃t"]}
 
 325   , "co" := Rule{rulePron = ["co" := "kɔ"], ruleExamples = ["cochon" := "kɔ.ʃɔ̃"]}
 
 326   , "diplodocus" := Rule{rulePron = ["di" := "di", "plo" := "plɔ", "do" := "dɔ", "cus" := "kys"], ruleExamples = ["diplodocus" := "di.plɔ.dɔ.kys"]}
 
 327   , "di" := Rule{rulePron = ["di" := "di"], ruleExamples = ["diplodocus" := "di.plɔ.dɔ.kys"]}
 
 328   , "de" := Rule{rulePron = ["de" := "də"], ruleExamples = ["demi" := "də.mi"]}
 
 329   , "deau" := Rule{rulePron = ["deau" := "do"], ruleExamples = ["rideau" := "ʁi.do"]}
 
 330   , "dent" := Rule{rulePron = ["dent" := "dɑ̃"], ruleExamples = ["dent" := "dɑ̃"]}
 
 331   , "deuil" := Rule{rulePron = ["deuil" := "dœj"], ruleExamples = ["deuil" := "dœj"]}
 
 332   , "do" := Rule{rulePron = ["do" := "dɔ"], ruleExamples = ["doré" := "dɔ.ʁe"]}
 
 333   , "don" := Rule{rulePron = ["don" := "dɔ̃"], ruleExamples = ["don" := "dɔ̃"]}
 
 334   , "drai" := Rule{rulePron = ["drai" := "dʁɛ"], ruleExamples = ["draisienne" := "dʁɛ.zjɛn"]}
 
 335   , "du" := Rule{rulePron = ["du" := "dy"], ruleExamples = ["du" := "dy"]}
 
 336   , "dule" := Rule{rulePron = ["dule" := "dyl"], ruleExamples = ["mucidule" := "my.si.dyl"]}
 
 337   , "an" <> [LexemeConsonant] := Rule{rulePron = ["an" <> [LexemeConsonant] := "ɑ̃"], ruleExamples = ["an" := "ɑ̃"]}
 
 338   , "en" <> [LexemeConsonant] := Rule{rulePron = ["en" <> [LexemeConsonant] := "ɑ̃"], ruleExamples = ["en" := "ɑ̃"]}
 
 339   , word "an" := Rule{rulePron = ["an" := "ɑ̃"], ruleExamples = ["an" := "ɑ̃"]}
 
 340   , word "ans" := Rule{rulePron = ["ans" := "ɑ̃"], ruleExamples = ["ans" := "ɑ̃"]}
 
 341   , word "en" := Rule{rulePron = ["en" := "ɑ̃"], ruleExamples = ["en" := "ɑ̃"]}
 
 342   , "ette" := Rule{rulePron = ["ette" := "ɛt"], ruleExamples = ["brouette" := "bʁu.ɛt"]}
 
 343   , ending "blanc" := Rule{rulePron = [ending "blanc" := "blɑ̃"], ruleExamples = ["blanc" := "blɑ̃"]}
 
 344   , "blanche" := Rule{rulePron = ["blanche" := "blɑ̃ʃ"], ruleExamples = ["blanche" := "blɑ̃ʃ"]}
 
 345   , "blan" <> [LexemeConsonant] := Rule{rulePron = ["blan" <> [LexemeConsonant] := "blɑ̃"], ruleExamples = ["blanc" := "blɑ̃"]}
 
 346   , "che" := Rule{rulePron = ["che" := "ʃə"], ruleExamples = ["cheval" := "ʃə.val"]}
 
 347   , "val" := Rule{rulePron = ["val" := "val"], ruleExamples = ["cheval" := "ʃə.val"]}
 
 348   , "fait" := Rule{rulePron = ["fait" := "fɛ"], ruleExamples = ["fait" := "fɛ"]}
 
 349   , "fa" <> [LexemeConsonant] := Rule{rulePron = ["fa" <> [LexemeConsonant] := "fa"], ruleExamples = ["famille" := "fa.mij"]}
 
 350   , "ffa" <> [LexemeConsonant] := Rule{rulePron = ["ffa" <> [LexemeConsonant] := "fa"], ruleExamples = ["giraffatitan" := "ʒi.ʁa.fa.ti.tɑ̃"]}
 
 351   , "da" <> [LexemeConsonant] := Rule{rulePron = ["da" <> [LexemeConsonant] := "da"], ruleExamples = ["mandarine" := "mɑ̃.da.ʁin"]}
 
 352   , "gin" <> [LexemeConsonant] := Rule{rulePron = ["gin" := "ʒɛ̃"], ruleExamples = ["gingembre" := "ʒɛ̃.ʒɑ̃bʁ"]}
 
 353   , "gembre" := Rule{rulePron = ["gembre" := "ʒɑ̃bʁ"], ruleExamples = ["gingembre" := "ʒɛ̃.ʒɑ̃bʁ"]}
 
 354   , "mille" := Rule{rulePron = ["mille" := "mij"], ruleExamples = ["famille" := "fa.mij"]}
 
 355   , "man" <> [LexemeConsonant] := Rule{rulePron = ["man" <> [LexemeConsonant] := "mɑ̃"], ruleExamples = ["mandarine" := "mɑ̃.da.ʁin"]}
 
 356   , "fram" <> [LexemeConsonant] := Rule{rulePron = ["fram" <> [LexemeConsonant] := "fʁɑ̃"], ruleExamples = ["framboise" := "fʁɑ̃.bwaz"]}
 
 357   , "boise" := Rule{rulePron = ["boise" := "bwaz"], ruleExamples = ["framboise" := "fʁɑ̃.bwaz"]}
 
 358   , "hibiscus" := Rule{rulePron = ["hi" := "i", "bis" := "bis", "cus" := "kys"], ruleExamples = ["hibiscus" := "i.bis.kys"]}
 
 359   , word "mille" := Rule{rulePron = [word "mille" := "mil"], ruleExamples = ["mille" := "mil"]}
 
 360   , "feu" := Rule{rulePron = ["feu" := "fø"], ruleExamples = ["feu" := "fø"]}
 
 361   , "four" := Rule{rulePron = ["four" := "fuʁ"], ruleExamples = ["four" := "fuʁ"]}
 
 362   , "feuille" := Rule{rulePron = ["feuille" := "fœj"], ruleExamples = ["feuille" := "fœj"]}
 
 363   , "font" := Rule{rulePron = ["font" := "fɔ̃"], ruleExamples = ["font" := "fɔ̃"]}
 
 364   , "fraise" := Rule{rulePron = ["fraise" := "fʁɛz"], ruleExamples = ["fraise" := "fʁɛz"]}
 
 365   , "ga" := Rule{rulePron = ["ga" := "ga"], ruleExamples = ["alligator" := "a.li.ga.tɔʁ"]}
 
 366   , "ge" := Rule{rulePron = ["ge" := "ʒə"], ruleExamples = ["gelée" := "ʒə.le"]}
 
 367   , "grue" := Rule{rulePron = ["grue" := "gʁy"], ruleExamples = ["grue" := "gʁy"]}
 
 368   , "sque" := Rule{rulePron = ["sque" := "skə"], ruleExamples = ["squelette" := "skə.lɛt"]}
 
 369   , "lette" := Rule{rulePron = ["lette" := "lɛt"], ruleExamples = ["squelette" := "skə.lɛt"]}
 
 370   , "geoir" := Rule{rulePron = ["geoir" := "ʒwaʁ"], ruleExamples = ["plongeoir" := "plɔ̃.ʒwaʁ"]}
 
 371   , "geur" := Rule{rulePron = ["geur" := "ʒœʁ"], ruleExamples = ["nageur" := "na.ʒœʁ"]}
 
 372   , "geuse" := Rule{rulePron = ["geuse" := "ʒøz"], ruleExamples = ["nageuse" := "na.ʒøz"]}
 
 373   , "gi" <> [LexemeConsonant] := Rule{rulePron = ["gi" <> [LexemeConsonant] := "ʒi"], ruleExamples = ["gilet" := "ʒi.lɛ"]}
 
 374   , "glace" := Rule{rulePron = ["glace" := "glas"], ruleExamples = ["glace" := "glas"]}
 
 375   , "gnon" := Rule{rulePron = ["gnon" := "ɲɔ̃"], ruleExamples = ["champignon" := "ʃɑ̃.pi.ɲɔ̃"]}
 
 376   , "gou" := Rule{rulePron = ["gou" := "gu"], ruleExamples = ["gouttière" := "gu.tjɛʁ"]}
 
 377   , "gue" := Rule{rulePron = ["gue" := "gə"], ruleExamples = ["marguerite" := "maʁ.gə.ʁit"]}
 
 378   , "gâ" := Rule{rulePron = ["gâ" := "ga"], ruleExamples = ["gâté" := "ga.te"]}
 
 379   , "gé" := Rule{rulePron = ["gé" := "ʒe"], ruleExamples = ["orangé" := "ɔ.ʁɑ̃.ʒe"]}
 
 380   , "gée" := Rule{rulePron = ["gée" := "ʒe"], ruleExamples = ["orangée" := "ɔ.ʁɑ̃.ʒe"]}
 
 381   , "hi" := Rule{rulePron = ["hi" := "i"], ruleExamples = ["hippopotame" := "i.pɔ.pɔ.tam"]}
 
 382   , "ppo" := Rule{rulePron = ["ppo" := "pɔ"], ruleExamples = ["hippopotame" := "i.pɔ.pɔ.tam"]}
 
 383   , "tame" := Rule{rulePron = ["tame" := "tam"], ruleExamples = ["hippopotame" := "i.pɔ.pɔ.tam"]}
 
 384   , "ho" := Rule{rulePron = ["ho" := "o"], ruleExamples = ["homo" := "o.mo"]}
 
 385   , "hêtre" := Rule{rulePron = ["hêtre" := "ɛtʁ"], ruleExamples = ["hêtre" := "ɛtʁ"]}
 
 386   , "é" := Rule{rulePron = ["é" := "e"], ruleExamples = ["éclat" := "e.kla"]}
 
 387   , "i" := Rule{rulePron = ["i" := "i"], ruleExamples = ["ibis" := "i.bis"]}
 
 388   , "illet" := Rule{rulePron = ["illet" := "jɛ"], ruleExamples = ["œillet" := "œ.jɛ"]}
 
 389   , "illo" := Rule{rulePron = ["illo" := "jo"], ruleExamples = ["maillot" := "ma.jo"]}
 
 390   , "ja" := Rule{rulePron = ["ja" := "ʒa"], ruleExamples = ["jacinthe" := "ʒa.sɛ̃t"]}
 
 391   , "jas" := Rule{rulePron = ["jas" := "ʒas"], ruleExamples = ["jasmin" := "ʒas.mɛ̃"]}
 
 392   , "je" := Rule{rulePron = ["je" := "ʒə"], ruleExamples = ["jetée" := "ʒə.te"]}
 
 393   , "jon" <> [LexemeConsonant] := Rule{rulePron = ["jon" := "ʒɔ̃"], ruleExamples = ["jonquille" := "ʒɔ̃.kij"]}
 
 394   , "ju" := Rule{rulePron = ["ju" := "ʒy"], ruleExamples = ["judo" := "ʒy.do"]}
 
 395   , "kan" <> [LexemeConsonant] := Rule{rulePron = ["kan" <> [LexemeConsonant] := "kɑ̃"], ruleExamples = ["kangourou" := "kɑ̃.gu.ʁu"]}
 
 396   , "ky" := Rule{rulePron = ["ky" <> [LexemeConsonant] := "ki"], ruleExamples = ["ankylosaurus" := "ɑ̃.ki.lɔ.zɔ.ʁys"]}
 
 397   , "gou" := Rule{rulePron = ["gou" := "gu"], ruleExamples = ["kangourou" := "kɑ̃.gu.ʁu"]}
 
 398   , "rou" := Rule{rulePron = ["rou" := "ʁu"], ruleExamples = ["kangourou" := "kɑ̃.gu.ʁu"]}
 
 399   , "rousse" := Rule{rulePron = ["rousse" := "ʁus"], ruleExamples = ["rousse" := "ʁus"]}
 
 400   , "la" := Rule{rulePron = ["la" := "la"], ruleExamples = ["la" := "la"]}
 
 401   , "lac" := Rule{rulePron = ["lac" := "lak"], ruleExamples = ["lac" := "lak"]}
 
 402   , "lai" := Rule{rulePron = ["lai" := "lɛ"], ruleExamples = ["laineux" := "lɛ.nø"]}
 
 403   , ending "neux" := Rule{rulePron = ["neux" := "nø"], ruleExamples = ["laineux" := "lɛ.nø"]}
 
 404   , "langue" := Rule{rulePron = ["langue" := "lɑ̃g"], ruleExamples = ["langue" := "lɑ̃g"]}
 
 405   , "le" := Rule{rulePron = ["le" := "lə"], ruleExamples = ["le" := "lə"]}
 
 406   , "li" := Rule{rulePron = ["li" := "li"], ruleExamples = ["pissenlit" := "pi.sɑ̃.li"]}
 
 407   , "lier" := Rule{rulePron = ["lier" := "lje"], ruleExamples = ["voilier" := "vwa.lje"]}
 
 408   , "lin" <> [LexemeBorder] := Rule{rulePron = ["lin" := "lɛ̃"], ruleExamples = ["merlin" := "mɛʁ.lɛ̃"]}
 
 409   , "lion" := Rule{rulePron = ["lion" := "ljɔ̃"], ruleExamples = ["lion" := "ljɔ̃"]}
 
 410   , "lionne" := Rule{rulePron = ["lionne" := "ljɔ̃n"], ruleExamples = ["lionne" := "ljɔ̃n"]}
 
 411   , "lla" := Rule{rulePron = ["lla" := "la"], ruleExamples = ["calla" := "ka.la"]}
 
 412   , "lli" := Rule{rulePron = ["lli" := "li"], ruleExamples = ["alligator" := "a.li.ga.tɔʁ"]}
 
 413   , "llon" := Rule{rulePron = ["llon" := "jɔ̃"], ruleExamples = ["papillon" := "pa.pi.jɔ̃"]}
 
 414   , "llume" := Rule{rulePron = ["llume" := "lym"], ruleExamples = ["allume" := "a.lym", "allume-feu" := "a.lym.fø"]}
 
 415   , "lu" := Rule{rulePron = ["lu" := "ly"], ruleExamples = ["révolution" := "ʁe.vɔ.ly.sjɔ̃"]}
 
 416   , "lo" := Rule{rulePron = ["lo" := "lɔ"], ruleExamples = ["logiciel" := "lɔ.ʒi.sjɛl"]}
 
 417   , "gi" := Rule{rulePron = ["gi" := "ʒi"], ruleExamples = ["logiciel" := "lɔ.ʒi.sjɛl"]}
 
 418   , "ciel" := Rule{rulePron = ["ciel" := "sjɛl"], ruleExamples = ["logiciel" := "lɔ.ʒi.sjɛl"]}
 
 419   , "ly" := Rule{rulePron = ["ly" := "li"], ruleExamples = ["polypore" := "pɔ.li.pɔʁ"]}
 
 420   , "lé" := Rule{rulePron = ["lé" := "le"], ruleExamples = ["gelé" := "ʒə.le"]}
 
 421   , "leur" := Rule{rulePron = ["leur" := "lœʁ"], ruleExamples = ["leur" := "lœʁ"]}
 
 422   , "griffe" := Rule{rulePron = ["griffe" := "gʁif"], ruleExamples = ["griffe" := "gʁif"]}
 
 423   , "ra" := Rule{rulePron = ["ra" := "ʁa"], ruleExamples = ["ra" := "ʁa"]}
 
 424   , "ma" := Rule{rulePron = ["ma" := "ma"], ruleExamples = ["ma" := "ma"]}
 
 425   , "mar" <> [LexemeConsonant] := Rule{rulePron = ["mar" <> [LexemeConsonant] := "maʁ"], ruleExamples = ["marguerite" := "maʁ.gə.ʁit"]}
 
 426   , "masque" := Rule{rulePron = ["masque" := "mask"], ruleExamples = ["masque" := "mask"]}
 
 427   , "mer" <> [LexemeConsonant] := Rule{rulePron = ["mer" <> [LexemeConsonant] := "mɛʁ"], ruleExamples = ["merlin" := "mɛʁ.lɛ̃"]}
 
 428   , "mé" := Rule{rulePron = ["mé" := "me"], ruleExamples = ["médicament" := "me.di.ka.mɑ̃"]}
 
 429   , "méde" := Rule{rulePron = ["méde" := "med"], ruleExamples = ["médecine" := "med.sin"]}
 
 430   , ending "cine" := Rule{rulePron = [ending "cine" := "sin"], ruleExamples = ["médecine" := "med.sin"]}
 
 431   , "mi" := Rule{rulePron = ["mi" := "mi"], ruleExamples = ["demi" := "də.mi"]}
 
 432   , "miel" := Rule{rulePron = ["miel" := "mjɛl"], ruleExamples = ["miel" := "mjɛl"]}
 
 433   , "mmo" := Rule{rulePron = ["mmo" := "mɔ"], ruleExamples = ["immobile" := "i.mɔ.bil"]}
 
 434   , "mo" := Rule{rulePron = ["mo" := "mɔ"], ruleExamples = ["moto" := "mɔ.to"]}
 
 435   , -- , "mon" := Rule{rulePron = ["mon" := "mɔ̃"], ruleExamples = ["montre" := "mɔ̃"]}
 
 436     "montre" := Rule{rulePron = ["montre" := "mɔ̃tʁ"], ruleExamples = ["montre" := "mɔ̃tʁ"]}
 
 437   , "montrent" := Rule{rulePron = ["montrent" := "mɔ̃tʁ"], ruleExamples = ["montrent" := "mɔ̃tʁ"]}
 
 438   , -- , "tre" := Rule{rulePron = ["tre" := "tʁ"], ruleExamples = ["montre" := "tʁ"]}
 
 439     "mu" := Rule{rulePron = ["mu" := "my"], ruleExamples = ["mucidule" := "my.si.dyl"]}
 
 440   , ending "ment" := Rule{rulePron = ["ment" := "mɑ̃"], ruleExamples = ["ment" := "mɑ̃"]}
 
 441   , "mène" := Rule{rulePron = ["mène" := "mɛn"], ruleExamples = ["promène" := "pʁɔ.mɛn"]}
 
 442   , "mènent" := Rule{rulePron = ["mènent" := "mɛn"], ruleExamples = ["promènent" := "pʁɔ.mɛn"]}
 
 443   , "na" := Rule{rulePron = ["na" := "na"], ruleExamples = ["na" := "na"]}
 
 444   , "nette" := Rule{rulePron = ["nette" := "nɛt"], ruleExamples = ["lunette" := "ly.nɛt", "lunettes" := "ly.nɛt"]}
 
 445   , "niche" := Rule{rulePron = ["niche" := "niʃ"], ruleExamples = ["péniche" := "pe.niʃ"]}
 
 446   , "nnet" := Rule{rulePron = ["nnet" := "nɛ"], ruleExamples = ["bonnet" := "bɔ.nɛ"]}
 
 447   , "noc" := Rule{rulePron = ["noc" := "nɔk"], ruleExamples = ["nocturne" := "nɔk.tyʁn"]}
 
 448   , "nou" := Rule{rulePron = ["nou" := "nu"], ruleExamples = ["nourrit" := "nu.ʁi"]}
 
 449   , "mmouth" := Rule{rulePron = ["mmouth" := "mut"], ruleExamples = ["mammouth" := "ma.mut"]}
 
 450   , "o" := Rule{rulePron = ["o" := "ɔ"], ruleExamples = ["orange" := "ɔ.ʁɑ̃ʒ"]}
 
 451   , "ou" := Rule{rulePron = ["ou" := "u"], ruleExamples = ["ou" := "u"]}
 
 452   , "pa" := Rule{rulePron = ["pa" := "pa"], ruleExamples = ["papillon" := "pa.pi.jɔ̃"]}
 
 453   , "paque" := Rule{rulePron = ["paque" := "pak"], ruleExamples = ["paquebot" := "pak.bo"]}
 
 454   , "passe" := Rule{rulePron = ["passe" := "pas"], ruleExamples = ["passerelle" := "pas.ʁɛl"]}
 
 455   , "pi" := Rule{rulePron = ["pi" := "pi"], ruleExamples = ["papillon" := "pa.pi.jɔ̃"]}
 
 456   , "pi" := Rule{rulePron = ["pi" := "pi"], ruleExamples = ["pissenlit" := "pi.sɑ̃.li"]}
 
 457   , "plon" := Rule{rulePron = ["plon" := "plɔ̃"], ruleExamples = ["plongeoir" := "plɔ̃.ʒwaʁ"]}
 
 458   , "pneu" := Rule{rulePron = ["pneu" := "pnø"], ruleExamples = ["pneumatique" := "pnø.ma.tik"]}
 
 459   , "po" := Rule{rulePron = ["po" := "pɔ"], ruleExamples = ["polypore" := "pɔ.li.pɔʁ"]}
 
 460   , "foin" := Rule{rulePron = ["foin" := "fwɛ̃"], ruleExamples = ["foin" := "fwɛ̃"]}
 
 461   , "pon" := Rule{rulePron = ["pon" := "pɔ̃"], ruleExamples = ["pont" := "pɔ̃"]}
 
 462   , "pore" := Rule{rulePron = ["pore" := "pɔʁ"], ruleExamples = ["polypore" := "pɔ.li.pɔʁ"]}
 
 463   , "porte" := Rule{rulePron = ["porte" := "pɔʁt"], ruleExamples = ["porte" := "pɔʁt"]}
 
 464   , "pro" := Rule{rulePron = ["pro" := "pʁɔ"], ruleExamples = ["promène" := "pʁɔ.mɛn"]}
 
 465   , "pâ" := Rule{rulePron = ["pâ" := "pa"], ruleExamples = ["pâquerette" := "pa.kʁɛt"]} -- ɑ
 
 466   , "pé" := Rule{rulePron = ["pé" := "pe"], ruleExamples = ["péniche" := "pe.niʃ"]}
 
 467   , "que" := Rule{rulePron = ["que" := "kə"], ruleExamples = ["querelle" := "kə.ʁɛl"]}
 
 468   , "querette" := Rule{rulePron = ["querette" := "kʁɛt"], ruleExamples = ["pâquerette" := "pa.kʁɛt"]}
 
 469   , "queuse" := Rule{rulePron = ["queuse" := "køz"], ruleExamples = ["visqueuse" := "vis.køz"]}
 
 470   , "quille" := Rule{rulePron = ["quille" := "kij"], ruleExamples = ["jonquille" := "ʒɔ̃.kij"]}
 
 471   , "quipe" := Rule{rulePron = ["quipe" := "kip"], ruleExamples = ["équipe" := "e.kip"]}
 
 472   , "range" := Rule{rulePron = ["range" := "ʁɑ̃ʒ"], ruleExamples = ["orange" := "ɔ.ʁɑ̃ʒ"]}
 
 473   , "rangent" := Rule{rulePron = ["rangent" := "ʁɑ̃ʒ"], ruleExamples = ["rangent" := "ʁɑ̃ʒ"]}
 
 474   , "ran" <> [LexemeConsonant] := Rule{rulePron = ["ran" <> [LexemeConsonant] := "ʁɑ̃"], ruleExamples = ["orangé" := "ɔ.ʁɑ̃.ʒe"]}
 
 475   , ending "ran" := Rule{rulePron = [ending "ran" := "ʁɑ̃"], ruleExamples = ["tyran" := "ti.ʁɑ̃"]}
 
 476   , "rann" := Rule{rulePron = ["rann" := "ʁan"], ruleExamples = ["tyrannosaure" := "ti.ʁa.nɔ.zɔʁ"]}
 
 477   , "ranno" := Rule{rulePron = ["ra" := "ʁa", "nno" := "nɔ"], ruleExamples = ["tyrannosaure" := "ti.ʁa.nɔ.zɔʁ"]}
 
 478   , "relle" := Rule{rulePron = ["relle" := "ʁɛl"], ruleExamples = ["passerelle" := "pas.ʁɛl"]}
 
 479   , -- , "ra" := Rule{rulePron = ["ra" := "ʁa"], ruleExamples = ["girafe" := "ʒi.ʁaf"]}
 
 480     "rafe" := Rule{rulePron = ["rafe" := "ʁaf"], ruleExamples = ["girafe" := "ʒi.ʁaf"]}
 
 481   , "aigle" := Rule{rulePron = ["aigle" := "ɛgl"], ruleExamples = ["aigle" := "ɛgl"]}
 
 482   , "cor" <> [LexemeConsonant] := Rule{rulePron = ["cor" <> [LexemeConsonant] := "kɔʁ"], ruleExamples = ["corbeau" := "kɔʁ.bo"]}
 
 483   , "ri" := Rule{rulePron = ["ri" := "ʁi"], ruleExamples = ["rideau" := "ʁi.do"]}
 
 484   , "rhi" := Rule{rulePron = ["rhi" := "ʁi"], ruleExamples = ["rhinocéros" := "ʁi.nɔ.se.ʁɔs"]}
 
 485   , "no" := Rule{rulePron = ["no" := "nɔ"], ruleExamples = ["rhinocéros" := "ʁi.nɔ.se.ʁɔs"]}
 
 486   , "cé" := Rule{rulePron = ["cé" := "se"], ruleExamples = ["rhinocéros" := "ʁi.nɔ.se.ʁɔs"]}
 
 487   , "rhinocéros" := Rule{rulePron = ["rhi" := "ʁi", "no" := "nɔ", "cé" := "se", "ros" <> [LexemeMeaning "animal"] := "ʁɔs"], ruleExamples = ["rhinocéros" := "ʁi.nɔ.se.ʁɔs"]}
 
 488   , "no" := Rule{rulePron = ["no" := "nɔ"], ruleExamples = ["rhinocéros" := "ʁi.nɔ.se.ʁɔs"]}
 
 489   , "cé" := Rule{rulePron = ["cé" := "se"], ruleExamples = ["rhinocéros" := "ʁi.nɔ.se.ʁɔs"]}
 
 490   , "rine" := Rule{rulePron = ["rine" := "ʁin"], ruleExamples = ["marine" := "ma.ʁin"]}
 
 491   , "rite" := Rule{rulePron = ["rite" := "ʁit"], ruleExamples = ["marguerite" := "maʁ.gə.ʁit"]}
 
 492   , "ro" := Rule{rulePron = ["ro" := "ʁɔ"], ruleExamples = ["robot" := "ʁɔ.bo"]}
 
 493   , "rex" := Rule{rulePron = ["rex" := "ʁɛks"], ruleExamples = ["rex" := "ʁɛks"]}
 
 494   , "tro" := Rule{rulePron = ["tro" := "tʁɔ"], ruleExamples = ["dimétrodon" := "di.me.tʁɔ.dɔ̃"]}
 
 495   , "kro" := Rule{rulePron = ["kro" := "kʁɔ"], ruleExamples = ["kronosaurus" := "kʁɔ.nɔ.zɔ.ʁys"]}
 
 496   , "rose" := Rule{rulePron = ["rose" := "ʁɔz"], ruleExamples = ["rose" := "ʁɔz"]}
 
 497   , "rou" := Rule{rulePron = ["rou" := "ʁu"], ruleExamples = ["rouler" := "ʁu.le"]}
 
 498   , "rouge" := Rule{rulePron = ["rouge" := "ʁuʒ"], ruleExamples = ["rouge" := "ʁuʒ"]}
 
 499   , "rri" := Rule{rulePron = ["rri" := "ʁi"], ruleExamples = ["nourrit" := "nu.ʁi"]}
 
 500   , "ré" := Rule{rulePron = ["ré" := "ʁe"], ruleExamples = ["révolution" := "ʁe.vɔ.ly.sjɔ̃"]}
 
 501   , "sa" := Rule{rulePron = ["sa" := "sa"], ruleExamples = ["satellite" := "sa.te.lit"]}
 
 502   , begining "singe" := Rule{rulePron = [begining "singe" := "sɛ̃ʒ"], ruleExamples = ["singe" := "sɛ̃ʒ"]}
 
 503   , "buse" := Rule{rulePron = ["buse" := "byz"], ruleExamples = ["buse" := "byz"]}
 
 504   , "bulle" := Rule{rulePron = ["bulle" := "byl"], ruleExamples = ["bulle" := "byl"]}
 
 505   , "tigre" := Rule{rulePron = ["tigre" := "tigʁ"], ruleExamples = ["tigre" := "tigʁ"]}
 
 506   , "tigresse" := Rule{rulePron = ["ti" := "ti", "gresse" := "gʁɛs"], ruleExamples = ["tigresse" := "ti.gʁɛs"]}
 
 507   , "lombe" := Rule{rulePron = ["lombe" := "lɔ̃b"], ruleExamples = ["colombe" := "kɔ.lɔ̃b"]}
 
 508   , "sauve" := Rule{rulePron = ["sauve" := "sov"], ruleExamples = ["sauvetage" := "sov.taʒ"]}
 
 509   , "scine" := Rule{rulePron = ["scine" := "sin"], ruleExamples = ["piscine" := "pi.sin"]}
 
 510   , "short" := Rule{rulePron = ["short" := "ʃɔʁt"], ruleExamples = ["short" := "ʃɔʁt"]}
 
 511   , "ssen" := Rule{rulePron = ["ssen" := "sɑ̃"], ruleExamples = ["pissenlit" := "pi.sɑ̃.li"]}
 
 512   , "cha" := Rule{rulePron = ["cha" := "ʃa"], ruleExamples = ["cha" := "ʃa"]}
 
 513   , "chasse" := Rule{rulePron = ["chasse" := "ʃas"], ruleExamples = ["chasse" := "ʃas"]}
 
 514   , "chassent" := Rule{rulePron = ["chassent" := "ʃas"], ruleExamples = ["chassent" := "ʃas"]}
 
 515   , "sur" := Rule{rulePron = ["sur" := "syʁ"], ruleExamples = ["sur" := "syʁ"]}
 
 516   , "smi" := Rule{rulePron = ["smi" := "smi"], ruleExamples = ["smilodon" := "smi.lɔ.dɔ̃"]}
 
 517   , "ta" := Rule{rulePron = ["ta" := "ta"], ruleExamples = ["ta" := "ta"]}
 
 518   , "tage" := Rule{rulePron = ["tage" := "taʒ"], ruleExamples = ["sauvetage" := "sov.taʒ"]}
 
 519   , "tan" <> [LexemeConsonant] := Rule{rulePron = ["tan" <> [LexemeConsonant] := "tɑ̃"], ruleExamples = ["tan" := "tɑ̃"]}
 
 520   , "tellite" := Rule{rulePron = ["te" <> [LexemeDoubleConsonant] := "te", "llite" := "lit"], ruleExamples = ["satellite" := "sa.te.lit"]}
 
 521   , "terie" := Rule{rulePron = ["terie" := "tʁi"], ruleExamples = ["poterie" := "pɔ.tʁi"]}
 
 522   , "thème" := Rule{rulePron = ["thème" := "tɛm"], ruleExamples = ["chrysanthème" := "kʁi.zɑ̃.tɛm"]}
 
 523   , "tient" := Rule{rulePron = ["tient" := "tjɛ̃"], ruleExamples = ["tient" := "tjɛ̃"]}
 
 524   , "tier" := Rule{rulePron = ["tier" := "tje"], ruleExamples = ["chalutier" := "ʃa.ly.tje"]}
 
 525   , "tion" := Rule{rulePron = ["tion" := "sjɔ̃"], ruleExamples = ["révolution" := "ʁe.vɔ.ly.sjɔ̃"]}
 
 526   , "quetzal" := Rule{rulePron = ["quet" := "kɛt", "zal" := "zal"], ruleExamples = ["quetzalcoatlus" := "kɛt.zal.ko.at.lys"]}
 
 527   , ending "coatlus" := Rule{rulePron = ["co" := "ko", "at" := "at", "lus" := "lys"], ruleExamples = ["quetzalcoatlus" := "kɛt.zal.ko.at.lys"]}
 
 528   , "pachy" := Rule{rulePron = ["pa" := "pa", "chy" := "ʃi"], ruleExamples = ["pachycephalosaurus" := "pa.ʃi.se.fa.lɔ.zɔ.ʁys"]}
 
 529   , "cephalo" := Rule{rulePron = ["ce" := "se", "pha" := "fa", "lo" := "lɔ"], ruleExamples = ["pachycephalosaurus" := "pa.ʃi.se.fa.lɔ.zɔ.ʁys"]}
 
 530   , "stégo" := Rule{rulePron = ["ste" := "ste", "go" := "gɔ"], ruleExamples = ["stégoceras" := "ste.gɔ.se.ʁas"]}
 
 531   , ending "ceras" := Rule{rulePron = ["ce" := "se", "ras" := "ʁas"], ruleExamples = ["stégoceras" := "ste.gɔ.se.ʁas"]}
 
 532   , [LexemeVowel] <> "saure" := Rule{rulePron = [[LexemeVowel] <> "saure" := "zɔʁ"], ruleExamples = ["ankylosaure" := "ɑ̃.ki.lɔ.zɔʁ"]}
 
 533   , [LexemeVowel] <> "sau" := Rule{rulePron = [[LexemeVowel] <> "sau" := "zɔ"], ruleExamples = ["maiasaura" := "ma.ja.zɔ.ʁa"]}
 
 534   , [LexemeVowel] <> "saurus" := Rule{rulePron = [[LexemeVowel] <> "sau" := "zɔ", "rus" := "ʁys"], ruleExamples = ["kronosaurus" := "kʁɔ.nɔ.zɔ.ʁys"]}
 
 535   , "saurus" := Rule{rulePron = ["sau" := "zɔ", "rus" := "ʁys"], ruleExamples = ["saurus" := "zɔ.ʁys"]}
 
 536   , "ssion" := Rule{rulePron = ["ssion" := "sjɔ̃"], ruleExamples = ["passion" := "pa.sjɔ̃"]}
 
 537   , "tille" := Rule{rulePron = ["tille" := "tij"], ruleExamples = ["myrtille" := "miʁ.tij"]}
 
 538   , "tique" := Rule{rulePron = ["tique" := "tik"], ruleExamples = ["pneumatique" := "pnø.ma.tik"]}
 
 539   , "tir" := Rule{rulePron = ["tir" := "tiʁ"], ruleExamples = ["tire" := "tiʁ"]}
 
 540   , "tops" := Rule{rulePron = ["tops" := "tɔps"], ruleExamples = ["tricératops" := "tʁi.se.ʁa.tɔps"]}
 
 541   , "pêche" := Rule{rulePron = ["pêche" := "pɛʃ"], ruleExamples = ["pêche" := "pɛʃ"]}
 
 542   , "vert" := Rule{rulePron = ["vert" := "vɛʁ"], ruleExamples = ["vert" := "vɛʁ"]}
 
 543   , "myr" := Rule{rulePron = ["myr" := "miʁ"], ruleExamples = ["myrtille" := "miʁ.tij"]}
 
 544   , begining "si" := Rule{rulePron = [begining "si" := "si"], ruleExamples = ["sirop" := "si.ʁo"]}
 
 545   , ending "rop" := Rule{rulePron = ["rop" := "ʁo"], ruleExamples = ["sirop" := "si.ʁo"]}
 
 546   , "tor" := Rule{rulePron = ["tor" := "tɔʁ"], ruleExamples = ["alligator" := "a.li.ga.tɔʁ"]}
 
 547   , "touche" := Rule{rulePron = ["touche" := "tuʃ"], ruleExamples = ["touche" := "tuʃ"]}
 
 548   , "tri" := Rule{rulePron = ["tri" := "tʁi"], ruleExamples = ["tri" := "tʁi"]}
 
 549   , "tris" <> [LexemeConsonant] := Rule{rulePron = ["tris" := "tʁis"], ruleExamples = ["ma" := "ma"]}
 
 550   , "truffe" := Rule{rulePron = ["truffe" := "tʁyf"], ruleExamples = ["Truffe" := "tʁyf"]}
 
 551   , "trône" := Rule{rulePron = ["trône" := "tʁon"], ruleExamples = ["trône" := "tʁon"]}
 
 552   , "ttière" := Rule{rulePron = ["ttière" := "tjɛʁ"], ruleExamples = ["gouttière" := "gu.tjɛʁ"]}
 
 553   , "tu" := Rule{rulePron = ["tu" := "ty"], ruleExamples = ["tuba" := "ty.ba"]}
 
 554   , "ty" := Rule{rulePron = ["ty" := "ti"], ruleExamples = ["tyran" := "ti.ʁɑ̃"]}
 
 555   , "turne" := Rule{rulePron = ["turne" := "tyʁn"], ruleExamples = ["nocturne" := "nɔk.tyʁn"]}
 
 556   , "té" := Rule{rulePron = ["té" := "te"], ruleExamples = ["gâté" := "ga.te"]}
 
 557   , "pté" := Rule{rulePron = ["pté" := "pte"], ruleExamples = ["ptéranodon" := "pte.ʁa.nɔ.dɔ̃"]}
 
 558   , "utah" := Rule{rulePron = ["u" := "y", "tah" := "ta"], ruleExamples = ["utah" := "y.ta"]}
 
 559   , "vache" := Rule{rulePron = ["vache" := "vaʃ"], ruleExamples = ["vache" := "vaʃ"]}
 
 560   , "vec" := Rule{rulePron = ["vec" := "vɛk"], ruleExamples = ["avec" := "a.vɛk"]}
 
 561   , "vis" := Rule{rulePron = ["vis" := "vis"], ruleExamples = ["visqueuse" := "vis.køz"]}
 
 562   , "vo" := Rule{rulePron = ["vo" := "vɔ"], ruleExamples = ["révolution" := "ʁe.vɔ.ly.sjɔ̃"]}
 
 563   , "von" := Rule{rulePron = ["von" := "vɔ̃"], ruleExamples = ["savon" := "sa.vɔ̃"]}
 
 564   , "sson" := Rule{rulePron = ["sson" := "sɔ̃"], ruleExamples = ["boisson" := "bwa.sɔ̃"]}
 
 565   , "zeuse" := Rule{rulePron = ["zeuse" := "zøz"], ruleExamples = ["gazeuse" := "ga.zøz"]}
 
 566   , "voi" := Rule{rulePron = ["voi" := "vwa"], ruleExamples = ["voilier" := "vwa.lje"]}
 
 567   , "vé" := Rule{rulePron = ["vé" := "ve"], ruleExamples = ["vélo" := "ve.lo"]}
 
 568   , "fête" := Rule{rulePron = ["fête" := "fɛt"], ruleExamples = ["fête" := "fɛt"]}
 
 569   , "fruit" := Rule{rulePron = ["fruit" := "fʁɥi"], ruleExamples = ["fruit" := "fʁɥi"]}
 
 570   , "nane" := Rule{rulePron = ["nane" := "nan"], ruleExamples = ["banane" := "ba.nan"]}
 
 571   , "pomme" := Rule{rulePron = ["pomme" := "pɔm"], ruleExamples = ["pomme" := "pɔm"]}
 
 572   , "ce" := Rule{rulePron = ["ce" := "sə"], ruleExamples = ["cerise" := "sə.ʁiz"]}
 
 573   , "rise" := Rule{rulePron = ["rise" := "ʁiz"], ruleExamples = ["cerise" := "sə.ʁiz"]}
 
 574   , "yo" := Rule{rulePron = ["yo" := "jo"], ruleExamples = ["Yohan" := "jo.an"]}
 
 575   , "é" := Rule{rulePron = ["é" := "e"], ruleExamples = ["équipe" := "e.kip"]}
 
 576   , "dé" := Rule{rulePron = ["dé" := "de"], ruleExamples = ["décorations" := "de.kɔ.ʁa.sjɔ̃"]}
 
 577   , "œ" := Rule{rulePron = ["œ" := "œ"], ruleExamples = ["œillet" := "œ.jɛ"]}
 
 578   , "ti" := Rule{rulePron = ["ti" := "ti"], ruleExamples = ["d'artifices" := "daʁ.ti.fis"]}
 
 579   , "fice" := Rule{rulePron = ["fice" := "fis"], ruleExamples = ["d'artifices" := "daʁ.ti.fis"]}
 
 581     "can" <> [LexemeConsonant] := Rule{rulePron = ["can" <> [LexemeConsonant] := "kɑ̃"], ruleExamples = ["cantaloup" := "kɑ̃.ta.lu"]}
 
 582   , ending "loup" := Rule{rulePron = [ending "loup" := "lu"], ruleExamples = ["cantaloup" := "kɑ̃.ta.lu"]}
 
 583   , begining "d'ar" := Rule{rulePron = [begining "d'ar" := "daʁ"], ruleExamples = ["d'artifices" := "daʁ.ti.fis"]}
 
 584   , "mustang" := Rule{rulePron = ["mus" := "mys", "tang" := "tɑ̃g"], ruleExamples = ["mustang" := "mys.tɑ̃g"]}
 
 585   , "tarte" := Rule{rulePron = ["tarte" := "taʁt"], ruleExamples = ["tarte" := "taʁt"]}
 
 586   , "citron" := Rule{rulePron = ["ci" := "si", "tron" := "tʁɔ̃"], ruleExamples = ["citron" := "si.tʁɔ̃"]}
 
 587   , begining "d'o" := Rule{rulePron = [begining "d'o" := "dɔ"], ruleExamples = ["d'orange" := "dɔ.ʁɑ̃ʒ"]}
 
 588   , begining "d'a" <> [LexemeConsonant] := Rule{rulePron = [begining "d'a" <> [LexemeConsonant] := "da"], ruleExamples = ["d'ananas" := "da.na.nas"]}
 
 589   , word "d'ananas" := Rule{rulePron = ["d'a" <> [LexemeMeaning "fruit"] := "da", "na" <> [LexemeMeaning "fruit"] := "na", "nas" <> [LexemeMeaning "fruit"] := "nas"], ruleExamples = ["d'ananas" := "da.na.nas"]}
 
 590   , [LexemeVowel] <> "san" <> [LexemeConsonant] := Rule{rulePron = [[LexemeVowel] <> "san" <> [LexemeConsonant] := "zɑ̃"], ruleExamples = ["chrysanthème" := "kʁi.zɑ̃.tɛm"]}
 
 591   , [LexemeVowel] <> "sienne" := Rule{rulePron = [[LexemeVowel] <> "sienne" := "zjɛn"], ruleExamples = ["draisienne" := "dʁɛ.zjɛn"]}
 
 592   , [LexemeVowel] <> "ya" := Rule{rulePron = [[LexemeVowel] <> "ya" := "ja"], ruleExamples = ["ya" := "ja"]}
 
 593   , [LexemeVowel] <> "ia" := Rule{rulePron = [[LexemeVowel] <> "ia" := "ja"], ruleExamples = ["maia" := "ma.ja"]}
 
 594   , begining "absent" := Rule{rulePron = [begining "ab" := "ab", "sent" := "sɑ̃"], ruleExamples = ["absent" := "ab.sɑ̃", "absents" := "ab.sɑ̃"]}
 
 595   , begining "exer" := Rule{rulePron = ["e" := "ɛ", "x" := "g.z", "er" := "ɛʁ"], ruleExamples = ["exercice" := "ɛg.zɛʁ.sis"]}
 
 596   , begining "ya" := Rule{rulePron = [begining "ya" := "ja"], ruleExamples = ["ya" := "ja"]}
 
 597   , begining "yacht" := Rule{rulePron = ["yacht" := "jɔt"], ruleExamples = ["yacht" := "jɔt"]}
 
 598   , ending "bis" := Rule{rulePron = [ending "bis" := "bis"], ruleExamples = ["ibis" := "i.bis"]}
 
 599   , ending "bo" := Rule{rulePron = [ending "bo" := "bo"], ruleExamples = ["bobo" := "bɔ.bo"]}
 
 600   , ending "bot" := Rule{rulePron = [ending "bot" := "bo"], ruleExamples = ["robot" := "ʁɔ.bo"]}
 
 601   , ending "cice" := Rule{rulePron = [ending "cice" := ["sis"]], ruleExamples = ["exercice" := "ɛg.zɛʁ.sis"]}
 
 602   , ending "cices" := Rule{rulePron = [ending "cices" := ["sis"]], ruleExamples = ["exercices" := "ɛg.zɛʁ.sis"]}
 
 603   , ending "co" := Rule{rulePron = ["co" := "ko"], ruleExamples = ["cocorico" := "kɔ.kɔ.ʁi.ko"]}
 
 604   , ending "do" := Rule{rulePron = [ending "do" := "do"], ruleExamples = ["judo" := "ʒy.do"]}
 
 605   , ending "e" := Rule{rulePron = [ending "e" := [""]], ruleExamples = ["gelée" := "ʒə.le"]}
 
 606   , ending "han" := Rule{rulePron = [ending "han" := "an"], ruleExamples = ["Yohan" := "jo.an"]}
 
 607   , ending "ler" := Rule{rulePron = [ending "ler" := "le"], ruleExamples = ["rouler" := "ʁu.le"]}
 
 608   , ending "let" := Rule{rulePron = [ending "let" := "lɛ"], ruleExamples = ["gilet" := "ʒi.lɛ"]}
 
 609   , ending "lo" := Rule{rulePron = [ending "lo" := "lo"], ruleExamples = ["vélo" := "ve.lo"]}
 
 610   , ending "min" := Rule{rulePron = [ending "min" := "mɛ̃"], ruleExamples = ["jasmin" := "ʒas.mɛ̃"]}
 
 611   , ending "mmo" := Rule{rulePron = [ending "mmo" := "mo"], ruleExamples = ["immo" := "i.mo"]}
 
 612   , ending "mo" := Rule{rulePron = [ending "mo" := "mo"], ruleExamples = ["homo" := "o.mo"]}
 
 613   , ending "mot" := Rule{rulePron = [ending "mot" := "mo"], ruleExamples = ["mot" := "mo"]}
 
 614   , ending "doux" := Rule{rulePron = [ending "doux" := "du"], ruleExamples = ["doux" := "du"]}
 
 615   , ending "not" := Rule{rulePron = [ending "not" := "no"], ruleExamples = ["canot" := "ka.no"]}
 
 616   , ending "s" := Rule{rulePron = [ending "s" := [""]], ruleExamples = ["bulles" := "byl"]}
 
 617   , ending "ent" := Rule{rulePron = [ending "ent" := [""]], ruleExamples = ["tirent" := "tiʁ"]}
 
 618   , ending "t" := Rule{rulePron = [ending "t" := [""]], ruleExamples = []}
 
 619   , ending "tan" := Rule{rulePron = [ending "tan" := "tɑ̃"], ruleExamples = ["tan" := "tɑ̃"]}
 
 620   , "teau" := Rule{rulePron = ["teau" := "to"], ruleExamples = ["bateau" := "ba.to"]}
 
 621   , "beau" := Rule{rulePron = ["beau" := "bo"], ruleExamples = ["corbeau" := "kɔʁ.bo"]}
 
 622   , "ceau" := Rule{rulePron = ["ceau" := "so"], ruleExamples = ["lionceau" := "ljɔ̃.so"]}
 
 623   , ending "to" := Rule{rulePron = [ending "to" := "to"], ruleExamples = ["moto" := "mɔ.to"]}
 
 624   , ending "ts" := Rule{rulePron = [ending "ts" := [""]], ruleExamples = ["maillots" := "ma.jo"]}
 
 625   , word "dans" := Rule{rulePron = [word "dans" := "dɑ̃"], ruleExamples = ["dans" := "dɑ̃"]}
 
 626   , word "et" := Rule{rulePron = [word "et" := "e"], ruleExamples = ["et" := "e"]}
 
 627   , word "des" := Rule{rulePron = ["des" := "de"], ruleExamples = ["des" := "de"]}
 
 628   , word "les" := Rule{rulePron = [word "les" := "le"], ruleExamples = ["les" := "le"]}
 
 629   , word "sous" := Rule{rulePron = [word "sous" := "su"], ruleExamples = ["sous" := "su"]}
 
 630   , word "un" := Rule{rulePron = [word "un" := "œ̃"], ruleExamples = ["un" := "œ̃"]}
 
 631   , word "une" := Rule{rulePron = [word "une" := "yn"], ruleExamples = ["une" := "yn"]}
 
 632   , "coli" := Rule{rulePron = ["co" := "kɔ", "li" := "li"], ruleExamples = ["Escherichia coli" := "ɛ.ʃe.ʁi.ʃja.kɔ.li"]}
 
 643       , ruleExamples = [["mer" & occurence]]
 
 645 , begining "mer" <> [LexemeConsonant] :=
 
 647       { rulePron = [ "mer" := ["mɛʁ"] ]
 
 648       , ruleExamples = [["mer" & occurence, "le"]]
 
 650 , begining "Mer" <> [LexemeConsonant] :=
 
 652       { rulePron = [ "Mer" := ["mɛʁ"] ]
 
 653       , ruleExamples = [["Mer" & occurence, "lin"]]
 
 655 , begining "Mer" <> [LexemeConsonant] :=
 
 657       { rulePron = [ "Mer" := ["mɛʁ"] ]
 
 658       , ruleExamples = [["Mer" & occurence, "lin"]]
 
 663           [ "ab" := ["ap"] -- sic
 
 664           , "strait" := ["stʁɛ"]
 
 666       , ruleExamples = [["abstrait" & occurence]]
 
 670       { rulePron = ["ab" := ["ab"]]
 
 671       , ruleExamples = [["ab" & occurence, "solu"]]
 
 675       { rulePron = ["so" := ["sɔ"]]
 
 676       , ruleExamples = [["ab", "so" & occurence, "lu"]]
 
 680       { rulePron = ["lu" := ["ly"]]
 
 681       , ruleExamples = [["lu" & occurence], ["abso", "lu" & occurence]]
 
 685       { rulePron = ["a" := ["a"]]
 
 686       , ruleExamples = [["a" & occurence]]
 
 690       { rulePron = ["llume" := ["lym"]]
 
 691       , ruleExamples = [["a", "llume" & occurence]]
 
 698       , ruleExamples = [["exer", "cice" & occurence]]