• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

sile-typesetter / sile / 6941442205

21 Nov 2023 08:56AM UTC coverage: 63.58% (+1.3%) from 62.266%
6941442205

Pull #1904

github

web-flow
Merge pull request #1891 from sile-typesetter/ot-tate
Pull Request #1904: Merge develop into master (commit to next release being breaking)

67 of 198 new or added lines in 20 files covered. (33.84%)

171 existing lines in 13 files now uncovered.

9907 of 15582 relevant lines covered (63.58%)

6710.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/languages/fr.lua
1
-- French language rules
2

3
local computeSpaces = function()
4
  -- Computes:
5
  --  -  regular inter-word space,
6
  --  -  half inter-word fixed space,
7
  --  -  "guillemet space", as defined in LaTeX's babel-french which is based
8
  --     on Thierry Bouche's recommendations,
9
  --  These should be usual for France and Canada. The Swiss may prefer a thin
10
  --  space for guillemets, that's why we are having settings hereafter.
11
  local enlargement = SILE.settings:get("shaper.spaceenlargementfactor")
×
12
  local stretch = SILE.settings:get("shaper.spacestretchfactor")
×
13
  local shrink = SILE.settings:get("shaper.spaceshrinkfactor")
×
14
  return {
×
15
    colonspace = SILE.length(enlargement.."spc plus "..stretch.."spc minus "..shrink.."spc"),
16
    thinspace = SILE.length((0.5 * enlargement).."spc"),
17
    guillspace = SILE.length((0.8 * enlargement).."spc plus "..(0.3 * stretch).."spc minus "..(0.8 * shrink).."spc")
×
18
  }
19
end
20

21
local spaces = computeSpaces()
×
22
-- NOTE: We are only doing it at load time. We don't expect the shaper settings to be often
23
-- changed arbitrarily _after_ having selected a language...
24

25
SILE.settings:declare({
×
26
  parameter = "languages.fr.colonspace",
27
  type = "kern",
28
  default = SILE.nodefactory.kern(spaces.colonspace),
29
  help = "The amount of space before a colon, theoretically a non-breakable, shrinkable, stretchable inter-word space"
×
30
})
31

32
SILE.settings:declare({
×
33
  parameter = "languages.fr.thinspace",
34
  type = "kern",
35
  default = SILE.nodefactory.kern(spaces.thinspace),
36
  help = "The amount of space before high punctuations, theoretically a fixed, non-breakable space, around half the inter-word space"
×
37
})
38

39
SILE.settings:declare({
×
40
  parameter = "languages.fr.guillspace",
41
  type = "kern",
42
  default = SILE.nodefactory.kern(spaces.guillspace),
43
  help = "The amount of space applying to guillemets, theoretically smaller than a non-breakable inter-word space, with reduced stretchability"
×
44
})
45

46
SILE.settings:declare({
×
47
  parameter = "languages.fr.debugspace",
48
  type = "boolean",
49
  default = false,
50
  help = "If switched to true, uses large spaces instead of the regular punctuation ones"
×
51
})
52

53
local getSpaceGlue = function(options, parameter)
54
  local sg
55
  if SILE.settings:get("languages.fr.debugspace") then
×
56
    sg = SILE.nodefactory.kern("5spc")
×
57
  else
58
    sg = SILE.settings:get(parameter)
×
59
  end
60
  -- Return the absolute (kern) length of the specified spacing parameter
61
  -- with a particular set of font options.
62
  -- As for SILE.shapers.base.measureSpace(), which has the same type of
63
  -- logic, caching this doesn't seem to have any significant speedup.
64
  SILE.settings:temporarily(function ()
×
65
    SILE.settings:set("font.size", options.size)
×
66
    SILE.settings:set("font.family", options.family)
×
67
    SILE.settings:set("font.filename", options.filename)
×
68
    sg = sg:absolute()
×
69
  end)
70
  -- Track a subtype on that kern:
71
  -- See automated italic correction at the typesetter level.
NEW
72
  sg.subtype = "punctspace"
×
UNCOV
73
  return sg
×
74
end
75

76
SILE.nodeMakers.fr = pl.class(SILE.nodeMakers.unicode)
×
77

78
-- Unfortunately, there is nothing in the Unicode properties
79
-- database which distinguishes between high and low punctuation, etc.
80
-- But in a way that's precisely why we can't just rely on Unicode
81
-- for everything and need our language-specific typesetting
82
-- processors.
83
SILE.nodeMakers.fr.colonPunctuations = { ":" }
×
84
SILE.nodeMakers.fr.openingQuotes = { "«", "‹" }
×
85
SILE.nodeMakers.fr.closingQuotes = { "»", "›" }
×
86
-- There's catch below: the shaper may have already processed common ligatures (!!, ?!, !?)
87
-- as a single item...
88
SILE.nodeMakers.fr.highPunctuations = { ";", "!", "?", "!!", "?!", "!?" }
×
89
-- High punctuations have some (kern) space before them... except in some cases!
90
-- By the books, they have it "after a letter or digit", at least. After a closing
91
-- punctuation, too, seems usual.
92
-- Otherwise, one shall have no space inside e.g. (?), ?!, [!], …?, !!! etc.
93
-- As a simplication, we reverse the rule and define after which characters the space
94
-- shall not be added. This is by no mean perfect, I couldn't find an explicit list
95
-- of exceptions. French typography is a delicate beast.
96
SILE.nodeMakers.fr.spaceExceptions = { "!", "?", ":", ".", "…", "(", "[", "{", "<", "«", "‹", "“", "‘", "?!", "!!", "!?" }
×
97

98
-- overriden properties from parent class
99
SILE.nodeMakers.fr.isQuoteType = { qu = true } -- split tokens at apostrophes &c.
×
100

101
-- methods defined in this class
102

103
function SILE.nodeMakers.fr.isIn (_, set, text)
×
104
  for _, v in ipairs(set) do
×
105
    if v == text then
×
106
      return true
×
107
    end
108
  end
109
  return false
×
110
end
111

112
function SILE.nodeMakers.fr:isOpeningQuote (text)
×
113
  return self:isIn(self.openingQuotes, text)
×
114
end
115

116
function SILE.nodeMakers.fr:isClosingQuote (text)
×
117
  return self:isIn(self.closingQuotes, text)
×
118
end
119

120
function SILE.nodeMakers.fr:isColonPunctuation (text)
×
121
  return self:isIn(self.colonPunctuations, text)
×
122
end
123

124
function SILE.nodeMakers.fr:isHighPunctuation (text)
×
125
  return self:isIn(self.highPunctuations, text)
×
126
end
127

128
function SILE.nodeMakers.fr:isSpaceException (text)
×
129
  return self:isIn(self.spaceExceptions, text)
×
130
end
131

132
function SILE.nodeMakers.fr:isPrevSpaceException ()
×
133
  return self.i > 1 and self:isSpaceException(self.items[self.i-1].text) or false
×
134
end
135

136
function SILE.nodeMakers.fr:makeUnbreakableSpace (parameter)
×
137
  self:makeToken()
×
138
  self.lastnode = "glue"
×
139
  coroutine.yield(getSpaceGlue(self.options, parameter))
×
140
end
141

142
function SILE.nodeMakers.fr:handleSpaceBefore (item)
×
143
  if self:isHighPunctuation(item.text) and not self:isPrevSpaceException() then
×
144
    self:makeUnbreakableSpace("languages.fr.thinspace")
×
145
    self:makeToken()
×
146
    self:addToken(item.text, item)
×
147
    return true
×
148
  end
149
  if self:isColonPunctuation(item.text) and not self:isPrevSpaceException() then
×
150
    self:makeUnbreakableSpace("languages.fr.colonspace")
×
151
    self:makeToken()
×
152
    self:addToken(item.text, item)
×
153
    return true
×
154
  end
155
  if self:isClosingQuote(item.text) then
×
156
    self:makeUnbreakableSpace("languages.fr.guillspace")
×
157
    self:makeToken()
×
158
    self:addToken(item.text, item)
×
159
    return true
×
160
  end
161
  return false
×
162
end
163

164
function SILE.nodeMakers.fr:handleSpaceAfter (item)
×
165
  if self:isOpeningQuote(item.text) then
×
166
    self:addToken(item.text, item)
×
167
    self:makeUnbreakableSpace("languages.fr.guillspace")
×
168
    self:makeToken()
×
169
    return true
×
170
  end
171
  return false
×
172
end
173

174
function SILE.nodeMakers.fr:mustRemove (i, items)
×
175
  -- Clear "manual" spaces we do not want, so that later we only have to
176
  -- insert the relevant kerns.
177
  local curr = items[i].text
×
178
  if self:isSpace(curr) then
×
179
    if i < #items then
×
180
      local next = items[i+1].text
×
181
      if self:isSpace(next)
×
182
          or self:isHighPunctuation(next)
×
183
          or self:isColonPunctuation(next)
×
184
          or self:isClosingQuote(next) then
×
185
        return true
×
186
      end
187
    end
188
    if i > 1 then
×
189
      local prev= items[i-1].text
×
190
      if self:isOpeningQuote(prev) then
×
191
        return true
×
192
      end
193
    end
194
  end
195
  return false
×
196
end
197

198
-- overriden methods from parent class
199

200
function SILE.nodeMakers.fr:dealWith (item)
×
201
  if self:handleSpaceBefore(item) then return end
×
202
  if self:handleSpaceAfter(item) then return end
×
203
  self._base.dealWith(self, item)
×
204
end
205

206
function SILE.nodeMakers.fr:handleWordBreak (item)
×
207
  if self:handleSpaceBefore(item) then return end
×
208
  if self:handleSpaceAfter(item) then return end
×
209
  self._base.handleWordBreak(self, item)
×
210
end
211

212
function SILE.nodeMakers.fr:handleLineBreak (item, subtype)
×
213
  if self:isSpace(item.text) then
×
214
    self:handleWordBreak(item)
×
215
    return
×
216
  end
217
  if self:handleSpaceBefore(item) then return end
×
218
  if self:handleSpaceAfter(item) then return end
×
219

220
  self._base.handleLineBreak(self, item, subtype)
×
221
end
222

223
function SILE.nodeMakers.fr:iterator (items)
×
224
  -- We start by cleaning up the input once for all.
225
  local cleanItems = {}
×
226
  local removed = 0
×
227
  for k = 1, #items do
×
228
    if self:mustRemove(k, items) then
×
229
      removed = removed + 1
×
230
    else
231
      items[k].index = items[k].index - removed -- index has changed due to removals
×
232
      table.insert(cleanItems, items[k])
×
233
    end
234
  end
235
  return self._base.iterator(self, cleanItems)
×
236
end
237

