Repository navigation
mdrefine 0.4.1
Changed
-
Forgejo and Gitea gain automated before/after comparisons against pinned official disposable hosts, with realistic fixed-seed corpora and actual repository-file heading/fragment controls. PR and release gates use these checks; weekly adversarial discovery remains separate (#486).
-
The command, configuration filenames, suppression comments, temporary-file prefixes, examples and current documentation now use
mdrefine. The oldmdtoolscommand, config names and comments remain compatible but deprecated throughout 0.4.x and will all be removed in 0.5.0. Rename config files and replace comment prefixes manually; formatting does not migrate them. One CLI migration notice per run does not count against--max-warnings(#600, #601). -
Obsidian structural rules conservatively keep ambiguous block boundaries as written. Proposed style edits held by native-rendering protection now report the original rule and severity instead of disappearing silently; safe independent formatting remains available (#603).
-
Renderer PR/release gates compare existing fixtures and realistic documents at fixed seeds. Fresh adversarial generation becomes weekly/manual discovery with exact issue-linked known differences and stale-entry checks. Maintenance and review now use bounded scope and proportional verification (#603).
-
A release is published only after CI has passed on its exact commit and GitHub, Obsidian, Forgejo and Gitea rendering of fixed documents is unchanged by formatting at that commit. Pull requests that change parsing, rules, presets, or dependencies run the renderer comparisons. The documentation site records the release and commit it was built from in
version.json, and the current release's site can be corrected from asite-VERSIONbranch without a new version (#485).
Fixed
-
Builtin parsers avoid repeated nested-label lookups and batch eligible pairs of long emphasis runs. Obsidian also avoids rescanning the same unfinished wikilink or embed suffix (#94, #577).
-
Focused Obsidian captures record the observed app and renderer versions separately from the requested version, with hashes binding completed evidence to its input and executed spec (#580).
-
Obsidian keeps the boundary after standalone comments so that heading/list spacing cannot split a native paragraph. Following inline style edits remain available (#357).
-
Setext titles directly after standalone Obsidian comments keep their underlines, since conversion can turn Reading-view paragraph text into a heading. Titles ending in whitespace-separated raw
#runs also keep their Setext form, preserving Live Preview's title text (#383). -
Obsidian keeps list indentation and number width where a preceding nested list affects the painted bullet of a following quoted list. Same-width numbering, delimiter preferences and inline styles remain available (#596).
-
Quoted blocks opened after a Tab keep their literal source where Reading view reads code instead of the parsed list, heading or paragraph. Blank quote rows between consecutive such blocks stay as literal code content too. Independent blocks and ordinary space-only quote margins still format (#597).
-
Obsidian keeps the separator before a list directly following another list's final secondary paragraph or indented code block, preserving Live Preview's paragraph grouping while allowing safe inline and marker preferences (#598).
-
Obsidian preserves list markers and tightness across quote and table continuations, literal table rows after list code fences, adjacent Setext titles that Reading view still reads as paragraph text across Tab lines, and blank lines inside physical list fences hidden by the primary inline parse (#582, #583, #584).
-
Obsidian keeps adjacent display math inside its final list item and retains standalone one-line display widgets when wrapping (#586, #587).
-
Protected separator starts also reject plugin insertions and replacements that add a blank before the existing line break or remove a quote-only marker, while safe terminal inline edits remain available (#590).
-
Rendering comparisons account for omitted terminal line feeds in highlighted GitHub code, generated math response IDs inside raw HTML, and invisible Reading-view whitespace beside Obsidian display math, retaining exact source code, authored attributes, formula content and visible inline spacing (#515, #588, #589).
-
Release-evidence validation runs through linked checkout paths, and the parser builder rejects dependencies resolved outside its checkout consistently across platforms while accepting valid checkout directory names (#574, #575, #578, #579).
-
Parsing uses a portable internal adapter to reduce repeated copying and searching on documents with many containers, inline constructs or unfinished labels. Syntax plugins retain the original attention/strikethrough event behavior. GFM footnote list items have valid source ranges and read correctly as loose or tight (#300, #151, #240, #280, #542).
-
GitHub file-fragment checks include native headings and HTML anchors in dollar-math source, with complete Setext title text and correct duplicate numbering. The target reading is lazy and preserves the YAML selection and formatter's math behavior (#570).
-
GitHub repository-file fragment checks follow YAML preprocessing: mappings and YAML error displays render the body after front matter, while ordinary non-mappings remain Markdown. Unsettled YAML classes retain only anchors shared by both readings, with incomplete checks reported explicitly (#540).
-
GitHub fragment checks and the CommonMark fallback include headings and explicit IDs inside tagfiltered HTML, whose outer tags render as text. Unsupported inline attributes and raw-text tag spellings remain incomplete instead of producing guessed missing fragments (#541).
-
Raw HTML heading fragments retain literal character-reference text split by tags or comments, including the numbering of later duplicate headings (#552).
-
Keep two-space hard breaks inside locally paired multiline code spans, which GitHub can display as literal text after an unmatched longer backtick run. Both wrapping and inline-code joining retain the physical boundary (#335).
-
Preserve GitHub's heading and lazy paragraph boundaries beside dollar display math, including compact hyphen lines and Setext titles. Keep thematic-marker, heading, spacing and wrap changes from splitting those native boundaries (#336).
-
Keep Obsidian list markers consistent when HTML leaves one parsed list and protects a later list's markers, so formatting cannot split one Reading-view list by changing only its earlier bullet (#399).
-
Keep one-column Obsidian table source when missing header or delimiter borders would turn Live Preview text into a table widget, and carry Reading paragraph state across Tab lines when those borders do not form a real table (#568).
-
Keep a list paragraph adjacent to an Obsidian tilde opener whose info contains backticks, preserving its Live Preview continuation while allowing safe list formatting. When its primary closer opens Live Preview code, conservatively preserve the remaining source because later fences can pair differently (#567).
-
Retain Reading paragraph state across Tab lines after a one-column table displayed as text, preserving later literal rows while allowing genuine tables to format (#398).
-
Keep the physical multiline image description containing backticks in Obsidian so wrapping cannot turn displayed source into an embed; safe surrounding inline text still formats (#566).
-
Retain short multiline Obsidian code spans and their following inline source when Live Preview resets code styling at the physical newline. Earlier text and later independent paragraphs can still format (#565).
-
Keep the terminal separator before an Obsidian Tab-only paragraph continuation, preserving hard breaks and literal backslashes while allowing earlier wrapping and safe whitespace cleanup (#563).
-
Preserve lazy paragraph lines that determine the Live Preview nesting of later blocks in an enclosing list item (#376).
-
Retain the separator before an uncertain Obsidian Setext underline when trimming it would create or remove a Reading-view hard break (#383). Also retain heading forms around unwrapped leading math and sole image/embed titles, preserving Live Preview typography and placement. The host comparison now checks inherited math typography too (#569).
-
Preserve the spaces or tabs after a literal backslash when trimming them would create a hard line break, avoiding a guarded trailing-space refusal (#560).
-
Keep hard breaks written as a Tab followed by two spaces, preventing silent break loss or guarded cleanup refusals while preserving ordinary trailing-space cleanup (#562).
-
Obsidian wrapping retains possible comments that cross a blank line, avoiding an unsafe-format refusal when wrapping would put their closer alone on a line (#559).
-
Obsidian table formatting keeps a following paragraph from becoming another row when its leading-pipe style differs from the header, including alias and link-destination pipes. Ordinary table rows and text after a real blank still format (#558).
-
Obsidian wrapping keeps a leading inline comment with the next atom, avoiding an unsafe-format refusal when a long link or other atom would leave the comment alone on its first line. The rest of the paragraph still wraps (#557).
-
Obsidian formatting preserves literal blocks after root HTML whose nested tags remain open, including URL-shaped children. A parent's closer cannot prematurely end that protection; balanced, void, and self-closing HTML still permit later Markdown formatting. Parsed fences do not close the raw state; formatting conservatively retains source across them until the HTML closes (#556).
-
Obsidian formatting keeps thematic breaks below tables from turning their last physical line into a literal Live Preview heading, including header-only tables. Existing literal headings retain their row text and underline (#553).
-
Obsidian formatting preserves underlined headings displayed after lazy list or quote text, retaining the final heading line, its boundaries, and the lazy margin when list padding or number width shrinks. Safe inline changes above it remain available (#554).
-
Obsidian formatting preserves literal table rows after paragraph-consumed footnotes, including HTML, heading, and code endings, adjacent definitions, and ambiguous tab separators. Independent footnotes and empty or space-only separators still permit table formatting (#549, #551).
-
Obsidian comparisons ignore native table-cell editing controls when a rendered preview is available, while retaining table content, styling, code spacing, alignment, row counts, links, and nested authored HTML (#550).
-
Obsidian protection searches for backticks only within each text node, avoiding repeated scans of the remaining document (#547).
-
Obsidian HTML continuation retains empty container markers before fences and protects code opened by the later fence through the end of the note (#548).
-
Obsidian formatting retains both list boundaries around lazy text below a list-item heading and keeps top-level HTML source continued through literal quote markers (#513, #546).
-
Obsidian comparisons recognize single-character Setext underlines and omit unstyled records emptied by existing punctuation normalization, while keeping actual heading, paragraph, code, and widget boundaries distinct (#544, #545).
-
Obsidian list formatting retains ordered-list boundaries across a missing quote or footnote prefix, and its comparison keeps adjacent headings distinct with or without blank separators (#543, #544).
-
GitHub table headers and continued rows take precedence over dollar display math, restoring table-column diagnostics and rejecting edits that split those rows into math (#504, #534).
-
GitHub formatting preserves source whose structural heading HTML makes its anchor boundary uncertain. Fragment checks report that limit instead of guessing IDs, and the semantic guard rejects plugin edits that change ordinary heading anchors (#498, #535, #536).
-
GitHub fragment checks include HTML headings in Markdown table cells, including headings closed by their cell boundary, and report raw-table reordering as uncertain (#538, #539).
-
Obsidian formatting keeps non-one ordered continuations after unpiped table text as written, and its comparison ignores terminal whitespace on styled fence separators while retaining code and internal metadata whitespace (#532, #533).
-
Obsidian formatting preserves code carried into nested quoted lists, task checkbox separators, bare HTML-comment markers, fences whose openers remain in HTML, and indented code read outside a quote (#524, #525, #526, #529, #530).
-
Renderer comparisons retain empty checkbox widgets and visible hexadecimal text, and ignore lone list-paragraph wrappers whose spacing is unchanged in Obsidian's default theme (#522, #523, #528).
-
Obsidian formatting preserves adjacent ordered continuations of tab-continued text, separate table headers, lazy paragraphs below list headings, multiline comment endings, non-one lists below quotes, footnote continuation text outside the four-column margin, fences inside HTML after carried inline code, and setext text continued across tabs (#510, #511, #513, #516, #517, #518, #519, #520).
-
Renderer comparisons retain task-list delimiter boundaries, ignore incidental font styling on separating spaces, and verify GitHub's highlighted code against the source before normalizing wrapper and final-line variations (#512, #514, #515).
-
Obsidian formatting preserves the boundaries its views read differently: lists around HTML, task fences, multiline setext text, footnote continuation margins and separators, callout lists, heading-like table rows, and inline code or emphasis carried into quoted lists (#487, #488, #489, #492, #493, #494, #495, #496, #499, #505, #506, #507).
-
The Obsidian comparison finishes and publishes the editor's syntax tree before capturing long notes, and ignores empty table source rows that show nothing. Real text, embeds, and empty code lines still count (#497, #508).
-
GitHub dollar display fences no longer interrupt an existing paragraph in the parser. Formatting preserves dollar lines as paragraph continuations, including inside list items and block quotes (#491).
-
The README's opening description and repository About/topics include VitePress, matching the released dialect support. Maintenance instructions require public descriptions and discovery metadata to be updated with feature changes (#483).