mdBook icon indicating copy to clipboard operation
mdBook copied to clipboard

Code with pipe character in table is impossible to write correctly

Open iFreilicht opened this issue 2 years ago • 3 comments

Problem

This was discovered in NixOS/nix#7770

We have a table with all operators, but || doesn't get rendered correctly:

image

I thought that maybe removing the \ from the markdown would solve this, but no. Comparing a few types of spans:

| code | bold   | ital |
| ---- | ------ | ---- |
|  `|` |  __|__ |  *|* |
| `\|` | __\|__ | *\|* |

Screenshot 2023-01-28 at 20 06 06

The documentation claims that tables are implemented according to the GFM tables extension.

However, this is not the case. From the GFM spec, Example 200:

Include a pipe in a cell’s content by escaping it, including inside other inline spans:

| f\|oo  |
| ------ |
| b `\|` az |
| b **\|** im |

Steps

  1. Create a new mdbook
  2. Paste this code into chapter_1.md:
    | code | bold   | ital |
    | ---- | ------ | ---- |
    |  `|` |  __|__ |  *|* |
    | `\|` | __\|__ | *\|* |
    
  3. Serve or build the mdbook and observe that either way of putting a pipe symbol inside a code span inside a table doesn't work: Screenshot 2023-01-28 at 20 06 06

Possible Solution(s)

It seems mdbook treats the code span as a self-contained unit, so \| does not have special meaning inside the table as it should.

While IMO it would be more intuitive to just have the non-escaped pipe symbol work inside code spans, adhering to the GFM spec would be best in terms of compatibility, so that's what I'd suggest.

Notes

In the end, this minimal markdown

| | |
| - | - |
| `\|` | |

should produce this HTML

<table>
  <thead>
    <tr>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="hljs">|</code></td>
      <td></td>
    </tr>
  </tbody>
</table>

While right now it produces this:

<table>
  <thead>
    <tr>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="hljs">\|</code></td>
      <td></td>
    </tr>
  </tbody>
</table>

Version

mdbook v0.4.25

iFreilicht avatar Jan 28 '23 19:01 iFreilicht

I did a bit more research and found out this is actually a known problem in pulldown-cmark since 2019, see pulldown-cmark#356. Not sure if this should stay open since it's a problem in mdbook that requires updating a dependency (once the bug is fixed there).

iFreilicht avatar Jan 28 '23 19:01 iFreilicht

It probably doesn't hurt to keep this open, but yea it is blocked on https://github.com/raphlinus/pulldown-cmark/issues/356.

ehuss avatar Jan 29 '23 17:01 ehuss

Yes, this has always been a problem. It is impossible to put a `|` inside a table.

The work around is to use <code></code> tags.

| This is <code>\|</code>|

schungx avatar Jan 30 '23 00:01 schungx