PMKrol / CC-SJP

Polish dictionary for mobile readers based on SJP.pl, Wikipedia and Wiktionary
16 stars 1 forks source link

Wersja StarDict #2

Open Tokariew opened 1 year ago

Tokariew commented 1 year ago
newlines = []
with open('SJP_202302181705.txt') as file:
    for k, line in enumerate(file):
        word, abberation, definition = line.split('\t')
        if abberation:
            abberation = abberation.replace(', ', '|')
            abberation = f"|{abberation}"
        newline = f'{word}{abberation}\t{definition}'
        newlines.append(newline)

with open('tabfile.txt', 'w') as file:
    for line in newlines:
        file.write(line)

Powyższy kod jest do przekonwertowania wersji z SJP-{data} do formatu tabfile rozumianego przez pyglossary, który potem umożliwia konwersja do formatu StarDict Do konwersji do StarDicta użyłem następujących opcji:

image

Słownik można tutaj pobrać https://tokariew.xyz/nextcloud/s/dQB5Dc6q3tzDndN Można go przetestować w programie Koreader

PMKrol commented 1 year ago

Czyli tabfile składa się z dwóch pól rozdzielonych tabem: wszystkich odmian oraz definicji, tak? Jeśli tak, to i to może się generować automatycznie. Widzę, że stardict jest dosyć niewdzięcznym formatem... Czy warto go generować natywnie czy ta metoda jest wystarczająco satysfakcjonująca?

PMKrol commented 1 year ago

...i pionowe kreski zamiast przecinków.

Tokariew commented 1 year ago

Więc tak Tabfile to forma podstawowa, oraz opcjonalnie odmiany oddzielone pionowymi kreskami, a po tym oddzielona tabem definicja.

Co do stardicta, to nie pamiętam skąd miałem dotychczasową wersję, czy ją również przekonwertowałem dawno temu, czy co, ale z nią nie miałem problemu. Z obecną wersją mam problemy, bo przy niektórych hasłach wywala mi aplikację Koreader na czytniku, przy kolejnym zwieszce jeśli będę w domu sprawdzę w logu czemu tak się dzieje. Oraz obecnie przerwy są trochę zbyt duże. Ale obecnie taka konwersja wystarcza. image

PMKrol commented 1 year ago

Najważniejsze, to chyba wyłapać które słowo powoduje błąd, bo może to definicja jest z błędem. Wiem, że niektóre hasła są błędami obarczone. Mam pomysł na poprawę jakości Wikipedii i może Wiktionary, ale SJP jest przerabiany przy użyciu dużej ilości wyrażeń regularnych, co skutkuje dziwnymi wynikami czasem.

TabFile.zip dostępny już na cc-sjp.zabałaganionemiejsce.pl. Jak dojdziemy co jest nie tak, dopiszę funkcje wykorzystujące ten plik do przerobienia na StarDict i poprawiające plik ifo o odpowiednia dane wg. https://github.com/huzheng001/stardict-3/blob/master/dict/doc/StarDictFileFormat:

bookname=      // required
wordcount=     // required
synwordcount=  // required if ".syn" file exists.
idxfilesize=   // required
idxoffsetbits= // New in 3.0.0
author=
email=
website=
description=    // You can use <br> for new line.
date=
sametypesequence= // very important.
dicttype=

Żeby to wszystko wyglądało tak jak należy (szczególnie data wygenerowania).

Dzięki.

Tokariew commented 1 year ago

W sumie z pyglossary zainstalowanym, to można te dane podać, jeżeli konwersje zrobi się w skrypcie bez gui. Wtedy też nie trzeba konwertować do TabFile.

for word, defi in mydict.items():
    glos.addEntryObj(glos.newEntry(
        word,
        defi,
        defiFormat="m",  # "m" for plain text, "h" for HTML
    ))

glos.setInfo("title", "My Test StarDict")
glos.setInfo("author", "John Doe")
glos.write("test.ifo", format="Stardict")

tylko obecnie sprawdzam jak należy podać odmiany, jeżeli by się zrobiło bez konwersji pośredniej do TabFile

Tokariew commented 1 year ago

Co do problematycznych słów: to na czytniku mam problem ze słowem fizyka, ale już jak odpalam KoReadera na Linuksie, to problemu brak. Wygląda jakby brakowało czytnikowi RAMu lub procesora, bo okrutnie on zwalnia, przed wywaleniem

PMKrol commented 1 year ago

Od razu zaznaczam, że skrypty o których ja mówię to php + ew. bash. Obecny TabFile generuje się bezpośrednio z php bezobsługowo, więc chyba nie ma potrzeby kombinowania. https://github.com/ilius/pyglossary nie podaje jak z cmd dodać autora przy konwersji.

Jeśli to problem z długością hasła, to można temu zaradzić.

Tokariew commented 1 year ago
from pyglossary import Glossary
from datetime import date

Glossary.init()
glos = Glossary()
with open('SJP_202302181705.txt') as file:
    for line in file:
        word, abberation, definition = line.split('\t')
        if abberation:
            abberation = abberation.split(', ')
        glos.addEntryObj(
            glos.newEntry([word, *abberation], definition, defiFormat='h')
        )
glos.setInfo('title', 'SJP info')
glos.setInfo('author', 'San Zamoyski')
glos.setInfo('date', date.today().strftime('%Y%m%d'))
staroptions = {'dictzip': True, 'sametypesequence': 'h', 'merge_syns': True}
glos.write(
    f"sjp-{date.today().strftime('%Y%m%d')}.ifo", 'Stardict', **staroptions
)

tak powinien wyglądać mniej więcej konwersja przy użyciu pythona z już wcześniej istniejącego formatu opcjonalnie do ustawienia jeszcze website, mail i description, ale to w podobny sposób jak autor

Można co prawda rozdzielić definicje i też podać w postaci listy.

Tokariew commented 1 year ago

https://github.com/ilius/pyglossary nie podaje jak z cmd dodać autora przy konwersji.

Autora można podać po konwersji edytując plik tekstowy ifo, który wygląda mniej więcej tak

StarDict's dict ifo file
version=3.0.0
bookname=SJP info
wordcount=4800846
idxfilesize=105209978
sametypesequence=h
author=San Zamoyski
date=2023-02-24
description=

Więc po konwersji autora, datę, opis, maila oraz stronę można dopisać ręcznie czy jakimś skryptem. Tytuł z tego co widzę, jeżeli jest konwertowany to pobiera z nazwy pliku wejściowego.

Tutaj w razie co komenda do konwersji z formatu tabfile:

pyglossary Tabfile.txt Stardict.ifo --read-format=Tabfile --write-format=Stardict --write-options='merge_syns=True;dictzip=True;sametypesequence=h'

Przepraszam, że tak chaotycznie

Do skompresowania przez pyglossary słownika potrzebny jest program dictzip

Daviteusz commented 7 months ago

Układ można poprawić plikiem .css, który się wrzuca obok plików słownika.

obraz

Skrypt naprawiający problemy z plikami html: (nie rozwiązuje problemów z zawieszaniem się na niektórych słowach)

Użyty skrypt do konwersji z HTML na StarDict Textual:

Słownik można pobrać tutaj: