mirror of
https://github.com/minetest/minetest.git
synced 2025-03-06 20:48:40 +01:00
152 lines
3.1 KiB
Python
152 lines
3.1 KiB
Python
#!/usr/bin/python3
|
|
|
|
import sys
|
|
import re
|
|
|
|
# preprocess files for indent check
|
|
|
|
# Code processing:
|
|
#
|
|
# Tabs are kept.
|
|
# Spaces after tabs are removed if indent is not smaller than in previous line.
|
|
#
|
|
# Example:
|
|
#
|
|
# <tab>a = 6;
|
|
# <spc>b = 5;
|
|
# <tab><spc>if (
|
|
# <tab><tab><tab><spc><spc>) {
|
|
# <tab><tab>c = 7;
|
|
# <tab><spc>}
|
|
#
|
|
# Result:
|
|
#
|
|
# <tab>a = 6;
|
|
# <spc>b = 5;
|
|
# <tab>if (
|
|
# <tab><tab><tab>) {
|
|
# <tab><tab>c = 7;
|
|
# <tab><spc>}
|
|
|
|
# Multiline comments processing:
|
|
#
|
|
# It is expected that tabs indent from comment begining is
|
|
# used as indent on begining of every commented line.
|
|
#
|
|
# Example:
|
|
#
|
|
# <tab>/*
|
|
# <spc><spc>A
|
|
# <tab><tab>B
|
|
# <tab><spc>C
|
|
# D
|
|
# <tab><spc>*/
|
|
# <tab><tab>/*
|
|
# <spc><tab><spc>R
|
|
# <tab><spc><tab>*/
|
|
#
|
|
# Result:
|
|
#
|
|
# <tab>/*
|
|
# <spc>A
|
|
# <tab>B
|
|
# <tab>C
|
|
# D
|
|
# <tab>*/
|
|
# <tab><tab>/*
|
|
# <spc><tab>*R
|
|
# <tab><spc>*/
|
|
|
|
|
|
def main():
|
|
if len(sys.argv) != 4:
|
|
#print("Bad arguments")
|
|
#print(sys.argv)
|
|
exit()
|
|
# multiline comment begining and end from command line
|
|
mlc_begin = sys.argv[1]
|
|
mlc_end = sys.argv[2]
|
|
file_name = sys.argv[3]
|
|
|
|
mlc_end_len = len(mlc_end)
|
|
re_begin = re.escape(mlc_begin)
|
|
re_end = re.escape(mlc_end)
|
|
|
|
re_mlc_begin = "^.*{}".format(re_begin)
|
|
re_mlc_begin_end = "^.*{}.*{}".format(re_begin, re_end)
|
|
re_mlc_end = "^.*{}".format(re_end)
|
|
|
|
file = open(file_name, "r")
|
|
|
|
lines = []
|
|
|
|
#print(re_mlc_begin)
|
|
#print(re_mlc_begin_end)
|
|
#print(re_mlc_end)
|
|
#print(file)
|
|
|
|
# -1 means not in the multiline comment
|
|
# other values mean multiline comment indent in the number of tabs
|
|
limit = -1
|
|
# this value stores the previous line indent in code mode (not in multiline comment)
|
|
prev = 80
|
|
for line in file:
|
|
if limit == -1:
|
|
find = re.search(re_mlc_begin, line)
|
|
if find:
|
|
if not re.search(re_mlc_begin_end, line):
|
|
# enter in block comment mode
|
|
find = re.search("^\\s*", line)
|
|
limit = find.end()
|
|
find = re.search("^\\t*", line)
|
|
end = find.end()
|
|
if end < prev:
|
|
lines.append(line)
|
|
else:
|
|
# in this case, there can be allowed extra trailing whitespaces
|
|
# up to 3 trailing whitespaces are allowed
|
|
#find = re.search("^\\t+[ ]{0,3}", line)
|
|
# unlimited number of trailng whitespaces are allowed
|
|
find = re.search("^\\t+[ ]*", line)
|
|
fend = find.end() if find else 0
|
|
if fend >= end:
|
|
find = re.search("^\\t*", line)
|
|
lines.append(line[0:find.end()] + line[fend:])
|
|
else:
|
|
lines.append(line)
|
|
prev = end
|
|
else:
|
|
# in block comment mode
|
|
find = re.search(re_mlc_end, line)
|
|
if find:
|
|
# erase whitechars enabled for ignore, end in block comment mode
|
|
begin = find.end() - mlc_end_len
|
|
if begin > limit:
|
|
lines.append(line[0:limit] + line[begin:])
|
|
else:
|
|
lines.append(line)
|
|
limit = -1
|
|
else:
|
|
# erase whitechars enabled for ignore
|
|
find = re.search("^$", line)
|
|
if find:
|
|
lines.append(line)
|
|
else:
|
|
find = re.search("^\\s*", line)
|
|
if find:
|
|
end = find.end()
|
|
if end > limit:
|
|
lines.append(line[0:limit] + line[end:])
|
|
else:
|
|
lines.append(line)
|
|
else:
|
|
lines.append(line)
|
|
|
|
file.close()
|
|
file = open(file_name, "w")
|
|
for line in lines:
|
|
file.write(line)
|
|
file.close()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|