1 | 1 | from typing import Any, Dict, Optional |
|
2 | |||
3 | 1 | from cleo.io.io import IO |
|
4 | |||
5 | 1 | from sdoc.sdoc2 import in_scope, out_scope |
|
6 | 1 | from sdoc.sdoc2.node.CaptionNode import CaptionNode |
|
7 | 1 | from sdoc.sdoc2.node.LabelNode import LabelNode |
|
8 | 1 | from sdoc.sdoc2.node.Node import Node |
|
9 | 1 | from sdoc.sdoc2.NodeStore import NodeStore |
|
10 | |||
11 | |||
12 | 1 | View Code Duplication | class FigureNode(Node): |
0 ignored issues
–
show
Duplication
introduced
by
![]() |
|||
13 | """ |
||
14 | A stub for SDoc2 node for figures. |
||
15 | """ |
||
16 | |||
17 | # ------------------------------------------------------------------------------------------------------------------ |
||
18 | 1 | def __init__(self, io: IO, options: Dict[str, str]): |
|
19 | """ |
||
20 | Object constructor. |
||
21 | |||
22 | :param OutputStyle io: The IO object. |
||
23 | :param dict[str,str] options: The options of this figure. |
||
24 | """ |
||
25 | 1 | super().__init__(io, 'figure', options) |
|
26 | |||
27 | 1 | self.caption: Optional[str] = None |
|
28 | 1 | """ |
|
29 | The caption for the figure. |
||
30 | """ |
||
31 | |||
32 | # ------------------------------------------------------------------------------------------------------------------ |
||
33 | 1 | def get_command(self) -> str: |
|
34 | """ |
||
35 | Returns the command of this node, i.e. smile. |
||
36 | """ |
||
37 | 1 | return 'figure' |
|
38 | |||
39 | # ------------------------------------------------------------------------------------------------------------------ |
||
40 | 1 | def is_block_command(self) -> bool: |
|
41 | """ |
||
42 | Returns False. |
||
43 | """ |
||
44 | 1 | return True |
|
45 | |||
46 | # ------------------------------------------------------------------------------------------------------------------ |
||
47 | 1 | def is_inline_command(self) -> bool: |
|
48 | """ |
||
49 | Returns True. |
||
50 | """ |
||
51 | return False |
||
52 | |||
53 | # ------------------------------------------------------------------------------------------------------------------ |
||
54 | 1 | def prepare_content_tree(self) -> None: |
|
55 | """ |
||
56 | Prepares this node for further processing. |
||
57 | """ |
||
58 | 1 | for node_id in self.child_nodes: |
|
59 | node = in_scope(node_id) |
||
60 | |||
61 | if isinstance(node, CaptionNode): |
||
62 | self.caption = node.argument |
||
63 | |||
64 | if isinstance(node, LabelNode): |
||
65 | self.setup_label(node) |
||
66 | |||
67 | out_scope(node) |
||
68 | |||
69 | # ------------------------------------------------------------------------------------------------------------------ |
||
70 | 1 | def setup_label(self, node: LabelNode) -> None: |
|
71 | """ |
||
72 | Sets the data of a label to current table. |
||
73 | |||
74 | :param LabelNode node: The label node. |
||
75 | """ |
||
76 | self._options['id'] = node.argument |
||
77 | |||
78 | # ------------------------------------------------------------------------------------------------------------------ |
||
79 | 1 | @staticmethod |
|
80 | 1 | def _get_numeration(enumerable_numbers: Dict[str, Any]) -> None: |
|
81 | """ |
||
82 | Returns the current enumeration of figures. |
||
83 | |||
84 | :param dict[str,any] enumerable_numbers: |
||
85 | """ |
||
86 | 1 | if 'heading' in enumerable_numbers and enumerable_numbers['heading'].get_level(1): |
|
87 | 1 | chapter = enumerable_numbers['heading'].get_level(1) |
|
88 | else: |
||
89 | 1 | chapter = 0 |
|
90 | |||
91 | 1 | if 'figures' not in enumerable_numbers: |
|
92 | 1 | enumerable_numbers['figures'] = '{0!s}.{1!s}'.format(chapter, '0') |
|
93 | |||
94 | else: |
||
95 | 1 | numbers_level = enumerable_numbers['figures'].split('.') |
|
96 | 1 | if chapter > int(numbers_level[0]): |
|
97 | 1 | numbers_level[0] = chapter |
|
98 | 1 | numbers_level[-1] = '0' |
|
99 | |||
100 | 1 | enumerable_numbers['figures'] = '.'.join(map(str, numbers_level)) |
|
101 | |||
102 | # ------------------------------------------------------------------------------------------------------------------ |
||
103 | 1 | @staticmethod |
|
104 | 1 | def _increment_last_level(enumerable_numbers: Dict[str, Any]) -> None: |
|
105 | """ |
||
106 | Increments the last level of figures enumeration. |
||
107 | |||
108 | :param dict[str,any] enumerable_numbers: The current numbers of enumerable nodes. |
||
109 | """ |
||
110 | 1 | heading_numbers = enumerable_numbers['figures'].split('.') |
|
111 | 1 | heading_numbers[-1] = str(int(heading_numbers[-1]) + 1) |
|
112 | |||
113 | 1 | enumerable_numbers['figures'] = '.'.join(heading_numbers) |
|
114 | |||
115 | # ------------------------------------------------------------------------------------------------------------------ |
||
116 | 1 | def number(self, enumerable_numbers: Dict[str, Any]): |
|
117 | """ |
||
118 | Sets the number of this figure node. |
||
119 | |||
120 | :param dict[str,any] enumerable_numbers: The current numbers of enumerable nodes. |
||
121 | """ |
||
122 | 1 | self._get_numeration(enumerable_numbers) |
|
123 | 1 | self._increment_last_level(enumerable_numbers) |
|
124 | |||
125 | 1 | self._options['number'] = enumerable_numbers['figures'] |
|
126 | |||
127 | 1 | super().number(enumerable_numbers) |
|
128 | |||
129 | |||
130 | # ---------------------------------------------------------------------------------------------------------------------- |
||
131 | NodeStore.register_block_command('figure', FigureNode) |
||
132 |