forked from doocs/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
run_format.py
121 lines (101 loc) · 3.72 KB
/
run_format.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
from typing import List
import os.path
import re
import black
suffixes = ['md', 'py', 'java', 'c', 'cpp', 'go', 'php', 'cs', 'rs', 'js', 'ts']
code_blocks = ['python', 'java', 'cpp', 'c', 'go', 'ts', 'js', 'php', 'cs', 'rs']
def add_header(path: str):
"""Add header to php and go files"""
print(f'[add header] path: {path}')
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
if path.endswith('.php'):
content = '<?php\n' + content
elif path.endswith('.go') and 'sorting' not in path:
content = 'package main\n' + content
else:
return
with open(path, 'w', encoding='utf-8') as f:
f.write(content)
def remove_header(path: str):
"""Remove header from php and go files"""
print(f'[remove header] path: {path}')
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
if path.endswith('.php'):
content = content.rstrip()
content = content.replace('<?php\n', '')
elif path.endswith('.go'):
content = content.rstrip()
if 'sorting' not in path:
content = content.replace('package main\n\n', '').replace(
'package main\n', ''
)
else:
return
with open(path, 'w', encoding='utf-8') as f:
f.write(content)
def find_all_paths() -> List[str]:
"""Find all paths of files with suffixes"""
paths = []
for root, _, files in os.walk(os.getcwd()):
for file in files:
path = root + '/' + file
if 'node_modules' in path or '__pycache__' in path or '.git' in path:
continue
if any(path.endswith(f'.{suf}') for suf in suffixes):
paths.append(path)
return paths
def format_inline_code(path: str):
"""Format inline code in .md file"""
if not path.endswith('.md'):
return
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
root = path[: path.rfind('/')]
print(f'[format inline code] path: {path}')
for suf in code_blocks:
res = re.findall(f'```{suf}\n(.*?)```', content, re.S)
for block in res or []:
# skip empty code block
if not block or not block.strip():
continue
if suf in ['c', 'cpp', 'java', 'go']:
file = f'{root}/Solution2.{suf}'
with open(file, 'w', encoding='utf-8') as f:
f.write(block)
if suf == 'go':
add_header(file)
os.system(f'gofmt -w "{file}"')
remove_header(file)
else:
os.system(f'npx clang-format -i --style=file "{file}"')
with open(file, 'r', encoding='utf-8') as f:
new_block = f.read()
content = content.replace(block, new_block)
os.remove(file)
elif suf == 'python':
new_block = black.format_str(
block, mode=black.FileMode(string_normalization=False)
)
content = content.replace(block, new_block)
with open(path, 'w', encoding='utf-8') as f:
f.write(content)
def run():
"""Start formatting"""
paths = find_all_paths()
for path in paths:
add_header(path)
if any(path.endswith(suf) for suf in ['c', 'cpp', 'java']):
# format with clang-format
os.system(f'npx clang-format -i --style=file "{path}"')
# format with prettier
os.system('npx prettier --write "**/*.{md,js,ts,php}"')
# format with gofmt
os.system('gofmt -w .')
for path in paths:
remove_header(path)
for path in paths:
format_inline_code(path)
if __name__ == '__main__':
run()