1 Commits

Author SHA1 Message Date
gffranco 5375e30bda fix(tables): don't skip escaped \| in cell scan — match the server
CI / editor tests (push) Successful in 46s
The server lexer (nuwiki-rs) splits table cells on a backslash-escaped `\|`
(it can't skip it yet without leaving a stray backslash in the output), but
the client's cell_bar_positions was skipping `\|`. That made the editor
auto-align keep `a\|b` as one cell while HTML export split it into two.

Drop the `\|` case from both clients so buffer alignment and export agree.
`[[…]]` / `{{…}}` / `` `code` `` pipes are still treated as literal. A
coordinated `\|` follow-up (server unescaping + client re-adding the skip)
is tracked in nuwiki-rs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 16:43:15 +00:00
2 changed files with 14 additions and 12 deletions
+7 -6
View File
@@ -1161,9 +1161,12 @@ endfunction
" 0-based byte offsets of the cell-separator `|` in `s`. Pipes that are literal " 0-based byte offsets of the cell-separator `|` in `s`. Pipes that are literal
" cell content are skipped: those inside `[[…]]` wikilinks, `{{…}}` " cell content are skipped: those inside `[[…]]` wikilinks, `{{…}}`
" transclusions, `` `…` `` inline code, and backslash-escaped `\|`. Byte-based " transclusions, and `` `…` `` inline code. Byte-based (strpart/stridx) to match
" (strpart/stridx) to match the rest of the table code. Keeps a `[[url|title]]` " the rest of the table code. Keeps a `[[url|title]]` link in one cell instead
" link in one cell instead of splitting on its internal pipe. " of splitting on its internal pipe.
"
" Backslash-escaped `\|` is intentionally NOT skipped, to match the server
" lexer (nuwiki-rs). See the nuwiki-rs issue for the coordinated `\|` follow-up.
function! s:cell_bar_positions(s) abort function! s:cell_bar_positions(s) abort
let l:out = [] let l:out = []
let l:i = 0 let l:i = 0
@@ -1171,9 +1174,7 @@ function! s:cell_bar_positions(s) abort
while l:i < l:n while l:i < l:n
let l:c = strpart(a:s, l:i, 1) let l:c = strpart(a:s, l:i, 1)
let l:two = strpart(a:s, l:i, 2) let l:two = strpart(a:s, l:i, 2)
if l:c ==# '\' if l:c ==# '`'
let l:i += 2
elseif l:c ==# '`'
let l:close = stridx(a:s, '`', l:i + 1) let l:close = stridx(a:s, '`', l:i + 1)
let l:i = l:close < 0 ? l:n : l:close + 1 let l:i = l:close < 0 ? l:n : l:close + 1
elseif l:two ==# '[[' elseif l:two ==# '[['
+7 -6
View File
@@ -823,18 +823,19 @@ local is_table_row = require('nuwiki.util').is_table_row
-- 1-based byte positions of the cell-separator `|` characters in `s`. Pipes -- 1-based byte positions of the cell-separator `|` characters in `s`. Pipes
-- that are literal cell content are skipped: those inside `[[…]]` wikilinks, -- that are literal cell content are skipped: those inside `[[…]]` wikilinks,
-- `{{…}}` transclusions, `` `…` `` inline code, and backslash-escaped `\|`. -- `{{…}}` transclusions, and `` `…` `` inline code. This keeps a
-- This keeps a `[[url|title]]` link in one cell instead of splitting on its -- `[[url|title]]` link in one cell instead of splitting on its internal pipe.
-- internal pipe. --
-- Backslash-escaped `\|` is intentionally NOT skipped, to match the server
-- lexer (nuwiki-rs), which can't skip it yet without leaving a stray backslash
-- in the output. See nuwiki-rs issue for the coordinated `\|` follow-up.
local function cell_bar_positions(s) local function cell_bar_positions(s)
local out = {} local out = {}
local i = 1 local i = 1
local n = #s local n = #s
while i <= n do while i <= n do
local c = s:sub(i, i) local c = s:sub(i, i)
if c == '\\' then if c == '`' then
i = i + 2 -- skip the escaped char (e.g. `\|`)
elseif c == '`' then
local close = s:find('`', i + 1, true) local close = s:find('`', i + 1, true)
i = (close or n) + 1 i = (close or n) + 1
elseif s:sub(i, i + 1) == '[[' then elseif s:sub(i, i + 1) == '[[' then