fix(lexer): don't split table cells on | inside links/code
The table-row lexer collected every `|` as a cell separator, so a pipe
inside a `[[url|title]]` wikilink (or `{{…}}` transclusion / `` `…` ``
inline code) was mistaken for a column boundary — mangling the link and
adding a phantom column in the AST and HTML export.
Replace the naive scan in `try_lex_table_row` with `cell_bar_positions`,
which skips pipes inside those constructs (matching the regions
`lex_inline` tokenises as a unit). Unclosed constructs fall back to
literal openers so a malformed cell can't swallow the rest of the row,
and the scan only slices at ASCII openers to stay UTF-8 safe.
Backslash-escaped `\|` is intentionally left unhandled: the inline lexer
has no escape handling, so honouring it here would leave a stray
backslash in the output. Documented as a matched follow-up.
Adds lexer + HTML-export regression tests.
Closes #1
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Lzhq43v1qpkZczN65dqXa3
This commit is contained in:
@@ -245,6 +245,19 @@ fn table_with_header_separator() {
|
||||
assert!(out.contains("<td> 1 </td>"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn table_cell_with_wikilink_pipe_exports_one_cell() {
|
||||
// Regression: the `|` in `[[url|title]]` must stay inside the link, so the
|
||||
// row keeps two columns and the link renders as a single anchor. Before the
|
||||
// fix the cell split into `[[https://example.com` + `My Site]]`, adding a
|
||||
// phantom <td> and breaking the link.
|
||||
let out = render("| Name | Link |\n|---|---|\n| foo | [[https://example.com|My Site]] |\n");
|
||||
assert!(
|
||||
out.contains("<td> foo </td><td> <a href=\"https://example.com\">My Site</a> </td>"),
|
||||
"got: {out}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn single_comment_becomes_html_comment() {
|
||||
let out = render("%% hidden\n");
|
||||
|
||||
Reference in New Issue
Block a user