-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlogic-autonum
executable file
·81 lines (67 loc) · 1.95 KB
/
logic-autonum
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
#!/usr/local/bin/python3
"""
@Author: logic
@Date: 20190623
@Desc: Automatically adding number for markdown file.
- {file_path} was from sys.stdin.read
- format: $cli format {file_path}
- clean: $cli clean {file_path}
- add: $cli add {file_path}
"""
import re
import click
import sys
HEAD_RE = re.compile('^#+')
initial_num_level = [0, 1, 1, 1, 1] # 4 level: 0.1.1.1 => 5 level: 0.1.1.1.1 => ...
def __reset_sub_levels(level, index):
level[index:] = initial_num_level[index:]
return level
def __clean(content):
lines = content.split('\n')
length = len(lines)
for i in range(length):
line = lines[i]
if HEAD_RE.match(line):
lines[i] = re.sub(r'^\s*(#+)\s+(\d+\.)+\s+', r'\1 ', line, 1)
print('\n'.join(lines))
def __add(content):
num_level = list(initial_num_level)
lines = content.split('\n')
length = len(lines)
last_head_len = 1
code_tag_cnt = 0
for i in range(length):
line = lines[i]
if re.match(r'\s*```',line):
code_tag_cnt += 1
if code_tag_cnt%2 == 0 and HEAD_RE.match(line): # filter # in code paragraph
head = re.match(r'^#+', line).group()
head_len = len(head)
if head_len <= last_head_len:
num_level = __reset_sub_levels(num_level, head_len)
num_level[head_len - 1] = num_level[head_len - 1] + 1
last_head_len = head_len
number_str = '.'.join([str(i) for i in num_level[:head_len]]) + '.'
number_str = re.sub(r'\.+$', '.', number_str)
lines[i] = re.sub(r'^(#+)\s+', r'\1 %s ' % number_str, line)
print('\n'.join(lines))
@click.group()
def cli():
pass
@click.command()
def clean():
"""
# clean number
"""
__clean(sys.stdin.read())
@click.command()
def add():
"""
# add number
"""
__add(sys.stdin.read())
# pack command
cli.add_command(clean)
cli.add_command(add)
if __name__ == '__main__':
cli()