Skip to content

[0828] 插件 I/O 序列化器迁移到 UTF-8 raw#3929

Open
AXeonV wants to merge 2 commits into
mainfrom
ty/0828
Open

[0828] 插件 I/O 序列化器迁移到 UTF-8 raw#3929
AXeonV wants to merge 2 commits into
mainfrom
ty/0828

Conversation

@AXeonV

@AXeonV AXeonV commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

[0828] 插件 I/O 序列化器迁移到 UTF-8 raw

1 相关文档

  • 0827.md - 插件 I/O 协议统一为 UTF-8(上一步)
  • dddd.md - 任务文档模板

2 任务相关的代码文件

  • src/Data/Convert/Verbatim/verbatim.cpp — 新增 tree_to_utf8raw / utf8raw_to_tree
  • src/Data/Convert/convert.hpp — 声明新函数
  • src/Scheme/L4/glue_convert.lua — 暴露 cpp-tree->utf8raw / cpp-utf8raw->tree
  • TeXmacs/progs/convert/rewrite/init-rewrite.scm — Scheme 包装 texmacs->utf8raw / utf8raw->texmacs
  • TeXmacs/progs/init-research.scm — lazy-define 新包装函数
  • TeXmacs/progs/utils/plugins/plugin-cmd.scm — 默认序列化器重命名为 utf8raw-serialize 并改用 texmacs->utf8raw
  • TeXmacs/plugins/{python,julia,goldfish,autosave,tikz,quiver,gnuplot,maxima}/progs/init-*.scm — 自定义 serializer 改用 texmacs->utf8raw
  • src/Data/Convert/Generic/input.cppverbatim_flush / utf8_flush 改用 utf8raw_to_tree + tree_utf8_to_herk
  • src/System/Link/connection.cppconnection_write(tree) 入口加入 tree_herk_to_utf8
  • src/Edit/Interface/edit_complete.cppsession_complete_command 在调用 utf8raw-serialize 前加入 tree_herk_to_utf8
  • TeXmacs/progs/dynamic/session-edit.scminput-done? 路径在调用 plugin-serialize 前把 pre 从 Herk 转成 UTF-8
  • TeXmacs/progs/dynamic/program-edit.scm — 同上,针对 program session
  • TeXmacs/tests/0828.scm — 新增 UTF-8 raw 往返、各插件 serializer UTF-8、输入/输出路径转换测试

3 如何测试

3.1 确定性测试(单元测试)

xmake b stem
xmake r 0801
xmake r 0804
xmake r 0827
xmake r 0828

3.2 非确定性测试(文档验证)

4 What

  • 新增无 cork/SourceCode 转换的 UTF-8 raw 序列化/反序列化函数。
  • 插件 I/O 主路径(connection_write(tree))先把内部 Herk tree 转成 UTF-8 tree。
  • 所有插件 serializer 改用 texmacs->utf8raw,不再使用 texmacs->code ... "SourceCode""utf-8"
  • 输入端 verbatim_flush / utf8_flush 改用 utf8raw_to_tree,再转回内部 Herk。
  • tree_to_verbatim / verbatim_to_tree 保留给文件格式转换等其他用途,plugin I/O 不再使用。

