Pipeline de renderizado Markdown (Desk)
Resumen
Doble pipeline: servidor (Python-Markdown + bleach) para páginas públicas; cliente (marked.js + DOMPurify) para preview staff.
Server-side
Archivo: apps/desk/services/markdown.py
- Preprocess strikethrough:
<del>text</del>→<del>vía regex_STRIKE_RE. markdown.markdown()con extensionesfenced_code,nl2br,sane_lists.bleach.clean()whitelist:
ALLOWED_TAGS = p, a, strong, em, code, pre, ul, ol, li, h1-h3, blockquote, del
ALLOWED_ATTRIBUTES = {a: [href, title]}
ALLOWED_PROTOCOLS = http, https, mailto
Client-side
desk-wiki-editor.js: marked.parse(md, {gfm:true, breaks:true}) → DOMPurify.sanitize().
Regla de paridad
El cliente no debe ser más permisivo que el servidor. Tests en wiki_preview_parity.py.
Edge case: strikethrough
Server pre-convierte ~~; marked en client puede divergir si hay espacios internos — documentado en parity fixtures.