The convert engine renders markdown→HTML/PDF through named doctype templates selected by the document's `template:` front matter, with per-project/per-party overrides. convert package: - embed.go now embeds the whole templates/ dir (all: prefix so _-prefixed partials are included) as an embed.FS; drop the single viewer-template.html + custom.css embeds. New TemplateSet type + DefaultTemplateSet(name) returning the chosen doctype + its partials. - ToHTML/ToPDF take a TemplateSet; writeTemplateSetToScratch materialises the template + partials flat into the per-call scratch dir (pandoc resolves $partial()$ from the template's own directory). handler: - converttemplate.go: templateNameFromFrontMatter (YAML front-matter scan, sanitized to a bare basename) + resolveTemplateSet, which overlays <level>/.zddc.d/templates/<name>.html overrides onto the embedded defaults, walking docDir→fsRoot so a party dir beats the project-global dir. An override may replace a doctype, a partial, or add a brand-new doctype. - buildAndStore threads fsRoot + source into the html/pdf paths. build: pandoc/templates/ is the single source of truth; shared/build-lib.sh sync_pandoc_templates mirrors it into the embed dir on every build (cmp-guarded, stale-pruning). convert.TestEmbeddedTemplatesMatchSource fails on drift. Tests: drift + DefaultTemplateSet (convert); front-matter parse + cascade override precedence (handler). Full ./... suite green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
56 lines
1.9 KiB
HTML
56 lines
1.9 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
$_head()$
|
|
|
|
<body class="doc-letter$if(numbering)$ numbered$endif$">
|
|
<!-- Letter layout: single column, no TOC sidebar -->
|
|
<main class="content-wrapper" role="main">
|
|
<div class="content-page">
|
|
<!-- Letterhead -->
|
|
<header class="document-header">
|
|
<div class="header-content">
|
|
$if(client)$$if(project)$
|
|
<div class="header-line client-project">
|
|
$client$ - $project$$if(project_number)$ ($project_number$)$endif$
|
|
</div>
|
|
$endif$$endif$
|
|
$if(title)$
|
|
<div class="document-title">$title$</div>
|
|
$endif$
|
|
<div class="document-meta">
|
|
$if(date)$<span class="date">$date$</span>$endif$
|
|
$if(tracking_number)$<span class="tracking-number">$tracking_number$</span>$endif$
|
|
$if(revision)$<span class="revision">Revision: $revision$</span>$endif$
|
|
$if(status)$<span class="status">Status: $status$</span>$endif$
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<!-- Print-only header -->
|
|
<div class="print-header">
|
|
$if(custom_header)$
|
|
$custom_header$
|
|
$else$
|
|
$if(client)$$if(project)$
|
|
<div class="header-line client-project">$client$ - $project$$if(project_number)$ ($project_number$)$endif$</div>
|
|
$endif$$endif$
|
|
$if(title)$<div class="header-line document-title">$title$</div>$endif$
|
|
$endif$
|
|
</div>
|
|
|
|
<!-- Print-only footer -->
|
|
<div class="print-footer">
|
|
<div class="footer-left">
|
|
$if(tracking_number)$$tracking_number$$endif$$if(revision)$ Revision: $revision$$endif$$if(status)$ Status: $status$$endif$
|
|
</div>
|
|
<div class="footer-right">Page <span class="page-number"></span></div>
|
|
</div>
|
|
|
|
<article class="document-content">
|
|
$body$
|
|
</article>
|
|
</div>
|
|
</main>
|
|
$_scripts()$
|
|
</body>
|
|
</html>
|