From 57aeea96231640b35f5ae0536b6e4205c7fd7117 Mon Sep 17 00:00:00 2001 From: Eugene Simonov Date: Wed, 27 Aug 2025 22:12:52 +0300 Subject: [PATCH 1/3] More ergonomic handling of JSONL in dictinfo --- vocabsieve/dictformats.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/vocabsieve/dictformats.py b/vocabsieve/dictformats.py index 66b88fc..0af923c 100644 --- a/vocabsieve/dictformats.py +++ b/vocabsieve/dictformats.py @@ -84,7 +84,7 @@ def dictinfo(path) -> dict[str, str]: return {"type": "audiolib", "basename": basename, "path": path} if ext not in supported_dict_extensions: raise NotImplementedError("Unsupported format") - if ext in ('.json', '.jsonl', '.xz', '.bz2', '.gz'): + if ext in ('.json', '.xz', '.bz2', '.gz'): with zopen(path) as f: try: d = json.load(f) @@ -108,9 +108,14 @@ def dictinfo(path) -> dict[str, str]: f.seek(0) first_line = f.readline() logger.debug("First line of bad json file: ", first_line) + raise NotImplementedError(f"File {path} is not a supported json format") + elif ext == ".jsonl": + with zopen(path) as f: + first_line = f.readline() + + if json.loads(first_line): logger.debug("Detected Kaikki wiktionary dump") - if json.loads(first_line): - return {"type": "wiktdump", "basename": basename, "path": path} + return {"type": "wiktdump", "basename": basename, "path": path} raise NotImplementedError(f"File {path} is not a supported json format") elif ext == ".ifo": return {"type": "stardict", "basename": basename, "path": path} From 5f50e984ad6723808739d8fb08905c86def8a14c Mon Sep 17 00:00:00 2001 From: Eugene Simonov Date: Mon, 22 Sep 2025 22:43:37 +0300 Subject: [PATCH 2/3] Handle JSONL archives --- .gitignore | 8 ++++-- ....org-dictionary-English-by-pos-postp.jsonl | 3 +++ ...g-dictionary-English-by-pos-postp.jsonl.gz | Bin 0 -> 7389 bytes tests/test_dictformats.py | 20 +++++++++++++++ vocabsieve/dictformats.py | 23 +++++++++++++++--- 5 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 testdata/kaikki/kaikki.org-dictionary-English-by-pos-postp.jsonl create mode 100644 testdata/kaikki/kaikki.org-dictionary-English-by-pos-postp.jsonl.gz create mode 100644 tests/test_dictformats.py diff --git a/.gitignore b/.gitignore index 7ac625a..7879528 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ __pycache__/ env/ dist/ +.DS_Store *.un~ vocabsieve.egg-info/ build/ @@ -12,5 +13,8 @@ htmlcov docs/_site docs/.jekyll-cache .vscode -testdata -testdir \ No newline at end of file +testdir + +testdata/kaikki/* +!kaikki.org-dictionary-English-by-pos-postp.jsonl +!kaikki.org-dictionary-English-by-pos-postp.jsonl.gz \ No newline at end of file diff --git a/testdata/kaikki/kaikki.org-dictionary-English-by-pos-postp.jsonl b/testdata/kaikki/kaikki.org-dictionary-English-by-pos-postp.jsonl new file mode 100644 index 0000000..52f96dc --- /dev/null +++ b/testdata/kaikki/kaikki.org-dictionary-English-by-pos-postp.jsonl @@ -0,0 +1,3 @@ +{"pos": "postp", "head_templates": [{"name": "head", "args": {"1": "en", "2": "postposition"}, "expansion": "ago"}], "sounds": [{"tags": ["General-American"], "enpr": "ə-gō'"}, {"ipa": "/əˈɡoʊ/", "tags": ["General-American"]}, {"tags": ["Received-Pronunciation"], "enpr": "ə-gō'"}, {"ipa": "/əˈɡəʊ/", "tags": ["Received-Pronunciation"]}, {"audio": "en-us-ago.ogg", "ogg_url": "https://upload.wikimedia.org/wikipedia/commons/9/9a/En-us-ago.ogg", "mp3_url": "https://upload.wikimedia.org/wikipedia/commons/transcoded/9/9a/En-us-ago.ogg/En-us-ago.ogg.mp3"}, {"rhymes": "-əʊ"}], "etymology_text": "From Middle English ago, agon (“passed”), past participle of agon (“to depart, escape, pass”), from Old English āgān (“to go away, pass away, go forth, come to pass”), from Proto-Germanic *uz- (“out”), *gāną (“to go”), equivalent to a- + gone, and by surface analysis, a- + go. Cognate with German ergehen (“to come to pass, fare, go forth”). Compare also Old Saxon āgangan (“to go or pass by”), Gothic 𐌿𐍃𐌲𐌰𐌲𐌲𐌰𐌽 (usgaggan, “to go forth”).", "etymology_templates": [{"name": "der", "args": {"1": "en", "2": "enm", "3": "ago"}, "expansion": "Middle English ago"}, {"name": "der", "args": {"1": "en", "2": "ang", "3": "āgān", "t": "to go away, pass away, go forth, come to pass"}, "expansion": "Old English āgān (“to go away, pass away, go forth, come to pass”)"}, {"name": "der", "args": {"1": "en", "2": "gem-pro", "3": "*uz-", "t": "out"}, "expansion": "Proto-Germanic *uz- (“out”)"}, {"name": "pre", "args": {"1": "en", "2": "a", "3": "gone"}, "expansion": "a- + gone"}, {"name": "surf", "args": {"1": "en", "2": "a-", "3": "go", "nocap": "1"}, "expansion": "by surface analysis, a- + go"}, {"name": "cog", "args": {"1": "de", "2": "ergehen", "t": "to come to pass, fare, go forth"}, "expansion": "German ergehen (“to come to pass, fare, go forth”)"}, {"name": "cog", "args": {"1": "osx", "2": "āgangan", "t": "to go or pass by"}, "expansion": "Old Saxon āgangan (“to go or pass by”)"}, {"name": "cog", "args": {"1": "got", "2": "𐌿𐍃𐌲𐌰𐌲𐌲𐌰𐌽", "t": "to go forth"}, "expansion": "Gothic 𐌿𐍃𐌲𐌰𐌲𐌲𐌰𐌽 (usgaggan, “to go forth”)"}], "word": "ago", "lang": "English", "lang_code": "en", "forms": [{"form": "agoe", "tags": ["alternative", "obsolete"]}, {"form": "agon", "tags": ["alternative", "obsolete"]}, {"form": "agone", "tags": ["alternative", "obsolete"]}, {"form": "ygo", "tags": ["alternative", "obsolete"]}, {"form": "ygoe", "tags": ["alternative", "obsolete"]}], "senses": [{"examples": [{"text": "I got married ten years ago.", "bold_text_offsets": [[24, 27]], "type": "example"}, {"text": "Two years ago a pair of scientists sparked fears of a devastating virus.", "ref": "2013 August 10, “Damned if you don’t”, in The Economist, volume 408, number 8848:", "type": "quote", "bold_text_offsets": [[10, 13]]}, {"text": "When they first met in 2000, my dad told my mom how he had gotten the money. The story begins 20 years ago.", "bold_text_offsets": [[103, 106]], "type": "example"}, {"text": "It was two weeks ago that I saw her last."}], "links": [["Before", "before"], ["present", "present"]], "glosses": ["Before now, before the present time"], "id": "en-ago-en-postp-lElehTyl", "categories": [{"name": "Terms with Old English translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "47 42 11"}, {"name": "Terms with West Frisian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "44 39 17"}, {"name": "Time", "kind": "other", "parents": [], "source": "w+disamb", "orig": "en:Time", "langcode": "en", "_dis": "0 2 98"}], "translations": [{"lang": "Albanian", "code": "sq", "lang_code": "sq", "sense": "past; gone by; since", "word": "parë"}, {"lang": "Arabic", "code": "ar", "lang_code": "ar", "sense": "past; gone by; since", "roman": "qabla", "word": "قَبْلَ"}, {"lang": "Arabic", "code": "arz", "lang_code": "arz", "tags": ["Egyptian-Arabic"], "sense": "past; gone by; since", "word": "من", "roman": "men"}, {"lang": "Armenian", "code": "hy", "lang_code": "hy", "sense": "past; gone by; since", "roman": "aṙaǰ", "word": "առաջ"}, {"lang": "Asturian", "code": "ast", "lang_code": "ast", "sense": "past; gone by; since", "word": "hai"}, {"lang": "Azerbaijani", "code": "az", "lang_code": "az", "sense": "past; gone by; since", "word": "əvvəl"}, {"lang": "Azerbaijani", "code": "az", "lang_code": "az", "sense": "past; gone by; since", "word": "qabaq"}, {"lang": "Azerbaijani", "code": "az", "lang_code": "az", "sense": "past; gone by; since", "word": "bundan əvvəl"}, {"lang": "Azerbaijani", "code": "az", "lang_code": "az", "sense": "past; gone by; since", "word": "bundan qabaq"}, {"lang": "Bashkir", "code": "ba", "lang_code": "ba", "sense": "past; gone by; since", "roman": "elek", "word": "элек"}, {"lang": "Basque", "code": "eu", "lang_code": "eu", "sense": "past; gone by; since", "word": "orain dela, duela"}, {"lang": "Belarusian", "code": "be", "lang_code": "be", "sense": "past; gone by; since", "roman": "tamú", "word": "таму́"}, {"lang": "Bulgarian", "code": "bg", "lang_code": "bg", "sense": "past; gone by; since", "roman": "predí", "word": "преди́"}, {"lang": "Catalan", "code": "ca", "lang_code": "ca", "sense": "past; gone by; since", "word": "fa"}, {"lang": "Chinese Cantonese", "code": "yue", "lang_code": "yue", "sense": "past; gone by; since", "roman": "zi¹ cin⁴", "word": "之前"}, {"lang": "Chinese Mandarin", "code": "cmn", "lang_code": "cmn", "sense": "past; gone by; since", "roman": "yǐqián", "word": "以前"}, {"lang": "Chinese Mandarin", "code": "cmn", "lang_code": "cmn", "sense": "past; gone by; since", "roman": "zhīqián", "word": "之前"}, {"lang": "Cornish", "code": "kw", "lang_code": "kw", "sense": "past; gone by; since", "word": "nans yw"}, {"lang": "Czech", "code": "cs", "lang_code": "cs", "sense": "past; gone by; since", "note": "used before the time", "word": "před"}, {"lang": "Danish", "code": "da", "lang_code": "da", "sense": "past; gone by; since", "word": "for ... siden"}, {"lang": "Dutch", "code": "nl", "lang_code": "nl", "sense": "past; gone by; since", "word": "geleden"}, {"lang": "Esperanto", "code": "eo", "lang_code": "eo", "sense": "past; gone by; since", "word": "antaŭ"}, {"lang": "Estonian", "code": "et", "lang_code": "et", "sense": "past; gone by; since", "word": "tagasi"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "past; gone by; since", "word": "sitten"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "past; gone by; since", "note": "used before the time", "word": "il y a"}, {"lang": "Galician", "code": "gl", "lang_code": "gl", "sense": "past; gone by; since", "word": "fai"}, {"lang": "Georgian", "code": "ka", "lang_code": "ka", "sense": "past; gone by; since", "roman": "c̣inat", "word": "წინათ"}, {"lang": "German", "code": "de", "lang_code": "de", "sense": "past; gone by; since", "note": "used before the time", "word": "vor"}, {"lang": "Greek", "code": "el", "lang_code": "el", "sense": "past; gone by; since", "roman": "prin", "word": "πριν"}, {"lang": "Haitian Creole", "code": "ht", "lang_code": "ht", "sense": "past; gone by; since", "word": "de sa"}, {"lang": "Hebrew", "code": "he", "lang_code": "he", "sense": "past; gone by; since", "roman": "lif'néi", "word": "לִפְנֵי"}, {"lang": "Hindi", "code": "hi", "lang_code": "hi", "sense": "past; gone by; since", "roman": "pahle", "word": "पहले"}, {"lang": "Hindi", "code": "hi", "lang_code": "hi", "sense": "past; gone by; since", "roman": "bahut pahle", "word": "बहुत पहले"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "past; gone by; since", "roman": "e.g. egy órával ezelőtt: one hour ago", "note": "after the time", "word": "-val/-vel ezelőtt"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "past; gone by; since", "note": "-a/-e/-ja/-je (e.g. egy órája: one hour ago)"}, {"lang": "Icelandic", "code": "is", "lang_code": "is", "sense": "past; gone by; since", "word": "fyrir"}, {"lang": "Indonesian", "code": "id", "lang_code": "id", "sense": "past; gone by; since", "word": "yang lalu"}, {"lang": "Ingrian", "code": "izh", "lang_code": "izh", "sense": "past; gone by; since", "word": "takas"}, {"lang": "Irish", "code": "ga", "lang_code": "ga", "sense": "past; gone by; since", "word": "ó shin"}, {"lang": "Italian", "code": "it", "lang_code": "it", "sense": "past; gone by; since", "word": "fa"}, {"lang": "Japanese", "code": "ja", "lang_code": "ja", "sense": "past; gone by; since", "alt": "まえ", "roman": "mae", "word": "前"}, {"lang": "Japanese", "code": "ja", "lang_code": "ja", "sense": "past; gone by; since", "alt": "いぜんに", "roman": "izen ni", "word": "以前に"}, {"lang": "Khmer", "code": "km", "lang_code": "km", "sense": "past; gone by; since", "roman": "mʊn", "word": "មុន"}, {"lang": "Korean", "code": "ko", "lang_code": "ko", "sense": "past; gone by; since", "roman": "jeone", "word": "전에"}, {"lang": "Ladino", "code": "lad", "lang_code": "lad", "sense": "past; gone by; since", "word": "aze"}, {"lang": "Ladino", "code": "lad", "lang_code": "lad", "sense": "past; gone by; since", "word": "faze"}, {"lang": "Latin", "code": "la", "lang_code": "la", "sense": "past; gone by; since", "word": "abhinc"}, {"lang": "Latvian", "code": "lv", "lang_code": "lv", "sense": "past; gone by; since", "word": "pirms"}, {"lang": "Malay", "code": "ms", "lang_code": "ms", "sense": "past; gone by; since", "word": "lalu"}, {"lang": "Malay", "code": "ms", "lang_code": "ms", "sense": "past; gone by; since", "word": "lepas"}, {"lang": "Malayalam", "code": "ml", "lang_code": "ml", "sense": "past; gone by; since", "roman": "mumpŭ", "word": "മുമ്പ്"}, {"lang": "Maltese", "code": "mt", "lang_code": "mt", "sense": "past; gone by; since", "word": "ilu"}, {"lang": "Mongolian", "code": "mn", "lang_code": "mn", "sense": "past; gone by; since", "roman": "ömnö", "word": "өмнө"}, {"lang": "Norwegian Bokmål", "code": "nb", "lang_code": "nb", "sense": "past; gone by; since", "word": "for ... siden"}, {"lang": "Norwegian Nynorsk", "code": "nn", "lang_code": "nn", "sense": "past; gone by; since", "word": "for ... sidan"}, {"lang": "Occitan", "code": "oc", "lang_code": "oc", "sense": "past; gone by; since", "word": "a"}, {"lang": "Old English", "code": "ang", "lang_code": "ang", "sense": "past; gone by; since", "note": "used before the time", "word": "for"}, {"lang": "Persian", "code": "fa", "lang_code": "fa", "sense": "past; gone by; since", "roman": "piš", "word": "پیش"}, {"lang": "Persian", "code": "fa", "lang_code": "fa", "sense": "past; gone by; since", "roman": "qabl", "word": "قبل"}, {"lang": "Polish", "code": "pl", "lang_code": "pl", "sense": "past; gone by; since", "word": "(dawno) temu"}, {"lang": "Polish", "code": "pl", "lang_code": "pl", "sense": "past; gone by; since", "word": "wcześniej"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "past; gone by; since", "word": "há"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "past; gone by; since", "word": "atrás"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "past; gone by; since", "word": "faz"}, {"lang": "Romanian", "code": "ro", "lang_code": "ro", "sense": "past; gone by; since", "word": "înainte cu"}, {"lang": "Romanian", "code": "ro", "lang_code": "ro", "sense": "past; gone by; since", "word": "în urmă"}, {"lang": "Romanian", "code": "ro", "lang_code": "ro", "sense": "past; gone by; since", "word": "acum"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "past; gone by; since", "roman": "tomú nazád", "word": "тому́ наза́д"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "past; gone by; since", "roman": "nazád", "word": "наза́д"}, {"lang": "Scots", "code": "sco", "lang_code": "sco", "sense": "past; gone by; since", "word": "syne"}, {"lang": "Scottish Gaelic", "code": "gd", "lang_code": "gd", "sense": "past; gone by; since", "word": "o chionn"}, {"lang": "Scottish Gaelic", "code": "gd", "lang_code": "gd", "sense": "past; gone by; since", "word": "air ais"}, {"lang": "Serbo-Croatian", "code": "sh", "lang_code": "sh", "tags": ["Cyrillic", "Ijekavian"], "sense": "past; gone by; since", "word": "при̏је"}, {"lang": "Serbo-Croatian", "code": "sh", "lang_code": "sh", "tags": ["Cyrillic", "Ekavian"], "sense": "past; gone by; since", "word": "пре̏"}, {"lang": "Serbo-Croatian", "code": "sh", "lang_code": "sh", "tags": ["Ijekavian", "Roman"], "sense": "past; gone by; since", "word": "prȉje"}, {"lang": "Serbo-Croatian", "code": "sh", "lang_code": "sh", "tags": ["Ekavian", "Roman"], "sense": "past; gone by; since", "word": "prȅ"}, {"lang": "Slovak", "code": "sk", "lang_code": "sk", "sense": "past; gone by; since", "word": "dozadu"}, {"lang": "Slovene", "code": "sl", "lang_code": "sl", "sense": "past; gone by; since", "word": "pred"}, {"lang": "Lower Sorbian", "code": "dsb", "lang_code": "dsb", "sense": "past; gone by; since", "note": "used before the time", "word": "pśed"}, {"lang": "Spanish", "code": "es", "lang_code": "es", "sense": "past; gone by; since", "note": "used before the time", "word": "hace"}, {"lang": "Spanish", "code": "es", "lang_code": "es", "sense": "past; gone by; since", "note": "used after the time", "word": "atrás"}, {"lang": "Spanish", "code": "es", "lang_code": "es", "sense": "past; gone by; since", "word": "ha"}, {"lang": "Swedish", "code": "sv", "lang_code": "sv", "sense": "past; gone by; since", "word": "för ... sedan"}, {"lang": "Thai", "code": "th", "lang_code": "th", "sense": "past; gone by; since", "roman": "lɛ́ɛo", "word": "แล้ว"}, {"lang": "Thai", "code": "th", "lang_code": "th", "sense": "past; gone by; since", "roman": "gɔ̀ɔn", "word": "ก่อน"}, {"lang": "Thai", "code": "th", "lang_code": "th", "sense": "past; gone by; since", "roman": "dtɛ̀ɛ-gɔ̀ɔn", "word": "แต่ก่อน"}, {"lang": "Thai", "code": "th", "lang_code": "th", "sense": "past; gone by; since", "roman": "tîi-lɛ́ɛo", "word": "ที่แล้ว"}, {"lang": "Tibetan", "code": "bo", "lang_code": "bo", "sense": "past; gone by; since", "roman": "sngon la", "word": "སྔོན་ལ"}, {"lang": "Turkish", "code": "tr", "lang_code": "tr", "sense": "past; gone by; since", "word": "önce"}, {"lang": "Ukrainian", "code": "uk", "lang_code": "uk", "sense": "past; gone by; since", "roman": "tomú", "word": "тому́"}, {"lang": "Uzbek", "code": "uz", "lang_code": "uz", "sense": "past; gone by; since", "word": "oldin"}, {"lang": "Vietnamese", "code": "vi", "lang_code": "vi", "sense": "past; gone by; since", "word": "trước đây"}, {"lang": "Welsh", "code": "cy", "lang_code": "cy", "sense": "past; gone by; since", "word": "yn ôl"}, {"lang": "West Frisian", "code": "fy", "lang_code": "fy", "sense": "past; gone by; since", "word": "lyn"}], "derived": [{"word": "four score and seven years ago"}, {"word": "long ago"}, {"word": "long long ago"}, {"word": "many moons ago"}, {"word": "three days ago"}, {"word": "two years ago"}]}]} +{"pos": "postp", "head_templates": [{"name": "head", "args": {"1": "en", "2": "postposition"}, "expansion": "apart"}], "antonyms": [{"word": "together"}], "sounds": [{"tags": ["Received-Pronunciation"], "ipa": "/əˈpɑːt/"}, {"tags": ["General-American"], "ipa": "/əˈpɑɹt/"}, {"enpr": "ə-pärt′", "tags": ["General-American"]}, {"audio": "en-us-apart.ogg", "ogg_url": "https://upload.wikimedia.org/wikipedia/commons/e/e1/En-us-apart.ogg", "mp3_url": "https://upload.wikimedia.org/wikipedia/commons/transcoded/e/e1/En-us-apart.ogg/En-us-apart.ogg.mp3"}, {"rhymes": "-ɑː(ɹ)t"}], "etymology_number": 1, "etymology_text": "From Middle English apart, aparte, a-part, a part, from Anglo-Norman a part, from Latin ad partem (“to the side”).", "etymology_templates": [{"name": "inh", "args": {"1": "en", "2": "enm", "3": "apart"}, "expansion": "Middle English apart"}, {"name": "der", "args": {"1": "en", "2": "xno", "3": "a part"}, "expansion": "Anglo-Norman a part"}, {"name": "der", "args": {"1": "en", "2": "la", "3": "ad partem", "t": "to the side"}, "expansion": "Latin ad partem (“to the side”)"}], "word": "apart", "lang": "English", "lang_code": "en", "senses": [{"examples": [{"text": "Joking apart, what do you think?", "bold_text_offsets": [[7, 12]], "type": "example"}], "synonyms": [{"word": "aside"}], "glosses": ["Excluded from consideration."], "id": "en-apart-en-postp-GcJTQ9U5", "categories": [{"name": "Terms with Ancient Greek translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "16 21 0 14 18 8 7 15"}, {"name": "Terms with Bulgarian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "7 24 0 25 20 5 6 13"}, {"name": "Terms with Catalan translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 24 1 19 28 5 5 11"}, {"name": "Terms with Dutch translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "7 28 0 20 25 4 3 12"}, {"name": "Terms with Finnish translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 26 1 20 22 5 5 13"}, {"name": "Terms with German translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 24 0 25 21 5 5 12"}, {"name": "Terms with Hungarian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "12 23 0 18 20 8 5 15"}, {"name": "Terms with Indonesian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 25 0 20 22 9 5 11"}, {"name": "Terms with Irish translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "7 23 1 24 20 10 5 10"}, {"name": "Terms with Italian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "19 21 1 16 18 4 8 14"}, {"name": "Terms with Japanese translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "6 29 1 24 24 3 3 11"}, {"name": "Terms with Kashubian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 26 1 20 23 5 5 12"}, {"name": "Terms with Latin translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "5 29 1 23 23 3 3 12"}, {"name": "Terms with Macedonian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 25 0 20 22 9 5 11"}, {"name": "Terms with Mandarin translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "9 24 1 18 20 7 5 16"}, {"name": "Terms with Maori translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 26 1 20 23 5 5 12"}, {"name": "Terms with Plautdietsch translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "2 25 0 26 30 1 1 15"}, {"name": "Terms with Polish translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "9 26 0 24 19 6 4 12"}, {"name": "Terms with Portuguese translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "18 19 1 15 22 7 6 12"}, {"name": "Terms with Russian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "5 29 1 23 23 3 3 12"}, {"name": "Terms with Sanskrit translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 26 1 20 23 5 5 12"}, {"name": "Terms with Scottish Gaelic translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 26 0 21 22 6 5 12"}, {"name": "Terms with Sicilian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 26 1 20 23 5 5 12"}, {"name": "Terms with Swedish translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 26 1 20 23 5 5 13"}, {"name": "Terms with Tocharian B translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "2 26 0 25 31 1 1 14"}, {"name": "Terms with Ukrainian translations", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "8 26 1 20 22 5 5 13"}], "translations": [{"lang": "Bulgarian", "code": "bg", "lang_code": "bg", "sense": "separately, in regard to space or company", "roman": "nastrana", "word": "настрана"}, {"lang": "Bulgarian", "code": "bg", "lang_code": "bg", "sense": "separately, in regard to space or company", "roman": "otdelno", "word": "отделно"}, {"lang": "Catalan", "code": "ca", "lang_code": "ca", "sense": "separately, in regard to space or company", "word": "a part"}, {"lang": "Chinese Mandarin", "code": "cmn", "lang_code": "cmn", "sense": "separately, in regard to space or company", "roman": "fēnlí de", "word": "分離地 /分离地"}, {"lang": "Chinese Mandarin", "code": "cmn", "lang_code": "cmn", "sense": "separately, in regard to space or company", "roman": "fēnbié", "word": "分別 /分别"}, {"lang": "Chinese Mandarin", "code": "cmn", "lang_code": "cmn", "sense": "separately, in regard to space or company", "roman": "sìfēnwǔliè", "word": "四分五裂"}, {"lang": "Dutch", "code": "nl", "lang_code": "nl", "sense": "separately, in regard to space or company", "word": "apart"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "separately, in regard to space or company", "word": "syrjässä"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "separately, in regard to space or company", "word": "syrjään"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "separately, in regard to space or company", "word": "séparé"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "separately, in regard to space or company", "word": "séparément"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "separately, in regard to space or company", "word": "à part"}, {"lang": "German", "code": "de", "lang_code": "de", "sense": "separately, in regard to space or company", "word": "getrennt"}, {"lang": "Ancient Greek", "code": "grc", "lang_code": "grc", "sense": "separately, in regard to space or company", "tags": ["Epic"], "roman": "nósphi", "word": "νόσφι"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "separately, in regard to space or company", "word": "külön"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "separately, in regard to space or company", "word": "elkülönülve"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "separately, in regard to space or company", "word": "elkülönülten"}, {"lang": "Indonesian", "code": "id", "lang_code": "id", "sense": "separately, in regard to space or company", "word": "terlepas"}, {"lang": "Irish", "code": "ga", "lang_code": "ga", "sense": "separately, in regard to space or company", "word": "ar leith"}, {"lang": "Italian", "code": "it", "lang_code": "it", "sense": "separately, in regard to space or company", "word": "separatamente"}, {"lang": "Japanese", "code": "ja", "lang_code": "ja", "sense": "separately, in regard to space or company", "alt": "べつべつに", "roman": "betsubetsu ni", "word": "別々に"}, {"lang": "Kashubian", "code": "csb", "lang_code": "csb", "sense": "separately, in regard to space or company", "word": "apart"}, {"lang": "Latin", "code": "la", "lang_code": "la", "sense": "separately, in regard to space or company", "word": "seorsum"}, {"lang": "Latin", "code": "la", "lang_code": "la", "sense": "separately, in regard to space or company", "word": "segregatim"}, {"lang": "Macedonian", "code": "mk", "lang_code": "mk", "sense": "separately, in regard to space or company", "roman": "oddelno", "word": "одделно"}, {"lang": "Maori", "code": "mi", "lang_code": "mi", "sense": "separately, in regard to space or company", "word": "tātahi"}, {"lang": "Old English", "code": "ang", "lang_code": "ang", "sense": "separately, in regard to space or company", "word": "sundor"}, {"lang": "Plautdietsch", "code": "pdt", "lang_code": "pdt", "sense": "separately, in regard to space or company", "word": "enaunda"}, {"lang": "Plautdietsch", "code": "pdt", "lang_code": "pdt", "sense": "separately, in regard to space or company", "word": "uteneen"}, {"lang": "Polish", "code": "pl", "lang_code": "pl", "sense": "separately, in regard to space or company", "word": "osobno"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "separately, in regard to space or company", "word": "à parte"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "separately, in regard to space or company", "roman": "otdélʹno", "word": "отде́льно"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "separately, in regard to space or company", "roman": "vrozʹ", "word": "врозь"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "separately, in regard to space or company", "roman": "póroznʹ", "word": "по́рознь"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "separately, in regard to space or company", "roman": "razdélʹno", "word": "разде́льно"}, {"lang": "Scottish Gaelic", "code": "gd", "lang_code": "gd", "sense": "separately, in regard to space or company", "word": "air leth"}, {"lang": "Sicilian", "code": "scn", "lang_code": "scn", "sense": "separately, in regard to space or company", "word": "sparti"}, {"lang": "Spanish", "code": "es", "lang_code": "es", "sense": "separately, in regard to space or company", "word": "aparte"}, {"lang": "Spanish", "code": "es", "lang_code": "es", "sense": "separately, in regard to space or company", "word": "separadamente"}, {"lang": "Tocharian B", "code": "txb", "lang_code": "txb", "sense": "separately, in regard to space or company", "word": "waiptār"}, {"lang": "Ukrainian", "code": "uk", "lang_code": "uk", "sense": "separately, in regard to space or company", "roman": "okrémo", "word": "окре́мо"}, {"lang": "Ukrainian", "code": "uk", "lang_code": "uk", "sense": "separately, in regard to space or company", "roman": "ostoronʹ", "word": "осторонь"}, {"lang": "Bulgarian", "code": "bg", "lang_code": "bg", "sense": "in a state of separation", "roman": "pootdelno", "word": "поотделно"}, {"lang": "Esperanto", "code": "eo", "lang_code": "eo", "sense": "in a state of separation", "word": "aparte"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "in a state of separation", "word": "erillään"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "in a state of separation", "word": "erilleen"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "in a state of separation", "word": "erikseen"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "in a state of separation", "word": "külön-külön"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "in a state of separation", "word": "különválasztva"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "in a state of separation", "word": "elkülönítve"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "in a state of separation", "word": "egyenként"}, {"lang": "Indonesian", "code": "id", "lang_code": "id", "sense": "in a state of separation", "word": "terlepas"}, {"lang": "Italian", "code": "it", "lang_code": "it", "sense": "in a state of separation", "word": "separatamente"}, {"lang": "Kashubian", "code": "csb", "lang_code": "csb", "sense": "in a state of separation", "word": "apart"}, {"lang": "Latin", "code": "la", "lang_code": "la", "sense": "in a state of separation", "word": "seorsum"}, {"lang": "Latin", "code": "la", "lang_code": "la", "sense": "in a state of separation", "word": "segregatim"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "in a state of separation", "word": "à parte"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "in a state of separation", "word": "afastado"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "in a state of separation", "roman": "otdélʹno", "word": "отде́льно"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "in a state of separation", "roman": "obosóblenno", "word": "обосо́бленно"}, {"lang": "Scottish Gaelic", "code": "gd", "lang_code": "gd", "sense": "in a state of separation", "word": "air leth"}, {"lang": "Sicilian", "code": "scn", "lang_code": "scn", "sense": "in a state of separation", "word": "sparti"}, {"lang": "Ukrainian", "code": "uk", "lang_code": "uk", "sense": "in a state of separation", "roman": "okrémo", "word": "окре́мо"}, {"lang": "Bulgarian", "code": "bg", "lang_code": "bg", "sense": "aside; away", "roman": "nastrana", "word": "настрана"}, {"lang": "Catalan", "code": "ca", "lang_code": "ca", "sense": "aside; away", "word": "a part"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "aside; away", "word": "syrjässä"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "aside; away", "word": "syrjään"}, {"lang": "German", "code": "de", "lang_code": "de", "sense": "aside; away", "word": "beiseite"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "aside; away", "word": "félretéve"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "aside; away", "word": "félre"}, {"lang": "Kashubian", "code": "csb", "lang_code": "csb", "sense": "aside; away", "word": "apart"}, {"lang": "Latin", "code": "la", "lang_code": "la", "sense": "aside; away", "word": "segregatim"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "aside; away", "word": "à parte"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "aside; away", "word": "de lado"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "aside; away", "word": "distante"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "aside; away", "roman": "pročʹ", "word": "прочь"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "aside; away", "word": "вон", "roman": "von"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "aside; away", "roman": "dolój", "word": "доло́й"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "aside; away", "roman": "v stóronu", "word": "в сто́рону"}, {"lang": "Scottish Gaelic", "code": "gd", "lang_code": "gd", "sense": "aside; away", "word": "air leth"}, {"lang": "Sicilian", "code": "scn", "lang_code": "scn", "sense": "aside; away", "word": "sparti"}, {"lang": "Sicilian", "code": "scn", "lang_code": "scn", "sense": "aside; away", "word": "di latu"}, {"lang": "Spanish", "code": "es", "lang_code": "es", "sense": "aside; away", "word": "aparte"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "in two or more parts; asunder", "word": "erillään"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "in two or more parts; asunder", "word": "erilleen"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "in two or more parts; asunder", "word": "en morceaux"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "in two or more parts; asunder", "word": "en pièces"}, {"lang": "German", "code": "de", "lang_code": "de", "sense": "in two or more parts; asunder", "word": "entzwei"}, {"lang": "German", "code": "de", "lang_code": "de", "sense": "in two or more parts; asunder", "word": "in Stücke"}, {"lang": "Hungarian", "code": "hu", "lang_code": "hu", "sense": "in two or more parts; asunder", "word": "szét-"}, {"lang": "Italian", "code": "it", "lang_code": "it", "sense": "in two or more parts; asunder", "word": "a pezzi"}, {"lang": "Japanese", "code": "ja", "lang_code": "ja", "sense": "in two or more parts; asunder", "roman": "barabara ni", "word": "ばらばらに"}, {"lang": "Latin", "code": "la", "lang_code": "la", "sense": "in two or more parts; asunder", "word": "segregatim"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "in two or more parts; asunder", "roman": "na části", "word": "на ча́сти"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "in two or more parts; asunder", "roman": "na kuskí", "word": "на куски́"}, {"lang": "Sanskrit", "code": "sa", "lang_code": "sa", "sense": "in two or more parts; asunder", "roman": "vi", "word": "वि"}, {"lang": "Sicilian", "code": "scn", "lang_code": "scn", "sense": "in two or more parts; asunder", "word": "'n 'ui"}, {"lang": "Sicilian", "code": "scn", "lang_code": "scn", "sense": "in two or more parts; asunder", "word": "a pizzuḍḍi"}, {"lang": "Swedish", "code": "sv", "lang_code": "sv", "sense": "in two or more parts; asunder", "word": "isär"}], "derived": [{"word": "a breed apart"}, {"word": "apart from"}, {"word": "apartness"}, {"word": "blow apart"}, {"word": "break apart"}, {"word": "come apart"}, {"word": "drift apart"}, {"word": "fall apart"}, {"word": "fly apart"}, {"word": "grow apart"}, {"word": "pick apart"}, {"word": "poles apart"}, {"word": "pull apart"}, {"word": "pull-apart"}, {"word": "rip apart"}, {"word": "set apart"}, {"word": "stand apart"}, {"word": "take apart"}, {"word": "tear apart"}, {"word": "tease apart"}, {"word": "tell apart"}, {"word": "worlds apart"}]}]} +{"pos": "postp", "head_templates": [{"name": "head", "args": {"1": "en", "2": "postposition"}, "expansion": "notwithstanding"}], "sounds": [{"tags": ["Received-Pronunciation"], "ipa": "/ˌnɒtwɪðˈstændɪŋ/"}, {"tags": ["US"], "ipa": "/ˌnɑtwɪθˈstændɪŋ/"}, {"audio": "en-us-notwithstanding-2.ogg", "ogg_url": "https://upload.wikimedia.org/wikipedia/commons/a/a8/En-us-notwithstanding-2.ogg", "mp3_url": "https://upload.wikimedia.org/wikipedia/commons/transcoded/a/a8/En-us-notwithstanding-2.ogg/En-us-notwithstanding-2.ogg.mp3"}, {"audio": "En-us-notwithstanding.ogg", "ogg_url": "https://upload.wikimedia.org/wikipedia/commons/8/8c/En-us-notwithstanding.ogg", "mp3_url": "https://upload.wikimedia.org/wikipedia/commons/transcoded/8/8c/En-us-notwithstanding.ogg/En-us-notwithstanding.ogg.mp3"}, {"audio": "en-au-notwithstanding.ogg", "ogg_url": "https://upload.wikimedia.org/wikipedia/commons/4/4f/En-au-notwithstanding.ogg", "mp3_url": "https://upload.wikimedia.org/wikipedia/commons/transcoded/4/4f/En-au-notwithstanding.ogg/En-au-notwithstanding.ogg.mp3"}, {"rhymes": "-ændɪŋ"}], "etymology_text": "From Middle English notwithstandinge, notwithstondyng, natwithstandyng, equivalent to not + withstanding. Compare Middle English notgainstonding, not aȝenstondynge, of similar meaning and formation.", "etymology_templates": [{"name": "inh", "args": {"1": "en", "2": "enm", "3": "notwithstandinge"}, "expansion": "Middle English notwithstandinge"}, {"name": "af", "args": {"1": "en", "2": "not", "3": "withstanding"}, "expansion": "not + withstanding"}, {"name": "cog", "args": {"1": "enm", "2": "notgainstonding"}, "expansion": "Middle English notgainstonding"}], "word": "notwithstanding", "lang": "English", "lang_code": "en", "forms": [{"form": "noughtwithstanding", "tags": ["alternative", "obsolete", "rare"]}, {"form": "nonwithstanding", "tags": ["alternative", "misconstruction"]}], "senses": [{"examples": [{"text": "in accordance with school district rules on the topic, personal preferences notwithstanding", "bold_text_offsets": [[76, 91]], "type": "example"}, {"text": "And be it declared and enacted by the authority aforesaid, that an Habeas Corpus, according to the true intent and meaning of this act, may be directed and seen in any county Palatine, the Cinque Ports, or other privileged places within the Kindgom of England, dominion of Wales, or town of Berwick upon Tweed, and the islands of Jersey and Guernsey; any law or usage to the contrary notwithstanding.", "ref": "1679, Habeas Corpus Act, section 11:", "type": "quote", "bold_text_offsets": [[384, 399]]}, {"text": "Van Gaal’s dismissal of his ability to play a central role notwithstanding, Shinji Kagawa began playing just behind the strikers Danny Welbeck and Javier Hernández.", "ref": "2014 August 26, Richard Rae, “Manchester United humbled by MK Dons after Will Grigg hits double”, in The Guardian:", "type": "quote", "bold_text_offsets": [[59, 74]]}], "links": [["In spite of", "in spite of#English"], ["despite", "despite"]], "synonyms": [{"word": "despite"}, {"word": "in spite of"}, {"word": "maugre", "alt": "obsolete"}], "glosses": ["In spite of, despite."], "id": "en-notwithstanding-en-postp-Z5ZTAhVf", "categories": [{"name": "English entries with incorrect language header", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "27 23 29 21"}, {"name": "English postpositions", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "29 25 19 27"}, {"name": "English prepositions", "kind": "other", "parents": [], "source": "w+disamb", "_dis": "24 18 30 27"}], "translations": [{"lang": "Arabic", "code": "ar", "lang_code": "ar", "sense": "in spite of", "roman": "ʕalā r-raḡm min", "word": "عَلَى اَلرَّغْم مِن"}, {"lang": "Armenian", "code": "hy", "lang_code": "hy", "sense": "in spite of", "roman": "čʻnayac", "word": "չնայած"}, {"lang": "Bulgarian", "code": "bg", "lang_code": "bg", "sense": "in spite of", "roman": "vse pak", "word": "все пак"}, {"lang": "Catalan", "code": "ca", "lang_code": "ca", "sense": "in spite of", "word": "no obstant"}, {"lang": "Czech", "code": "cs", "lang_code": "cs", "sense": "in spite of", "word": "přes"}, {"lang": "Czech", "code": "cs", "lang_code": "cs", "sense": "in spite of", "word": "vzdor"}, {"lang": "Czech", "code": "cs", "lang_code": "cs", "sense": "in spite of", "word": "navzdory"}, {"lang": "Danish", "code": "da", "lang_code": "da", "sense": "in spite of", "word": "trods"}, {"lang": "Danish", "code": "da", "lang_code": "da", "sense": "in spite of", "word": "uagtet"}, {"lang": "Dutch", "code": "nl", "lang_code": "nl", "sense": "in spite of", "word": "niettegenstaande"}, {"lang": "Esperanto", "code": "eo", "lang_code": "eo", "sense": "in spite of", "word": "malgraŭ"}, {"lang": "Finnish", "code": "fi", "lang_code": "fi", "sense": "in spite of", "word": "huolimatta"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "in spite of", "word": "en dépit de"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "in spite of", "word": "nonobstant"}, {"lang": "French", "code": "fr", "lang_code": "fr", "sense": "in spite of", "word": "malgré"}, {"lang": "German", "code": "de", "lang_code": "de", "sense": "in spite of", "word": "ungeachtet"}, {"lang": "German", "code": "de", "lang_code": "de", "sense": "in spite of", "word": "trotz"}, {"lang": "Hebrew", "code": "he", "lang_code": "he", "sense": "in spite of", "roman": "lamrot", "word": "למרות"}, {"lang": "Hebrew", "code": "he", "lang_code": "he", "sense": "in spite of", "roman": "af al pi", "word": "אף על פי"}, {"lang": "Icelandic", "code": "is", "lang_code": "is", "sense": "in spite of", "word": "þrátt fyrir"}, {"lang": "Ido", "code": "io", "lang_code": "io", "sense": "in spite of", "word": "malgre"}, {"lang": "Irish", "code": "ga", "lang_code": "ga", "sense": "in spite of", "word": "d’ainneoin"}, {"lang": "Irish", "code": "ga", "lang_code": "ga", "sense": "in spite of", "word": "in ainneoin"}, {"lang": "Irish", "code": "ga", "lang_code": "ga", "sense": "in spite of", "word": "ainneoin"}, {"lang": "Italian", "code": "it", "lang_code": "it", "sense": "in spite of", "word": "nonostante"}, {"lang": "Polish", "code": "pl", "lang_code": "pl", "sense": "in spite of", "word": "mimo"}, {"lang": "Polish", "code": "pl", "lang_code": "pl", "sense": "in spite of", "word": "pomimo"}, {"lang": "Portuguese", "code": "pt", "lang_code": "pt", "sense": "in spite of", "word": "apesar de"}, {"lang": "Romanian", "code": "ro", "lang_code": "ro", "sense": "in spite of", "word": "în ciuda faptului că"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "in spite of", "roman": "nesmotrjá na", "word": "несмотря́ на"}, {"lang": "Russian", "code": "ru", "lang_code": "ru", "sense": "in spite of", "roman": "vopreki", "word": "вопреки"}, {"lang": "Spanish", "code": "es", "lang_code": "es", "sense": "in spite of", "word": "no obstante"}, {"lang": "Swedish", "code": "sv", "lang_code": "sv", "sense": "in spite of", "word": "oaktat"}, {"lang": "Swedish", "code": "sv", "lang_code": "sv", "sense": "in spite of", "word": "trots"}, {"lang": "Turkish", "code": "tr", "lang_code": "tr", "sense": "in spite of", "word": "rağmen"}, {"lang": "Turkish", "code": "tr", "lang_code": "tr", "sense": "in spite of", "word": "karşın"}, {"lang": "Ukrainian", "code": "uk", "lang_code": "uk", "sense": "in spite of", "roman": "nezvažájučy na", "word": "незважа́ючи на"}, {"lang": "Ukrainian", "code": "uk", "lang_code": "uk", "sense": "in spite of", "roman": "pópry", "word": "по́при"}], "derived": [{"tags": ["Canada"], "word": "notwithstanding clause"}]}]} diff --git a/testdata/kaikki/kaikki.org-dictionary-English-by-pos-postp.jsonl.gz b/testdata/kaikki/kaikki.org-dictionary-English-by-pos-postp.jsonl.gz new file mode 100644 index 0000000000000000000000000000000000000000..f80d6d20f54b6419845903e93d89299bb552774c GIT binary patch literal 7389 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 Pt`Yw~$pRzN?VkVu^8 dict[str, str]: return {"type": "audiolib", "basename": basename, "path": path} if ext not in supported_dict_extensions: raise NotImplementedError("Unsupported format") + + for jsonl_ext in (".jsonl", ".jsonl.xz", ".jsonl.gz", ".jsonl.bz2"): + if not path.endswith(jsonl_ext): + continue + + with zopen(path) as f: + first_line = f.readline() + try: + if json.loads(first_line): + logger.debug("Detected Kaikki wiktionary dump") + return { + "type": "wiktdump", + "basename": os.path.basename(path.removesuffix(jsonl_ext)), + "path": path + } + except json.JSONDecodeError: + pass + raise NotImplementedError(f"File {path} is not a supported jsonl format") + if ext in ('.json', '.xz', '.bz2', '.gz'): with zopen(path) as f: try: @@ -112,10 +131,6 @@ def dictinfo(path) -> dict[str, str]: elif ext == ".jsonl": with zopen(path) as f: first_line = f.readline() - - if json.loads(first_line): - logger.debug("Detected Kaikki wiktionary dump") - return {"type": "wiktdump", "basename": basename, "path": path} raise NotImplementedError(f"File {path} is not a supported json format") elif ext == ".ifo": return {"type": "stardict", "basename": basename, "path": path} From 6a0642cefbf7261af661068c319d77486cbaace6 Mon Sep 17 00:00:00 2001 From: Eugene Simonov Date: Mon, 22 Sep 2025 22:47:14 +0300 Subject: [PATCH 3/3] Rm redundant branch --- vocabsieve/dictformats.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/vocabsieve/dictformats.py b/vocabsieve/dictformats.py index 94b10cc..61f1a9a 100644 --- a/vocabsieve/dictformats.py +++ b/vocabsieve/dictformats.py @@ -128,10 +128,6 @@ def dictinfo(path) -> dict[str, str]: first_line = f.readline() logger.debug("First line of bad json file: ", first_line) raise NotImplementedError(f"File {path} is not a supported json format") - elif ext == ".jsonl": - with zopen(path) as f: - first_line = f.readline() - raise NotImplementedError(f"File {path} is not a supported json format") elif ext == ".ifo": return {"type": "stardict", "basename": basename, "path": path} elif ext == ".mdx":