77from ..dictformats import kaikki_line_to_textdef
88from ..constants import langcodes
99
10+ def fmt_result (definitions ):
11+ "Format the result of dictionary lookup"
12+ lines = []
13+ for defn in definitions :
14+ if defn ['pos' ] != "" :
15+ lines .append ("<i>" + defn ['pos' ] + "</i>" )
16+ lines .extend ([str (item [0 ] + 1 ) + ". " + item [1 ]
17+ for item in list (enumerate (defn ['meaning' ]))])
18+ return "<br>" .join (lines )
1019
1120class WiktionarySource (DictionarySource ):
1221 def __init__ (self , langcode : str , options : SourceOptions ) -> None :
@@ -17,22 +26,27 @@ def __init__(self, langcode: str, options: SourceOptions) -> None:
1726 super ().__init__ ("Wiktionary (English)" , langcode , options )
1827
1928 def _lookup (self , word : str ) -> LookupResult :
20- logger .info (f"Looking up { word } in Wiktionary" )
21- language_longname = langcodes [self .langcode ]
29+ logger .info (f"Looking up { word } in Wiktionary (English), langcode { self .langcode } " )
2230 try :
2331 res = cached_get (
24- f"https://kaikki.org/dictionary/{ language_longname } /meaning/{ word [0 ]} /{ word [0 :2 ]} /{ word } .jsonl" )
32+ 'https://en.wiktionary.org/api/rest_v1/page/definition/' +
33+ word )
2534 except Exception as e :
2635 logger .error (f"Failed to get data from Wiktionary: { repr (e )} " )
27- return LookupResult (error = repr (e ))
36+ return LookupResult (error = str (e ))
2837 if res .status_code != 200 :
2938 return LookupResult (error = str (res .text ))
30- datalines = res .content .decode ('utf-8' ).splitlines ()
31- items : list [str ] = []
32- for line in datalines :
33- data = json .loads (line )
34- items .append (kaikki_line_to_textdef (data ))
35- if items :
36- return LookupResult (definition = "<br>\n " .join (items ))
37- else :
38- return LookupResult (error = "No definitions found" )
39+ definitions = []
40+ data = res .json ()
41+ if self .langcode not in data .keys ():
42+ return LookupResult (error = "Word not defined in language" )
43+ data = data [self .langcode ]
44+ for item in data :
45+ meanings = []
46+ for defn in item ['definitions' ]:
47+ parsed_meaning = BeautifulSoup (defn ['definition' ], features = "lxml" )
48+ meanings .append (parsed_meaning .text )
49+
50+ meaning_item = {"pos" : item ['partOfSpeech' ], "meaning" : meanings }
51+ definitions .append (meaning_item )
52+ return LookupResult (definition = fmt_result (definitions ))
0 commit comments