fix(tables): don't skip escaped \| in cell scan — match the server
CI / editor tests (push) Successful in 46s
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>
This commit is contained in:
@@ -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 ==# '[['
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user