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

1from wikitextprocessor import NodeKind, TemplateNode 

2 

3from ...page import clean_node 

4from ...wxr_context import WiktextractContext 

5from ..share import calculate_bold_offsets 

6from .models import Example, Sense 

7 

8EXAMPLE_TEMPLATES = frozenset(["пример", "english surname example"]) 

9 

10 

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) 

20 

21 

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} 

37 

38 

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 ) 

65 

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 ) 

85 

86 if len(example.text) > 0: 

87 sense.examples.append(example) 

88 

89 

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)