Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wersja StarDict #2

Open
Tokariew opened this issue Feb 24, 2023 · 10 comments
Open

Wersja StarDict #2

Tokariew opened this issue Feb 24, 2023 · 10 comments

Comments

@Tokariew
Copy link

Tokariew commented Feb 24, 2023

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
Copy link
Owner

PMKrol commented Feb 24, 2023

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
Copy link
Owner

PMKrol commented Feb 24, 2023

...i pionowe kreski zamiast przecinków.

@Tokariew
Copy link
Author

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
Copy link
Owner

PMKrol commented Feb 24, 2023

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
Copy link
Author

Tokariew commented Feb 24, 2023

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
Copy link
Author

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
Copy link
Owner

PMKrol commented Feb 24, 2023

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
Copy link
Author

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
Copy link
Author

Tokariew commented Feb 24, 2023

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
Copy link

Daviteusz commented Nov 16, 2023

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:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants