Routing the x86_64-unknown-linux-musl link through Ubuntu's musl-gcc
wrapper overrode Rust's crt-static default and produced a dynamic
binary with an interpreter of /lib/ld-musl-x86_64.so.1. That path
exists on approximately no machine outside Alpine, so the shipped
binary died at exec time with "required file not found" everywhere —
the opposite of what a musl build is for. aarch64-unknown-linux-musl
never used musl-gcc and was static all along; only x86_64 was broken.
Drop musl-tools and the linker override and let Rust link with its
own bundled musl libc.a, which yields a static-pie executable.
Add a post-build check that fails the release if a musl binary has an
INTERP segment, so this can't silently ship again.
Also correct the asset-URL comment: Gitea serves
/releases/download/latest/<name>, not GitHub's
/releases/latest/download/<name>.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011J8C6eRmWEZsh28vkEMD9H
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