Skip to content

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 16 May 21:44
· 103 commits to main since this release

Changed — four babel/CLI interop fixes (#607, #608, #610, #611)

Four more user-visible converter fixes, continuing the interop work-stream.

  • KaTeX CDN tags carry SRI hashes (#611). The KaTeX 0.16.11 CSS, core JS, and auto-render JS tags emitted by the HTML serializer now include integrity="sha384-…" attributes; browsers reject any CDN payload whose hash doesn't match. Hashes were computed from the official release tarball at github.com/KaTeX/KaTeX/releases/tag/v0.16.11.
  • .lex-verbatim paged-media break-rule modernized (#607). Every other paged-media element in @media print already pairs the legacy page-break-* property with its modern break-* companion; .lex-verbatim only had the legacy form. Chromium's headless paged-media now treats page-break-inside as deprecated, so without the modern companion code blocks could split across PDF pages.
  • Mojibake detection for lexd convert / lexd format (#608). A new lex-core::lex::mojibake::detect_mojibake helper scans for the two-character signatures of a UTF-8 → cp1252 → UTF-8 round-trip (é, ö,  , etc.) and the CLI prints a one-shot stderr warning when ≥3 distinct patterns appear in the entry file or any :: lex.include ::-pulled file. The conversion still runs to completion — detection is informational. Suppress with the new --no-warnings global flag or LEX_QUIET=1 env. Auto-correction is out of scope (re-encoding mojibake is lossy in edge cases).
  • Redundant <div class="lex-content"> wrapper dropped inside <section> (#610, option 1). Extends the <dd>-specific narrow fix (#604) to its broader sibling case: the wrapper is also pure DOM bloat when the immediate parent is a <section> (the section IS the content area). Baseline CSS gains a direct-child margin-left rule on the section's content children (p, .lex-list, .lex-verbatim, .lex-verbatim-subject, .lex-definition, .lex-table, blockquote, figure, section.lex-session) that replaces the wrapper's old padding. margin-left (not padding-left) so boxed children like .lex-verbatim keep moving as a whole instead of just nudging their inner text. The further targets the issue lists (<li>, <blockquote> parents) are deferred for a follow-up; each needs its own CSS-compensation pass and snapshot review. Snapshots updated: kitchensink + three trifecta fixtures. No theme changes required (neither theme-fancy-serif.css nor theme-modern.css references .lex-content or section.lex-session).

Changed — three babel interop fixes (#604, #605, #606)

Three user-visible changes to the markdown / HTML converters, surfaced during the glossary-doc review (deferred from PR #609).

  • HTML <dd> body shape (#604). <dd> no longer wraps its content in <div class="lex-content"><p class="lex-paragraph">…</p></div> — the dd is already the content container and the inner div added bytes without semantic value. Simple bodies render as <dd><p>…</p></dd> now. Baseline CSS gains compensating .lex-definition dd > p / .lex-definition dd > .lex-list rules so the rendered vertical rhythm and nested-content indentation are preserved.
  • Pandoc-flavored markdown definition lists (#605). Definitions now serialize as Term\n\n: details (via Comrak's native DescriptionList nodes; description_lists extension enabled in both serializer and parser). The legacy **Term**: fallback is replaced. The markdown importer also recognizes Pandoc-style definition lists, so a lex → markdown → lex round-trip preserves the <dl> structure (regression test ships).
  • Numeric heading escape (#606). Comrak's ## 1\. Glossary (escape on a digit-dot prefix to disambiguate from an ordered-list marker) is post-processed away on heading lines — a #-prefixed line can't open a list, so the escape is just visual noise. Paragraph-leading 1\. keeps Comrak's protection.

regex and once_cell move from dev-deps to main deps (the post-process in #606 uses them).

Changed — symmetric IR for document_annotations (#614, Phase 3b of #570)

Document::document_annotations is now the single source of truth for document-scope annotations on the IR → Lex path. to_lex_document emits every entry into lex_doc.annotations via the to_lex_annotation_raw helper (shipped in Phase 3a, previously dead code), so a lex → IR → lex roundtrip preserves document metadata structurally.

The legacy frontmatter annotation event synthesis in crates/lex-babel/src/common/nested_to_flat.rs is retired. tree_to_events no longer inserts a packed frontmatter annotation event from document_annotations — format-specific serializers that need a YAML preamble read the IR slot directly. The markdown serializer (crates/lex-babel/src/formats/markdown/serializer.rs) was updated to synthesize the YAML block from document_annotations at output time, matching the previous flatten-keys-by-lex.metadata.*-prefix shape. The Markdown import path still produces a frontmatter annotation in children[0] and continues to round-trip through the existing markdown-side handling — final unification with the metadata-label whitelist happens in Sub D (#617).

This unblocks the rest of the interop architecture work-stream (umbrella #613): #615 / #616 / #617 build on the now-symmetric IR.