Files
Horizon-OC/Source/Configurator/src/ini.py
2025-10-01 19:10:21 -04:00

102 lines
3.3 KiB
Python

import os
import re
import common as c
def ensure_dir_exists(path: str):
os.makedirs(os.path.dirname(path), exist_ok=True)
def set_ini_values(ini_path, section, entries):
if not c.drive:
c.show_popup("Error", "This feature requires a valid drive to be selected")
return
ini_path = str(ini_path)
try:
with open(ini_path, "r") as f:
lines = f.readlines()
except FileNotFoundError:
lines = []
output_lines = []
current_section = None
section_lines = []
section_found = False
def flush_section():
nonlocal section_lines, output_lines
if section_lines:
output_lines.extend(section_lines)
section_lines = []
for line in lines:
section_match = re.match(r"\s*\[([^\]]+)\]", line)
if section_match:
if current_section == section and entries:
new_lines = []
keys_handled = set()
for l in section_lines[1:]:
key_match = re.match(r"\s*([A-Za-z0-9_.]+)\s*=", l)
if key_match:
key = key_match.group(1)
if key in entries:
val = entries[key]
if val is None:
continue
new_lines.append(f"{key} = {val}\n")
keys_handled.add(key)
else:
new_lines.append(l)
else:
new_lines.append(l)
for k, v in entries.items():
if k not in keys_handled and v is not None:
new_lines.append(f"{k} = {v}\n")
section_lines = [section_lines[0]] + new_lines
flush_section()
current_section = section_match.group(1)
section_lines = [line]
if current_section == section:
section_found = True
continue
section_lines.append(line)
if current_section == section and entries:
new_lines = []
keys_handled = set()
for l in section_lines[1:]:
key_match = re.match(r"\s*([A-Za-z0-9_.]+)\s*=", l)
if key_match:
key = key_match.group(1)
if key in entries:
val = entries[key]
if val is None:
continue
new_lines.append(f"{key} = {val}\n")
keys_handled.add(key)
else:
new_lines.append(l)
else:
new_lines.append(l)
for k, v in entries.items():
if k not in keys_handled and v is not None:
new_lines.append(f"{k} = {v}\n")
section_lines = [section_lines[0]] + new_lines
flush_section()
if not section_found and entries:
output_lines.append(f"\n[{section}]\n")
for k, v in entries.items():
if v is not None:
output_lines.append(f"{k} = {v}\n")
ensure_dir_exists(ini_path)
if output_lines:
with open(ini_path, "w") as f:
f.writelines(output_lines)
else:
if os.path.exists(ini_path):
os.remove(ini_path)