Remove outdated toc_pages.txt, add new Go modules for IHK Chemnitz PDF rendering including diagrams, tables, and TOC functionality.

This commit is contained in:
Sebastian Unterschütz
2026-05-04 22:06:28 +02:00
parent e98f7efa52
commit 81745b5f48
23 changed files with 1532 additions and 809 deletions
+51 -39
View File
@@ -4,6 +4,8 @@ import (
"flag"
"fmt"
"log"
"github.com/yuin/goldmark/ast"
)
func main() {
@@ -13,49 +15,59 @@ func main() {
config, doc, content, err := ParseMarkdown(*inputMd)
if err != nil {
log.Fatalf("Error parsing markdown: %v", err)
log.Fatalf("Failed to parse input: %v", err)
}
// Pass 1: Dummy render to collect TOC info
dummyRenderer := NewIHKRenderer(config)
dummyRenderer.RenderTitlePage()
dummyRenderer.RenderTOC() // This is the placeholder
dummyRenderer.pageOffset = dummyRenderer.pdf.PageNo()
RenderAST(doc, content, dummyRenderer)
dummyRenderer.RenderBibliography()
dummyRenderer.RenderListOfTables()
dummyRenderer.RenderAppendices()
// Pass 2: Real render
renderer := NewIHKRenderer(config)
renderer.tocItems = dummyRenderer.tocItems
renderer.tableItems = dummyRenderer.tableItems
renderer.RenderTitlePage()
renderer.RenderTOC()
// Main Content
err = RenderAST(doc, content, renderer)
if err != nil {
log.Fatalf("Error rendering PDF: %v", err)
// Pass 1 — dummy render to collect page numbers for the TOC, tables, and figures.
// The recorded page numbers are used to fill the TOC in pass 2.
pass1 := NewIHKRenderer(config)
if err = renderPipeline(pass1, doc, content); err != nil {
log.Fatalf("Pass 1 failed: %v", err)
}
// 4. Bibliography
renderer.RenderBibliography()
// List of Tables
renderer.RenderListOfTables()
// 5. Appendices
renderer.RenderAppendices()
// 6. Declaration of Authenticity
renderer.RenderDeclarationPage()
err = renderer.Save(*outputPdf)
if err != nil {
log.Fatalf("Error saving PDF: %v", err)
// Pass 2 — final render with the TOC index collected in pass 1.
// Only tocItems must be pre-seeded because RenderTOC() runs before RenderAST().
// tableItems and figureItems are re-populated during RenderAST() in pass 2,
// so they must NOT be copied here (that would produce duplicates in the lists).
pass2 := NewIHKRenderer(config)
pass2.tocItems = pass1.tocItems
if err = renderPipeline(pass2, doc, content); err != nil {
log.Fatalf("Pass 2 failed: %v", err)
}
fmt.Printf("Successfully generated %s\n", *outputPdf)
if err = pass2.Save(*outputPdf); err != nil {
log.Fatalf("Failed to save PDF: %v", err)
}
fmt.Printf("PDF created: %s\n", *outputPdf)
}
// renderPipeline executes the full document rendering sequence in the mandatory
// IHK Chemnitz order:
//
// 1. Title page (no page number)
// 2. Table of contents (Roman II)
// 3. List of abbrev. (Roman, from YAML — optional)
// 4. Body via AST walk (foreword Roman → main body Arabic from 1)
// 5. Bibliography (Arabic, AZ sorted)
// 6. List of tables (Arabic)
// 7. List of figures (Arabic)
// 8. Appendix / annex (Arabic)
// 9. Glossary (Arabic, from YAML — optional)
// 10. Declaration (no page number)
func renderPipeline(r *IHKRenderer, doc ast.Node, content []byte) error {
r.RenderTitlePage()
r.RenderTOC()
r.RenderAbbreviations()
if err := RenderAST(doc, content, r); err != nil {
return err
}
r.RenderBibliography()
r.RenderListOfTables()
r.RenderListOfFigures()
r.RenderAppendices()
r.RenderGlossary()
r.RenderDeclarationPage()
return nil
}