rust-lang / mdBook

Create book from markdown files. Like Gitbook but implemented in Rust
https://rust-lang.github.io/mdBook/
Mozilla Public License 2.0
18.12k stars 1.63k forks source link

Code with pipe character in table is impossible to write correctly #2000

Open iFreilicht opened 1 year ago

iFreilicht commented 1 year ago

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 commented 1 year ago

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).

ehuss commented 1 year ago

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

schungx commented 1 year ago

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>|