147 lines
4.4 KiB
Python
147 lines
4.4 KiB
Python
"""
|
|
Operazioni sui file della wiki
|
|
"""
|
|
|
|
import re
|
|
from pathlib import Path
|
|
from typing import List, Dict, Optional
|
|
import frontmatter
|
|
|
|
|
|
def list_wiki_pages(wiki_root: Path) -> Dict[str, List[Dict]]:
|
|
"""Lista tutte le pagine wiki organizzate per categoria."""
|
|
categories = {
|
|
"entities": [],
|
|
"concepts": [],
|
|
"sources": [],
|
|
"comparisons": [],
|
|
"topics": [],
|
|
}
|
|
|
|
for category in categories.keys():
|
|
category_dir = wiki_root / "wiki" / category
|
|
if category_dir.exists():
|
|
for md_file in category_dir.glob("*.md"):
|
|
categories[category].append({
|
|
"name": md_file.stem,
|
|
"file": str(md_file),
|
|
"category": category
|
|
})
|
|
|
|
# Anche le pagine root
|
|
for md_file in (wiki_root / "wiki").glob("*.md"):
|
|
if md_file.name not in ["index.md", "log.md", "overview.md"]:
|
|
categories["topics"].append({
|
|
"name": md_file.stem,
|
|
"file": str(md_file),
|
|
"category": "topics"
|
|
})
|
|
|
|
return categories
|
|
|
|
|
|
def read_page(file_path: Path) -> Dict:
|
|
"""Legge una pagina wiki e restituisce contenuto + metadata."""
|
|
if not file_path.exists():
|
|
return {"error": "File not found"}
|
|
|
|
try:
|
|
post = frontmatter.parse(file_path)
|
|
content = post.content
|
|
metadata = post.metadata
|
|
except Exception:
|
|
# Fallback: leggi solo contenuto
|
|
content = file_path.read_text(encoding="utf-8")
|
|
metadata = {}
|
|
|
|
return {
|
|
"content": content,
|
|
"metadata": metadata,
|
|
"file": str(file_path)
|
|
}
|
|
|
|
|
|
def write_page(file_path: Path, content: str, metadata: Optional[Dict] = None):
|
|
"""Scrive una pagina wiki con frontmatter."""
|
|
# Assicura che la directory esista
|
|
file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
if metadata:
|
|
# Usa frontmatter per scrivere con metadata
|
|
post = frontmatter.Post(content, **metadata)
|
|
with open(file_path, "w", encoding="utf-8") as f:
|
|
frontmatter.dump(post, f)
|
|
else:
|
|
file_path.write_text(content, encoding="utf-8")
|
|
|
|
|
|
def update_index(wiki_root: Path, new_pages: List[str], category: str):
|
|
"""Aggiunge pagine all'indice."""
|
|
index_file = wiki_root / "wiki" / "index.md"
|
|
|
|
# Leggi indice esistente
|
|
if index_file.exists():
|
|
content = index_file.read_text(encoding="utf-8")
|
|
else:
|
|
content = "# Wiki Index\n\n> Master catalog of all wiki pages.\n\n"
|
|
|
|
# Aggiungi nuovo entries
|
|
for page in new_pages:
|
|
# Check se gia presente
|
|
link = f"[[{page}]]"
|
|
if link not in content:
|
|
section = f"## {category.capitalize()}"
|
|
if section not in content:
|
|
content += f"\n{section}\n"
|
|
content += f"- [[{page}]]\n"
|
|
|
|
index_file.write_text(content, encoding="utf-8")
|
|
|
|
|
|
def append_log(wiki_root: Path, source_file: str, created: List[str], updated: List[str]):
|
|
"""Appende un entry al log."""
|
|
log_file = wiki_root / "wiki" / "log.md"
|
|
from datetime import datetime
|
|
now = datetime.now().strftime("%Y-%m-%d %H:%M")
|
|
|
|
entry = f"\n## {now} — {Path(source_file).name}\n"
|
|
if created:
|
|
entry += f"- Created: {', '.join(created)}\n"
|
|
if updated:
|
|
entry += f"- Updated: {', '.join(updated)}\n"
|
|
|
|
if log_file.exists():
|
|
content = log_file.read_text(encoding="utf-8")
|
|
# Insert dopo l'header
|
|
lines = content.split("\n")
|
|
insert_idx = 2 # dopo # Wiki Log e ---
|
|
lines.insert(insert_idx, entry)
|
|
content = "\n".join(lines)
|
|
else:
|
|
content = f"# Wiki Log\n\n> Append-only record.\n{entry}\n"
|
|
|
|
log_file.write_text(content, encoding="utf-8")
|
|
|
|
|
|
def extract_wikilinks(content: str) -> List[str]:
|
|
"""Estrae tutti i [[wikilinks]] dal contenuto."""
|
|
pattern = r'\[\[([^\]]+)\]\]'
|
|
return re.findall(pattern, content)
|
|
|
|
|
|
def get_all_wikilinks(wiki_root: Path) -> Dict[str, List[str]]:
|
|
"""Trova tutti i wikilinks in tutte le pagine."""
|
|
links = {}
|
|
|
|
for md_file in wiki_root.glob("wiki/**/*.md"):
|
|
if md_file.name == "index.md":
|
|
continue
|
|
try:
|
|
content = md_file.read_text(encoding="utf-8")
|
|
page_links = extract_wikilinks(content)
|
|
if page_links:
|
|
links[str(md_file.relative_to(wiki_root))] = page_links
|
|
except Exception:
|
|
continue
|
|
|
|
return links |