238
SILE.hyphenator.languages["fr"] = {}
×
239
SILE.hyphenator.languages["fr"].patterns =
×
240
{
241
------------------------------------------------
242
-- phonetic patterns -- etymological patterns --
243
------------------------------------------------
244
----*
245
"2'2",
246
------------------------------------------------
247
-- phonetic patterns -- etymological patterns --
248
------------------------------------------------
249
----a
250
".a4",
251
"'a4",
252
".â4",
253
"'â4",
254
"ab2h", -- df-bg 1998/02/07 for abhorrer
255
".ab3réa",
256
"'ab3réa",
257
"ad2h", -- df-bg 1998/02/07 for adhèsion & co
258
"a1è2dre",
259
".ae3s4ch",
260
"'ae3s4ch",
261
"1alcool",
262
"'2alcool",
263
"a2l1algi",
264
".amino1a2c",
265
"'amino1a2c",
266
".ana3s4tr",
267
"'ana3s4tr",
268
"1a2nesthési",
269
"'2a2nesthési",
270
".anti1a2",
271
"'anti1a2",
272
".anti1e2",
273
"'anti1e2",
274
".anti1é2",
275
".anti2enne",
276
"'anti2enne",
277
"'anti1é2",
278
".anti1s2",
279
"'anti1s2",
280
".apo2s3ta",
281
"'apo2s3ta",
282
"apo2s3tr",
283
"archi1é2pis",
284
".as2ta",
285
"'as2ta",
286
"a2s3tro",
287
------------------------------------------------
288
-- phonetic patterns -- etymological patterns --
289
------------------------------------------------
290
----b
291
"1ba",
292
"1bâ",
293
".bai2se3main", -- hyphen disappeared from french  5/2/94
294
"1be",
295
"1bé",
296
"1bè",
297
"1bê",
298
"4be.",
299
"4bes.",
300
"2bent.", -- mute syllable: tombent (df) 22/02/94
301
"1bi",
302
"1bî",
303
".bi1a2c",
304
".bi1a2t", -- like .tri1a2t for tri-athlon bg 12/27/93
305
".bi1au",
306
".bio1a2",
307
".bi2s1a2",
308
".bi1u2",
309
"1b2l",
310
"4ble.",
311
"4bles.",
312
"2blent.", -- mute syllable: troublent (df) 28/02/94
313
"1bo",
314
"1bô",
315
"1b2r",
316
"4bre.",
317
"4bres.",
318
"2brent.", -- mute syllable: palabrent (df) 28/02/94
319
"1bu",
320
"1bû",
321
"1by",
322
------------------------------------------------
323
-- phonetic patterns -- etymological patterns --
324
------------------------------------------------
325
----c
326
"1ç",
327
"1ca",
328
"1câ",
329
"ca3ou3t2", -- for caoutchou... added 3/1/94 df-bg
330
"1ce",
331
"1cé",
332
"1cè",
333
"1cê",
334
"4ce.",
335
"4ces.",
336
-- words ending with -cent (df) 22/02/94
337
"2cent.",
338
"ja3cent.",
339
"ac3cent.",
340
"é3cent.",
341
"munifi3cent.",
342
"réti3cent.",
343
"privatdo3cent.",
344
"inno3cent.",
345
"es3cent.",
346
"acquies4cent.",
347
"is3cent.",
348
"immis4cent.",
349
--
350
".ch4",
351
"1c2h",
352
"4ch.",
353
"2chb",
354
"4che.",
355
"4ches.",
356
"2chent.", -- mute syllable: touchent (df) 22/02/94
357
".chè2vre3feuille", -- hyphen disappeared from french 5/2/94
358
"2chg",
359
"ch2l",
360
"4chle.",
361
"4chles.",
362
"chlo2r3a2c",
363
"chlo2r3é2t",
364
"2chm",
365
"2chn",
366
"2chp",
367
"ch2r",
368
"4chre.",
369
"4chres.",
370
"2chs",
371
"2cht",
372
"2chw",
373
"1ci",
374
"1cî",
375
".ci2s1alp",
376
"1c2k",
377
"4ck.",
378
"2ckb",
379
"4cke.",
380
"4ckes.",
381
"2ckent.", -- mute syllable: stockent (df) 22/02/94
382
"2ckf",
383
"2ckg",
384
"2ck3h",
385
"2ckp",
386
"2cks",
387
"2ckt",
388
"1c2l",
389
"4cle.",
390
"4cles.",
391
"2clent.", -- mute syllable: encerclent (df) 28/02/94
392
"1co",
393
"1cô",
394
"co1acc",
395
"co1acq",
396
"co1a2d",
397
"co1ap",
398
"co1ar",
399
"co1assoc",
400
"co1assur",
401
"co1au",
402
"co1ax",
403
"1cœ",
404
"co1é2",
405
"co1ef",
406
"co1en",
407
"co1ex",
408
".con4",  -- missing from nb list
409
".cons4", -- missing from nb list
410
".contre1s2c",
411
".contre3maître", -- hyphen disappeared from french 5/2/94
412
"co2nurb",
413
".co1o2",
414
".co2o3lie",
415
"1c2r",
416
"4cre.",
417
"4cres.",
418
"2crent.", -- mute syllable: massacrent (df) 28/02/94
419
"1cu",
420
"1cû",
421
"1cy",
422
".cul4", -- -- as .con4 .cons4 (march 92)
423
------------------------------------------------
424
-- phonetic patterns -- etymological patterns --
425
------------------------------------------------
426
----d
427
"1d'",
428
"1da",
429
"1dâ",
430
".dacryo1a2",
431
"d1d2h",
432
"1de",
433
"1dé",
434
"1dè",
435
"1dê",
436
"4de.",
437
"4des.",
438
-- words ending with -dent (df) 22/02/94
439
"2dent.",
440
"déca3dent.",
441
"é3dent.",
442
"cci3dent.",
443
"inci3dent.",
444
"confi3dent.",
445
"tri3dent.",
446
"dissi3dent.",
447
"chien3dent.",
448
".ar3dent.",
449
"impu3dent.",
450
"pru3dent.",
451
".dé1a2",
452
".dé1io",
453
".dé1o2",
454
".dé2s", -- originaly in JD file
455
-- .dé2s1a2 removed 09/17/92 because wrong for the
456
--  original JD 500 words test
457
".dé3s2a3cr",
458
".dés2a3m", -- .dés2a2mi introduced 09/17/92 bec. i
459
-- can't see why désamidonner ran in JD.
460
-- Moved to .dés2a3m df 12/27/93.
461
".dé3s2a3tell",
462
".dé3s2astr",
463
".dé3s2c", -- 1 moved 3 due to .dé2s 09/17/92
464
--.dé2s1e2 removed 09/17/92 because wrong for the
465
-- original JD 500 words test
466
".dé2s1é2",
467
".dé3s2é3gr",
468
".dé3s2ensib",
469
".dé3s2ert",
470
".dé3s2exu",
471
--.dé2s3h removed 09/17/92 because wrong for the
472
-- original JD 500 words test
473
".dé2s1i2",
474
".dé3s2i3d",
475
".dé3s2i3gn",
476
".dé3s2i3li",
477
".dé3s2i3nen",
478
".dé3s2invo",
479
".dé3s2i3r",
480
".dé3s2ist",
481
--.dé2s1o2 removed 09/17/92 because wrong for the
482
-- original JD 500 words test
483
".dé3s2o3dé",
484
".dé2s1œ",
485
".dé3s2o3l",
486
".dé3s2o3pil",
487
".dé3s2orm",
488
".dé3s2orp",
489
".dé3s2oufr",
490
".dé3s2p", -- 1 moved 3 due to .dé2s 09/17/92
491
".dé3s2t", -- 1 moved 3 due to .dé2s 09/17/92
492
".dé2s1u2n",
493
"3d2hal",
494
"3d2houd",
495
"1di",
496
"1dî",
497
"di2s3cop",
498
".di1a2cé",
499
".di1a2cid",
500
".di1ald",
501
".di1a2mi",
502
".di1a2tom",
503
".di1e2n",
504
".di2s3h",
505
"2dlent.", -- mute syllable: jodlent (df) 28/02/94
506
"1do",
507
"1dô",
508
"1d2r",
509
"4dre.",
510
"4dres.",
511
"2drent.", -- mute syllable: engendrent (df) 28/02/94
512
"d1s2",
513
"1du",
514
"1dû",
515
"1dy",
516
".dy2s3",
517
".dy2s1a2",
518
".dy2s1i2",
519
".dy2s1o2", -- missing from nb list
520
".dy2s1u2",
521
------------------------------------------------
522
-- phonetic patterns -- etymological patterns --
523
------------------------------------------------
524
----e
525
".e4",
526
"'e4",
527
".ê4",
528
"'ê4",
529
".é4",
530
"'é4",
531
".è4",
532
"'è4",
533
"éd2hi", -- df-bg 1998/02/07 for rédhibitoire
534
"1é2drie",
535
"1é2drique",
536
"1é2lectr",
537
"1é2lément",
538
".en1a2",
539
"'en1a2",
540
"1é2nerg",
541
"e2n1i2vr",
542
".en1o2",
543
"'en1o2",
544
"épi2s3cop",
545
"épi3s4cope",
546
"e2s3cop",
547
".eu2r1a2",
548
"'eu2r1a2",
549
"eu1s2tat",
550
"extra1",
551
"extra2c",
552
"extra2i",
553
------------------------------------------------
554
-- phonetic patterns -- etymological patterns --
555
------------------------------------------------
556
----f
557
"1fa",
558
"1fâ",
559
"1fe",
560
"1fé",
561
"1fè",
562
"1fê",
563
"4fe.",
564
"4fes.",
565
"2fent.", -- mute syllable: agrafent chauffent (df) 22/02/94
566
--
567
"1fi",
568
"1fî",
569
"1f2l",
570
"4fle.",
571
"4fles.",
572
"2flent.", -- mute syllable: gonflent (df) 28/02/94
573
"1fo",
574
"1fô",
575
"1f2r",
576
"4fre.",
577
"4fres.",
578
"2frent.", -- mute syllable: balafrent (df) 28/02/94
579
"f1s2",
580
"1fu",
581
"1fû",
582
"1fy",
583
------------------------------------------------
584
-- phonetic patterns -- etymological patterns --
585
------------------------------------------------
586
----g
587
"1ga",
588
"1gâ",
589
"1ge",
590
"1gé",
591
"1gè",
592
"1gê",
593
"4ge.",
594
"4ges.",
595
-- words ending with -gent (df) 22/02/94
596
"2gent.",
597
"ré3gent.",
598
"entre3gent.",
599
"indi3gent.",
600
"dili3gent.",
601
"intelli3gent.",
602
"indul3gent.",
603
"tan3gent.",
604
"rin3gent.",
605
"contin3gent.",
606
".ar3gent.",
607
"'ar3gent.",
608
"ser3gent.",
609
"ter3gent.",
610
"résur3gent.",
611
--
612
"1g2ha",
613
"1g2he",
614
"1g2hi",
615
"1g2ho",
616
"1g2hy",
617
"1gi",
618
"1gî",
619
"1g2l",
620
"4gle.",
621
"4gles.",
622
"2glent.", -- mute syllable: meuglent (df) 28/02/94
623
"1g2n",
624
"'a2g3nat", -- (df) 16/01/02
625
".a2g3nat", -- (df) 16/01/02
626
"a2g3nos", -- (df) 16/01/02 (pattern dia2g3n deleted)
627
"co2g3niti", -- (df) 16/01/02
628
"'i2g3né", -- (df) 16/01/02
629
".i2g3né", -- (df) 16/01/02
630
"'i2g3ni", -- (df) 16/01/02
631
".i2g3ni", -- (df) 16/01/02
632
".ma2g3nicide", -- (df) 16/01/02
633
".ma2g3nificat", -- (df) 16/01/02
634
".ma2g3num", -- (df) 16/01/02
635
"o2g3nomoni", -- (df) 16/01/02
636
"o2g3nosi", -- (df) 16/01/02
637
".pro2g3nath", -- (df) 16/01/02
638
"pu2g3nable", -- (df) 16/01/02
639
"pu2g3nac", -- (df) 16/01/02
640
".sta2g3n",
641
".syn2g3nath", -- (df) 16/01/02
642
"wa2g3n",
643
"4gne.",
644
"4gnes.",
645
"2gnent.", -- mute syllable: accompagnent (df) 28/02/94
646
"1go",
647
"1gô",
648
"1g2r",
649
"4gre.",
650
"4gres.",
651
"2grent.", -- mute syllable: immigrent (df) 28/02/94
652
"1gu",
653
"1gû",
654
"g1s2",
655
"4gue.",
656
"4gues.",
657
-- words ending with -guent (df) 22/02/94
658
"2guent.",
659
".on3guent.",
660
"'on3guent.",
661
--
662
"1gy",
663
------------------------------------------------
664
-- phonetic patterns -- etymological patterns --
665
------------------------------------------------
666
----h
667
"1ha",
668
"1hâ",
669
"1he",
670
"1hé",
671
"1hè",
672
"1hê",
673
"hémi1é",
674
"hémo1p2t",
675
"4he.",
676
"4hes.",
677
"1hi",
678
"1hî",
679
"1ho",
680
"1hô",
681
"1hu",
682
"1hû",
683
"1hy",
684
"hypera2",
685
"hypere2",
686
"hyperé2",
687
"hyperi2",
688
"hypero2",
689
"hypers2",
690
"hype4r1",
691
"hyperu2",
692
"hypo1a2",
693
"hypo1e2", -- missing from nb list
694
"hypo1é2",
695
"hypo1i2",
696
"hypo1o2",
697
"hypo1s2",
698
"hypo1u2",
699
------------------------------------------------
700
-- phonetic patterns -- etymological patterns --
701
------------------------------------------------
702
----i
703
".i4",
704
"'i4",
705
".î4",
706
"'î4",
707
"i1algi",
708
"i1arthr",
709
"i1è2dre",
710
-- ill patterns missing from nb list
711
"il2l",
712
"cil3l",
713
"rcil4l",
714
"ucil4l",
715
"vacil4l",
716
"gil3l",
717
"hil3l",
718
"lil3l",
719
"l3lion",
720
"mil3l",
721
"mil4let",
722
"émil4l",
723
"semil4l",
724
"rmil4l",
725
"armil5l",
726
"capil3l",
727
"papil3la",
728
"papil3le",
729
"papil3li",
730
"papil3lom",
731
"pupil3l",
732
"piril3l",
733
"thril3l",
734
"cyril3l",
735
"ibril3l",
736
"pusil3l",
737
".stil3l",
738
"distil3l",
739
"instil3l",
740
"fritil3l",
741
"boutil3l",
742
"vanil3lin",
743
"vanil3lis",
744
"vil3l",
745
"avil4l",
746
"chevil4l",
747
"uevil4l",
748
"uvil4l",
749
"xil3l",
750
-- end of ill patterns
751
"1informat", -- missing from nb list
752
"'2informat",
753
".in1a2",
754
"'in1a2",
755
".in2a3nit",
756
"'in2a3nit",
757
".in2augur",
758
"'in2augur",
759
".in1e2",
760
"'in1e2",
761
".in1é2",
762
"'in1é2",
763
".in2effab", -- missing from nb list
764
"'in2effab",
765
".in2é3lucta",
766
"'in2é3lucta",
767
".in2é3narra",
768
"'in2é3narra",
769
".in2ept",
770
"'in2ept",
771
".in2er",
772
"'in2er",
773
".in2exora", -- missing from nb list
774
"'in2exora",
775
".in1i2",
776
"'in1i2",
777
".in2i3miti",
778
"'in2i3miti",
779
".in2i3q",
780
"'in2i3q",
781
".in2i3t",
782
"'in2i3t",
783
".in1o2",
784
"'in1o2",
785
".in2o3cul",
786
"'in2o3cul",
787
".in2ond",
788
"'in2ond",
789
".in1s2tab",
790
"'in1s2tab",
791
"'inte4r3",
792
".intera2",
793
"'intera2",
794
".intere2",
795
"'intere2",
796
".interé2",
797
"'interé2",
798
".interi2",
799
"'interi2",
800
".intero2",
801
"'intero2",
802
".inte4r3",
803
".interu2",
804
"'interu2",
805
".inters2",
806
"'inters2",
807
".in1u2",
808
"'in1u2",
809
".in2uit",
810
"'in2uit",
811
".in2u3l",
812
"'in2u3l",
813
"io1a2ct",
814
"i1oxy",
815
"i1s2tat",
816
------------------------------------------------
817
-- phonetic patterns -- etymological patterns --
818
------------------------------------------------
819
----j
820
"1j",
821
"2jk",
822
"4je.",
823
"4jes.",
824
"2jent.", -- mute syllable: galèjent (df) 22/02/94
825
------------------------------------------------
826
-- phonetic patterns -- etymological patterns --
827
------------------------------------------------
828
----k
829
"1ka",
830
"1kâ",
831
"1ke",
832
"1ké",
833
"1kè",
834
"1kê",
835
"4ke.",
836
"4kes.",
837
"2kent.", -- mute syllable: jerkent (df) 22/02/94
838
"1k2h",
839
"4kh.",
840
".kh4",
841
"1ki",
842
"1kî",
843
"1ko",
844
"1kô",
845
"1k2r",
846
"1ku",
847
"1kû",
848
"1ky",
849
------------------------------------------------
850
-- phonetic patterns -- etymological patterns --
851
------------------------------------------------
852
----l
853
"1la",
854
"1lâ",
855
"1là",
856
"la2w3re",
857
"1le",
858
"1lé",
859
"1lè",
860
"1lê",
861
"4le.",
862
"4les.",
863
-- words ending with -lent (df) 22/02/94
864
"2lent.",
865
".ta3lent.",
866
"iva3lent.",
867
"équiva4lent.",
868
"monova3lent.",
869
"polyva3lent.",
870
"re3lent.",
871
".do3lent.",
872
"indo3lent.",
873
"inso3lent.",
874
"turbu3lent.",
875
"succu3lent.",
876
"fécu3lent.",
877
"trucu3lent.",
878
"opu3lent.",
879
"corpu3lent.",
880
"ru3lent.",
881
"sporu4lent.",
882
--
883
"1li",
884
"1lî",
885
"1lo",
886
"1lô",
887
"l1s2t",
888
"1lu",
889
"1lû",
890
"1ly",
891
------------------------------------------------
892
-- phonetic patterns -- etymological patterns --
893
------------------------------------------------
894
----m
895
"1ma",
896
"1mâ",
897
".ma2c3k",
898
".macro1s2c",
899
".ma2l1a2dres",
900
".ma2l1a2dro",
901
".ma2l1aisé",
902
".ma2l1ap",
903
".ma2l1a2v",
904
".ma2l1en",
905
".ma2l1int",
906
".ma2l1oc",
907
".ma2l1o2d",
908
".ma2r1x", -- nb (jbb: ?)
909
"1me",
910
"1mé",
911
"1mè",
912
"1mê",
913
".mé2g1oh",
914
".mé2sa", -- missing from nb list
915
".mé3san", -- missing from nb list
916
".mé2s1es",
917
".mé2s1i",
918
".mé2s1u2s",
919
".méta1s2ta",
920
"4me.",
921
"4mes.",
922
-- words ending with -ment (df) 22/02/94
923
"â2ment.",
924
"da2ment.",
925
"fa2ment.",
926
"amalga2ment.",
927
"cla2ment.",
928
"ra2ment.",
929
"tempéra3ment.",
930
"ta2ment.",
931
"testa3ment.",
932
"qua2ment.",
933
"è2ment.",
934
"carê2ment.",
935
"diaphrag2ment.",
936
"ryth2ment.",
937
"ai2ment.",
938
"rai3ment.",
939
"abî2ment.",
940
"éci2ment.",
941
"vidi2ment.",
942
"subli2ment.",
943
"éli2ment.",
944
"reli2ment.",
945
"mi2ment.",
946
"ani2ment.",
947
"veni2ment.",
948
"ri2ment.",
949
"détri3ment.",
950
"nutri3ment.",
951
"inti2ment.",
952
"esti2ment.",
953
"l2ment.",
954
"flam2ment.",
955
"gram2ment.",
956
".gem2ment.",
957
"om2ment.",
958
".com3ment.",
959
"ô2ment.",
960
"slalo2ment.",
961
"chro2ment.",
962
"to2ment.",
963
"ar2ment.",
964
".sar3ment.",
965
"er2ment.",
966
"antifer3ment.",
967
".ser3ment.",
968
"fir2ment.",
969
"or2ment.",
970
"as2ment.",
971
"au2ment.",
972
"écu2ment.",
973
"fu2ment.",
974
"hu2ment.",
975
"fichu3ment.",
976
"llu2ment.",
977
"plu2ment.",
978
"bou2ment.",
979
"bru2ment.",
980
"su2ment.",
981
"tu2ment.",
982
--
983
"1mi",
984
"1mî",
985
".milli1am",
986
"1m2némo",
987
"1m2nès",
988
"1m2nési",
989
"1mo",
990
"1mô",
991
"1mœ",
992
".mono1a2",
993
".mono1e2",
994
".mono1é2",
995
".mono1i2",
996
".mono1ï2dé",
997
".mono1o2",
998
".mono1u2",
999
".mono1s2",
1000
"mon2t3réal", -- missing from nb list
1001
"m1s2",
1002
"1mu",
1003
"1mû",
1004
"1my",
1005
"moye2n1â2g",
1006
------------------------------------------------
1007
-- phonetic patterns -- etymological patterns --
1008
------------------------------------------------
1009
----n
1010
"1na",
1011
"1nâ",
1012
"1ne",
1013
"1né",
1014
"1nè",
1015
"1nê",
1016
"4ne.",
1017
"4nes.",
1018
-- words ending with -nent (df) 22/02/94
1019
"2nent.", -- fric-tionnent - syllable muette - bg 27/12/93
1020
"réma3nent.",
1021
"imma3nent.",
1022
"perma3nent.",
1023
".émi3nent.",
1024
"préémi3nent.",
1025
"proémi3nent.",
1026
"surémi3nent.",
1027
"immi3nent.",
1028
"conti3nent.",
1029
"perti3nent.",
1030
"absti3nent.",
1031
--
1032
"1ni",
1033
"1nî",
1034
"1no",
1035
"1nô",
1036
"1nœ",
1037
".no2n1obs",
1038
"1nu",
1039
"1nû",
1040
"n3s2at.",
1041
"n3s2ats.",
1042
"n1x",
1043
"1ny",
1044
------------------------------------------------
1045
-- phonetic patterns -- etymological patterns --
1046
------------------------------------------------
1047
----o
1048
".o4",
1049
"'o4",
1050
"'ô4",
1051
".ô4",
1052
--'ö2 -- mjf -- deleted 3/1/94 df-bg
1053
"o2b3long",
1054
"1octet", -- missing from nb list
1055
"'2octet",
1056
"o1d2l",
1057
"o1è2dre",
1058
"o1ioni",
1059
"ombud2s3",
1060
"omni1s2",
1061
"o1s2tas",
1062
"o1s2tat",
1063
"o1s2téro",
1064
"o1s2tim",
1065
"o1s2tom",
1066
"o1s2trad",
1067
"o1s2tratu",
1068
"o1s2triction",
1069
".oua1ou",
1070
"'oua1ou",
1071
".ovi1s2c",
1072
"'ovi1s2c",
1073
"oxy1a2",
1074
------------------------------------------------
1075
-- phonetic patterns -- etymological patterns --
1076
------------------------------------------------
1077
----p
1078
"1pa",
1079
"1pâ",
1080
"paléo1é2",
1081
".pa2n1a2f",
1082
".pa2n1a2mé",
1083
".pa2n1a2ra",
1084
".pa2n1is",
1085
".pa2n1o2ph",
1086
".pa2n1opt",
1087
".pa2r1a2che",
1088
".pa2r1a2chè",
1089
".para1s2",
1090
".pa2r3hé",
1091
"1pe",
1092
"1pé",
1093
"1pè",
1094
"1pê",
1095
"4pe.",
1096
"4pes.",
1097
-- words ending with -pent (df) 22/02/94
1098
"2pent.",
1099
"re3pent.",
1100
".ar3pent.",
1101
"'ar3pent.",
1102
"ser3pent.",
1103
--
1104
".pen2ta", -- pent- or penta- but never pen-ta bg 12/27/93
1105
"per3h",
1106
"pé2nul", -- pé2n1ul moved back 09/17/92 to JD def.
1107
".pe4r",
1108
".per1a2",
1109
".per1e2",
1110
".per1é2",
1111
".per1i2",
1112
".per1o2",
1113
".per1u2",
1114
"pé1r2é2q", -- 2r1 moved 09/17/92 to 1r2(it was a typo)
1115
".péri1os",
1116
".péri1s2",
1117
".péri2s3s",
1118
".péri2s3ta",
1119
".péri1u2",
1120
"1p2h",
1121
".ph4",
1122
"4ph.",
1123
".phalan3s2t",
1124
"4phe.",
1125
"4phes.",
1126
"2phent.", -- mute syllable: triomphent (df) 22/02/94
1127
"ph2l",
1128
"4phle.",
1129
"4phles.",
1130
"2phn",
1131
"photo1s2",
1132
"ph2r",
1133
"4phre.",
1134
"4phres.",
1135
"2phs",
1136
"2pht",
1137
"3ph2talé",
1138
"3ph2tis",
1139
-------- Here is an example of a pb involving phonetic and etymologic patterns 5/94
1140
--------                .phyto3ph2 -- originaly, but wrong for phy-toph-thora   9/92
1141
--------                .phy2topha -- for -pharmacie but wrong for phyto-biol.. 5/94
1142
"1pi",
1143
"1pî",
1144
"1p2l",
1145
"4ple.",
1146
"4ples.",
1147
"2plent.", -- mute syllable: accouplent (df) 28/02/94
1148
".pluri1a",
1149
"1p2né",
1150
"1p2neu",
1151
"1po",
1152
"1pô",
1153
"po1astre",
1154
"poly1a2",
1155
"poly1e2",
1156
"poly1é2",
1157
"poly1è2",
1158
"poly1i2",
1159
"poly1o2",
1160
"poly1s2",
1161
"poly1u2",
1162
".pon2tet", -- JD hypenated it asis 09/17/92, exception
1163
".pos2t3h",
1164
".pos2t1in",
1165
".pos2t1o2",
1166
".pos2t3r",
1167
".post1s2",
1168
"1p2r",
1169
"4pre.",
1170
"4pres.",
1171
"2prent.", -- mute syllable: empourprent (df) 28/02/94
1172
".pré1a2",
1173
".pré2a3la", -- missing from nb list
1174
".pré2au",
1175
".pré1é2",
1176
".pré1e2",
1177
".pré1i2",
1178
".pré1o2",
1179
".pré1u2",
1180
".pré1s2",
1181
".pro1é2",
1182
".pro1s2cé",
1183
"pro2s3tat",
1184
".prou3d2h",
1185
"1p2sych",
1186
".psycho1a2n",
1187
"1p2tèr",
1188
"1p2tér",
1189
"1pu",
1190
".pud1d2l",
1191
"1pû",
1192
"1py",
1193
------------------------------------------------
1194
-- phonetic patterns -- etymological patterns --
1195
------------------------------------------------
1196
----q
1197
"1q",
1198
"4que.",
1199
"4ques.",
1200
-- words ending with -quent (df) 22/02/94
1201
"2quent.",
1202
"é3quent.",
1203
"élo3quent.",
1204
"grandilo3quent.",
1205
------------------------------------------------
1206
-- phonetic patterns -- etymological patterns --
1207
------------------------------------------------
1208
----r
1209
"1ra",
1210
"1râ",
1211
"radio1a2", -- missing from nb list
1212
"1re",
1213
"1ré",
1214
"1rè",
1215
"1rê",
1216
".ré1a2",
1217
".ré2a3le",
1218
".ré2a3lis",
1219
".ré2a3lit",
1220
".ré2aux",
1221
".ré1é2",
1222
".ré1e2",
1223
".ré2el",
1224
".ré2er",
1225
".ré2èr",
1226
".ré1i2",
1227
".ré2i3fi",
1228
".ré1o2",
1229
".re1s2",
1230
".re2s3cap",
1231
".re2s3cisi", -- for res-cision  09/17/92 (missing from nb)
1232
".re2s3ciso", -- for res-cisoire 09/17/92(missing from nb)
1233
".re2s3cou",
1234
".re2s3cri",
1235
".re2s3pect",
1236
".re2s3pir",
1237
".re2s3plend",
1238
".re2s3pons",
1239
".re2s3quil",
1240
".re2s3s",
1241
".re2s3t",
1242
".re3s4tab",
1243
".re3s4tag",
1244
".re3s4tand",
1245
".re3s4tat",
1246
".re3s4tén",
1247
".re3s4tér",
1248
".re3s4tim",
1249
".re3s4tip",
1250
".re3s4toc",
1251
".re3s4top",
1252
".re3s4tr",
1253
".re4s5trein",
1254
".re4s5trict",
1255
".re4s5trin",
1256
".re3s4tu",
1257
".re3s4ty",
1258
".réu2", --.ré1u2 -- pattern rejected 12/2/92
1259
-- (don't hyphenate as ré-union nor réu-nion)
1260
".ré2uss",
1261
".rétro1a2",
1262
"4re.",
1263
"4res.",
1264
-- words ending with -rent (df) 22/02/94
1265
"2rent.", -- es-pèrent - syllable muette - bg 27/12/93
1266
".pa3rent.",
1267
"appa3rent.",
1268
"transpa3rent.",
1269
"é3rent.",
1270
"tor3rent.",
1271
"cur3rent.",
1272
--
1273
"1r2h",
1274
"4rhe.",
1275
"4rhes.",
1276
"2r3heur",
1277
"2r3hydr",
1278
"1ri",
1279
"1rî",
1280
"1ro",
1281
"1rô",
1282
"1ru",
1283
"1rû",
1284
"1ry",
1285
------------------------------------------------
1286
-- phonetic patterns -- etymological patterns --
1287
------------------------------------------------
1288
----s
1289
"1sa",
1290
"1sâ",
1291
".sch4",
1292
"1s2caph",
1293
"1s2clér",
1294
"1s2cop",
1295
"1s2ch",
1296
"e2s3ch",
1297
"i2s3ché",
1298
"i2s3chia",
1299
"i2s3chio",
1300
"4sch.",
1301
"4sche.",
1302
"4sches.",
1303
"2schs",
1304
"1se",
1305
"1sé",
1306
"1sè",
1307
"1sê",
1308
"sesqui1a2",
1309
"4se.",
1310
"4ses.",
1311
-- words ending with -sent (df) 22/02/94
1312
"2sent.", -- massent - syllable muette - bg 27/12/93
1313
"ab3sent.",
1314
"pré3sent.",
1315
".res3sent.",
1316
--
1317
".seu2le", -- jbb
1318
".sh4",
1319
"1s2h",
1320
"4sh.",
1321
"4she.",
1322
"4shes.",
1323
"2shent.", -- mute syllable: smashent (df) 22/02/94
1324
"2shm",
1325
"2s3hom",
1326
"2shr",
1327
"2shs",
1328
"1si",
1329
"1sî",
1330
"1s2lav",
1331
"1s2lov",
1332
"1so",
1333
"1sô",
1334
"1sœ",
1335
"1s2patia",
1336
"1s2perm",
1337
"1s2por",
1338
"1s2phèr",
1339
"1s2phér",
1340
"1s2piel",
1341
"1s2piros",
1342
"1s2tandard",
1343
"1s2tein",
1344
"stéréo1s2",
1345
"1s2tigm",
1346
"1s2tock",
1347
"1s2tomos",
1348
"1s2troph",
1349
"1s2tructu",
1350
"1s2tyle",
1351
"1su",
1352
"1sû",
1353
".su2b1a2",
1354
".su3b2alt",
1355
".su2b1é2",
1356
".su3b2é3r",
1357
".su2b1in",
1358
".su2b3limin",
1359
".su2b3lin",
1360
".su2b3lu",
1361
"sub1s2",
1362
".su2b1ur",
1363
"supero2",
1364
"supe4r1",
1365
"supers2",
1366
".su2r1a2",
1367
"su3r2ah",
1368
".su3r2a3t",
1369
".su2r1e2",
1370
".su3r2eau",
1371
".su3r2ell",
1372
".su3r2et",
1373
".su2r1é2",
1374
".su2r3h",
1375
".su2r1i2m",
1376
".su2r1inf",
1377
".su2r1int",
1378
".su2r1of",
1379
".su2r1ox",
1380
"1sy",
1381
------------------------------------------------
1382
-- phonetic patterns -- etymological patterns --
1383
------------------------------------------------
1384
----t
1385
"1ta",
1386
"1tâ",
1387
"1tà",
1388
"tachy1a2",
1389
"tchin3t2",
1390
"1te",
1391
"1té",
1392
"1tè",
1393
"1tê",
1394
"télé1e2",
1395
"télé1i2",
1396
"télé1o2b",
1397
"télé1o2p",
1398
"télé1s2",
1399
"4te.",
1400
"4tes.",
1401
-- words ending with -tent (df) 22/02/94
1402
"2tent.", -- mentent - syllable muette - bg 27/12/93
1403
".la3tent.",
1404
".pa3tent.",
1405
"compé3tent.",
1406
"éni3tent.",
1407
"mécon3tent.",
1408
"omnipo3tent.",
1409
"ventripo3tent.",
1410
"équipo3tent.",
1411
"impo3tent.",
1412
"mit3tent.",
1413
--
1414
".th4",
1415
"1t2h",
1416
"4th.",
1417
"4the.",
1418
"4thes.",
1419
"thermo1s2",
1420
"2t3heur",
1421
"2thl", -- th2l  was wrong for ...ath-lon (jd said 2thl) df 12/27/93
1422
"2thm",
1423
"2thn",
1424
"th2r",
1425
"4thre.",
1426
"4thres.",
1427
"2ths",
1428
"1ti",
1429
"1tî",
1430
"1to",
1431
"1tô",
1432
"1t2r",
1433
"tran2s1a2",
1434
"tran3s2act",
1435
"tran3s2ats",
1436
"tran2s3h",
1437
"tran2s1o2",
1438
"tran2s3p",
1439
"tran2s1u2",
1440
"4tre.",
1441
"4tres.",
1442
"2trent.", -- mute syllable: infiltrent (df) 28/02/94
1443
".tri1a2c",
1444
".tri1a2n",
1445
".tri1a2t",
1446
".tri1o2n",
1447
"t1t2l",
1448
"1tu",
1449
"1tû",
1450
"tung2s3",
1451
"1ty",
1452
------------------------------------------------
1453
-- phonetic patterns -- etymological patterns --
1454
------------------------------------------------
1455
----u
1456
".u4",
1457
"'u4",
1458
".û4",
1459
"'û4",
1460
"uni1o2v",
1461
"uni1a2x",
1462
"u2s3tr",
1463
------------------------------------------------
1464
-- phonetic patterns -- etymological patterns --
1465
------------------------------------------------
1466
----v
1467
"1va",
1468
"1vâ",
1469
"1ve",
1470
"1vé",
1471
"1vè",
1472
"1vê",
1473
"vélo1s2ki",
1474
"4ve.",
1475
"4ves.",
1476
-- words ending with -vent (df) 22/02/94
1477
"2vent.",
1478
"conni3vent.",
1479
".sou3vent.",
1480
--
1481
"1vi",
1482
"1vî",
1483
"1vo",
1484
"1vô",
1485
"vol2t1amp",
1486
"1v2r",
1487
"4vre.",
1488
"4vres.",
1489
"2vrent.", -- mute syllable: recouvrent (df) 28/02/94
1490
"1vu",
1491
"1vû",
1492
"1vy",
1493
------------------------------------------------
1494
-- phonetic patterns -- etymological patterns --
1495
------------------------------------------------
1496
----w
1497
"1wa",
1498
"1we",
1499
"4we.",
1500
"4wes.",
1501
"2went.", -- mute syllable: interviewent (df) 22/02/94
1502
"1wi",
1503
"1wo",
1504
"1wu",
1505
"1w2r",
1506
------------------------------------------------
1507
-- phonetic patterns -- etymological patterns --
1508
------------------------------------------------
1509
----x
1510
"2xent.", -- mute syllable:  malaxent (df) 22/02/94
1511
------------------------------------------------
1512
-- phonetic patterns -- etymological patterns --
1513
------------------------------------------------
1514
----y
1515
".y4",
1516
"'y4",
1517
"y1asth",
1518
"y1s2tom",
1519
"y1algi",
1520
------------------------------------------------
1521
-- phonetic patterns -- etymological patterns --
1522
------------------------------------------------
1523
----z
1524
"1za",
1525
"1ze",
1526
"1zé",
1527
"1zè",
1528
"4ze.",
1529
"4zes.",
1530
-- words ending with -zent (df) 22/02/94
1531
"2zent.",
1532
"privatdo3zent.",
1533
--
1534
"1zi",
1535
"1zo",
1536
"1zu",
1537
"1zy",
1538
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc