Grammalecte  Check-in [18924f57b4]

Overview
Comment:Sync to trunk
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | nodejs
Files: files | file ages | folders
SHA3-256: 18924f57b4994604991398d7d6ca68340f832cdcd926fad6e0ee120ed21e511d
User & Date: IllusionPerdu on 2018-10-21 14:37:01
Other Links: branch diff | manifest | tags
Context
2018-10-21
14:58
[js] Add getIgnoreRules check-in: fc3446bfc2 user: IllusionPerdu tags: nodejs
14:37
Sync to trunk check-in: 18924f57b4 user: IllusionPerdu tags: nodejs
2018-10-20
12:52
[fr] amélioration: quel +être +det check-in: 453f4dcb62 user: olr tags: trunk, fr
2018-10-17
16:07
[njs] fix labels and few mistakes check-in: 23d95509f4 user: olr tags: njs, nodejs
Changes

Modified gc_lang/fr/rules.grx from [9051dbf326] to [64849e9ba2].

6316
6317
6318
6319
6320
6321
6322









6323
6324
6325
6326
6327
6328
6329
        # Confusion probable. Écrivez “or” pour dire “néanmoins”. La préposition “hors” sert à dire “en dehors de” ou “excepté”.|https://fr.wiktionary.org/wiki/hors

TEST: {{hors}}, nous y coryons malgré tout ce qu’on peut en dire.
TEST: {{Hors}} il y a tant à faire depuis que nous sommes arrivés en ces lieux.
TEST: Hors nous, personne ne sait ce qui s’est passé là-bas.
TEST: Le peuple se sent hors jeu.











# jeune / jeûne
__conf_jeune__
    très  >jeûne
        <<- /conf/ -2>> =\1.replace("û", "u")                                                       # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune

TEST: Très {{jeûne}}, elle a su qu’elle ne voulait pas d’une vie ordinaire.







>
>
>
>
>
>
>
>
>







6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
        # Confusion probable. Écrivez “or” pour dire “néanmoins”. La préposition “hors” sert à dire “en dehors de” ou “excepté”.|https://fr.wiktionary.org/wiki/hors

TEST: {{hors}}, nous y coryons malgré tout ce qu’on peut en dire.
TEST: {{Hors}} il y a tant à faire depuis que nous sommes arrivés en ces lieux.
TEST: Hors nous, personne ne sait ce qui s’est passé là-bas.
TEST: Le peuple se sent hors jeu.


# l’issue
__conf_l_issue__
    l’ issu
        <<- /conf/ -2>> issue                                                   # Confusion. Le nom “issue” est féminin.

TEST: à l’{{issu}} de la partie.



# jeune / jeûne
__conf_jeune__
    très  >jeûne
        <<- /conf/ -2>> =\1.replace("û", "u")                                                       # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune

TEST: Très {{jeûne}}, elle a su qu’elle ne voulait pas d’une vie ordinaire.
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364

# voir / voire
__conf_voir_voire__
    voir [grand|petit|rouge]
        <<- %2>>

    voir  @:A¬:[NGM]
        <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|de)/")
            and not before("(?i)\\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$")
        -1>> voir                       # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez :|https://fr.wiktionary.org/wiki/voire

    [comme|lorque|puisque|quand|que|quoique|si]     (voire)
    [ni|et|par|pour|sans]                           (voire)
    [>aller|>falloir|>pouvoir|>vouloir]  ?[guère|jamais|pas|plus|point|rien]¿  (voire)
        <<- /conf/ -1>> voir            # Confusion probable : “voire” signifie “et même possiblement”. Pour le verbe, écrivez “voir”.|https://fr.wiktionary.org/wiki/voire







|







7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373

