Skip to content

Commit

Permalink
v2.4
Browse files Browse the repository at this point in the history
  • Loading branch information
anezih committed Jul 23, 2023
1 parent b5af998 commit bc94987
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 59 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
GTSv*
21 changes: 14 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,38 @@
# Nedir?
https://github.com/ogun/guncel-turkce-sozluk reposunda bulunan TDK Güncel Türkçe Sözlük gts.json.tar.gz dosyasını
PyGlossary aracılığıyla StarDict, Kobo ve Kindle formatlarına çeviren bir Python betiği.
TDK Güncel Türkçe Sözlük gts.json.tar.gz dosyasını PyGlossary aracılığıyla StarDict, Kobo ve Kindle formatlarına çeviren bir Python betiği.

# Kullanımı
`python gts_convert.py --help`
```
usage: gts_convert.py [-h] [--json-tar-gz-path JSON_TAR_GZ_PATH] [--stardict] [--kobo] [--kindle] [--dictzip]
[--dictgen DICTGEN]
usage: gts_convert.py [-h] [--json-tar-gz-path JSON_TAR_GZ_PATH] [--cekim-sozlukler CEKIM_SOZLUKLER] [--stardict]
[--kobo] [--kindle] [--dictzip] [--dictgen DICTGEN]
https://github.com/ogun/guncel-turkce-sozluk reposunda bulunan TDK Güncel Türkçe Sözlük gts.json.tar.gz dosyasını
PyGlossary aracılığıyla StarDict, Kobo ve Kindle formatlarına çeviren bir Python betiği.
TDK Güncel Türkçe Sözlük gts.json.tar.gz dosyasını PyGlossary aracılığıyla StarDict, Kobo ve Kindle formatlarına çeviren bir Python betiği.
options:
-h, --help show this help message and exit
--json-tar-gz-path JSON_TAR_GZ_PATH
gts.json.tar.gz konumu.
--cekim-sozlukler CEKIM_SOZLUKLER
Sözcük çekimleri için ek Stardict sözlüklerinin dosya yolları. Birden fazla kaynağı noktalı
virgül (;) ile ayırın
--stardict StarDict çıktı formatı oluşturulsun.
--kobo Kobo dicthtml.zip çıktı formatı oluşturulsun.
--kindle Kindle MOBI çıktı formatı oluşturulsun.
--dictzip StarDict .dict dosyasını sıkıştıracak dictzip aracı PATH'de mi?
--dictgen DICTGEN Kobo dicthtml-tr.zip dosyasını oluşturacak aracın (dictgen-*.exe) konumu.
```
Yukarıda belirtilen repodan gts.json.tar.gz dosyasını gts_convert.py betiğinin yanına indirin. Sözcüklerin çekim bilgilerinin yer aldığı tr_TR.json.gz dosyasının betik ile aynı konumda olduğundan emin olun. (Bu dosyanın nasıl oluşturulduğunu merak ediyorsanız [bağlantıyı](https://github.com/anezih/HunspellWordForms) takip edin. Üretilen json dosyasının [kaynak Hunspell dosyaları](https://github.com/titoBouzout/Dictionaries/blob/master/Turkish.txt).)
gts.json.tar.gz dosyasının ve sözcüklerin çekim bilgilerinin yer aldığı tr_TR.json.gz dosyasının betik ile aynı konumda olduğundan emin olun. (Bu dosyanın nasıl oluşturulduğunu merak ediyorsanız [bağlantıyı](https://github.com/anezih/HunspellWordForms) takip edin. Üretilen json dosyasının [kaynak Hunspell dosyaları](https://github.com/titoBouzout/Dictionaries/blob/master/Turkish.txt).) (NOT: 2.4 versiyonu öncesinde kaynak olarak kullanılan gts.json.tar.gz dosyasına [buradan](https://github.com/ogun/guncel-turkce-sozluk) ulaşabilirsiniz)

Tüm formatları üretmek için betiği şu şekilde çağırın:

`python gts_convert.py --stardict --kobo --kindle --dictzip --dictgen "dictgen-windows.exe"`

`--cekim-sozlukler` parametresi, var olan sözcük çekim bilgilerini hazırlanan sözlüğe ekleyebilmenizi sağlar. Bu parametreye çekim bilgileri olan StarDict sözlüklerinin yollarını gösterin. Birden fazla sözlük kullanılacaksa bunları noktalı virgül (;) ile ayırın. Örnek:
```
python gts_convert.py --cekim-sozlukler "D:\sozlukler\kaynak_1.ifo;D:\sozlukler\kaynak_2.ifo" --stardict --kobo --kindle --dictzip --dictgen "dictgen-windows.exe"
```

`--dictzip` anahtarı, kullanıldığında dictzip çalıştırılabilir dosyasının PATH'de olduğunu belirtir. (Windows'a yüklemek için: https://github.com/Tvangeste/dictzip-win32)

`--dictgen` parametresi Dictfile dosyasını Kobo dicthtml.zip formatına dönüştüren çalıştırılabilir dosyanın konumunu gösterir. Sisteminiz için uygun dictgen-* programını https://github.com/pgaskin/dictutil adresinden edinebilirsiniz.
Expand All @@ -39,6 +45,7 @@ pip install requests
# Kobo sözlüğünü yükleme
* Sözlüğü `KOBOeReader/.kobo/dict` konumuna kopyalayın.
* `KOBOeReader/.kobo/Kobo/Kobo eReader.conf` dosyasında `ApplicationPreferences` kısmının altına `ExtraLocales=tr` seçeneğini ekleyin.
* Veya sözlüğü doğrudan `KOBOeReader/.kobo/custom-dict` konumuna kopyalayın.
* Kaynak ve detaylı açıklama için [buraya](https://pgaskin.net/dictutil/dicthtml/install.html) başvurun.


Expand Down
Binary file added src/gts.json.tar.gz
Binary file not shown.
179 changes: 127 additions & 52 deletions src/gts_convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,37 +7,77 @@
import sys
import tarfile
from copy import deepcopy
from time import sleep
from datetime import datetime

import requests
from pyglossary.glossary_v2 import Glossary
from pyglossary.sort_keys import namedSortKeyList

VERSION = (2, 3)
LAST_ID = 92411
VERSION = (2, 4)
LAST_ID = 99501
DUZELTME_IMLERI_DICT = {
"Â" : "A", "â" : "a",
"Û" : "U", "û" : "u",
"Î" : "İ", "î" : "i"
}
normalize = str.maketrans(DUZELTME_IMLERI_DICT)

class INFL:
# https://github.com/anezih/HunspellWordForms
def __init__(self, unmunched: str) -> None:
try:
with gzip.open(unmunched, "rt", encoding="utf-8") as infl:
temp = json.load(infl)
except:
sys.exit("Sözcük çekimlerinin bulunduğu gzip dosyası açılamadı.\ntr_TR.json.gz dosyasının betikle aynı konumda olduğundan emin olun.")
class INFL():
def __init__(self, source: str) -> None:
self.j = {}
self.populate_dict(source=source)

def populate_dict(self, source: str, glos_format: str = "") -> None:
raise NotImplementedError

def get_infl(self, word: str) -> list[str]:
raise NotImplementedError

class Unmunched(INFL):
def populate_dict(self, source: str) -> None:
if source.endswith(".gz"):
try:
with gzip.open(source, "rt", encoding="utf-8") as f:
temp = json.load(f)
except:
sys.exit("[!] Gzip ile sıkıştırılmış tr_TR.json.gz dosyası açılamadı.\n Dosya ismini/yolunu kontrol edin.")
else:
try:
with open(source, "r", encoding="utf-8") as f:
temp = json.load(f)
except:
sys.exit("[!] tr_TR.json dosyası açılamadı.\n Dosya ismini/yolunu kontrol edin.")
for it in temp:
for key, val in it.items():
if key in self.j.keys():
self.j[key]["SFX"] += val["SFX"]
else:
self.j[key] = val

def get_sfx(self, word: str) -> list:
word_dict = self.j.get(word)
if word_dict:
return word_dict["SFX"]
else:
return []
def get_infl(self, word: str) -> list[str]:
afx = []
afx_lst = self.j.get(word)
if afx_lst:
afx += afx_lst["SFX"]
return afx

class GlosSource(INFL):
def populate_dict(self, source: str) -> None:
if not os.path.exists(source):
sys.exit("[!] Çekimler için kaynak olarak kullanılacak sözlük bulunamadı.\n Dosya ismini/yolunu kontrol edin.")
glos = Glossary()
glos.directRead(filename=source)
for entry in glos:
if len(entry.l_word) < 2:
continue
hw = entry.l_word[0]
if hw in self.j.keys():
self.j[hw] += entry.l_word[1:]
else:
self.j[hw] = entry.l_word[1:]

def get_infl(self, word: str) -> list[str]:
return self.j.get(word, [])

def out_dir(name: str, format: str) -> str:
folder_name = f"{name}_{format}"
Expand Down Expand Up @@ -66,19 +106,20 @@ def fix_quotes(text: str) -> str:

def fix_df_hws(fname: str) -> None:
with open(fname, "r", encoding="utf-8") as df:
_in = df.readlines()
_out = []
for line in _in:
if line.startswith("@"):
line = line.replace("\"", "'")
_out.append(line)
else:
_out.append(line)
with open(fname, "w", encoding="utf-8") as df_out:
for out_line in _out:
df_out.write(out_line)
with open(f"{fname}_fixed", "w", encoding="utf-8") as df_out:
for line in df.readlines():
if line.startswith("@"):
line = line.replace("\"", "'")
df_out.write(line)
df_out.flush()
else:
df_out.write(line)
df_out.flush()

def dl_new_entries(num: int) -> list[dict]:
def dl_new_entries(num: int, ignore_cache: bool = False) -> list[dict]:
if os.path.exists(cache_fname := f"{num+1}_{LAST_ID}.json") and not ignore_cache:
with open(cache_fname, "r", encoding="utf-8") as cache_in:
return json.load(cache_in)
extra_arr = []
s = requests.Session()
headers = {
Expand All @@ -89,42 +130,54 @@ def dl_new_entries(num: int) -> list[dict]:
try:
res = s.get(url, params={"id": i}, headers=headers)
if res.status_code == 200:
if res.json().get("error"):
continue
extra_arr.append(res.json()[0])
print(f"Yeni girdilerden {i}/{LAST_ID} indirildi.", end="\r")
except:
pass
sleep(1.5)
print("\n")
if extra_arr:
extra_arr.sort(key=lambda x: int(x["madde_id"]))
with open(cache_fname, "w", encoding="utf-8") as cache_out:
json.dump(extra_arr, cache_out, ensure_ascii=False, indent=2)
return extra_arr

def local_json(fname: str) -> list[dict]:
arr = []
with tarfile.open(fname, "r:gz") as f:
_json = f.extractfile("gts.json").readlines()
for i in _json:
arr.append(json.loads(i))
if (num := len(arr)) < LAST_ID:
_json = f.extractfile("gts.json")
if _json.read(1).decode() == "[":
_json.seek(0,0)
arr = json.load(_json)
else:
for i in _json.readlines():
arr.append(json.loads(i))
arr.sort(key=lambda x: int(x["madde_id"]))
if (num := int(arr[-1]["madde_id"])) < LAST_ID:
arr += dl_new_entries(num=num)
return arr

def create_dictionaries(dictionary: list[dict], infl: INFL, stardict: bool = False, kobo: bool = False, kindle: bool = False, dictzip: bool = False, dictgen: str = ""):
Glossary.init()

def create_dictionaries(dictionary: list[dict], infl_dicts: list[INFL], stardict: bool = False, kobo: bool = False, kindle: bool = False, dictzip: bool = False, dictgen: str = ""):
glos = Glossary()
glos.setInfo("title", "Güncel Türkçe Sözlük")
glos.setInfo("author", "https://github.com/anezih")
glos.setInfo("description", "TDK Güncel Türkçe Sözlük")
glos.setInfo("description", f"TDK Güncel Türkçe Sözlük | Sürüm: {VERSION[0]}.{VERSION[1]}")
glos.setInfo("date", f"{datetime.today().strftime('%d/%m/%Y')}")
glos.sourceLangName = "tr"
glos.targetLangName = "tr"

for it in dictionary:
if not it.get("anlamlarListe"):
continue
continue
entry = f'<p style="margin-left:1em">'
features = f''
if it["telaffuz"]:
features += f'<span style="color:#696969">/{it["telaffuz"]}/</span>'
if it["lisan"]:
features += f'{"<br/>" if len(features) > 1 else ""}<span style="color:#696969"> Orijin:</span> {it["lisan"]}'
if it["cogul_mu"] == "1":
features += f'{"<br/>" if len(features) > 1 else ""}<span style="color:#696969">[ÇOĞUL]</span>'
features += f'{"<br/>" if len(features) > 1 else ""}<span style="color:#696969">[ÇOĞUL]</span>'
if it["ozel_mi"] == "1":
features += f'{"<br/>" if "[ÇOĞUL]" not in features else ""}<span style="color:#696969">[ÖZEL]</span>'
if len(features) > 1:
Expand All @@ -136,7 +189,7 @@ def create_dictionaries(dictionary: list[dict], infl: INFL, stardict: bool = Fal
on_taki = f'{it["on_taki"]} '
if it["taki"]:
taki = f', -{it["taki"]}'
if on_taki or taki:
if on_taki or taki:
anlamlar += f'<b>{on_taki}{it["madde"]}{taki}</b><br/>'
for idx, a in enumerate(it["anlamlarListe"], start=1):
anlam = f''
Expand Down Expand Up @@ -168,9 +221,21 @@ def create_dictionaries(dictionary: list[dict], infl: INFL, stardict: bool = Fal
birlesikler = [f'<a href="bword://{html.escape(i)}">{i}</a>' for i in birlesikler_temp]
entry += f'{", ".join(birlesikler)} </span><br/>'
entry += f"</p>"
madde = it["madde"]
madde_cekimler = [madde] + infl.get_sfx(madde)

madde = it["madde"].strip()

suffixes_set = {
_infl
for infl_dict in infl_dicts
for _infl in infl_dict.get_infl(word=madde)
}

if madde != (duzeltme_yok := madde.translate(normalize)):
suffixes_set.add(duzeltme_yok)
if madde in suffixes_set:
suffixes_set.remove(madde)

madde_cekimler = [madde] + list(suffixes_set)

glos.addEntry(
glos.newEntry(
word = madde_cekimler, defi=entry, defiFormat="h"
Expand All @@ -193,8 +258,8 @@ def create_dictionaries(dictionary: list[dict], infl: INFL, stardict: bool = Fal
fix_df_hws(kobo_out)
print(f"*** {fname} Dictfile dosyası oluşturuldu.")
if dictgen:
subprocess.Popen([dictgen, kobo_out, "-o", os.path.join(out_dir(fname, 'Kobo'), "dicthtml-tr.zip")], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
print(f" *** Dictfile dosyası dicthtml-tr.zip formatına dönüştürüldü.")
subprocess.Popen([dictgen, f"{kobo_out}_fixed", "-o", os.path.join(out_dir(fname, 'Kobo'), "dicthtml-tr.zip")], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
print(f" *** Dictfile dosyası dicthtml-tr.zip (Kobo) formatına dönüştürüldü.")
if kindle:
print(f"*** {fname} Kindle MOBI dosyası oluşturuluyor, bu işlem biraz zaman alabilir.")
kindle_out = os.path.join(out_dir(fname, 'Kindle'), fname)
Expand All @@ -203,15 +268,18 @@ def create_dictionaries(dictionary: list[dict], infl: INFL, stardict: bool = Fal
if os.path.isfile(mobi_path):
os.rename(mobi_path, os.path.join(out_dir(fname, 'Kindle'), f"{fname}.mobi"))
print(f" *** {fname} Kindle MOBI dosyası oluşturuldu.")

if __name__ == '__main__':
Glossary.init()
parser = argparse.ArgumentParser(description=
"""
https://github.com/ogun/guncel-turkce-sozluk reposunda bulunan TDK Güncel Türkçe Sözlük gts.json.tar.gz dosyasını
https://github.com/ogun/guncel-turkce-sozluk reposunda bulunan TDK Güncel Türkçe Sözlük gts.json.tar.gz dosyasını
PyGlossary aracılığıyla StarDict, Kobo ve Kindle formatlarına çeviren bir Python betiği.
""")
parser.add_argument('--json-tar-gz-path', default="gts.json.tar.gz",
parser.add_argument('--json-tar-gz-path', default="gts.json.tar.gz",
help="""gts.json.tar.gz konumu.""")
parser.add_argument('--cekim-sozlukler', default="",
help="""Sözcük çekimleri için ek Stardict sözlüklerinin dosya yolları. Birden fazla kaynağı noktalı virgül (;) ile ayırın""")
parser.add_argument('--stardict', default=False, action="store_true",
help="""StarDict çıktı formatı oluşturulsun.""")
parser.add_argument('--kobo', default=False, action="store_true",
Expand All @@ -222,8 +290,15 @@ def create_dictionaries(dictionary: list[dict], infl: INFL, stardict: bool = Fal
help="""StarDict .dict dosyasını sıkıştıracak dictzip aracı PATH'de mi?""")
parser.add_argument('--dictgen', default="",
help="""Kobo dicthtml-tr.zip dosyasını oluşturacak aracın (dictgen-*.exe) konumu.""")

args = parser.parse_args()
local = local_json(args.json_tar_gz_path)
infl_obj = INFL("tr_TR.json.gz")
create_dictionaries(dictionary=local, infl=infl_obj, stardict=args.stardict, kobo=args.kobo, kindle=args.kindle, dictzip=args.dictzip, dictgen=args.dictgen)
infl_dicts = []
infl_dicts.append(Unmunched("tr_TR.json.gz"))
if args.cekim_sozlukler:
if ";" in args.cekim_sozlukler:
for cekim_s in args.cekim_sozlukler.split(";"):
infl_dicts.append(GlosSource(cekim_s))
else:
infl_dicts.append(GlosSource(args.cekim_sozlukler))
create_dictionaries(dictionary=local, infl_dicts=infl_dicts, stardict=args.stardict, kobo=args.kobo, kindle=args.kindle, dictzip=args.dictzip, dictgen=args.dictgen)

0 comments on commit bc94987

Please sign in to comment.