feat: publication IA (magazine/brief/essay) + fixes critique
Publication IA: - 4 templates (magazine, brief, essay, simple) avec CSS riche - Rewrite IA (article/exercises/tutorial/reference/mixed) - Modération avec timeout 12s + fallback safe - Quotas publish_enhance par tier (basic=2, pro=15, business=100) - Détection contenu stale (hash) - Migration DB publishedContent/publishedTemplate/publishedSourceHash Fixes: - cheerio v1.2: Element -> AnyNode (domhandler), decodeEntities cast - _isShared ajouté au type Note (champ virtuel serveur) - callout colors PDF export: extraction fonction pure testable - admin/published: guard note.userId null - Cmd+S fonctionne en mode dialog (pas seulement fullPage) i18n: - 23 clés publish* traduites dans les 15 locales - Extension Web Clipper: 13 locales mise à jour Tests: - callout-colors.test.ts (6 tests) - note-visible-in-view.test.ts (5 tests) - entitlements.test.ts + byok-entitlements.test.ts: mock usageLog + unstubAllEnvs - 199/199 tests passent Tracker: user-stories.md sync avec sprint-status.yaml
This commit is contained in:
@@ -27,3 +27,29 @@ export function sanitizeRichHtml(html: string): string {
|
||||
if (!html) return ''
|
||||
return DOMPurify.sanitize(html, { USE_PROFILES: { html: true } })
|
||||
}
|
||||
|
||||
/** Sanitisation pages publiées — préserve le HTML généré par KaTeX (MathML + spans). */
|
||||
const KATEX_MATH_TAGS = [
|
||||
'math', 'semantics', 'mrow', 'mi', 'mo', 'mn', 'msup', 'msub', 'mfrac', 'msqrt',
|
||||
'mroot', 'mtext', 'mspace', 'mstyle', 'mpadded', 'mphantom', 'menclose',
|
||||
'mover', 'munder', 'munderover', 'mtable', 'mtr', 'mtd', 'mlabeledtr',
|
||||
'annotation', 'maligngroup', 'malignmark',
|
||||
] as const
|
||||
|
||||
const KATEX_MATH_ATTR = [
|
||||
'xmlns', 'display', 'mathvariant', 'mathsize', 'mathcolor', 'dir',
|
||||
'columnalign', 'rowalign', 'columnspacing', 'rowspacing', 'stretchy',
|
||||
'symmetric', 'maxsize', 'minsize', 'largeop', 'movablelimits', 'accent',
|
||||
'accentunder', 'fence', 'separator', 'lspace', 'rspace', 'depth', 'height',
|
||||
'width', 'displaystyle', 'scriptlevel', 'class', 'style', 'aria-hidden',
|
||||
'encoding', 'data-latex',
|
||||
] as const
|
||||
|
||||
export function sanitizePublishedHtml(html: string): string {
|
||||
if (!html) return ''
|
||||
return DOMPurify.sanitize(html, {
|
||||
USE_PROFILES: { html: true },
|
||||
ADD_TAGS: [...KATEX_MATH_TAGS],
|
||||
ADD_ATTR: [...KATEX_MATH_ATTR],
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user