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 `
${items}
`
}
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 ? `
` : ''}
${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)
}