v0.14.0
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-verbatimpaged-media break-rule modernized (#607). Every other paged-media element in@media printalready pairs the legacypage-break-*property with its modernbreak-*companion;.lex-verbatimonly had the legacy form. Chromium's headless paged-media now treatspage-break-insideas deprecated, so without the modern companion code blocks could split across PDF pages.- Mojibake detection for
lexd convert/lexd format(#608). A newlex-core::lex::mojibake::detect_mojibakehelper 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-warningsglobal flag orLEX_QUIET=1env. 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-childmargin-leftrule 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-verbatimkeep 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 (neithertheme-fancy-serif.cssnortheme-modern.cssreferences.lex-contentorsection.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-listrules 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 nativeDescriptionListnodes;description_listsextension enabled in both serializer and parser). The legacy**Term**:fallback is replaced. The markdown importer also recognizes Pandoc-style definition lists, so alex → markdown → lexround-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-leading1\.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.