Add export support for the MDict dictionary format
This commit is contained in:
parent
e4a2e75d82
commit
4c837cd72d
53 changed files with 2233 additions and 275 deletions
23
bot/mdict/terms/daijirin2.py
Normal file
23
bot/mdict/terms/daijirin2.py
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
from bot.mdict.terms.terminator import Terminator
|
||||
from bot.mdict.glossary.daijirin2 import make_glossary
|
||||
|
||||
|
||||
class Daijirin2Terminator(Terminator):
|
||||
def _glossary(self, entry):
|
||||
if entry.entry_id in self._glossary_cache:
|
||||
return self._glossary_cache[entry.entry_id]
|
||||
glossary = make_glossary(entry, self._media_dir)
|
||||
self._glossary_cache[entry.entry_id] = glossary
|
||||
return glossary
|
||||
|
||||
def _link_glossary_parameters(self, entry):
|
||||
return [
|
||||
[entry.children, "子項目"],
|
||||
[entry.phrases, "句項目"],
|
||||
]
|
||||
|
||||
def _subentry_lists(self, entry):
|
||||
return [
|
||||
entry.children,
|
||||
entry.phrases,
|
||||
]
|
||||
18
bot/mdict/terms/factory.py
Normal file
18
bot/mdict/terms/factory.py
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
from bot.targets import Targets
|
||||
|
||||
from bot.mdict.terms.jitenon import JitenonKokugoTerminator
|
||||
from bot.mdict.terms.jitenon import JitenonYojiTerminator
|
||||
from bot.mdict.terms.jitenon import JitenonKotowazaTerminator
|
||||
from bot.mdict.terms.smk8 import Smk8Terminator
|
||||
from bot.mdict.terms.daijirin2 import Daijirin2Terminator
|
||||
|
||||
|
||||
def new_terminator(target):
|
||||
terminator_map = {
|
||||
Targets.JITENON_KOKUGO: JitenonKokugoTerminator,
|
||||
Targets.JITENON_YOJI: JitenonYojiTerminator,
|
||||
Targets.JITENON_KOTOWAZA: JitenonKotowazaTerminator,
|
||||
Targets.SMK8: Smk8Terminator,
|
||||
Targets.DAIJIRIN2: Daijirin2Terminator,
|
||||
}
|
||||
return terminator_map[target](target)
|
||||
42
bot/mdict/terms/jitenon.py
Normal file
42
bot/mdict/terms/jitenon.py
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
from bot.mdict.terms.terminator import Terminator
|
||||
|
||||
from bot.mdict.glossary.jitenon import JitenonKokugoGlossary
|
||||
from bot.mdict.glossary.jitenon import JitenonYojiGlossary
|
||||
from bot.mdict.glossary.jitenon import JitenonKotowazaGlossary
|
||||
|
||||
|
||||
class JitenonTerminator(Terminator):
|
||||
def __init__(self, target):
|
||||
super().__init__(target)
|
||||
self._glossary_maker = None
|
||||
|
||||
def _glossary(self, entry):
|
||||
if entry.entry_id in self._glossary_cache:
|
||||
return self._glossary_cache[entry.entry_id]
|
||||
glossary = self._glossary_maker.make_glossary(entry, self._media_dir)
|
||||
self._glossary_cache[entry.entry_id] = glossary
|
||||
return glossary
|
||||
|
||||
def _link_glossary_parameters(self, entry):
|
||||
return []
|
||||
|
||||
def _subentry_lists(self, entry):
|
||||
return []
|
||||
|
||||
|
||||
class JitenonKokugoTerminator(JitenonTerminator):
|
||||
def __init__(self, target):
|
||||
super().__init__(target)
|
||||
self._glossary_maker = JitenonKokugoGlossary()
|
||||
|
||||
|
||||
class JitenonYojiTerminator(JitenonTerminator):
|
||||
def __init__(self, target):
|
||||
super().__init__(target)
|
||||
self._glossary_maker = JitenonYojiGlossary()
|
||||
|
||||
|
||||
class JitenonKotowazaTerminator(JitenonTerminator):
|
||||
def __init__(self, target):
|
||||
super().__init__(target)
|
||||
self._glossary_maker = JitenonKotowazaGlossary()
|
||||
24
bot/mdict/terms/smk8.py
Normal file
24
bot/mdict/terms/smk8.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
from bot.mdict.terms.terminator import Terminator
|
||||
from bot.mdict.glossary.smk8 import make_glossary
|
||||
|
||||
|
||||
class Smk8Terminator(Terminator):
|
||||
def _glossary(self, entry):
|
||||
if entry.entry_id in self._glossary_cache:
|
||||
return self._glossary_cache[entry.entry_id]
|
||||
glossary = make_glossary(entry, self._media_dir)
|
||||
self._glossary_cache[entry.entry_id] = glossary
|
||||
return glossary
|
||||
|
||||
def _link_glossary_parameters(self, entry):
|
||||
return [
|
||||
[entry.children, "子項目"],
|
||||
[entry.phrases, "句項目"],
|
||||
]
|
||||
|
||||
def _subentry_lists(self, entry):
|
||||
return [
|
||||
entry.children,
|
||||
entry.phrases,
|
||||
entry.kanjis,
|
||||
]
|
||||
73
bot/mdict/terms/terminator.py
Normal file
73
bot/mdict/terms/terminator.py
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
from abc import abstractmethod, ABC
|
||||
|
||||
|
||||
class Terminator(ABC):
|
||||
def __init__(self, target):
|
||||
self._target = target
|
||||
self._glossary_cache = {}
|
||||
self._media_dir = None
|
||||
|
||||
def set_media_dir(self, media_dir):
|
||||
self._media_dir = media_dir
|
||||
|
||||
def make_terms(self, entry):
|
||||
gid = entry.get_global_identifier()
|
||||
glossary = self.__full_glossary(entry)
|
||||
terms = [[gid, glossary]]
|
||||
keys = set()
|
||||
headwords = entry.get_headwords()
|
||||
for reading, expressions in headwords.items():
|
||||
if len(expressions) == 0:
|
||||
keys.add(reading)
|
||||
for expression in expressions:
|
||||
if expression.strip() == "":
|
||||
keys.add(reading)
|
||||
continue
|
||||
keys.add(expression)
|
||||
if reading.strip() == "":
|
||||
continue
|
||||
if reading != expression:
|
||||
keys.add(f"{reading}【{expression}】")
|
||||
else:
|
||||
keys.add(reading)
|
||||
link = f"@@@LINK={gid}"
|
||||
for key in keys:
|
||||
if key.strip() != "":
|
||||
terms.append([key, link])
|
||||
for subentries in self._subentry_lists(entry):
|
||||
for subentry in subentries:
|
||||
for term in self.make_terms(subentry):
|
||||
terms.append(term)
|
||||
return terms
|
||||
|
||||
def __full_glossary(self, entry):
|
||||
glossary = []
|
||||
style_link = f"<link rel='stylesheet' href='{self._target.value}.css' type='text/css'>"
|
||||
glossary.append(style_link)
|
||||
glossary.append(self._glossary(entry))
|
||||
|
||||
for x in self._link_glossary_parameters(entry):
|
||||
(subentries, list_title) = x
|
||||
if len(subentries) == 0:
|
||||
continue
|
||||
items = []
|
||||
for subentry in subentries:
|
||||
exp = subentry.get_first_expression()
|
||||
gid = subentry.get_global_identifier()
|
||||
item = f"<li><a href='entry://{gid}'>{exp}</a></li>"
|
||||
items.append(item)
|
||||
link_glossary = f"<div data-child-links='{list_title}'><span>{list_title}</span><ul>{''.join(items)}</ul></div>"
|
||||
glossary.append(link_glossary)
|
||||
return "\n".join(glossary)
|
||||
|
||||
@abstractmethod
|
||||
def _glossary(self, entry):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def _link_glossary_parameters(self, entry):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def _subentry_lists(self, entry):
|
||||
pass
|
||||
Loading…
Reference in a new issue