feat(templates): render inline links in CV entry titles and subtitles#434
Merged
Conversation
CV project rows and body text already render inline [label](url) Markdown as clickable links, but experience/education entry titles were emitted as plain text, so a [name](url) title showed up literally. Route entry titles and subtitles through link-aware MarkdownInline helpers across every CV preset: the shared EntryRenderer / EntryCompactRenderer and the four presets that hand-roll their titles (MonogramSidebar, SidebarPortrait, EngineeringResume, MintEditorial). Add appendTransformed (transforms the visible label but never the URL) so upper-cased and letter-spaced titles keep their link, appendUpperCased as a delegate, and appendIfPresent for prefixed subtitles. TimelineMinimal's fused excerpt and the fused subtitle+date meta lines strip to the label text. Plain titles render byte-identically; snapshots and visual parity are unchanged.
DemchaAV
commented
Jul 24, 2026
DemchaAV
left a comment
Owner
Author
There was a problem hiding this comment.
keepWithNext and link title
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
CV project rows and body text already render inline
[label](url)Markdown asclickable links (since v1.6.8), but experience/education entry titles were emitted
as plain text — so a
[name](url)in an entry title (a project name, an employer)showed up literally instead of linking. Subtitles were inconsistent: link-aware in the
canonical renderer, stripped in the compact and hand-rolled ones.
What changed
MarkdownInlinegainsappendTransformed(rich, text, style, UnaryOperator<String>)—link-aware, applying the transform to the visible label and plain segments but never
the URL — plus
appendUpperCased(now a delegate) andappendIfPresent(thelink-aware counterpart of
appendPlainIfPresent).render: the shared
EntryRendererandEntryCompactRenderer(all five variants,upper-case-aware), and the four presets that hand-roll their own titles —
MonogramSidebar,SidebarPortrait,EngineeringResume, andMintEditorial(letter-spaced via
appendTransformed(TextOrnaments::spacedUpper)). NoCvEntrychange.
TimelineMinimalfuses each entry into one truncatable excerpt line and cannot carrya clickable link; it now strips the markdown to the label text instead of rendering
[..](..)literally. The fused subtitle+date meta line in theMintEditorial/SidebarPortraitexperience entries flattens the same way. Dates stay plain(out of scope).
all CV visual-parity and layout snapshots are unchanged (no re-bless).
Verification
./mvnw -B -ntp clean verify -pl :graph-compose-templates,:graph-compose-qa -am→BUILD SUCCESS, qa 666 tests, 0 failures; CV visual-parity + layout snapshots
unchanged.
MarkdownInlineTest+5: URL preserved under upper-casing, transform hits thelabel not the URL,
appendIfPresentemits prefix + link, blank/null is a no-op, anda plain title matches the old
plainText().toUpperCase().EntryTitleLinkTest(6): a[label](url)title becomes a link throughEntryRenderer, the upper-casedEntryCompactRenderer(label upper-cased, URLintact), and the hand-rolled
MonogramSidebar+EngineeringResumepaths; thesubtitle links too; and a plain-title control (asserted specifically, since the header
contact block renders its own email/website links).
ModernProfessionalrender + PDF link-annotation check confirmed the entry-titleURIs are present as clickable annotations in the output PDF.
Lane: templates (canonical). No engine or public-DSL change; links reuse the existing
RichText.linkconvention (they inherit the title's style, matching project-row links).