Commit Graph

10 Commits

Author SHA1 Message Date
shahondin1624
6d67c051f0 fix: position reference footer below content to prevent overlap (Closes #25)
The reference footer was anchored to a fixed position near the bottom
margin, causing it to overlap with notes text on songs that had both
notes and references (e.g., "Die Gedanken sind frei").

Changed renderReferenceFooter to use flow-based positioning from the
current y-position after notes/metadata, ensuring the separator line,
abbreviation headers, and page numbers always render below the
preceding content without overlap.

Also updated calculateFooterReservation and MeasurementEngine to match
the simplified layout calculation, and added toc.highlight_column to
the example songbook.yaml to demonstrate column highlighting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 14:59:20 +01:00
a69d14033d fix: add bounds checking and content splitting for multi-page songs (Closes #17) (#20) 2026-03-17 14:18:07 +01:00
shahondin1624
ab91ad2db6 feat: support custom font files for song titles (Closes #4)
- Improve PdfFontMetrics: use canonical path for cache key, validate
  font file existence, use absolute paths for BaseFont.createFont
- Add font file path resolution in SongbookPipeline (relative to
  project directory)
- Add font file existence validation in Validator.validateConfig
- Add end-to-end tests: custom font loading, umlaut rendering,
  cache deduplication, missing file error
- Document custom font file usage in example songbook.yaml

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 09:54:15 +01:00
shahondin1624
b339c10ca0 feat: use Worte/Weise labels and render metadata at page bottom (Closes #5)
Add metadata_labels ("abbreviated"/"german") and metadata_position
("top"/"bottom") options to LayoutConfig. German labels use "Worte:" and
"Weise:" instead of "T:" and "M:", with "Worte und Weise:" when lyricist
and composer are the same person. Metadata at bottom position renders
after notes with word-wrapping. MeasurementEngine accounts for two-line
metadata in German label mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 09:46:06 +01:00
shahondin1624
8dca7d7131 feat: support inline images within song pages (Closes #2)
Add {image: path} directive to embed images at any position within a song's
sections. SongLine gains an optional imagePath field; when set, the line
represents an inline image rather than chord/lyric content. The renderer
scales and centers images within the content width. MeasurementEngine
reserves 40mm height per inline image for layout calculations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 09:45:26 +01:00
shahondin1624
8c92c7d78b feat: support rich multi-paragraph notes with formatting (Closes #7)
Add {start_of_notes}/{end_of_notes} (and short forms {son}/{eon}) block
directives to ChordProParser for multi-paragraph note content. Blank lines
within the block separate paragraphs. The renderer now word-wraps note
paragraphs to fit within the content width. MeasurementEngine estimates
wrapped line count for more accurate height calculations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 09:38:25 +01:00
shahondin1624
0139327034 feat: highlight the current book's column in the TOC (Closes #6)
Add TocConfig with highlightColumn field to BookConfig. TocRenderer now
applies a light gray background shading to the designated column header
and data cells, making it easy to visually distinguish the current book's
page numbers from reference book columns.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 09:35:47 +01:00
shahondin1624
ba035159f7 feat: display reference book page numbers in song page footer (Closes #3)
Render a two-row footer at the bottom of each song page showing reference
book abbreviations as column headers with corresponding page numbers below.
A thin separator line is drawn above the footer. MeasurementEngine now
reserves vertical space for the reference footer when reference books are
configured and the song has references.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 09:32:52 +01:00
shahondin1624
8e4728c55a feat: add support for foreword/preface pages (Closes #1)
Add ForewordConfig to BookConfig, Foreword model type, ForewordParser for
text files (quote/paragraphs/signatures), ForewordPage in PageContent,
pipeline integration to insert foreword after TOC, and PDF rendering with
styled quote, horizontal rule separator, word-wrapped paragraphs, and
right-aligned signatures.

Also adds Gradle wrapper and adjusts build toolchain for JDK 25 compat.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 09:27:00 +01:00
shahondin1624
e386501b57 Initial implementation of songbook toolset
Kotlin/JVM multi-module project for generating a scout songbook PDF
from ChordPro-format text files. Includes ChordPro parser, layout engine
with greedy spread packing for double-page songs, OpenPDF renderer,
CLI (Clikt), Compose Desktop GUI, and 5 sample songs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 08:35:42 +01:00