Production parser evidence

Parser Compatibility Lab

These are executable cases, not illustrative mockups. Every result below is generated with the same converter used on the homepage.

Last updated: September 17, 2026

15parser cases
3output styles
45style runs
0content uploads

How verification works

One parser, one fixture source

  1. Each source sample and expected behavior lives in a structured fixture.
  2. The production converter renders Grid ASCII, Unicode box, and Simple text.
  3. Unit tests compare table metrics, diagnostics, visible width, and output snapshots.
  4. Browser tests verify the same behaviors through the public converter interface.

Case 01

Escaped pipe

A backslash-escaped pipe stays inside one cell and renders as a literal pipe.

Try this case in the converter
Markdown source 3 lines
| Status |
| --- |
| success \| warning |
Generated result Grid ASCII
+-------------------+
| Status            |
+-------------------+
| success | warning |
+-------------------+

Tables: 1 · Rows: 2 · Columns: 1 · Max line: 21 chars · 80-col safe

No diagnostics for this case.

Case 02

Inline code pipe

A pipe inside a backtick code span is treated as code, not a column boundary.

Try this case in the converter
Markdown source 3 lines
| Code |
| --- |
| `a | b` |
Generated result Grid ASCII
+-------+
| Code  |
+-------+
| a | b |
+-------+

Tables: 1 · Rows: 2 · Columns: 1 · Max line: 9 chars · 80-col safe

No diagnostics for this case.

Case 03

Escaped pipe in inline code

Escaping a pipe inside inline code still produces one readable code value.

Try this case in the converter
Markdown source 3 lines
| Code |
| --- |
| `a \| b` |
Generated result Grid ASCII
+-------+
| Code  |
+-------+
| a | b |
+-------+

Tables: 1 · Rows: 2 · Columns: 1 · Max line: 9 chars · 80-col safe

No diagnostics for this case.

Case 05

Pipe in a fenced code block

A shell pipe inside a fenced block is preserved as code and never becomes a table.

Try this case in the converter
Markdown source 3 lines
```js
cat file | grep foo
```
Generated result Simple text
cat file | grep foo

No valid table detected; source text is preserved.

No diagnostics for this case.

Case 06

Pipe in ordinary prose

A sentence containing a pipe is preserved unless a valid separator row establishes a table.

Try this case in the converter
Markdown source 1 lines
Use A | B in prose, not as a table.
Generated result Simple text
Use A | B in prose, not as a table.

No valid table detected; source text is preserved.

No diagnostics for this case.

Case 07

Table followed immediately by prose

The table ends before a prose-like pipe line, which remains in document order.

Try this case in the converter
Markdown source 4 lines
| Key | Value |
| --- | --- |
| A | 1 |
Use A | B for fallback.
Generated result Grid ASCII
+-----+-------+
| Key | Value |
+-----+-------+
| A   | 1     |
+-----+-------+

Use A | B for fallback.

Tables: 1 · Rows: 2 · Columns: 2 · Max line: 23 chars · 80-col safe

  • Line 4: This looks like prose after a table. Consider adding a blank line after the table.

Case 08

Table without outer pipes

A standard table without leading or trailing pipes is recognized by its separator row.

Try this case in the converter
Markdown source 3 lines
Name | Score
--- | ---:
Alpha | 12
Generated result Simple text
Name   Score
-----  -----
Alpha     12

Tables: 1 · Rows: 2 · Columns: 2 · Max line: 12 chars · 80-col safe

No diagnostics for this case.

Case 09

CJK visible width

Wide CJK characters use terminal display width so adjacent columns stay aligned.

Try this case in the converter
Markdown source 3 lines
| 名称 | 状态 |
|---|---|
| 表格 | 完成 |
Generated result Unicode box
┌──────┬──────┐
│ 名称 │ 状态 │
├──────┼──────┤
│ 表格 │ 完成 │
└──────┴──────┘

Tables: 1 · Rows: 2 · Columns: 2 · Max line: 15 chars · 80-col safe

No diagnostics for this case.

Case 10

Emoji visible width

Emoji width is included in the same display-width calculation used for alignment and health metrics.

Try this case in the converter
Markdown source 3 lines
| Item | Status |
|---|---|
| Rocket 🚀 | ✅ Done |
Generated result Unicode box
┌───────────┬─────────┐
│ Item      │ Status  │
├───────────┼─────────┤
│ Rocket 🚀 │ ✅ Done │
└───────────┴─────────┘

Tables: 1 · Rows: 2 · Columns: 2 · Max line: 23 chars · 80-col safe

No diagnostics for this case.

Case 12

Inconsistent column count

A short row gets a best-effort blank cell plus a line-level repair suggestion.

Try this case in the converter
Markdown source 3 lines
| A | B | C |
|---|---|---|
| 1 | 2 |
Generated result Grid ASCII
+---+---+---+
| A | B | C |
+---+---+---+
| 1 | 2 |   |
+---+---+---+

Tables: 1 · Rows: 2 · Columns: 3 · Max line: 13 chars · 80-col safe

  • Line 3: Expected 3 columns, found 2. Add the missing cell separators or leave an empty cell such as `| |`.

Case 13

Multiple tables in one document

Two tables are converted independently while the paragraphs between them remain in place.

Try this case in the converter
Markdown source 11 lines
Intro

| A | B |
|---|---|
| 1 | 2 |

Between

Name | Score
--- | ---:
Alpha | 12
Generated result Grid ASCII
Intro

+---+---+
| A | B |
+---+---+
| 1 | 2 |
+---+---+

Between

+-------+-------+
| Name  | Score |
+-------+-------+
| Alpha |    12 |
+-------+-------+

Tables: 2 · Rows: 4 · Columns: 2 · Max line: 17 chars · 80-col safe

No diagnostics for this case.

Case 14

Invalid separator row

Table-like text without a valid dash separator remains ordinary text.

Try this case in the converter
Markdown source 3 lines
| A | B |
| --- | nope |
| 1 | 2 |
Generated result Simple text
| A | B |
| --- | nope |
| 1 | 2 |

No valid table detected; source text is preserved.

No diagnostics for this case.

Case 15

Empty cells

Intentional empty cells keep their column positions across all three output styles.

Try this case in the converter
Markdown source 4 lines
| A | B | C |
|---|---|---|
| 1 |  | 3 |
|  | 2 |  |
Generated result Grid ASCII
+---+---+---+
| A | B | C |
+---+---+---+
| 1 |   | 3 |
+---+---+---+
|   | 2 |   |
+---+---+---+

Tables: 1 · Rows: 3 · Columns: 3 · Max line: 13 chars · 80-col safe

No diagnostics for this case.

What these results do and do not prove

These samples verify md2text's parsing and width model. They are not a guarantee that every Markdown renderer, terminal, email client, or font will display the same spacing.

md2text accepts unescaped pipes inside inline code as a convenience. Other Markdown renderers may require escaping them. Table-ending detection uses heuristics: adding a blank line is still the clearest boundary. Fenced code loses its fence markers in plain-text output.

The converter does not wrap long cells, transliterate non-ASCII content, or render HTML tables. For destination decisions, see the measured style comparison, 80-column repair example, and Unicode width measurements.

Use your own source

Check a Markdown table locally

The converter never puts pasted Markdown or generated output in the URL.

Open the converter