mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 01:05:48 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			153 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			153 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()
 |