Examples: Edge Cases
These edge cases are executable conformance fixtures, organized into topical pages for easier reading.
Tables
Alignment, spans, multi-line cells, ragged rows and the pipe rules that decide whether a table exists at all.
- An indented line after a table is a paragraph
- Escaped table hyphens stay literal
- Escaped hyphen run in a table cell
- A head-row alignment marker sets the whole column
- Table content parses inline markup
- Table spans keep alignment defaults in physical columns
- Table without alignment
- Table alignment with colspan
- Table doubled alignment marker
- Table columns carry alignment, vertical alignment and widths
- A table alignment run carries two independent axes
- A vertical table marker needs a horizontal partner
- A table cell can inherit horizontal alignment
- Pipe tables can state head and foot row counts
- CSV and TSV table bodies
- Table cell escaped pipe
- Table cell pipe inside code span
- An unclosed verbatim run in a row stops at the closing pipe
- A continuation row's open run, and an escaped closing pipe
- An attributed cell keeps its attributes and its literal marker
- Table stacked rowspan
- Table rowspan with multi-line content
- Superscript in a table cell
- Table span marker in first column
- Table cell attributes
- Cell attributes bind after the kind and alignment markers
- A table cell's marker run ends at a space
- Table row attributes
- Table header cell rowspan
- An explicit table head span keeps one row group
- A table foot span keeps one row group
- Blocked span marker renders as empty cell
- Colspan marker scans left past a consumed cell
- A span never covers another cell
- A continuation on a span marker joins the cell the marker resolves into
- A pipe pair with no cell is not a table
- A row whose every cell is blank is not a table
- An explicitly delimited row of blank cells is a table
- A continuation row needs a body row
- Table row closing pipe
- A table delimiter cell needs at least one dash
- A continuation row carries no trailing text
- A ragged table keeps each row's cell count
- Tables
- A verbatim run a continuation row opens stays open into the next continuation row
- A hard break in a pipe-table cell survives Markdown export
Lists
Markers, looseness, the content-column model, continuation markers and block openers inside items.
- Non-row pipe keeps lazy plus in a nested item
- A tabbed table ends before a flush-left list line
- A list import preserves its hard break
- A post-marker tab keeps a quote literal
- A refused plus without the inner quote prefix renders as text
- A caption after a continuation marker fence stays with the fence
- A lazily folded fence opener line does not keep a list tight
- A fence run folded into a child paragraph loosens the outer item when it closes at the outer column
- A fence closer outside the child folds and leaves the child open
- An indented plus below a nested fence stays content at every depth
- A refused marker leaves an open fence's blank payload
- A column-zero marker below an open div attaches beside the div
- A dangling plus marker adds nothing and a nested quote reads it like an unnested one
- A continuation marker stands alone at column zero or right after a block opener
- A task item takes a first-block continuation marker after its checkbox
- A continuation marker uses its container column
- A first-block marker on an indented opener reads two columns
- A refused continuation plus remains text
- A tab-indented nested list starts at its marker
- Definition body, note, and fence owner boundaries
- Nested plus below fence and description
- A folded fence run leaves a later paragraph loose
- A folded child fence keeps the below-column line in its paragraph
- An unclosed fence run with no closer in its item does not hide a blank line
- A lazy colon-shaped line in a quote paragraph keeps no indentation
- A first-block marker does not pull a column-zero list into a note or description
- A separate plus after content attaches a list to a note or description
- A comment line leaves a description's list item open for a fence
- A quote-prefixed plus takes one space after each quote marker and attaches a quote
- A quote opened on its own line in an item takes the first-block form
- A quote opened on an item's marker line attaches a quote at its own depth
- A first-block plus refuses a follower at an intervening column
- A wrapped attribute line interrupts like a one-line attribute line
- A stacked first-block plus takes a follower only at column zero or its line's column
- A quote's first-block plus refuses a list follower in every host
- A wrapped attribute line opened at a container's column is one construct
- A wrapped attribute opener indented in a body is paragraph text
- A quote follower below stacked quote openers in an item is read at its raw column
- A hosted quote's first-block plus attaches any non-list block at column zero
- The column of the quote that owns a first-block plus stays eligible at every depth
- A description separator left of its item's column folds into the definition body
- A definition marker line keeps a straddling tab's residual columns
- An invisible fenced block is not a list paragraph
- Lists
- Ordered marker vs prose
- Parenthesized ordered marker
- List nesting and looseness
- List lazy continuation
- Compact list blocks
- Marker-line nested lists
- Fence opener with a nested-list body inside a list item
- Sublist marker interrupts a continuation paragraph
- Post-blank list continuation (content-column model)
- Nested item looseness does not propagate to the outer item
- Table as a block opener in a list item
- A paragraph opened after a block in an item is still open for a lazy line
- An unterminated container does not extend the item past a blank line
- A task item's checkbox is not decided by its first block
- Only lazy folding demotes a marker-line colon opener
- A blank line before a sibling marker separates the items, whatever consumed it
- A raw block keeps the blank line at the end of its payload too
- An unterminated fence at a content column opens no block, so the paragraph stays open
- A heading at an item's content column leaves no paragraph open
- A quote is reached by its marker, and a column never reaches into one
- A marker folds into a quote below it
- An opener under a quote in a nested host opens at one column only
- Colon-fence as a block opener in a list item
- Fence folds as lazy inline code above the content column
- Indented ordered marker content column includes the marker indent
- Outer item with an internal blank before an attached block is loose
- Tight list item keeps trailing text after a block bare
- Bare-dot ordered markers
- A definition attached by a + continuation marker is collected, and the item keeps no trace
- An uppercase roman numeral is a list marker
- Sibling markers that reach one column are one list
- The continuation marker at an item's own column, and what follows it
- A continuation marker after a blank line in the item
- A continuation marker attaches one block, and the boundary is that block's extent
- A continuation marker after a blank line in a loose item
- A fence opened on a list marker line, body below the content column
- An item's fence is read once, whatever block it follows
- A definition body's open code fence ends at a line below its column
- A closer below the container's column does not count
- A bare colon opener in a description body is an opener
- An empty term marker in a description body is text
- A table row ends a description body and a lone plus folds into a term
- A below-column marker after a comment, where no paragraph is open
- A column-zero definition ends an open list item
- A definition between two open content columns reaches the outer one
- Adjacent sibling lists survive the round trip
- A multi-letter ordered marker opens no list
- A block attached after an invisible line leaves the item tight
- A blank line loosens an item only when a paragraph follows it
- Loose list starts directly on its first paragraph
- A resumed lazy run belongs to the innermost marker-line item
- A marker-line link definition is collected where no paragraph is open
- A lazy marker line's definition defines nothing, in any container
- A marker folds only strictly between the item's base and content column
- A continuation marker attaches only a flush-left block
- A longer run at a list boundary is written as exactly three blank lines
- One consumed boolean spells the looseness no blank line can
- The writer spells looseness only where a blank line cannot
- A floating attribute does not widen a list item's content column
- The continuation marker attaches one block in every container
- The continuation marker's column gate reaches every container
- A block that opens a tight item is written on the marker line
- An empty description body claims no line below column 0
- An empty description body is written with the empty sentinel
- A colon followed by only whitespace is not a description
- A leading continuation marker in a footnote body or a quote is text
- A band paragraph after an invisible line leaves the item loose
- A paragraph in a held container does not loosen the item
- A description marker followed by a no-break space has content
- Captions in list items do not create a paragraph gap
- A fence run that dedents out of a child keeps the outer item tight
- A fence run folded into a child paragraph loosens the outer item
- A line at the marker column leaves a closed nested body
- A bare dot starts a list after a blank line
Containers, quotes and fences
Divs, block quotes, code and comment fences: nesting, lazy continuation, absorption and what closes what.
- Invalid named-container metadata keeps the subtree
- Non-row pipe keeps lazy plus in an unclosed div
- A fence with no host prefix leaves an inline run
- Fenced code shorter inner fence
- Blockquote caption after a blank line
- Opaque spans inside a container
- Inside an unclosed fence only the innermost container's closer is structural
- An unclosed fence under an open paragraph in a container opens nothing
- An unclosed fence after an attribute line in a container ends at its closer
- A quoted comment or attribute line closes the quote's paragraph
- An unclosed fence under a multi-line quote paragraph in a container opens nothing
- A table row or a definition under a paragraph ends it before an unclosed fence
- A block at an item content column ends its paragraph before an unclosed fence
- A definition or attribute line in a nested container leaves no paragraph for an unmarked line
- A quoted item comment ends the quote before an unclosed fence
- A line past a body's column is read in the body, and a quote does not rebase
- A line is read in the container whose column it reaches
- An item comment or attribute line closes the item's paragraph
- Blockquote lazy continuation
- Lazy text stays in an unclosed quoted admonition
- Fenced code language with punctuation
- Blockquote lazy continuation stops at a fenced block
- Nested comment fences
- Indented colon-fence blocks stay literal
- Below-content-column div body in a list item stays literal
- Comment fence with trailing text
- Unterminated comment fence
- Widened verbatim fences
- A comment is recognized at any column
- A comment fence is a comment at any column too
- A comment under a nested item does not close it
- A definition inside a comment registers nothing
- A comment fence at an item's content column registers nothing either
- A footnote definition inside an item's comment registers nothing
- A comment fence opened on an item's marker line hides its body too
- A comment fence one item deeper registers nothing either
- A wider comment fence inside an item hides its body the same way
- An abbreviation inside a comment defines nothing
- A comment fence inside a colon container registers nothing
- A comment fence reached through a quote registers nothing either
- A blank after a comment still ends the item
- A comment fence under a nested item does not close it either
- A comment ends the paragraph it sits under
- A quote marker is
>plus a space, and a lazy line keeps its own text - A block-attribute line inside a quote ends the paragraph above it
- A floating attribute is scoped to the container that holds it
- A floating attribute under a definition attaches at column zero
- A comment fence at column 0 ends the item; a
%%line does not - Two backticks are not a code fence, opening or closing
- A single percent is not a comment
- A multi-line raw block is placed at its opening and verbatim after it
- An all-blank raw payload still emits its line
- A zero-line and a one-blank raw payload are not the same block
- An unterminated raw fence keeps literal payload termination
- An empty code payload renders no characters
- A raw block passes its attributes through untouched
- An absorbed colon fence leaves a block quote's paragraph open
- A real div in a container and the flush-left line after it
- The flush-left line after a container a quoted line opened
- A column-0 line after a container's last block, when that block left no paragraph open
- A list marker at the content column inside an open fence
- A boundary line inside an open fence does not end the container
- A container a lazy line folded into is still open
- A fence keeps the blank line at the end of its content
- A captioned quote holds more than one block
- Composite figures
- Fenced code
- Admonitions
- A titled admonition skips an authored heading id
- Comments
- An unclosed inline run in a line block reaches the end of the block
- Line block inline note
- A line block takes a lazy line whatever its last payload line
- A comment-only line in a line block is removed before any inline run
- A terminal comment in a quote leaves no paragraph open
- A terminal comment line still leaves an empty verse line
- A line block's hard break keeps its backslash
- A line block's last body line keeps its backslash
- A closed inline construct spanning a verse boundary
- A container whose table ends on a continuation row
- A definition at a container's content column
- A bracketed construct spanning a line boundary
- A bracketed construct's identifiers stay on one line
- A bracketed construct spanning a verse boundary
- A continuation row joins the row above it, whatever its cells hold
- A container whose table ends on a joined header row
- A quote inside a quote is asked what it ends on
- A nested quoted term leaves no paragraph for a lazy line
- A quoted term takes a lazy line
- A fence in a quote stores no continuation claim
- A fence a container inside a quote holds open stores no claim
- A shifted fence in a quoted item stores no continuation claim
- An emphasis marker does not pair across a link bracket
- A link title crosses a soft wrap and an attribute value does not
- A block at a container's content column ends the paragraph, whatever it renders
- What a content-column block does not reach
- A footnote definition's block runs to the end of its body
- A collected definition closes the item paragraph
- A container's span ends at its last placed child
- A definition list ends at its last placed child too
- A marker at an item content column opens a sublist, first in the item or not
- A container starts at its opening markup even where its first child is unplaced
- A container ends at the markup that closes it even where its last child is unplaced
- A definition behind an alternating container prefix registers at the innermost content column
- Line blocks
- Inline code
- Generic divs
- An unclosed bare colon fence opens a div
- A bare colon run interrupts a paragraph whether or not a line follows it
- A closer does not rescue a marker-line colon opener whose body folded in
- A fenced block quote is the block quote written another way
- An unterminated comment fence in a list item is the line form
- A degraded comment fence at a container's column 0 keeps the follower in the item
- A degraded comment fence leaves a lazy follower where the line form does
- A dropped raw block takes no line in the container that holds it
- A footnote body whose every block renders nothing is an empty body
- A container label publishes its inline run
- A container label preserves closed inline constructs before cutting a comment
- A braced span cannot close beyond its bracket run
- Quoted values and titles retain a non-punctuation backslash
- A marker-line opaque quote keeps overindented markers literal
- A blank ends the old quote's child column
- An unclosed nested fence keeps blanks before outer text
- A second plus starts its own paragraph after attachment
- Compact single-paragraph quote
- Consecutive continuation markers in a div-hosted quote
- A first-block item takes the next owned block
- A nested first-block item releases the next root block
- An enclosing closer ends a tag name
- A contentless description marker folds under a quoted term
- An overindented colon opener keeps the quote paragraph open
- A first-block plus hands its block to the host as the host reads it
Paragraphs, breaks and captions
Paragraph folding, thematic breaks, caption attachment and adjacent block openers.
- Blocks that render to nothing
- Paragraph interruption
- Thematic break requires contiguous markers
- A flush-left line needs an open paragraph to fold into
- Two dashes are not a thematic break
- A caption attaches across one blank line
- A display-math span with trailing attributes takes a caption
- A styled display-math span takes a caption across one blank line
- Two blank lines detach a caption
- Adjacent block openers in an attached run stay separate
- A caret line does not end a paragraph it cannot caption
- A caption's marker separator is a run, and none of it is content
- A quote holding a captioned block indents it like any other nested block
- A heading's marker separator is a run, and none of it is content
- A dash run opens frontmatter only at the start, and only a dash run
Inline spans
Emphasis flanking, mentions and tags, smart typography, inline literals and escaping.
- An at sign before a space and a doubled delimiter inside bold italic are text
- Mention ignores email addresses
- Tag requires a word boundary
- Smart typography escapes and code
- The doubled run is the canonical arrow, in both families
- Empty delimiters
- Escape coverage
- Escaped space in inline text
- Emphasis edge cases
- Doubled emphasis delimiters
- Two-char delimiter runs
- Mention and tag name boundaries
- Strong emphasis starting with a link
- Literal less-than in prose
- Editorial markup takes a trailing attribute
- Emphasis opener slash-adjacency
- Bold-italic delimiter needs content
- A run of asterisks inside a combined token is content
- Any character is content of the combined bold-italic token
- A form feed or a no-break space is content wherever whitespace is tested
- Emphasis span closes before a following delimiter
- Unclaimed openers stay literal
- Inline literal
- All-space verbatim content
- A code span closes only on a run of its own length, whatever the length
- Adjacent slash and underscore emphasis nest
- A delimiter after an underscore or slash opens only when that one pairs
- Quote flanking after an escaped character
- A quote after a bare delimiter follows what that delimiter does
- A caption's placeholder is any
#that does not begin a tag - A comment inside a forced span or the combined token ends at its closer
- An unresolved reference's literal source is HTML-escaped like any other text
- Adjacent strong spans use HTML only where their delimiters merge
- A braced comment does not decide a quote
- A below-column line continues a paragraph only where one is open
- A closed block leaves no frame for the line below
- A line retained after a comment opens a paragraph
- An at-column comment retains nothing
- A shifted fence in a quoted container's body stores no continuation claim
- A container boundary is read at the container's own column
- A description keeps a block at its body column whatever leads the item
- A line-block payload span pairs past the content column
- A quoted item that ends on a block past its column holds no paragraph
- An opener past a hosted container's column opens there
- A fence that leaves a closed nested item opens in the host it lands in
- A footnote definition past a box's column is hoisted
- A link definition or an attribute line past a box's column opens on its authored base
- A block quote and a footnote body take the first-block form
- An opener past a hosted container's column interrupts its open paragraph
- A closed fence in a quoted sub-item after a lazy line leaves no paragraph
- A caption scope resets at a structural-only line
- A quote after an escaped quote closes
- A combined bold-italic span may cross a line
- The combined bold-italic token does not open or close inside a word
- The combined bold-italic token does not open after an underscore or a slash
- The combined bold-italic token does not open inside an open bare italic or bold
- A bare closer does not reach inside a braced inline
- A bare closer does not reach inside a link destination
- A bare closer does not reach inside a cross-reference
- An autolink or a cross-reference is atomic to brackets and braces
- Editorial markup closes outside a cross-reference or a bracket run
- An autolink is opaque to the bracket scan
- An autolink, a cross-reference or a comment is atomic to every outside delimiter
- An escaped cross-reference spelling stays literal
- A delimiter that is part of a larger character is text
- A tag inside a literal brace run is still a tag
- A math span's base class keeps the class slot in place
- A marker glued to a name opens nothing
- An angle bracket is escaped only where it opens markup
- An underscore pair in text is escaped where the line would pair it
- An underscore pair split across a line break is escaped
- The round-trip comparison normalizes a named list
- Braced emphasis can nest its own kind
- An escaped hash keeps its escape at a container's content position
- An unclosed inline literal reaches the end of its block
- A hyphen run opening a word after whitespace is a flag
- A braced hyphen pair is an en dash
- An empty brace pair is not a construct
- A leading escaped caret keeps its escape
- An idle escape does not spread from the block that needed one
- An idle escape does not spread from the occurrence that needed one
- A boolean attribute does not start with an underscore
- Substitution content is inline, and only a top-level arrow splits it
- Emphasis
- Inline extensions
- Smart typography dashes and quotes
- Inline code
- Non-breaking space
- Superscript and subscript
- Symbols
- A partial braced opener before a terminal backslash
- An unclosed backtick run still forms math
- An unresolved symbol leaves a colon before a quote
- Quotes open after an unresolved symbol
- A non-ASCII letter does not block a bare delimiter
- A lone brace stays inside forced emphasis
- Combined emphasis finds a later nonempty closer
- A literal bracket run bounds emphasis like a resolved one
- A quote at the start of a span opens
- A nested braced span hides an editorial closer
- A combined token inside a forced span stops at the span's closer
- An attribute block after a span behind a guarding opener belongs to that span
- An attribute block that attaches to nothing is text from the first pass
- A guard that closes only inside its guarded child's block
- A matched insertion or deletion hides a substitution's closer
- A footnote label may hold a bracket
- A footnote reference bounds an editorial closer scan
- Inside a note a footnote-shaped run is a bracket run
- Inside a note a nested note opener is a caret and a bracket run
- A block glued to a split combined token or a forced span's own delimiter
- A braced opener forms before an enclosing closer takes its block
- An opener is open where it stands, so a combined token after a guarded star stays split
- The rest of a split combined token is read again as inline content
- A comment inside a split combined token is removed before pairing
- A block glued to a combined closer inside a braced emphasis span
- A mention or tag keeps its full spelling in a strong child
- A generic extension parses its captured content as inline content
Links, images and references
Destinations, titles, reference and collapsed forms, autolinks and where a definition may live.
- Nested brackets in link text
- An image's alt text closes where a link's text closes
- An editorial comment's bracket is content, not the close
- Reference labels are case-sensitive
- Every name lookup compares case exactly
- Link destination parentheses balance
- A link destination is opaque to the bracket scan
- Empty link and image titles are preserved
- A backslash in a link destination is a literal character
- An empty link destination is not a link
- Link titles accept trailing ASCII padding with either destination
- An empty link destination takes spaces
- A tab cannot pad an empty link destination
- A quote is an ordinary link destination character
- Autolink display keeps the raw content
- Link reference definition separator must be a space
- A reference definition cannot take its destination from the next line
- Indented image and caption stay literal
- A lone indented image is a paragraph, and its HTML cannot say so
- A lone reference image at column 0, in every spelling
- A promoted image leaves the task checkbox unnamed
- A resolved reference image also leaves the checkbox unnamed
- An item's attribute block moves its content column; its checkbox does not
- Indented reference and footnote definitions stay literal
- A repeated definition: which one wins
- A collapsed reference is matched by the label the author wrote
- A definition inside a container is collected at that container's content column
- Trailing attributes on a link reference definition
- An image takes a reference the way a link does
- A collapsed image reference uses its alt text as the label
- One definition serves a link and an image
- An unresolved image reference stays literal
- A reference image takes a caption
- An unresolved reference image takes no caption
- An unresolved image gives its whole caption slot back, at any depth
- An at sign is a reference label character everywhere but the first position
- A label beginning with an at sign is not a reference label
- A link definition written before a footnote stays before it
- A zero-width character in a reference definition destination
- A block image is separated from the block after it on every target
- Invisible content and image promotion
- A reference definition is anchored at end of line
- An autolink body admits non-ASCII and excludes format characters
- Unresolved reference link
- Bare URLs stay literal
- A link inside a span's label keeps its destination
- A tab does not open the title slot
- Links
- Reference link
- Autolinks
- Unicode whitespace ends a link destination
- A reference definition needs a separator before its destination
- An invalid attribute block leaves a definition as prose
- A bang before a link is escaped
- Citation-shaped lines remain core text
- Raw inline image bytes stay inside a paragraph
- Unresolved footnote literal escapes HTML text
Footnotes
Bodies as blocks, the body content column, collection inside containers and placement of the rendered list.
- Authored inline footnote reference IDs
- Footnote with multiple blocks
- A fence after a footnote quote has its own base
- Cross-references resolve inside footnote bodies
- Footnote definition inside a container is collected
- Footnotes placement
- A footnotes placement marker inside a container does not place
- A footnotes marker renders its authored blocks before the placed section
- An unplaced footnotes marker keeps its authored blocks inside the div
- Footnote definition requires an inline body
- Footnote definition separator must be a space
- Unresolved footnote reference with a trailing attribute stays literal
- A caret is a reference label, not an empty footnote
- A definition on a footnote body's continuation line is collected
- A quoted link definition in a footnote body registers globally
- A footnote body holds blocks, and they render where they were written
- A heading in a footnote body takes an id but no section wrapper
- An attribute line inside a footnote body attaches inside it
- A nested list in a footnote body stays nested
- A flush-left line after a footnote definition belongs to the document
- A footnote continuation survives a blank run
- A footnote body's authored base can open a table past column two
- A definition below a footnote body's column is the document's own text
- A definition past a footnote body's column registers from its authored base
- A tab reaches a footnote body's column just as two spaces do
- A footnote body's last block, when it is not a paragraph, gets a synthesized paragraph for the backlink
- Multiple footnote backlinks follow inline content
- A line at a footnote definition's own column, followed by non-blank text, forms its own tight block
- An empty footnote body is written with the
{empty}sentinel - An empty inline note is literal
- A note's content recognizes no note
- A footnote in link text nests the anchors
- A footnote in reference link text nests the anchors too
- A footnote reference in link text keeps its id on the sup
- A titled footnotes marker names the endnotes section
- A closed fence at a marker-line note's body column opens in the note
- A quote or a term at a marker-line note's body column opens in the note
- A comment in a marker-line note changes nothing
- A comment closes a marker-line note's paragraph, and an unclosed fence below it opens in the note
- A comment between a heading and a colon fence leaves the fence an opener
- A fence past the column after an attribute line opens on its authored base
- A note body's own references resolve
- A reference link's text survives its own frame
- An authored base carries opaque payload, captions, and nested metadata
- A footnote in an unresolved reference is not a reference
- An inline note's content resolves after the note
- Footnotes
- A definition list inside a footnote body carries its authored base
- A recognized opener in a body needs no blank line above it
- One authored base rule reaches a definition nested in a list item
- A comment in a footnote body is invisible in both spellings
- An unreferenced footnote definition takes its links out of the render
Definition lists and abbreviations
Terms and descriptions, abbreviation definitions and the document levels that may declare them.
- Non-row pipe keeps lazy plus in a description item
- A below-column fence stays in a definition paragraph
- A definition opens a sibling block after a list
- Nested term after a list in a description
- A marker-line sublist stays open in a description body
- A flush-left description leaves a nested term's host
- A flush-left description leaves a deeper host
- Indented term ends with its unclosed host
- Abbreviation matches on word boundaries only
- Abbreviation definition interrupts a paragraph
- Abbreviation definition separator must be a space
- Definition list as a first-class block opener
- Abbreviation title escapes its markup characters
- Under-indented definition attaches, over-indented definition folds
- Wrapped definition term continuation below the content column strips leading whitespace
- Two abbreviation definitions
- An abbreviation definition is recognized only at document level
- A list item does not define an abbreviation either
- A div does not define an abbreviation either
- A definition below every content column folds as text
- An abbreviation at a list item's content column is still not a definition
- An abbreviation definition in an item body is paragraph text
- A
:description line needs a term above it - A tab as the first character of a definition term
- An abbreviation term is one ASCII alphanumeric word
- A definition inside a definition-list dd is collected, and the entry keeps no trace
- An empty abbreviation term is not a definition
- A definition body opener at or past its column stays structural
- An abbreviation expands inside an inline container
- Definition lists
- One consumed boolean spells the looseness no blank line can
- A definition body's separator width sets its content column
- An ordered item's separator width sets its content column
- Below a definition body's column the body ends
- An opener at or past a description body's column closes its paragraph
- The host does not change which column a definition reaches
- Below a definition body's column an invisible line folds as text
- A comment below a description body's column ends the body
- A closed fence in a description body ends it
- A container in a host body owns a line past its own content column
- A block opener past a nested footnote definition opens in the item
- An unterminated fence on a nested lead in a description body owns its body
- A definition nested past a footnote body is a note, and a reference below it resolves
- A container closer closes its container in a footnote body too
- A wrapped attribute block ends at its quote and reaches no line below it
- A trailing line after a consumed definition is placed by column-reach
- A nested note's floor is two columns past its own marker
- A column-0 line after a description-hosted note is a document sibling
- An empty unterminated container ends at a flush-left line
- An abbreviation definition outside document level is not an invisible line
- A block opener indented under a definition term is term text at every depth
- A comment or a definition under a definition term folds at every depth
- An info string does not change how a flush-left fence folds into a description body
- A description body whose own block is a fence keeps no line below its column
- An ordered list carries its authored delimiter
- A description continues after any blank run
Attributes
Attribute lines and inline blocks, names and values, classes, booleans and the semantic/language sugar.
- Attribute edge cases
- Trailing attribute block edge cases
- Block attribute lines
- Boolean attributes
- Unquoted attribute values may contain dots and colons
- Adjacent attribute blocks on one line merge
- Glued attribute blocks on an inline element merge
- Footnote references take an attribute run, editorial substitution and comment take none
- Classes are deduplicated
- Code span and image trailing attributes are strict
- A bare attribute block on its own line is literal
- Leading attribute brace before an inline span stays literal
- Attribute block after a mention stays literal
- Image trailing attribute is strict about the glue
- Indented attribute line stays literal
- Attribute braces on a list-item marker line
- A floating attribute stops at the item boundary
- An attribute line under an attributed sub-item stays in that item
- A marker attribute may hold a quoted brace
- An attribute name admits no colon
- An inline attribute block does not span lines, but an attribute line does
- The inline attribute interior is space-only, the attribute line is not
- A quoted attribute value stops at the newline
- A quoted value and a quoted title escape different sets
- A structural attribute leads the author's own
- A core directive-kind class leads authored attributes
- A boolean and a key/value of the same name are one attribute
- A semantic name renames the span, and the leftovers ride the element
- A language attribute is exact sugar for lang
- A malformed language tag leaves the whole block literal
- A language attribute and lang are one key
- The language sigil takes no padding
- A boolean lang is the third spelling of the same key
- The semantic registry holds no element Carve already spells
- Two attributes need a separator between them
- A derived title yields to an authored one
- An attribute block reaches the nested list it precedes
- An attribute line after a continuation marker attributes the attached block
- Attributes
- Inline span
- An attribute line below a list item interrupts it
- A wrapped attribute line leaves no paragraph open
- An engine-written shape says what it is called
- Text-block alignment renders the CSS declaration
- A sigil fence takes its attribute line
- A class key-value shares the class slot
Headings and cross-references
Section wrapping, id derivation and normalization, implicit and collapsed heading references.
- Single-line headings
- Heading marker column zero
- Cyclic cross-reference resolves to one level
- Only the id hoists to the section wrapper
- Headings inside containers are not wrapped
- Attribute order on an unwrapped heading
- Implicit heading references with no definition
- Explicit references do not use heading fallback
- A heading id keeps a non-ASCII space
- Paired German quotes leave no quote in a heading id
- A heading reference folds Unicode normalization, but not compatibility
- A collapsed reference reaches a heading by the heading's rendered text
- Heading-index plain text covers visible leaves and rejects an empty key
- A heading comment preserves code-span content
- Which inline content a heading id is derived from
- An editorial comment contributes nothing to a heading id
- Raw inline content in heading ids
- Headings
- Numbered cross-references
- Heading IDs
- Empty heading slugs use the ordinary duplicate suffix
- A cross-reference clones heading inline nodes
Whitespace, tabs and columns
Where a space is required, where a tab reaches, blank lines, line endings and trailing whitespace.
- Paragraph trailing whitespace
- Trailing whitespace boundaries
- A marker separator is a space, never a tab
- A tab inside a line is content in a label and after a definition marker
- A line-final run of spaces and tabs is dropped before the line is read
- A final tab does not change list ownership in a description
- A tab is content in a heading key and in a cross-reference id
- An invisible line does not cancel a blank-line separation
- An invisible line before the blank does not cancel the separation
- A tab after a heading, quote or caption marker leaves the line as prose
- A tab indent is the column it reaches, whatever the line holds
- The same column, written with four spaces
- Trailing whitespace after a block marker
- Line endings and a byte order mark
- A null byte is replaced before the document is read
- A tab separates two attributes, and pads a block, as a space does
- Colon fence separator must be a space
- Colon fence metadata slots must be a space too
- Table cell padding must be a space
- Link and image title slots must be a space
- Code fence metadata slots must be a space too
- A tab continues a list item just as two spaces do
- A blank line holds spaces and tabs and nothing else
- A link title takes exactly one space
- A code fence opener takes exactly one space
- The canonical writer glues a code fence to its info string
- A frontmatter opener takes exactly one space
- Frontmatter closer at end of input
- A reference definition's metadata slots take exactly one space
- A definition marker's separator is a space, and it is a run
- Trailing whitespace on a content line is dropped
- A comment line's text is content and a block body is payload
- A tab after a comment marker stays in its text
- A trailing comment takes a tab, a run start and its whole separator
- A tab after a fence or a frontmatter opener depends on where it sits
- Fenced code
- Reference link
- Comments
- Comment columns and surviving list items
- Line blocks
- Empty containers share one HTML body shape
- A title or label fills the container body slot
- A verbatim line keeps what sits past its fence opener, not past its container
- A list marker in a raised colon container folds into its open paragraph
- A comment span's closer below its host's column stays a delimiter
- A fence closer below a nested item's column ends containers down to its owner
- A comment span's closer column does not move the item's ownership
- A comment span opened below every content column is located there
- A nested marker comment keeps its own ownership
- A closed fence in a nested child leaves no paragraph open
- A code line left of an authored-base fence opener is measured from that base
- A fence closer below the authored base is measured as its payload
Security and limits
Trojan-Source stripping, scheme probes, attribute hardening and the nesting cap.
- Security hardening
- Trojan-Source: heading ids are NFC-normalized and strip invisible controls
- Trojan-Source: rendered text and code strip bidi-override controls
- Bidi controls in math content
- Scheme probe strips Unicode whitespace
- URL-list attributes are probed token-wise
- Openers past the nesting cap are one paragraph
- A format character before a scheme is not stripped, and is inert
- A denied destination takes one render-loss row per sink
- Include directive with no resolver renders literal
- Invalid include line ranges remain literal in core
- Invalid line-range includes within paragraphs stay literal
- A quoted include with no resolver parses inline content
- URL sinks reject schemes after emitted-value normalization
- Inline extensions
- Autolinks
Generated container documents
Generated cases for container ownership, blank payload and definitions.
Model boundary and fallback cases
Syntax ownership, inline frames, and table metadata.
- Model syntax boundaries and ownership
- Model inline frames and HTML attributes
- Invalid table metadata keeps the table
Model source boundaries
Source columns, table sections, footnotes, and image attributes.
- Opaque reference and inline bounds
- Lazy quote owners
- A later term after a shifted separator opens in the outer item
- A task item uses the ordered item column rule
- The deepest quoted paragraph takes a lazy line across missed prefixes
- A native header continues a promoted GFM header run
- A table ends a footnote paragraph claim
- A footnote heading does not loosen its host item
- A promoted GFM header keeps following native headers before the body
- A below-column line returns to its definition body
- A lazy line keeps its plus through three quote levels
- A task item uses its authored term base one column past a child marker
- A task item keeps a lazy term one column below its child marker
- A promoted image merges block attributes before inline attributes
- A content tab does not hide a description boundary
- A description keeps a list marker below its hosted footnote
- An intervening column refuses a description hosted first block
- A hosted footnote keeps a heading at its body floor
- Invalid body row metadata leaves one table body
- A heading inside the intervening band stays description text
- A below-column term stays in the footnote paragraph
- A closed footnote child releases a flush line
- A note-claimed fence line keeps the item loose
Visible footnote headings
Used footnote headings enter reference lookup; unused definitions do not.
Lint directives are invisible in rendered content
Carve lint comments control findings without changing the document's HTML.