mejor version del wiki 2.0

This commit is contained in:
2026-09-28 17:35:13 -06:00
parent 983e19716d
commit 444706b78e
52 changed files with 4086 additions and 108 deletions
+47
View File
@@ -0,0 +1,47 @@
"""Comprueba enlaces y anclas del HTML compilado, sin dependencias externas."""
from html.parser import HTMLParser
from pathlib import Path
from urllib.parse import unquote, urlsplit
ROOT = Path(__file__).resolve().parents[1] / 'dist'
class Document(HTMLParser):
def __init__(self, source):
super().__init__()
self.ids = set()
self.links = []
self.feed(source)
def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
if 'id' in attrs:
self.ids.add(attrs['id'])
if tag == 'a' and 'href' in attrs:
self.links.append(attrs['href'])
pages = {p: Document(p.read_text()) for p in ROOT.rglob('*.html')}
if ROOT / 'index.html' not in pages:
raise SystemExit('Primero ejecuta npm run build.')
errors = set()
count = 0
for page, document in pages.items():
for href in document.links:
url = urlsplit(href)
if url.scheme or url.netloc:
continue
dest = (ROOT / unquote(url.path.lstrip('/')) if url.path.startswith('/')
else page.parent / unquote(url.path) if url.path else page)
if dest.is_dir():
dest /= 'index.html'
dest = dest.resolve()
count += 1
if not dest.exists():
errors.add(f'{page.relative_to(ROOT)} → {href}: archivo ausente')
elif url.fragment and dest in pages and unquote(url.fragment) not in pages[dest].ids:
errors.add(f'{page.relative_to(ROOT)} → {href}: ancla ausente')
expected = {'administrador', 'solicitante', 'comprador', 'autorizador', 'almacen', 'contabilidad', 'proveedor'}
actual = {x.strip('/').split('/')[1] for x in pages[ROOT / 'index.html'].links if x.startswith('/roles/')}
if actual != expected:
errors.add(f'Los accesos de inicio no coinciden con los siete roles: {actual}')
print(f'{len(pages)} páginas HTML; {count} enlaces internos; {len(errors)} errores.')
for error in sorted(errors):
print(error)
raise SystemExit(bool(errors))