Files
croccybot/scripts/makedomains.py

77 lines
2.1 KiB
Python

# Iterate through each file in the project
# Look for LocalBabel("text") in each file, mark it as the "text" domain
# module files inherit from their __init__ files if they don't specify a specific domain
import re
import os
from collections import defaultdict
babel_regex = re.compile(
r".*LocalBabel\(\s*['\"](.*)['\"]\s*\).*"
)
ignored_dirs = {
'RCS',
'__pycache__',
'pending-rewrite',
'.git'
}
def parse_domain(path):
"""
Parse a file to check for domain specifications.
Currently just looks for a LocalBabel("domain") specification.
"""
with open(path, 'r') as file:
for line in file:
match = babel_regex.match(line)
if match:
return match.groups()[0]
def read_directory(path, domain_map, domain='base'):
init_path = None
files = []
dirs = []
for entry in os.scandir(path):
if entry.is_file(follow_symlinks=False) and entry.name.endswith('.py'):
if entry.name == '__init__.py':
init_path = entry.path
else:
files.append(entry.path)
elif entry.is_dir(follow_symlinks=False) and entry.name not in ignored_dirs:
dirs.append(entry.path)
if init_path:
domain = parse_domain(init_path) or domain
print(
f"{domain:<20} | {path}"
)
for file_path in files:
file_domain = parse_domain(file_path) or domain
print(
f"{file_domain:<20} | {file_path}"
)
domain_map[file_domain].append(file_path)
for dir_path in dirs:
read_directory(dir_path, domain_map, domain)
def write_domains(domain_map):
for domain, files in domain_map.items():
domain_path = os.path.join('locales', 'domains', f"{domain}.txt")
with open(domain_path, 'w') as domain_file:
domain_file.write('\n'.join(files))
print(f"Wrote {len(files)} source files to {domain_path}")
if __name__ == '__main__':
domain_map = defaultdict(list)
read_directory('src/', domain_map, domain='base')
write_domains(domain_map)
print("Supported domains: {}".format(', '.join(domain_map.keys())))