Files
llm-wiki-web/backend/wiki_ops.py
T

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