113 lines
3.9 KiB
Python
113 lines
3.9 KiB
Python
import os
|
|
import re
|
|
import sys
|
|
import subprocess
|
|
from glob import glob
|
|
|
|
# Assets
|
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
PROJECT_ROOT = os.path.dirname(BASE_DIR)
|
|
MANAGE_REGISTRY_SCRIPT = os.path.join(BASE_DIR, "manage_registry.py")
|
|
CONVERT_PDF_SCRIPT = os.path.join(BASE_DIR, "convert_to_pdf.py")
|
|
|
|
def get_manual_level(filename):
|
|
"""Infer level from filename [Nível X] ..."""
|
|
match = re.search(r'\[Nível\s*(\d+)\]', filename, re.IGNORECASE)
|
|
if match:
|
|
return int(match.group(1))
|
|
|
|
# Fallback: check parent folder name
|
|
if "Nivel_0" in filename: return 0
|
|
if "Nivel_1" in filename: return 1
|
|
if "Nivel_2" in filename: return 2
|
|
if "Nivel_3" in filename: return 3
|
|
|
|
return None
|
|
|
|
def update_manual(file_path):
|
|
filename = os.path.basename(file_path)
|
|
|
|
# Skip non-manuals
|
|
if filename.lower() == "gemini.md" or "readme" in filename.lower() or "legado" in file_path.lower():
|
|
print(f"Skipping: {filename}")
|
|
return
|
|
|
|
level = get_manual_level(file_path)
|
|
if level is None:
|
|
print(f"Skipping (Unknown Level): {filename}")
|
|
return
|
|
|
|
# Extract Title (everything after [Nível X])
|
|
clean_title = re.sub(r'\[Nível\s*\d+\]', '', filename).replace('.md', '').strip(" -_")
|
|
|
|
print(f"Processing: {filename} | Level: {level} | Title: {clean_title}")
|
|
|
|
# 1. Generate New Code
|
|
try:
|
|
cmd = [sys.executable, MANAGE_REGISTRY_SCRIPT, "--level", str(level), "--title", clean_title]
|
|
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
|
|
|
|
# Extract code from stdout (looking for "SUCCESS: Generated Code: X")
|
|
code_match = re.search(r'Generated Code:\s*(ITG[A-Z]+\s+\d{4}/\d{2})', result.stdout)
|
|
if not code_match:
|
|
print(f"Failed to generate code for {filename}. Output: {result.stdout}")
|
|
return
|
|
|
|
new_code = code_match.group(1)
|
|
print(f" -> New Code: {new_code}")
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Error calling registry script: {e}")
|
|
return
|
|
|
|
# 2. Update Markdown Content
|
|
with open(file_path, 'r', encoding='utf-8') as f:
|
|
content = f.read()
|
|
|
|
# Regex to find existing code line or insert it
|
|
# Pattern looks for "**Código:** ITITG ... |" or similar
|
|
code_pattern = re.compile(r'(\*\*Código:\*\*).*?(\|)')
|
|
|
|
if code_pattern.search(content):
|
|
# Update existing
|
|
new_content = code_pattern.sub(f"**Código:** {new_code} |", content)
|
|
else:
|
|
# Insert after title (assuming standard format)
|
|
# This is trickier, so for now we append simple replacement logic or just manual check
|
|
# But given the request to "update", let's assume they might have old headers
|
|
# Let's simple look for the "Código:" string
|
|
new_content = re.sub(r'Código:.*?\|', f"Código: {new_code} |", content)
|
|
|
|
if new_content != content:
|
|
with open(file_path, 'w', encoding='utf-8') as f:
|
|
f.write(new_content)
|
|
print(" -> Markdown updated.")
|
|
else:
|
|
print(" -> No header change needed (or header not found).")
|
|
# Ensure we write at least once to touch the file? No.
|
|
|
|
# Force Insert if standard header missing?
|
|
# Let's try to be smart: if it's an old manual without header, we might need to prepend it
|
|
# validating against the standard template.
|
|
pass
|
|
|
|
# 3. Regenerate PDF
|
|
print(" -> Generating PDF...")
|
|
try:
|
|
subprocess.run([sys.executable, CONVERT_PDF_SCRIPT, file_path], check=True)
|
|
print(" -> PDF Done.")
|
|
except subprocess.CalledProcessError as e:
|
|
print(f" -> PDF Generation Failed: {e}")
|
|
|
|
def main():
|
|
# Find all .md files in parent dir recursively
|
|
search_path = os.path.join(PROJECT_ROOT, "**", "*.md")
|
|
files = glob(search_path, recursive=True)
|
|
|
|
for f in files:
|
|
if ".gemini" in f: continue
|
|
update_manual(f)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|