# voir / voire
__conf_voir_voire__
    voir [grand|petit|rouge]
        <<- %2>>

    voir  @:A¬:[NGM]
        <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|de)/")
            and not before("(?i)\\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$")
        -1>> voir                       # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez :|https://fr.wiktionary.org/wiki/voire

    [comme|lorque|puisque|quand|que|quoique|si]     (voire)
    [ni|et|par|pour|sans]                           (voire)
    [>aller|>falloir|>pouvoir|>vouloir]  ?[guère|jamais|pas|plus|point|rien]¿  (voire)
        <<- /conf/ -1>> voir            # Confusion probable : “voire” signifie “et même possiblement”. Pour le verbe, écrivez “voir”.|https://fr.wiktionary.org/wiki/voire
7378
7379
7380
7381
7382
7383
7384

7385
7386
7387
7388
7389
7390
7391
TEST: de fortes chances de se voir ruiné
TEST: Quelle chance tu as eue de voir ruiné ce connard.
TEST: l’immobilier a été ces dernières années l’investissement le plus rentable (voir graphique ci-dessous)
TEST: elles sont pas mal ainsi, voire élégantes pourrait-on dire.
TEST: il y en a peu, voire très peu.
TEST: car elles pénètrent dans les poumons voire le système sanguin.
TEST: des enfants malades, qui préfèrent souvent voir Dark Vador que des vieux clowns un peu flippants.



# vieil / vieux
__conf_vieil_vieux_euphonie__
    vieux  homme
        <<- /conf/ -1>> vieil                                   # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie








>







7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
TEST: de fortes chances de se voir ruiné
TEST: Quelle chance tu as eue de voir ruiné ce connard.
TEST: l’immobilier a été ces dernières années l’investissement le plus rentable (voir graphique ci-dessous)
TEST: elles sont pas mal ainsi, voire élégantes pourrait-on dire.
TEST: il y en a peu, voire très peu.
TEST: car elles pénètrent dans les poumons voire le système sanguin.
TEST: des enfants malades, qui préfèrent souvent voir Dark Vador que des vieux clowns un peu flippants.
TEST: les membres de l’équipage commencent à voir flou


# vieil / vieux
__conf_vieil_vieux_euphonie__
    vieux  homme
        <<- /conf/ -1>> vieil                                   # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie

11140
11141
11142
11143
11144
11145
11146
11147




11148
11149
11150
11151
11152




11153
11154
11155
11156
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171


11172
11173
11174
11175
11176
11177
11178

__gn_quels_quelles_accord_être__
    [quels|quelles]  [est|étais|était|sera|serais|serait|fut|fût|fus]
        <<- /gn/ not value(<1, "|tels|telles|")
        -1>> =\1[:-1]                                                                       # Accord de nombre erroné avec “\2”.

