Skip to content

Commit

Permalink
2.4.3
Browse files Browse the repository at this point in the history
  • Loading branch information
anezih committed Apr 13, 2024
1 parent ab8d9e4 commit 32c1c58
Show file tree
Hide file tree
Showing 7 changed files with 206 additions and 192 deletions.
60 changes: 35 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,56 +2,66 @@
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`
`python gts.py --help`
```
usage: gts_convert.py [-h] [--json-tar-gz-path JSON_TAR_GZ_PATH] [--cekim-sozlukler CEKIM_SOZLUKLER] [--stardict]
[--kobo] [--kindle] [--dictzip] [--dictgen DICTGEN]
usage: gts.py [-h] [-j GTS_JSON] [--cekim-sozlukleri CEKIM_SOZLUKLERI [CEKIM_SOZLUKLERI ...]]
[--cekim-sozlukleri-bicimleri CEKIM_SOZLUKLERI_BICIMLERI [CEKIM_SOZLUKLERI_BICIMLERI ...]]
[--hunspell-sozlukleri HUNSPELL_SOZLUKLERI [HUNSPELL_SOZLUKLERI ...]] [-b {1,2,3,4}]
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
-j GTS_JSON, --json-tar-gz-path GTS_JSON
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.
--cekim-sozlukleri CEKIM_SOZLUKLERI [CEKIM_SOZLUKLERI ...]
Sözcük çekimleri için kullanılacak ek sözlüklerin yolları. Birden fazla dosya yolunu boşluk
ile ayırın.
--cekim-sozlukleri-bicimleri CEKIM_SOZLUKLERI_BICIMLERI [CEKIM_SOZLUKLERI_BICIMLERI ...]
--cekim-sozlukleri seçeneğinde kullanılan kaynakların biçimleri, birden fazla kaynak biçimini
boşluk ile ayırın.
--hunspell-sozlukleri HUNSPELL_SOZLUKLERI [HUNSPELL_SOZLUKLERI ...]
Çekim bilgilerinin alınacağı Hunspell dosyalarından .aff ve .dic dosyasının konumu. Birden
fazla dosya yolunu boşluk ile ayırın.
-b {1,2,3,4}, --cikti-bicimi {1,2,3,4}
Çıktı biçimi. StarDict = 1, StarDict (WebKit) = 2, Kobo = 3, Kindle = 4. StarDict biçimini
Webkit tabanlı bir görüntüleyicide kullanacaksanız (GoldenDict gibi) 2'yi seçin.
```
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. (tr_TR.json.gz dosyasını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:
Tüm biçimleri üretmek için betiği Powershell üzerinde şu şekilde çağırın:

`python gts_convert.py --stardict --kobo --kindle --dictzip --dictgen "dictgen-windows.exe"`
```powershell
1..4 | % { python gts.py -b $_ }
```

`--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:
`--cekim-sozlukleri` 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ı boşluk ile ayırın. Bu parametrenin kullanılması durumunda `--cekim-sozlukleri-bicimleri`'nde kullandığınız sözlüklerin biçimini belirtin. Ö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"
python gts.py --cekim-sozlukleri "D:\sozlukler\kaynak_1.ifo" "D:\sozlukler\kaynak_2.ifo" --cekim-sozlukleri-bicimleri Stardict Stardict -b 1"
```

`--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)
# 2.4.3 sürümü hakkında notlar
## İki tane olan StarDict biçimi hakkında<br>
2.4.3 sürümünde sözlük biçimlendirmesi StarDict'de ayrı css dosyasına taşınmıştır. Ancak KOReader yazılımının sözlük görüntüleyici arka ucu (MuPDF) HTML4 ve eşleniği CSS sürümü ötesinde görüntüleme yapamadığından StarDict sürümü basit ve biraz daha karmaşık CSS'li olmaz üzere ikiye ayrılmıştır. Sonunda *WebKit olan sürüm, görüntüleyici olarak WebKit veya daha modern bir arka uç kullanan yazılımlar içindir (Örneğin GoldenDict veya KOReader dşındaki her şey.)

