Coverage for src/wiktextract/extractor/ru/example.py: 91%
45 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-11 10:26 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-11 10:26 +0000
1from wikitextprocessor import NodeKind, TemplateNode
3from ...page import clean_node
4from ...wxr_context import WiktextractContext
5from ..share import calculate_bold_offsets
6from .models import Example, Sense
8EXAMPLE_TEMPLATES = frozenset(["пример", "english surname example"])
11def process_example_template(
12 wxr: WiktextractContext,
13 sense: Sense,
14 template_node: TemplateNode,
15):
16 if template_node.template_name == "пример":
17 process_пример_template(wxr, sense, template_node)
18 elif template_node.template_name == "english surname example": 18 ↛ exitline 18 didn't return from function 'process_example_template' because the condition on line 18 was always true
19 process_en_surname_example_template(wxr, sense, template_node)
22ПРИМЕР_TEMPLATE_ARG_MAPPING = {
23 "автор": "author",
24 "титул": "title",
25 "дата": "date",
26 "издание": "collection",
27 "дата издания": "date_published",
28 "ответственный": "editor",
29 "перев": "translator",
30 "источник": "source",
31 2: "author",
32 3: "title",
33 4: "date",
34 5: "collection",
35 6: "date_published",
36}
39def process_пример_template(
40 wxr: WiktextractContext,
41 sense: Sense,
42 template_node: TemplateNode,
43):
44 # https://ru.wiktionary.org/wiki/Шаблон:пример
45 example = Example()
46 for arg_name, arg_value in template_node.template_parameters.items():
47 value = clean_node(wxr, None, arg_value)
48 if len(value) == 0:
49 continue
50 if arg_name == 1:
51 example.text = value
52 elif arg_name == "текст": 52 ↛ 53line 52 didn't jump to line 53 because the condition on line 52 was never true
53 example.text = value
54 elif arg_name == "перевод":
55 example.translation = value
56 elif arg_name in ПРИМЕР_TEMPLATE_ARG_MAPPING: 56 ↛ 46line 56 didn't jump to line 46 because the condition on line 56 was always true
57 field_name = ПРИМЕР_TEMPLATE_ARG_MAPPING[arg_name]
58 if hasattr(example, field_name): 58 ↛ 61line 58 didn't jump to line 61 because the condition on line 58 was always true
59 setattr(example, field_name, value)
60 else:
61 wxr.wtp.debug(
62 f"Unknown {arg_name=} in example template {template_node}",
63 sortid="ru/example/process_example_template/54",
64 )
66 expanded_node = wxr.wtp.parse(
67 wxr.wtp.node_to_wikitext(template_node), expand_all=True
68 )
69 for span_node in expanded_node.find_html_recursively("span"):
70 span_class = span_node.attrs.get("class", "")
71 if "example-details" in span_class:
72 example.ref = clean_node(wxr, None, span_node)
73 elif "example-block" in span_class:
74 calculate_bold_offsets(
75 wxr, span_node, example.text, example, "bold_text_offsets"
76 )
77 elif "example-translate" in span_class:
78 calculate_bold_offsets(
79 wxr,
80 span_node,
81 example.translation,
82 example,
83 "bold_translation_offsets",
84 )
86 if len(example.text) > 0:
87 sense.examples.append(example)
90def process_en_surname_example_template(
91 wxr: WiktextractContext,
92 sense: Sense,
93 template_node: TemplateNode,
94) -> None:
95 # https://ru.wiktionary.org/wiki/Шаблон:english_surname_example
96 expanded_node = wxr.wtp.parse(
97 wxr.wtp.node_to_wikitext(template_node),
98 additional_expand={"english surname example"},
99 pre_expand=True,
100 )
101 for node in expanded_node.find_child(NodeKind.TEMPLATE):
102 if node.template_name == "пример": 102 ↛ 101line 102 didn't jump to line 101 because the condition on line 102 was always true
103 process_пример_template(wxr, sense, node)