__gn_quel_accord_être_sujet__
    quel  [est|était|seras|sera|serais|serait|fut|fût|fus]  [la|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD




        <<- /gn/ not value(<1, "|tel|telle|") and morph(\4, ":[NA].*:f", ":[me]")
        -1>> quelle                                                                         # Accord de genre erroné avec « \3 \4 ».

__gn_quelle_accord_être_sujet__
    quelle  [est|était|seras|sera|serais|serait|fut|fût|fus]  [le|ce|cet|mon|ton|son|notre|votre|leur]  *WORD




        <<- /gn/ not value(<1, "|tel|telle|") and morph(\4, ":[NA].*:m", ":[fe]")
        -1>> quel                                                                           # Accord de genre erroné avec « \3 \4 ».

__gn_quels_accord_être_sujet__
    quels  [sont|étaient|seront|serons|seraient|furent|fussent]  [les|ces|mes|tes|ses|nos|vos|leurs]  *WORD
        <<- /gn/ not value(<1, "|tels|telles|") and morph(\4, ":[NA].*:f", ":[me]")
        -1>> quelles                                                                        # Accord de genre erroné avec « \3 \4 ».

__gn_quelles_accord_être_sujet__
    quelles  [sont|étaient|seront|serons|seraient|furent|fussent]  [les|ces|mes|tes|ses|nos|vos|leurs]  *WORD
        <<- /gn/ not value(<1, "|tels|telles|") and morph(\4, ":[NA].*:m", ":[fe]")
        -1>> quels                                                                          # Accord de genre erroné avec « \3 \4 ».

TEST: {{Quel}} sont ces hommes.                               ->> Quels
TEST: {{Quel}} est cette force ?                              ->> Quelle
TEST: {{Quelle}} est mon animal favori ?                      ->> Quel
TEST: {{Quels}} sont ces femmes ?                             ->> Quelles
TEST: {{Quelles}} est cette imbécillité ?                     ->> Quelle
TEST: {{Quelles}} sont ces hommes ?                           ->> Quels


TEST: Il s’agit de définir quelle est notre propre orientation.



#### Quel(le) que soit …

## masculin requis







|
>
>
>
>




|
>
>
>
>



















>
>







11150
11151
11152
11153
11154
11155
11156
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171
11172
11173
11174
11175
11176
11177
11178
11179
11180
11181
11182
11183
11184
11185
11186
11187
11188
11189
11190
11191
11192
11193
11194
11195
11196
11197
11198

__gn_quels_quelles_accord_être__
    [quels|quelles]  [est|étais|était|sera|serais|serait|fut|fût|fus]
        <<- /gn/ not value(<1, "|tels|telles|")
        -1>> =\1[:-1]                                                                       # Accord de nombre erroné avec “\2”.

__gn_quel_accord_être_sujet__
    quel  [est|était|seras|sera|serais|serait|fut|fût|fus]  [la|cette|ma|ta|sa]  *WORD
        <<- /gn/ not value(<1, "|tel|telle|") and morph(\4, ":[NA].*:[fe]", ":m")
        -1>> quelle                                                                         # Accord de genre erroné avec « \3 \4 ».

    quel  [est|était|seras|sera|serais|serait|fut|fût|fus]  [mon|ton|son|notre|votre|leur]  *WORD
        <<- /gn/ not value(<1, "|tel|telle|") and morph(\4, ":[NA].*:f", ":[me]")
        -1>> quelle                                                                         # Accord de genre erroné avec « \3 \4 ».

__gn_quelle_accord_être_sujet__
    quelle  [est|était|seras|sera|serais|serait|fut|fût|fus]  [le|ce|cet]  *WORD
        <<- /gn/ not value(<1, "|tel|telle|") and morph(\4, ":[NA].*:[me]", ":f")
        -1>> quel                                                                           # Accord de genre erroné avec « \3 \4 ».

    quelle  [est|était|seras|sera|serais|serait|fut|fût|fus]  [mon|ton|son|notre|votre|leur]  *WORD
        <<- /gn/ not value(<1, "|tel|telle|") and morph(\4, ":[NA].*:m", ":[fe]")
        -1>> quel                                                                           # Accord de genre erroné avec « \3 \4 ».

__gn_quels_accord_être_sujet__
    quels  [sont|étaient|seront|serons|seraient|furent|fussent]  [les|ces|mes|tes|ses|nos|vos|leurs]  *WORD
        <<- /gn/ not value(<1, "|tels|telles|") and morph(\4, ":[NA].*:f", ":[me]")
        -1>> quelles                                                                        # Accord de genre erroné avec « \3 \4 ».

__gn_quelles_accord_être_sujet__
    quelles  [sont|étaient|seront|serons|seraient|furent|fussent]  [les|ces|mes|tes|ses|nos|vos|leurs]  *WORD
        <<- /gn/ not value(<1, "|tels|telles|") and morph(\4, ":[NA].*:m", ":[fe]")
        -1>> quels                                                                          # Accord de genre erroné avec « \3 \4 ».

TEST: {{Quel}} sont ces hommes.                               ->> Quels
TEST: {{Quel}} est cette force ?                              ->> Quelle
TEST: {{Quelle}} est mon animal favori ?                      ->> Quel
TEST: {{Quels}} sont ces femmes ?                             ->> Quelles
TEST: {{Quelles}} est cette imbécillité ?                     ->> Quelle
TEST: {{Quelles}} sont ces hommes ?                           ->> Quels
TEST: {{Quel}} est la politique ?                             ->> Quelle
TEST: {{Quelle}} est le politique ?                           ->> Quel
TEST: Il s’agit de définir quelle est notre propre orientation.



#### Quel(le) que soit …

## masculin requis
12102
12103
12104
12105
12106
12107
12108



12109
12110

12111
12112
12113
12114
12115
12116
12117
    [>air|>aire] du [cénozoïque|digital|numérique|paléozoïque|pliocène|pétrole|primaire|secondaire|tertiaire|quaternaire]
    [>air|>aire] du big data
        <<- /conf/ -1>> ère         # Confusion. L’aire est une surface. L’air est un gaz, une apparence ou une musique. Pour évoquen une époque, écrivez “ère”.

    l’ [aire|ère] du temps
        <<- /conf/ -2>> air         # Confusion probable. Locution “l’air du temps”.|https://fr.wiktionary.org/wiki/%C3%AAtre_dans_l%E2%80%99air_du_temps




TEST: L’{{aire}} du pétrole n’est pas encore terminée.
TEST: Ce sera un jour dans l’{{ère}} du temps



# auspice / hospice
__conf_auspices_hospices__
    sous [les|de|des|ces] ?*WORD¿ (hospices)
        <<- /conf/ -1>> auspices        # Confusion probable. L’hospice est un centre de soins.|https://fr.wiktionary.org/wiki/auspice








>
>
>


>







12122
12123
12124
12125
12126
12127
12128
12129
12130
12131
12132
12133
12134
12135
12136
12137
12138
12139
12140
12141
    [>air|>aire] du [cénozoïque|digital|numérique|paléozoïque|pliocène|pétrole|primaire|secondaire|tertiaire|quaternaire]
    [>air|>aire] du big data
        <<- /conf/ -1>> ère         # Confusion. L’aire est une surface. L’air est un gaz, une apparence ou une musique. Pour évoquen une époque, écrivez “ère”.

    l’ [aire|ère] du temps
        <<- /conf/ -2>> air         # Confusion probable. Locution “l’air du temps”.|https://fr.wiktionary.org/wiki/%C3%AAtre_dans_l%E2%80%99air_du_temps

    >avoir l’ [aire|ère] [de|d’]
        <<- /conf/ -3>> air         # Confusion probable. La locution “avoir l’air de” signifie “sembler”, “paraître”…|https://fr.wiktionary.org/wiki/avoir_l%E2%80%99air

TEST: L’{{aire}} du pétrole n’est pas encore terminée.
TEST: Ce sera un jour dans l’{{ère}} du temps
TEST: il a l’{{aire}} d’un plouc.


# auspice / hospice
__conf_auspices_hospices__
    sous [les|de|des|ces] ?*WORD¿ (hospices)
        <<- /conf/ -1>> auspices        # Confusion probable. L’hospice est un centre de soins.|https://fr.wiktionary.org/wiki/auspice

17053
17054
17055
17056
17057
17058
17059

17060
17061
17062
17063
17064
17065
17066
TEST: Le moral des ménages au plus haut depuis 2007
TEST: Ce qu’ils nous ont fait
TEST: Comment vous expliquez ça ?
TEST: Comment vous expliquer ça ?
TEST: le général n’en aura cure
TEST: n’en avoir cure et faire comme si de rien n’était.
TEST: Comme d’habitude, ils ont tout fait à l’arrache.



!!! Tests historiques                                                                             !!

## Version 0.5.14
TEST: par le léger tissu de rayonne qui les protégeait en ce moment.








>







17077
17078
17079
17080
17081
17082
17083
17084
17085
17086
17087
17088
17089
17090
17091
TEST: Le moral des ménages au plus haut depuis 2007
TEST: Ce qu’ils nous ont fait
TEST: Comment vous expliquez ça ?
TEST: Comment vous expliquer ça ?
TEST: le général n’en aura cure
TEST: n’en avoir cure et faire comme si de rien n’était.
TEST: Comme d’habitude, ils ont tout fait à l’arrache.
TEST: tout un système pour justifier que “nous” avons toujours raison et que nous ne pouvons jamais avoir tort.


!!! Tests historiques                                                                             !!

## Version 0.5.14
TEST: par le léger tissu de rayonne qui les protégeait en ce moment.

Modified gc_lang/fr/webext/manifest.json from [b647bed430] to [5d7857a281].

112
113
114
115
116
117
118
119


120
121
122
123
124
125
126
        "default": "Ctrl+Shift+8"
      },
      "description": "Ouvre l’éditeur lexical"
    }
  },

  "web_accessible_resources": [
    "grammalecte/_dictionaries/French.json",


    "grammalecte/fr/conj_data.json",
    "grammalecte/fr/mfsp_data.json",
    "grammalecte/fr/phonet_data.json",
    "grammalecte/fr/tests_data.json",
    "img/logo-16.png"
  ],








