---
title: "Markdown table multiline cells: grid and multiline tests"
slug: markdown-table-multiline-cells
excerpt: "Markdown table multiline cells meet pandoc 3.8.3 here; the HTML for a wrapped Notes cell is under A grid table with two lines in one cell."
quickAnswer: "Under Spec greps and pandoc table extensions, grep tallies taken on the CommonMark spec are listed with pandoc's extension lists. The section A grid table with two lines in one cell quotes pandoc's HTML for one test file. A grid cell holding a bullet list and a paragraph is tested under Lists and paragraphs inside a grid cell. Pandoc's full table output for a wrapped row is quoted in A multiline table with wrapped cell text. Spec line numbers sit beside the commonmark output in Why commonmark read the multiline table as a heading. Caption line results from four reader settings appear under A pipe table with a caption line. A typed tag between two lines of a cell is tested in A br tag inside a pipe cell. Five numbered checks, four of them with printed counts, make up Test a multiline cell with pandoc."
keyTakeaways:
  - "Grep counts for table words in the spec text are listed under Spec greps and pandoc table extensions."
  - "Joined text in the Notes cell, from the markdown reader, is quoted in A grid table with two lines in one cell."
  - "Pandoc's HTML for a wrapped row and a one-line row appears in A multiline table with wrapped cell text."
  - "Spec lines on thematic breaks and setext headings are cited in Why commonmark read the multiline table as a heading."
  - "Under A pipe table with a caption line, the caption element pandoc wrote is quoted."
publishedDate: 2026-10-20
dateModified: 2026-10-20
author: Bobby Huang
cluster: B
role: post
status: published
faq:
  - q: How do I put two lines in a Markdown table cell?
    a: "HTML from a grid table holding a wrapped cell is quoted under A grid table with two lines in one cell."
  - q: Why did my multiline table turn into a heading?
    a: "The section Why commonmark read the multiline table as a heading quotes that output with spec line numbers beside it."
  - q: Can a grid table cell contain a bulleted list?
    a: "Under Lists and paragraphs inside a grid cell, one cell with a two-item list and a paragraph goes through two readers."
  - q: Will a br tag inside a pipe cell survive pandoc?
    a: "Under A br tag inside a pipe cell, pandoc's HTML for that cell is quoted from three reader settings."
related:
  - markdown-tables
  - raw-html-in-markdown
  - markdown-line-breaks
---

You have a table where one cell needs more room: a name in the first column and a note wrapping onto a second line in the next. The [Markdown tables guide](markdown-tables.md) covers pipe rows and alignment; this post tries other ways to get that second line.

The markdown table multiline tests below each ran under pandoc 3.8.3 for macOS with a single reader setting, and the returned HTML is quoted. The test files hold a grid table, a multiline table, a pipe table with a caption line and a pipe cell with a typed tag in it. Nothing here goes past what pandoc printed.

## Spec greps and pandoc table extensions

Grep, ignoring case, turned up `grid table` on 0 lines of the 0.31.2 CommonMark text and `multiline table` on 0 lines. The word `caption` matched 2 lines, 2235 and 2236, where the HTML blocks section lists tag names (`caption` on one line, `figcaption` on the other). As a whole word, `table` matched 23 lines, all between lines 2241 and 2937, inside that same HTML blocks section. For a control, `thematic break` matched 20 lines.

Pandoc adds table syntax through extensions. Piping `pandoc --list-extensions=markdown` through grep found `+grid_tables`, `+multiline_tables`, `+pipe_tables` and `+table_captions`. On the `commonmark` list, grep counted 0 lines for `grid_tables`, `multiline_tables` and `table_captions`, and found `-pipe_tables`. Both lists showed `+raw_html`.

## A grid table with two lines in one cell

The test file `tbl-grid.md` draws the table with `+` corners, `-` borders and a `+===+` line under the header:

```markdown
+-----------+------------------+
| Owner     | Notes            |
+===========+==================+
| Jane Doe  | First line       |
|           | second line      |
+-----------+------------------+
```

The command `pandoc -f markdown -t html tbl-grid.md` gave:

```html
<table style="width:43%;">
<colgroup>
<col style="width: 16%" />
<col style="width: 26%" />
</colgroup>
<thead>
<tr>
<th>Owner</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Jane Doe</td>
<td>First line second line</td>
</tr>
</tbody>
</table>
```

The two source lines in the Notes cell became one cell, `First line second line`, with a space where the line ending had been. Pandoc also wrote a `colgroup` with a width for each column and a width on the table itself.

With `pandoc -f commonmark -t html tbl-grid.md`, the same file came back as one paragraph of text:

```html
<p>+-----------+------------------+ | Owner | Notes |
+===========+==================+ | Jane Doe | First line | | | second
line | +-----------+------------------+</p>
```

The `commonmark+pipe_tables` setting printed those same three lines.

## Lists and paragraphs inside a grid cell

An added test, `tbl-grid-blocks.md`, put a two-item list, a blank cell line and a sentence into the Notes cell:

```markdown
+-----------+------------------+
| Owner     | Notes            |
+===========+==================+
| Jane Doe  | - First item     |
|           | - Second item    |
|           |                  |
|           | A closing line.  |
+-----------+------------------+
```

Here is the body row from `pandoc -f markdown -t html tbl-grid-blocks.md`:

```html
<tr>
<td>Jane Doe</td>
<td><ul>
<li>First item</li>
<li>Second item</li>
</ul>
<p>A closing line.</p></td>
</tr>
```