## Kindle MOBI biçimi
2.4.2 sürümünde yer alan tanım içinde alan HTML bağlantılara yer verilmemiştir. Bu bağlantıların çalışıp çalışmadığını fiziki cihaz üzerinde deneyemediğimden bağlantıları bu sürüme dahil etmedim. 2.4.2 sürümünü deneyip, çalıştığını biri onaylayabilirse bu özellik tekrardan eklenebilir.

`--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.
## Biçimlendirme esnekliği
Bu sürümde sözlükleri oluşturan betik tekrar en baştan yazıldı. Bunun nedeni biçimlendirmeyi olabilidiğince koddan ayırmak ve kolaylaştırmak. Bu aynı zamanda biçimlendirmeyi son kullanıcı açısından da daha kişiselleştirilebilir kılıyor. Eğer HTML ve CSS biliyorsanız. `tpl/` klasöründe yer alan dosyaları düzenledikten sonra betiği yeniden çalıştırarak tanım görünümlerini değiştirebilirsiniz. StarDict biçiminde programı yeniden çalıştırmaya gerek kalmadan sadece CSS dosyasını düzenlemek ise yeterli.

# Gerekli paketler
```
pip install pyglossary==4.6.1
pip install requests
pip install spylls
```
# 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.
* 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.


<details>
<summary><h1>Ekran Görüntüleri</h1></summary>
<summary><h1>Ekran Görüntüleri (Eski)</h1></summary>
<h2>V1</h2>

| | |
Expand Down Expand Up @@ -83,4 +93,4 @@ pip install requests
|<img src="img/v2_1/screen_shot-20980.gif" width="300px">|<img src="img/v2_1/screen_shot-20981.gif" width="300px">|
|**V2.1 PyGlossary aracılığıyla Kindle için derlendi,<br/> çekimlenmiş sözcüklerde sonuç dönüyor**| **Kindle üzerinde tanımın detaylı görünümü**|

</details>
</details>
24 changes: 19 additions & 5 deletions src/gts.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,8 +254,9 @@ def yazar(self) -> str:
return _yazar[0]["tam_adi"]

class Anlam:
def __init__(self, anlam_sozluk: dict) -> None:
def __init__(self, anlam_sozluk: dict, bStarDict: bool = False) -> None:
self.anlam_sozluk = anlam_sozluk
self.bStarDict = bStarDict

@cached_property
def anlam_sira(self) -> int:
Expand Down Expand Up @@ -289,6 +290,7 @@ def anlam(self) -> str:

@cached_property
def anlam_gonderme_baglantili(self) -> str:
baglanti_simge = "↗" if self.bStarDict else ""
res = re.search(r"(?:;|►|bk\.)\s?([^.:]+)", self.anlam)
if not res:
return self.anlam
Expand All @@ -307,18 +309,19 @@ def anlam_gonderme_baglantili(self) -> str:
for j in gonderme_yapilanlar:
yeni_tanim = yeni_tanim.replace(
j,
f'<a href="bword://{html.escape(j)}">{j}</a>',
f'{baglanti_simge} <a href="bword://{html.escape(j)}">{j}</a>',
1
).replace("► ","")
return yeni_tanim

class Girdi:
def __init__(self, json_girdisi: dict[str,str], duzeltme_imi: DuzeltmeImi,
cekim_sozlukleri: CekimSozlukleri, tpl: Template) -> None:
cekim_sozlukleri: CekimSozlukleri, tpl: Template, bStarDict: bool = False) -> None:
self.json_girdisi = json_girdisi
self.duzeltme_imi = duzeltme_imi
self.cekim_sozlukleri = cekim_sozlukleri
self.tpl = tpl
self.bStarDict = bStarDict

@property
def anlam_html(self) -> str:
Expand Down Expand Up @@ -401,7 +404,7 @@ def atasozu(self) -> list[str]:
def anlam(self) -> list[Anlam]:
cikti: list[Anlam] = list()
if _anlamlarListe:=self.json_girdisi.get("anlamlarListe"):
cikti = [Anlam(_anlamlar) for _anlamlar in _anlamlarListe]
cikti = [Anlam(_anlamlar, self.bStarDict) for _anlamlar in _anlamlarListe]
cikti.sort(key=lambda x: x.anlam_sira)
return cikti

Expand All @@ -421,6 +424,12 @@ def __init__(self, gts_json: Path, cekim_sozlukleri: list[str],
self.hunspell_sozlukleri = hunspell_sozlukleri
self.cikti_secenegi = CiktiSecenegi(cikti_secenegi)

@cached_property
def bStarDict(self) -> bool:
if self.cikti_secenegi == CiktiSecenegi.StarDict:
return True
return False

@cached_property
def InflDicts(self) -> list[InflBase]:
infl_dicts: list[InflBase] = list()
Expand Down Expand Up @@ -513,7 +522,8 @@ def glossary(self) -> Glossary:
json_girdisi=x,
duzeltme_imi=self.DuzeltmeImi,
cekim_sozlukleri=self.CekimSozlukleri,
tpl=self.tpl
tpl=self.tpl,
bStarDict=self.bStarDict
)
for x in self.GtsJSON
]
Expand Down Expand Up @@ -548,6 +558,10 @@ def stardict(self) -> None:
if not klasor.exists():
klasor.mkdir()
glossary.write(str(dosya_ismi), "Stardict", dictzip=False)
# koreader res/ klasöründeki css dosyasını okuyamıyor.
css_path = klasor / "res" / "stardict_bicem.css"
css_uste = klasor / f"{dosya_ismi.name}.css"
css_uste.write_text(css_path.read_text("utf-8"),"utf-8")

def stardict_webkit(self) -> None:
glossary = self.glossary()
Expand Down
102 changes: 52 additions & 50 deletions src/tpl/inline.html.j2
Original file line number Diff line number Diff line change
@@ -1,69 +1,71 @@
<div style="display: block;">
<div style="display: inline-block;">
{% if Girdi.telaffuz %}
<span style="display: block;margin-bottom: 0.375em;">/{{ Girdi.telaffuz }}/</span>
{% endif %}
{% if Girdi.lisan %}
<span style="display: block;margin-bottom: 0.5em;">Kaynak: {{ Girdi.lisan }}</span>
{% endif %}
{% if Girdi.cogul_mu %}
<span style="display: inline-block;">[ÇOĞUL]&nbsp;</span>
{% endif %}
{% if Girdi.ozel_mi %}
{%- if Girdi.telaffuz -%}
<span style="display: block;margin-bottom: 0.375em;">/{{- Girdi.telaffuz -}}/</span>
{%- endif -%}
{%- if Girdi.lisan -%}
<span style="display: block;margin-bottom: 0.5em;">Kaynak: {{ Girdi.lisan -}}</span>
{%- endif -%}
{%- if Girdi.cogul_mu -%}
<span style="display: inline-block;">[ÇOKLUK]&nbsp;</span>
{%- endif -%}
{%- if Girdi.ozel_mi -%}
<span style="display: inline-block;">[ÖZEL]</span>
{% endif %}
{%- endif -%}
</div>
<div style="display: block;margin-top: 0.375em;">
{% if Girdi.on_taki or Girdi.taki %}
<span style="font-weight: bold;display: block;margin-bottom: 0.375em;">{{ Girdi.on_taki }}&nbsp;{{ Girdi.madde }}, -{{Girdi.taki}}</span>
{% endif %}
{% for Anlam in Girdi.anlam %}
{%- if Girdi.on_taki or Girdi.taki -%}
<span style="font-weight: bold;display: block;margin-bottom: 0.375em;">{{- Girdi.on_taki -}}&nbsp;{{- Girdi.madde -}}, -{{-Girdi.taki-}}</span>
{%- endif -%}
{%- for Anlam in Girdi.anlam -%}
<div style="display: block;margin-bottom: 0.5em;">
{% if Girdi.anlam|length > 1 %}
<span style="font-weight: bold;">{{ Anlam.anlam_sira }}.&nbsp;</span>
{% else %}
{%- if Girdi.anlam|length > 1 -%}
<span style="font-weight: bold;">{{- Anlam.anlam_sira -}}.&nbsp;</span>
{%- else -%}
<span style="text-indent: 1em;"></span>
{% endif %}
{% if Anlam.fiil %}
{%- endif -%}
{%- if Anlam.fiil -%}
<span style="display: inline-block;">[FİİL]&nbsp;</span>
{% endif %}
{% if Anlam.ozelliklerListe %}
<span style="display: inline-block;font-style: italic;">[
{% for Ozellik in Anlam.ozelliklerListe %}
{{ "%s" % Ozellik if loop.last else "%s, " % Ozellik }}
{% endfor %}
]</span>
{% endif %}
{%- endif -%}
{%- if Anlam.ozelliklerListe -%}
<span style="display: inline-block;">[
{%- for Ozellik in Anlam.ozelliklerListe -%}
{{- "%s" % Ozellik if loop.last else "%s, " % Ozellik -}}
{%- endfor -%}
]&nbsp;</span>
{%- endif -%}
<span>
{{ Anlam.anlam }}
{{- Anlam.anlam -}}
</span>
{% if Anlam.orneklerListe %}
{%- if Anlam.orneklerListe -%}
<div style="display: block;">
{% for _ornek in Anlam.orneklerListe %}
<span style="display: block;margin-left: 1em;margin-right: 1em;margin-top: 0.5em;">▪ {{ _ornek.ornek }}</span>
{% if _ornek.yazar %}
<span style="display: block;margin-left: 1em;margin-right: 1em;margin-top: 0.5em;">— {{ _ornek.yazar }}</span>
{% endif %}
{% endfor %}
{%- for _ornek in Anlam.orneklerListe -%}
<span style="display: block;margin-left: 1em;margin-right: 1em;margin-top: 0.5em;">▪ {{ _ornek.ornek -}}</span>
{%- if _ornek.yazar -%}
<span style="display: block;margin-left: 1em;margin-right: 1em;margin-top: 0.5em;">— {{ _ornek.yazar -}}</span>
{%- endif -%}
{%- endfor -%}
</div>
{% endif %}
{%- endif -%}
</div>
{% endfor %}
{% if Girdi.atasozu %}
{%- endfor -%}
{%- if Girdi.atasozu -%}
<div style="display: block;margin-top: 0.5em;">
<span style="font-weight: bold;display: block;margin-bottom: 0.375em;">Atasözleri, Deyimler veya Birleşik Fiiller</span><br>
{% for a in Girdi.atasozu %}
{{ "%s" % a if loop.last else "%s, " % a }}
{% endfor %}
<span style="font-weight: bold;display: block;">Atasözleri, Deyimler veya Birleşik Fiiller</span><br>
<span>→ </span>
{%- for a in Girdi.atasozu -%}
{{- "<span>%s</span>" % a if loop.last else "<span>%s, </span>" % a -}}
{%- endfor -%}
</div>
{% endif %}
{% if Girdi.birlesikler %}
{%- endif -%}
{%- if Girdi.birlesikler -%}
<div style="display: block;margin-top: 0.5em;">
<span style="font-weight: bold;display: block;margin-bottom: 0.375em;">Birleşik Kelimeler</span><br>
{% for a in Girdi.birlesikler %}
{{ "%s" % a if loop.last else "%s, " % a }}
{% endfor %}
<span style="font-weight: bold;display: block;">Birleşik Kelimeler</span><br>
<span>→ </span>
{%- for a in Girdi.birlesikler -%}
{{- "<span>%s</span>" % a if loop.last else "<span>%s, </span>" % a -}}
{%- endfor -%}
</div>
{% endif %}
{%- endif -%}
</div>
</div>
Loading

0 comments on commit 32c1c58

Please sign in to comment.