Passed
Push — master ( 8c7e96...605616 )
by torrua
01:16
created

app.site.compose.english_item   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 76
dl 0
loc 99
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A EnglishItem.select_definitions_by_key() 0 14 1
A EnglishItem.export_as_html() 0 3 1
A EnglishItem.__init__() 0 9 1
B EnglishItem.export_for_english() 0 54 3
1
# -*- coding: utf-8 -*-
2
3
from loglan_core.definition import BaseDefinition
4
from loglan_core.addons.definition_selector import DefinitionSelector
5
from loglan_core.event import BaseEvent
6
from loglan_core.word import BaseWord
7
from sqlalchemy.sql.selectable import Select
8
9
from app.site.compose import DEFAULT_HTML_STYLE, Item
10
from app.site.compose.definition_formatter import DefinitionFormatter
11
12
13
class EnglishItem(Item):
14
    def __init__(
15
        self,
16
        definitions: list[BaseDefinition],
17
        key: str,
18
        style: str = DEFAULT_HTML_STYLE,
19
    ):
20
        self.definitions = definitions
21
        self.key = key
22
        self.style = style
23
24
    @staticmethod
25
    def select_definitions_by_key(
26
        key: str,
27
        language: str = None,
28
        case_sensitive: bool = False,
29
        event_id: BaseEvent | int | str = None,
30
    ) -> Select:
31
        return (
32
            DefinitionSelector()
33
            .by_key(key=key, language=language, case_sensitive=case_sensitive)
34
            .join(BaseWord)
35
            .filter(BaseWord.filter_by_event_id(event_id=event_id))
36
            .distinct(BaseWord.name)
37
            .order_by(BaseWord.name)
38
        )
39
40
    def export_as_html(self):
41
        return "\n".join(
42
            [self.export_for_english(d, self.key, self.style) for d in self.definitions]
43
        )
44
45
    @staticmethod
46
    def export_for_english(  # pylint: disable=too-many-locals
47
        definition: BaseDefinition,
48
        key: str,
49
        style: str = DEFAULT_HTML_STYLE,
50
    ) -> str:
51
        # de = definition english
52
        tags = {
53
            "normal": [
54
                '<span class="dg">(%s)</span>',
55
                '<span class="dt">[%s]</span> ',
56
                ' <span class="db">%s</span>',
57
                f'<span class="definition eng" id={definition.id}>%s</span>',
58
                '<div class="d_line">%s</div>',
59
                '<span class="w_name">%s</span>, ',
60
                '<span class="w_origin">&lt;%s&gt;</span> ',
61
            ],
62
            "ultra": [
63
                "(%s)",
64
                "[%s] ",
65
                " %s",
66
                "<de>%s</de>",
67
                "<ld>%s</ld>",
68
                "<wn>%s</wn>, ",
69
                "<o>&lt;%s&gt;</o> ",
70
            ],
71
        }
72
73
        (
74
            t_d_gram,
75
            t_d_tags,
76
            t_d_body,
77
            t_def,
78
            t_def_line,
79
            t_word_name,
80
            t_word_origin,
81
        ) = tags[style]
82
83
        gram_form = str(definition.slots or "") + definition.grammar_code
84
        def_gram = t_d_gram % gram_form if gram_form else ""
85
        def_tags = (
86
            t_d_tags % definition.case_tags.replace("-", "&zwj;-&zwj;")
87
            if definition.case_tags
88
            else ""
89
        )
90
91
        def_body = DefinitionFormatter(definition).tagged_definition_body(key, t_d_body)
92
        word_name = DefinitionFormatter(definition).tagged_word_name(t_word_name)
93
        word_origin_x = DefinitionFormatter(definition).tagged_word_origin_x(
94
            t_word_origin
95
        )
96
97
        definition = t_def % f"{def_tags}{def_gram}{def_body}"
98
        return t_def_line % f"{word_name}{word_origin_x}{definition}"
99