The cell held a `ul` with two items and a `p` after it. The `commonmark` reader printed this file as one paragraph of text too, dashes and pipes included.

## A multiline table with wrapped cell text

The file `tbl-multi.md` uses a different form. A dash line opens and closes it, a row of dash groups sits under the header, and a blank line separates the body rows:

```markdown
----------------------------
Owner      Notes
---------- -----------------
Jane Doe   First line
           second line

John Doe   One line
----------------------------
```

Pandoc's `markdown` reader turned that into:

```html
<table style="width:40%;">
<colgroup>
<col style="width: 15%" />
<col style="width: 25%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Owner</th>
<th style="text-align: left;">Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">Jane Doe</td>
<td style="text-align: left;">First line second line</td>
</tr>
<tr>
<td style="text-align: left;">John Doe</td>
<td style="text-align: left;">One line</td>
</tr>
</tbody>
</table>
```

The wrapped note was joined with a space, as in the grid test. The two body rows came out as two `tr` elements, and every header and body cell got `style="text-align: left;"`.

## Why commonmark read the multiline table as a heading

Plain `commonmark` gave this for `tbl-multi.md`, and `commonmark+pipe_tables` printed the same five lines:

```html
<hr />
<p>Owner Notes</p>
<hr />
<p>Jane Doe First line second line</p>
<h2>John Doe One line</h2>
```

The spec explains each line. Per lines 838 to 841, a thematic break is a line holding at least three of the same character, `-`, `_` or `*`, with optional spaces or tabs after each. That covers the opening dash line, and it covers the dash groups under the header, since the space between groups is allowed there. Line 1373 adds that a setext heading underline can't hold internal spaces, so the line of dash groups stayed a break.

The closing dash line had no gap in it, and it sat right under `John Doe   One line`. Lines 1255 to 1260 define a setext heading underline as a run of `=` or `-` characters and make a `-` underline a level 2 heading. Lines 995 to 998 settle the overlap: if a dash run could count as either a break or a setext underline, the heading reading takes precedence. So the last row became an `h2`.

## A pipe table with a caption line

The file `tbl-pipe-cap.md` puts a `Table:` caption line under a pipe table. Its rows follow the pipe rules in the [Markdown tables guide](markdown-tables.md).

```markdown
| Owner | Notes |
|---|---|
| Jane Doe | First line |
| | second line |

Table: Owners and notes
```

This time the `markdown` reader printed:

```html
<table>
<caption>Owners and notes</caption>
<thead>
<tr>
<th>Owner</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Jane Doe</td>
<td>First line</td>
</tr>
<tr>
<td></td>
<td>second line</td>
</tr>
</tbody>
</table>
```

The `Table:` line became a `caption` element.

Under `commonmark+pipe_tables`, the table came out with the same rows and no caption, and the caption line printed after it as `<p>Table: Owners and notes</p>`. An added run, `pandoc -f markdown-table_captions -t html tbl-pipe-cap.md`, gave that same result. Plain `commonmark` gave two paragraphs: the table as text, then the caption line.

## A br tag inside a pipe cell

The last test file, `tbl-pipe-br.md`, has a typed tag between the two parts of one cell:

```markdown
| Owner | Notes |
|---|---|
| Jane Doe | First line<br>second line |
```

Both `pandoc -f markdown -t html tbl-pipe-br.md` and `pandoc -f commonmark+pipe_tables -t html tbl-pipe-br.md` wrote the cell as:

```html
<td>First line<br>second line</td>
```

That tag came through unchanged, inside the one `td`. Under plain `commonmark`, the whole table turned into a paragraph:

```html
<p>| Owner | Notes | |---|---| | Jane Doe | First line<br>second line
|</p>
```

Typed tags beyond this one get more room in the [raw HTML in Markdown post](raw-html-in-markdown.md). The [line break fixes](markdown-line-breaks.md) post covers other ways to end a line.

## Test a multiline cell with pandoc

When a wrapped cell comes out wrong, put that one table in a file by itself and run these checks.

1. Print the file with `cat tbl-grid.md` and confirm the `|` and `+` characters line up on every row of the grid.
2. Count tables. `pandoc -f markdown -t html tbl-grid.md | grep -c '<table'` printed `1` in this test. The count fell to `0` with `-f commonmark` in its place.
3. Count rows in a multiline table. `pandoc -f markdown -t html tbl-multi.md | grep -c '<tr>'` printed `3`: the header row and two body rows.
4. Look for a stray heading. `pandoc -f commonmark -t html tbl-multi.md | grep -c '<h2>'` printed `1`, the closing dash line read as an underline.
5. Check a caption. `pandoc -f markdown -t html tbl-pipe-cap.md | grep -c '<caption>'` printed `1`; the `-f commonmark+pipe_tables` run printed `0`.

When your count doesn't match, set your output beside the quoted HTML for that file and reader.

## Where Sashmark fits

In its v1 plan, Sashmark would let you change words directly inside the rendered page, and the clean Round-Trip it plans for would bring untouched lines back carrying identical bytes. Planned as well, with no git needed for it, is a Changes View, which would highlight wording altered since your prior look at that file. It is in development and has not been released. The app itself has no AI features. See the [planned features](/features), the [help pages](/help) and the [roadmap](/roadmap) for where each part stands.

Read more at [sashmark.com](https://www.sashmark.com/).
