forked from doocs/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun_format.py
117 lines (97 loc) · 3.66 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
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') and '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()