88import os .path
99import argparse
1010import json
11+ import itertools
1112import re
1213import traceback
1314
1415import grammalecte
1516import grammalecte .text as txt
17+ import grammalecte .graphspell .str_transform as strt
1618from grammalecte .graphspell .echo import echo
1719
1820
2729 !word spelling suggestion
2830 >word draw path of word in the word graph
2931 =[filter1][=[filter2]] show entries which fit to filters (filter1 for word, filter2 for morphology)
30- $some_text show sentences and tokens of text
32+ ≠word|word|… show distance between words
33+ $some_text show sentences and tokens of text
3134
3235Other commands:
3336 /help /h show this text
@@ -129,6 +132,10 @@ def getCommand ():
129132
130133def main ():
131134 "launch the CLI (command line interface)"
135+ if sys .version_info < (3 , 5 ):
136+ print ("Python 3.5+ required" )
137+ return
138+
132139 xParser = argparse .ArgumentParser ()
133140 xParser .add_argument ("-f" , "--file" , help = "parse file (UTF-8 required!) [on Windows, -f is similar to -ff]" , type = str )
134141 xParser .add_argument ("-ff" , "--file_to_file" , help = "parse file (UTF-8 required!) and create a result file (*.res.txt)" , type = str )
@@ -153,7 +160,6 @@ def main ():
153160
154161 oGrammarChecker = grammalecte .GrammarChecker ("fr" )
155162 oSpellChecker = oGrammarChecker .getSpellChecker ()
156- oLexicographer = oGrammarChecker .getLexicographer ()
157163 oTextFormatter = oGrammarChecker .getTextFormatter ()
158164 if xArgs .personal_dict :
159165 oJSON = loadDictionary (xArgs .personal_dict )
@@ -271,8 +277,10 @@ def main ():
271277 for sWord in sText [1 :].strip ().split ():
272278 if sWord :
273279 echo ("* " + sWord )
274- for sMorph in oSpellChecker .getMorph (sWord ):
275- echo (" {:<32} {}" .format (sMorph , oLexicographer .formatTags (sMorph )))
280+ for sElem , aRes in oSpellChecker .analyze (sWord ):
281+ echo (" - " + sElem )
282+ for sMorph , sMeaning in aRes :
283+ echo (" {:<40} {}" .format (sMorph , sMeaning ))
276284 elif sText .startswith ("!" ):
277285 for sWord in sText [1 :].strip ().split ():
278286 if sWord :
@@ -291,6 +299,11 @@ def main ():
291299 sTagsPattern = ""
292300 for aRes in oSpellChecker .select (sFlexPattern , sTagsPattern ):
293301 echo ("{:<30} {:<30} {}" .format (* aRes ))
302+ elif sText .startswith ("≠" ):
303+ lWords = sText [1 :].split ("|" )
304+ for s1 , s2 in itertools .combinations (lWords , 2 ):
305+ nDist = strt .distanceDamerauLevenshtein (s1 , s2 )
306+ print (f"{ s1 } ≠ { s2 } : { nDist } " )
294307 elif sText .startswith ("/o+ " ):
295308 oGrammarChecker .gce .setOptions ({ opt :True for opt in sText [3 :].strip ().split () if opt in oGrammarChecker .gce .getOptions () })
296309 echo ("done" )
@@ -329,18 +342,31 @@ def main ():
329342 if xArgs .textformatter :
330343 sParagraph = oTextFormatter .formatText (sParagraph )
331344 lParagraphErrors , lSentences = oGrammarChecker .gce .parse (sParagraph , bDebug = xArgs .debug , bFullInfo = True )
332- echo (txt .getReadableErrors (lParagraphErrors , xArgs .width ))
345+ # echo(txt.getReadableErrors(lParagraphErrors, xArgs.width))
333346 for dSentence in lSentences :
334- echo ("{nStart}:{nEnd}" .format (** dSentence ))
335- echo (" <" + dSentence ["sSentence" ]+ ">" )
336- for dToken in dSentence ["lToken" ]:
337- echo (" {0[nStart]:>3}:{0[nEnd]:<3} {1} {0[sType]:<14} {2} {0[sValue]:<16} {3:<10} {4}" .format (dToken , \
338- "×" if dToken .get ("bToRemove" , False ) else " " ,
339- "!" if dToken ["sType" ] == "WORD" and not dToken .get ("bValidToken" , False ) else " " ,
340- " " .join (dToken .get ("lMorph" , "" )), \
341- "·" .join (dToken .get ("aTags" , "" )) ) )
342- echo (txt .getReadableErrors (dSentence ["lGrammarErrors" ], xArgs .width ))
347+ echo ("{nStart}:{nEnd} <{sSentence}>" .format (** dSentence ))
348+ for dToken in dSentence ["lTokens" ]:
349+ if dToken ["sType" ] == "INFO" or "bMerged" in dToken :
350+ continue
351+ echo (" {0[nStart]:>3}:{0[nEnd]:<3} {1} {0[sType]:<14} {2} {0[sValue]:<16} {3}" .format (dToken , \
352+ "×" if dToken .get ("bToRemove" , False ) else " " ,
353+ "!" if dToken ["sType" ] == "WORD" and not dToken .get ("bValidToken" , False ) else " " ,
354+ " " .join (dToken .get ("aTags" , "" )) ) )
355+ if "lMorph" in dToken :
356+ for sMorph , sLabel in zip (dToken ["lMorph" ], dToken ["aLabels" ]):
357+ echo (" {0:40} {1}" .format (sMorph , sLabel ))
358+ if "lSubTokens" in dToken :
359+ for dSubToken in dToken ["lSubTokens" ]:
360+ if dSubToken ["sValue" ]:
361+ echo (" · {0:20}" .format (dSubToken ["sValue" ]))
362+ for sMorph , sLabel in zip (dSubToken ["lMorph" ], dSubToken ["aLabels" ]):
363+ echo (" {0:40} {1}" .format (sMorph , sLabel ))
364+ #echo(txt.getReadableErrors(dSentence["lGrammarErrors"], xArgs.width))
343365 else :
366+ if sText .startswith ("TEST: " ):
367+ sText = sText [6 :]
368+ sText = sText .replace ("{{" , "" ).replace ("}}" , "" )
369+ sText = re .sub (" ->> .*$" , "" , sText ).rstrip ()
344370 for sParagraph in txt .getParagraph (sText ):
345371 if xArgs .textformatter :
346372 sParagraph = oTextFormatter .formatText (sParagraph )
0 commit comments