5 How

  1. verbatim.cpp 新增 tree_to_utf8raw(tree),直接调用 as_verbatim 并处理 Windows 换行,跳过 var_cork_to_utf8 / var_cork_to_sourcecode
  2. verbatim.cpp 新增 utf8raw_to_tree(string),复用 mac_to_unix / dos_to_unix 与拆分逻辑,但不经过 encode(即不做 utf8_to_cork)。把原有拆分逻辑抽成静态 helper verbatim_raw_to_tree 供旧函数复用。两函数均不设 wrap 形参——tree_to_verbatim / verbatim_to_tree 保留了 wrap 是为了文件格式转换等需要折行的场景,而插件 I/O 一律传 false,故 raw 版本直接省去该形参,避免留下一处无调用者、无测试的折行分支。
  3. convert.hpp 声明两个新函数;glue_convert.lua 暴露给 Scheme。
  4. init-rewrite.scm 提供 texmacs->utf8raw / utf8raw->texmacs 包装;init-research.scm 加入 lazy-define。
  5. plugin-cmd.scmverbatim-serialize 重命名为 utf8raw-serializegeneric-serialize 改用 texmacs->utf8raw
  6. Python、Julia、Goldfish、Autosave、TikZ、Quiver、Gnuplot、Maxima 自定义 serializer 全部替换为 texmacs->utf8raw (stree->tree u)
  7. input.cppverbatim_flush / utf8_flush 改为 tree_utf8_to_herk (utf8raw_to_tree (buf))texmacs_input_rep 是插件连接的"输入端"——站在 TeXmacs 视角,插件进程经管道发回的数据要"输入"进来;write(tree) 把解析结果喂给编辑器内部的文档树(不是写文件,也不是发回插件)。编辑器内部所有字符串标签统一用 Herk 编码,所以 write 的实参必须是 Herk tree,而 buf 是插件发来的 UTF-8 字节,分两步翻译:utf8raw_to_tree(buf) 先切成 (document ...) 但标签仍是 UTF-8 原始字节(raw,不做编码转换),tree_utf8_to_herk(...) 再把每个 atomic 标签从 UTF-8 解码成 Herk。两步合起来等价于旧版 verbatim_to_tree(buf, false, "utf-8")(内部走 utf8_to_cork),但编码目标从 cork 升级为 Herk——cork 表之外的码点,旧的 utf8_to_cork 无映射就丢弃,新的 utf8_to_herk<#XXXX> 保留,emoji、BMP 外字符因此不再丢失,这是相对 0827 的关键修正。此外 utf8raw_to_tree 引入了 dos_to_unix / mac_to_unix 换行归一化(旧 verbatim_to_tree(buf,"utf-8") 路径没有),插件输出里的 \r\n / 裸 \r 会被统一成 \n。写出端是对称的逆过程:第 8–10 条里编辑器内部的 Herk tree 先经 tree_herk_to_utf8 转成 UTF-8 tree,再交给 serializer 输出给插件。
  8. connection.cppconnection_write(tree)tree_to_stree 之前调用 tree_herk_to_utf8
  9. edit_complete.cppsession_complete_command 在调用 utf8raw-serialize 前加入 tree_herk_to_utf8,处理 tab completion 这条旁路。
  10. session-edit.scmprogram-edit.scminput-done? 路径在调用 plugin-serialize 前把 pre 从 Herk 转成 UTF-8,避免该查询路径发送 cork 文本给插件。该转换不可省略:plugin-serialize 约定接收 UTF-8 stree,而编辑器内部字符串为 Herk/cork,省略会让 Herk 的 <#XXXX> 字面原样漏给插件——插件收到的是 8 个 ASCII 字符 <#4E2D> 而非"中"。0828.scmtest-input-done-herk-to-utf8 用同一 Herk stree 对比了转换与不转换两种结果,断言不转换时 <#XXXX> 会漏出,以此证明该转换是必需的而非冗余。当前实现有 stree->tree->stree 往返开销,但 input-done? 输入通常很小,影响可忽略;若后续出现瓶颈,可改为直接 stree 级转换。
  11. 新增 TeXmacs/tests/0828.scm,覆盖 texmacs->utf8raw / utf8raw->texmacs 往返、各插件 serializer(含 Maxima 的 ;/$ 终止符与空输入特例)的 UTF-8 输出、输入端 Herk 转换(含 emoji 落到 <#XXXX> 的保留路径)、<#XXXX> 与普通文本混合的往返、主写出入口 Herk->UTF-8 转换、以及 input-done? 旁路 Herk stree 转 UTF-8 后再序列化(含不转换的反向对照)等场景。

PS

  • TeXmacs/plugins/*/progs/data/*.scm 中出现的 (texmacs->verbatim x (acons "texmacs->verbatim:encoding" "SourceCode" '())) 用于文件格式导入/导出(如 .py.cpp.scm),不属于插件 I/O 路径;SourceCode 编码用于文件持久化与往返,0828 不涉及这些路径,保持原样不改。

Copilot AI review requested due to automatic review settings July 10, 2026 13:57

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants