Skip to content

GraphCompose 2.0

v1.6.4 Breaking

This release includes breaking changes for platform teams planning a safe upgrade.

Published 2mo Build & Package
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

business-documents cv-templates declarative-api document-generation invoice-template java
+12 more
java-17 layout-engine maven pagination pdf pdf-generator pdf-lib pdf-library pdfbox3 report-generation snapshot-testing template-engine

Summary

AI summary

Adds WorkHistoryBlock and EducationBlock for structured CV sections, fixing a Boxed Sections layout bug caused by em‑dash/en‑dash parsing.

Full changelog

Bug fix + structured-block patch. Adds two new public Block types —
WorkHistoryBlock and EducationBlock — that let template authors
declare work-history and education entries with explicit (title,
organisation, date, description) / (degree, institution, year,
details) fields instead of relying on the legacy
MultiParagraphBlock pipe-separated string parser. Also closes a
Boxed Sections layout defect that bundled the date and description
into the right-aligned date column for any author-supplied line that
used an em-dash (" — "), en-dash (" – "), or contained
prose-shaped content the parser misread as a date. No public API
break
— the sealed Block permit list grows from six to eight,
existing MultiParagraphBlock work-history strings continue to
parse, and the deprecated parser path stays in place for backward
compatibility.

Templates — new structured blocks

  • WorkHistoryBlock. New public record block carrying a list of
    Item(title, organisation, date, description) entries. The
    BoxedSections preset renders each item as a structured row:
    title bold on the left, date right-aligned on the same row,
    organisation italic on the next line under the title, and
    description as a full-width paragraph beneath. Other presets fall
    back to a single concatenated paragraph per item. Authors who use
    WorkHistoryBlock bypass the legacy
    BoxedSections#parseWorkEntry heuristic parser entirely.
  • EducationBlock. New public record block carrying a list of
    Item(degree, institution, year, details) entries. Renders with
    the same structured layout as WorkHistoryBlock (degree bold
    left, year right, institution italic, details paragraph) so
    Education & Certifications sections visually match Professional
    Experience.
  • Sample data migrated. ExampleDataFactory.sampleCvSpecV2 now
    uses WorkHistoryBlock for Professional Experience and
    EducationBlock for Education & Certifications. The legacy
    MultiParagraphBlock pattern remains supported and is exercised
    by PresetLayoutSnapshotTest / PresetVisualParityTest to lock
    the backward-compat path.

Templates — parser robustness (legacy path)

  • parseWorkEntry accepts em-dash and en-dash. Used to split
    the post-pipe segment on ASCII " - " only; now tries " — ",
    " – ", and " - " in order, mirroring splitHeading. Authors
    who typed "*2024-Present* — Led reusable document flows." saw
    the whole tail collapse into the date column — this no longer
    happens.
  • parseWorkEntry rejects prose dressed up as a date. The
    loose looksLikeDate check accepted any string containing a
    year and a hyphen anywhere, which caused education lines like
    "... | 2019. First-class honours. Specialisation ..." to
    parse as work entries (the hyphen inside "First-class" was
    enough to satisfy the heuristic). Parser now rejects post-pipe
    segments that contain sentence-ending punctuation (., :,
    ;) when no explicit date / description separator was found,
    letting these lines fall back to plain paragraph rendering.
    Marked @Deprecated with a @deprecated Javadoc pointing
    callers to WorkHistoryBlock / EducationBlock.
  • parseProjectItem picks up the same em-dash / en-dash /
    ASCII separator set so future Project items typed with em-dash
    don't regress into "title only" rendering.

Tests

  • BlockTest.blockSealingPermitsAllEightVariants updated for the
    two new permitted block types.
  • PresetVisualGalleryTest.sampleSpec migrated to
    WorkHistoryBlock so the visible "primary example" exercises the
    new structured shape.
  • PresetLayoutSnapshotTest intentionally retained on
    MultiParagraphBlock to lock the legacy parser's behaviour.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track GraphCompose 2.0

Get notified when new releases ship.

Sign up free

About GraphCompose 2.0

All releases →

Related context

Related tools

Earlier breaking changes

  • v2.0.0 Package rename: layered template packages dropped `.v2` suffix; update imports.
  • v2.0.0 Removed dormant ECS engine internals (EntityManager, SystemECS, Entity components, render pipeline).
  • v2.0.0 Removed linkOptions() accessor; use linkTarget() and ExternalLinkTarget.options().
  • v2.0.0 Removed PDF‑typed document‑chrome overloads on DocumentSession; use backend‑neutral metadata/watermark/protect/header/footer.
  • v2.0.0 Removed DSL name-aliases DocumentSession.builder() and DocumentDsl.text(); use builder() and paragraph().

Beta — feedback welcome: [email protected]