manuais-e-documentacao-itguys/.gemini/batch_update.py

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()