Rust 2024 · 手写 FSM

可读地写,紧凑地喂给 Agent。

xmlsquish 递归处理 XML 提示词,压缩布局空白,并在标签与标签、标签与单词、单词与标签之间保留且只保留一个空格。

输入保持不变;结果写入同名 .o.xml 文件。

它不是保持 XML 语义的通用压缩器:会改写普通字符数据中的空白,可能改变混合内容,且不遵守 xml:space="preserve"。请只处理已确认空白是布局噪声的提示词。

INPUT
<role>
  You are a careful agent.
</role>
<task>
  Summarize this.
</task>
OUTPUT
<role> You are a careful agent. </role> <task> Summarize this. </task>
回车、换行、制表符与空格归并为词法单元边界上的一个空格。

做得少,做得准

为提示词管线而设计

这是面向提示词的词法规范化器,而非 XML 信息集压缩器:它规范化普通字符数据的 XML 空白,不构造 DOM。

确定性

单遍扫描

有限状态机逐字符推进;相同输入始终产生相同输出,不依赖格式化器的偏好。

批处理

路径、目录与通配符

一次接收多个路径;目录递归发现 *.xml,通配符匹配你的现有工作流。

可追踪

输入从不覆盖

每份结果写到对应的 *.o.xml,原始提示词仍是可读、可审阅的事实来源。

机制,而非魔法

先形成 atom,再统一发射

扫描器把普通字符数据形成 Word atom,把完整 markup 形成 Markup atom;连续空白延迟为候选分隔符,再由相邻 atom 统一决定输出。

边界规则:TAG ↔ TAG、TAG ↔ WORD 以及 WORD ↔ TAG,均输出恰好一个空格。
  1. DATA字符数据

    形成 Word atom,并暂存 XML S 空白游程。

  2. TAG标签

    属性引号中的 > 不会提前结束标签。

  3. COMMENT / CDATA / PI定界结构

    识别各自的结束序列,内部字节原样保留。

  4. DOCTYPE文档类型

    跟踪引号、注释、PI 与内部子集方括号深度。

零仪式批处理

把路径交给它

传入任意数量的文件、目录或通配符。没有参数时,xmlsquish 会打印帮助信息。

目录会递归查找 *.xml;每个输入在相同目录生成对应的 *.o.xml。

xmlsquish — zsh
$ cargo install --path crates/xmlsquish-cli --locked

$ xmlsquish ./prompts "templates/*.xml"
✓ 12 个文件已完成

每次运行都有账

看见真正省下的内容

完成后汇总文件、token、字符与空白,让压缩效果可验证而非凭感觉。

Tokenizer 编码o200k_base
处理文件数1
输入 token12
输出 token9
输入字符18
输出字符15
识别到的空白6
插入的空白1
Token 压缩率25.00%

示例数据仅用于展示统计界面;实际数值由你的文件决定。

让 XML 对人友好,对 Agent 也克制。

查看源码