77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
package main
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"log"
|
||
|
||
"github.com/yuin/goldmark/ast"
|
||
)
|
||
|
||
func main() {
|
||
inputMd := flag.String("i", "report.md", "Input Markdown file")
|
||
outputPdf := flag.String("o", "projektarbeit.pdf", "Output PDF file")
|
||
kroki := flag.String("kroki", "https://kroki.io", "Kroki base URL (e.g. http://localhost:8000 for a local instance)")
|
||
flag.Parse()
|
||
|
||
krokiBaseURL = *kroki
|
||
|
||
config, doc, content, err := ParseMarkdown(*inputMd)
|
||
if err != nil {
|
||
log.Fatalf("Failed to parse input: %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)
|
||
}
|
||
|
||
// 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)
|
||
}
|
||
|
||
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, A–Z 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
|
||
}
|