import { createHash } from 'crypto' import type { PublishEnhanceSpec, PublishRewriteSpec, PublishTemplateId } from './types' import { extractPublishImageUrls, isAllowedImageSrc, processNoteHtmlForPublish } from './process-note-html' function esc(text: string): string { return text .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') } function heroFigure(src: string): string { if (!isAllowedImageSrc(src)) return '' return `
` } function galleryFigures(urls: string[]): string { const items = urls.map((src) => { if (!isAllowedImageSrc(src)) return '' return `` }).filter(Boolean).join('') if (!items) return '' return `` } function removeFirstImageFromHtml(html: string): string { return html.replace(/]*>[\s\S]*?]*>[\s\S]*?<\/figure>|]*>/i, '') } /* ─── Mode éditorial (texte original + habillage) ──────────────────────── */ export function renderPublishedTemplate( spec: PublishEnhanceSpec, template: PublishTemplateId, sourceHtml: string, ): string { const images = extractPublishImageUrls(sourceHtml) const bodySource = images[0] ? removeFirstImageFromHtml(sourceHtml) : sourceHtml const processedBody = processNoteHtmlForPublish(bodySource) const hero = images[0] ? heroFigure(images[0]) : '' const gallery = images.length > 1 ? galleryFigures(images.slice(1)) : '' const summary = esc(spec.summary) const pullQuote = spec.pullQuote ? `

${esc(spec.pullQuote)}

` : '' const epigraph = spec.epigraph ? `

${esc(spec.epigraph)}

` : '' const keyPoints = spec.keyPoints?.length ? `

Points clés

    ${spec.keyPoints.map((k) => `
  • ${esc(k)}
  • `).join('')}
` : '' const bodyBlock = `
${processedBody}
` if (template === 'brief') { return `
${hero} ${summary ? `

${summary}

` : ''} ${keyPoints} ${bodyBlock} ${gallery}
` } if (template === 'essay') { return `
${hero} ${epigraph} ${summary ? `

${summary}

` : ''} ${bodyBlock} ${gallery}
` } return `
${hero} ${summary ? `

${summary}

` : ''} ${pullQuote} ${bodyBlock} ${gallery}
` } /* ─── Mode réécriture (HTML sémantique IA) ─────────────────────────────── */ export function renderRewrittenTemplate( spec: PublishRewriteSpec, template: PublishTemplateId, sourceHtml: string, ): string { const images = extractPublishImageUrls(sourceHtml) const hero = images[0] ? heroFigure(images[0]) : '' const gallery = images.length > 1 ? galleryFigures(images.slice(1)) : '' const summary = spec.summary ? `

${esc(spec.summary)}

` : '' const processedBody = processNoteHtmlForPublish(spec.body) return `
${hero} ${summary}
${processedBody}
${gallery}
` } export function computePublishedSourceHash(content: string): string { return createHash('sha256').update(content || '').digest('hex').slice(0, 16) }