Evospace  0.19.0
Modding API
 
Loading...
Searching...
No Matches
filter_ue4_macros.py
1# -*- coding: utf-8 -*-
2
3import os
4import re
5import sys
6
7def camel_to_snake_case(camel_case_str):
8 snake_case_parts = []
9 current_word = ""
10
11 for i, char in enumerate(camel_case_str):
12 if char.isupper():
13 if current_word:
14 if current_word[-1].isdigit() and not (len(current_word) > 1 and current_word[-2] == 'D'):
15 if snake_case_parts:
16 snake_case_parts[-1] = snake_case_parts[-1] + current_word
17 else:
18 snake_case_parts.append(current_word)
19 else:
20 snake_case_parts.append(current_word)
21 current_word = char.lower()
22 else:
23 current_word += char
24
25 if current_word:
26 if current_word[-1].isdigit() and not (len(current_word) > 1 and current_word[-2] == 'D'):
27 if snake_case_parts:
28 snake_case_parts[-1] = snake_case_parts[-1] + current_word
29 else:
30 snake_case_parts.append(current_word)
31 else:
32 snake_case_parts.append(current_word)
33
34 return '_'.join(snake_case_parts)
35
36def camel_to_snake_case(name):
37 # Adjust to handle names starting with 'm' and followed by an uppercase letter
38 name = re.sub(r'^m([A-Z])', r'\1', name) # Remove 'm' prefix if followed by uppercase
39 return re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()
40
41def is_excluded(name):
42 # Exclude if it starts with "U" or "F" followed by an uppercase letter, indicating CamelCase.
43 return re.match(r'^(F|U|T|E|I)[A-Z]', name)
44
45def replace_camel_case_with_snake_case(text):
46 def replace(match):
47 matched_str = match.group(0)
48 # Apply exclusion criteria based on the starting characters "U" or "F".
49 if is_excluded(matched_str):
50 return matched_str
51 return camel_to_snake_case(matched_str)
52
53 # Adjust the pattern to also match names starting with 'm' followed by an uppercase letter.
54 pattern = r'\b[A-Z][a-zA-Z0-9]*\b|\bm[A-Z][a-zA-Z0-9]*\b'
55
56 result_lines = []
57 for line in text.splitlines():
58 # Skip processing for comment lines.
59 if line.strip().startswith("*"):
60 result_lines.append(line)
61 else:
62 result_lines.append(re.sub(pattern, replace, line))
63
64 return '\n'.join(result_lines)
65
66
67def paren_matcher (n):
68 return r"[^()]*?(?:\‍("*n+r"[^()]*?"+r"\‍)[^()]*?)*?"*n
69
70for root, dirs, files in os.walk("./"):
71 for filename in files:
72 namepath = os.path.join(root, filename)
73 if namepath.find(".h") != -1 and namepath.find(".html") == -1:
74 print(namepath)
75 # Slurp file into a single string
76 with open(namepath, 'r') as file:
77 content = file.read()
78 content = content.replace('FVector', 'Vec3')
79 content = content.replace('std::vector', 'UArray')
80 content = content.replace('std::unordered_map', 'UTable')
81 content = content.replace('std::map', 'UTable')
82
83 content = replace_camel_case_with_snake_case(content)
84
85 regex = '^(\s*)((?:UFUNCTION|UCLASS|UPROPERTY|UENUM|GENERATED_BODY)\s*\‍('+paren_matcher(25)+'\‍))'
86 content = re.sub(regex, r'\1', content, flags=re.MULTILINE)
87 content = re.sub(r'\bU[A-Z]\w+', lambda x: x.group().replace("U", ""), content)
88 content = re.sub(r'\bF[A-Z]\w+', lambda x: x.group().replace("F", ""), content)
89 content = re.sub(r'\bE[A-Z]\w+', lambda x: x.group().replace("E", ""), content)
90 content = re.sub(r'\bT[A-Z]\w+', lambda x: x.group().replace("T", ""), content)
91 content = re.sub(r'\bI[A-Z]\w+', lambda x: x.group().replace("I", ""), content)
92
93 with open(namepath, 'w') as file:
94 file.write(content)