/
indentutils.py
128 lines (106 loc) · 3.62 KB
/
indentutils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import mwparserfromhell as mwp
import time
# Unclean code
def extract_indent_blocks(wikicode):
old_indent = 0
wc_block_list = []
cur_block_wc_lines = []
for wc_line in _split_wikicode_on_endlines(wikicode):
line = str(wc_line)
indent = _find_line_indent(line)
if indent != old_indent and line.strip() != "":
wc_block = _join_wikicode(cur_block_wc_lines)
block = str(wc_block)
if block.strip() != "":
wc_block_list.append(wc_block)
cur_block_wc_lines = []
old_indent = indent
cur_block_wc_lines.append(wc_line)
wc_block = _join_wikicode(cur_block_wc_lines)
block = str(wc_block)
if block.strip() != "":
wc_block_list.append(wc_block)
return wc_block_list
# Unclean code
def _split_wikicode_on_endlines(wikicode):
divided = []
cur = []
for node in wikicode.nodes:
if type(node) is mwp.nodes.text.Text:
split_nodes = _split_text_node_on_endline(node)
for sn in split_nodes:
cur.append(sn)
if "\n" in sn.value:
divided.append(mwp.wikicode.Wikicode(cur))
cur = []
else:
cur.append(node)
if len(cur) > 0:
divided.append(mwp.wikicode.Wikicode(cur))
return divided
def _split_text_node_on_endline(text_node):
text = text_node.value
lines = _split_text_and_leave_delimiter(text, "\n")
results = []
for line in lines:
if line != "":
results.append(mwp.nodes.text.Text(line))
return results
def _split_text_and_leave_delimiter(text, delimiter):
result = []
lines = text.split(delimiter)
for i, line in enumerate(lines):
if i == (len(lines) - 1):
break
result.append(line + delimiter)
result.append(lines[i])
return result
def _join_wikicode(wikicode_list):
nodes = []
for wc in wikicode_list:
nodes.extend(wc.nodes)
return mwp.wikicode.Wikicode(nodes)
def find_min_indent(wikicode):
text = str(wikicode)
lines = text.split('\n')
non_empty = [line for line in lines if line.strip() != ""]
indents = [_find_line_indent(line) for line in non_empty]
return min(indents)
def find_line_indent(wcode):
text = str(wcode)
if text.strip() != "":
return _find_line_indent(text)
return None
def _find_line_indent(line):
return _count_indent_in_some_order(line)
def _count_indent_in_some_order(line):
line = line.strip()
count = 0
count_star = 0
indent_chars = [':', '*', '#']
while len(indent_chars) > 0:
if len(line) > count and line[count] in indent_chars:
char = line[count]
count += _count_leading_char(line[count:], line[count])
if char == '*' or char =='#':
count_star += count
indent_chars.remove(char)
else:
break
if count_star > 0:
return count - 1
return count
def _count_leading_char(line, char):
line = line.strip()
if len(line) == 0 or line[0] != char:
return 0
else:
return 1 + _count_leading_char(line[1:], char)
def has_continuation_indent(wikicode):
if len(wikicode.nodes) > 0:
start_node = wikicode.nodes[0]
if type(start_node) is mwp.nodes.template.Template:
return "outdent" in str(start_node).lower() or "undent" in str(start_node).lower() or "od" in str(start_node).lower()
if type(start_node) is mwp.nodes.template.Text:
return "outdent" in str(start_node).lower() or "undent" in str(start_node).lower()
return False