|
>
>







112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
        "default": "Ctrl+Shift+8"
      },
      "description": "Ouvre l’éditeur lexical"
    }
  },

  "web_accessible_resources": [
    "grammalecte/graphspell/_dictionaries/fr-allvars.json",
    "grammalecte/graphspell/_dictionaries/fr-classic.json",
    "grammalecte/graphspell/_dictionaries/fr-reform.json",
    "grammalecte/fr/conj_data.json",
    "grammalecte/fr/mfsp_data.json",
    "grammalecte/fr/phonet_data.json",
    "grammalecte/fr/tests_data.json",
    "img/logo-16.png"
  ],

Modified graphspell-js/ibdawg.js from [820a95ea91] to [edb211270b].

144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
        }
        if (!(this.nCompressionMethod == 1 || this.nCompressionMethod == 2 || this.nCompressionMethod == 3)) {
            throw RangeError("# Error. Unknown dictionary compression method: " + this.nCompressionMethod);
        }
        // <dChar> to get the value of an arc, <dCharVal> to get the char of an arc with its value
        this.dChar = helpers.objectToMap(this.dChar);
        this.dCharVal = this.dChar.gl_reverse();
        this.a2grams = new Set(this.l2grams);

        if (this.cStemming == "S") {
            this.funcStemming = str_transform.changeWordWithSuffixCode;
        } else if (this.cStemming == "A") {
            this.funcStemming = str_transform.changeWordWithAffixCode;
        } else {
            this.funcStemming = str_transform.noStemming;







|







144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
        }
        if (!(this.nCompressionMethod == 1 || this.nCompressionMethod == 2 || this.nCompressionMethod == 3)) {
            throw RangeError("# Error. Unknown dictionary compression method: " + this.nCompressionMethod);
        }
        // <dChar> to get the value of an arc, <dCharVal> to get the char of an arc with its value
        this.dChar = helpers.objectToMap(this.dChar);
        this.dCharVal = this.dChar.gl_reverse();
        this.a2grams = (this.l2grams) ? new Set(this.l2grams) : null;

        if (this.cStemming == "S") {
            this.funcStemming = str_transform.changeWordWithSuffixCode;
        } else if (this.cStemming == "A") {
            this.funcStemming = str_transform.changeWordWithAffixCode;
        } else {
            this.funcStemming = str_transform.noStemming;
410
411
412
413
414
415
416



417
418
419
420
421
422
423
            }
        }
    }

    isNgramsOK (sChars) {
        if (sChars.length != 2) {
            return true;



        }
        return this.a2grams.has(sChars);
    }

    * _getCharArcs (iAddr) {
        // generator: yield all chars and addresses from node at address <iAddr>
        for (let [nVal, jAddr] of this._getArcs(iAddr)) {







>
>
>







410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
            }
        }
    }

    isNgramsOK (sChars) {
        if (sChars.length != 2) {
            return true;
        }
        if (!this.a2grams) {
            return true;
        }
        return this.a2grams.has(sChars);
    }

    * _getCharArcs (iAddr) {
        // generator: yield all chars and addresses from node at address <iAddr>
        for (let [nVal, jAddr] of this._getArcs(iAddr)) {

Modified graphspell/ibdawg.py from [eceb83c9e7] to [59273fbe60].

186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
        self.nBytesOffset = 1 # version 3

    def _initJSON (self, oJSON):
        "initialize with a JSON text file"
        self.__dict__.update(oJSON)
        self.byDic = binascii.unhexlify(self.sByDic)
        self.dCharVal = { v: k  for k, v in self.dChar.items() }
        self.a2grams = set(self.l2grams)

    def getInfo (self):
        "return string about the IBDAWG"
        return  "  Language: {0.sLangName}   Lang code: {0.sLangCode}   Dictionary name: {0.sDicName}" \
                "  Compression method: {0.nCompressionMethod:>2}   Date: {0.sDate}   Stemming: {0.cStemming}FX\n" \
                "  Arcs values:  {0.nArcVal:>10,} = {0.nChar:>5,} characters,  {0.nAff:>6,} affixes,  {0.nTag:>6,} tags\n" \
                "  Dictionary: {0.nEntry:>12,} entries,    {0.nNode:>11,} nodes,   {0.nArc:>11,} arcs\n" \







|







186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
        self.nBytesOffset = 1 # version 3

    def _initJSON (self, oJSON):
        "initialize with a JSON text file"
        self.__dict__.update(oJSON)
        self.byDic = binascii.unhexlify(self.sByDic)
        self.dCharVal = { v: k  for k, v in self.dChar.items() }
        self.a2grams = set(self.l2grams)  if hasattr(self, 'l2grams')  else None

    def getInfo (self):
        "return string about the IBDAWG"
        return  "  Language: {0.sLangName}   Lang code: {0.sLangCode}   Dictionary name: {0.sDicName}" \
                "  Compression method: {0.nCompressionMethod:>2}   Date: {0.sDate}   Stemming: {0.cStemming}FX\n" \
                "  Arcs values:  {0.nArcVal:>10,} = {0.nChar:>5,} characters,  {0.nAff:>6,} affixes,  {0.nTag:>6,} tags\n" \
                "  Dictionary: {0.nEntry:>12,} entries,    {0.nNode:>11,} nodes,   {0.nArc:>11,} arcs\n" \
354
355
356
357
358
359
360


361
362
363
364
365
366
367
            elif len(sRemain) == 1:
                self._suggest(oSuggResult, "", nMaxSwitch, nMaxDel, nMaxHardRepl, nMaxJump, nDist, nDeep+1, iAddr, sNewWord, True) # remove last char and go on
                for sRepl in cp.dFinal1.get(sRemain, ()):
                    self._suggest(oSuggResult, sRepl, nMaxSwitch, nMaxDel, nMaxHardRepl, nMaxJump, nDist, nDeep+1, iAddr, sNewWord, True)

    def isNgramsOK (self, sChars):
        if len(sChars) != 2:


            return True
        return sChars in self.a2grams

    #@timethis
    def suggest2 (self, sWord, nSuggLimit=10):
        "returns a set of suggestions for <sWord>"
        sWord = cp.spellingNormalization(sWord)







>
>







354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
            elif len(sRemain) == 1:
                self._suggest(oSuggResult, "", nMaxSwitch, nMaxDel, nMaxHardRepl, nMaxJump, nDist, nDeep+1, iAddr, sNewWord, True) # remove last char and go on
                for sRepl in cp.dFinal1.get(sRemain, ()):
                    self._suggest(oSuggResult, sRepl, nMaxSwitch, nMaxDel, nMaxHardRepl, nMaxJump, nDist, nDeep+1, iAddr, sNewWord, True)

    def isNgramsOK (self, sChars):
        if len(sChars) != 2:
            return True
        if not self.a2grams:
            return True
        return sChars in self.a2grams

    #@timethis
    def suggest2 (self, sWord, nSuggLimit=10):
        "returns a set of suggestions for <sWord>"
        sWord = cp.spellingNormalization(sWord)