Keep inferred document titles free of smart punctuation - #105
Merged
Merged
Conversation
cmark-gfm applies smart punctuation by default, turning typed `--`,
`---`, `...` and straight quotes into dashes, an ellipsis and curly
quotes. SwiftMarkdownHTMLRenderer documents the project's policy of
literal source fidelity and every renderer parses with
`.disableSmartOpts` to enforce it — except firstHeadingPlainText, the
one Document(parsing:) call site in the package that passed no options.
That function is what RenderCommand.inferTitle uses to derive a
document title, so a heading containing `--` or `...` produced a title
with typographic substitution while the body under it kept the literal
source:
title: Dashes – and ellipsis… and “quotes”
body: <p>Body -- text... here.</p>
The mismatch reached the HTML <title> and the title metadata written
into PDF, DOCX and EPUB output.
Pass `.disableSmartOpts` here too, and add a regression test pinning the
title and the rendered body to the same convention.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
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.
Problem
cmark-gfm applies smart punctuation by default — typed
--,---,...and straight quotes become en/em dashes, an ellipsis and curly quotes.SwiftMarkdownHTMLRendererdocuments the project's policy of literal source fidelity and every renderer parses with.disableSmartOptsto enforce it.MarkdownToHTML.firstHeadingPlainTextwas the onlyDocument(parsing:)call site in the package that passed no options — 1 of 12.That function is what
RenderCommand.inferTitleuses to derive the document title, so a heading containing--or...produced a title with typographic substitution while the body under it kept the literal source:The mismatch reached the HTML
<title>and the title metadata written into PDF, DOCX and EPUB output.Fix
Pass
.disableSmartOptsat that call site too, matching the other eleven.Verification
After the fix, all three agree:
Added
firstHeadingPlainTextKeepsLiteralPunctuation, which pins the title and the rendered body to the same convention and rejects all seven smart characters. Verified non-vacuous — reverting just the parse option fails it with 5 issues.Full suite: 582 tests in 63 suites passing;
swiftlint --strictclean.Provenance
Found while auditing stale branches for unmerged work. An abandoned branch carried a
reverseSmartPunctuationhelper absent from main; tracing why showed main had solved the problem better — by disabling the substitution rather than reversing it after the fact — and that one call site had been missed.🤖 Generated with Claude Code