🧩 XmlHighlighter
Translator 核心 正则分词器
用一组正则把纯文本 XML 切成带
TAG标签的ELEMENT列表,供 UI 着色。
📁 源码:
ClassySharkWS/src/com/google/classyshark/silverghost/translator/xml/XmlHighlighter.java 📦 包:com.google.classyshark.silverghost.translator.xml职责
XmlHighlighter 接收已解压的纯文本 XML 字符串,对一组预编译正则模式逐个跑 Matcher.find(),收集所有匹配项为内部 Element(start/end/TagType),按起始偏移排序后顺序遍历:匹配项之间的间隙文本发为 XML_COMMENT,匹配项本身按其 TagType 映射到 Translator.TAG 发出。最终输出 List<Translator.ELEMENT>,供 DisplayArea.fillTokensToDoc 做语法着色。
关键方法 / 字段
| 名称 | 类型 | 说明 |
|---|---|---|
TagType | enum | 内部分词类型:TAG, ATTR_NAME, ATTR_VALUE, COMMENT, CDATA |
TAG_PATTERN / TAG_PATTERN_2 / TAG_END_PATTERN | static Pattern | 匹配标签开闭(<manifest、<?xml、> 等) |
TAG_ATTRIBUTE_PATTERN | static Pattern | 匹配属性名(\s(\w*)\=) |
TAG_ATTRIBUTE_VALUE / TAG_ATTRIBUTE_VALUE_2 | static Pattern | 匹配双引号/单引号属性值 |
TAG_COMMENT | static Pattern | 匹配 <!--...--> |
TAG_CDATA_START / TAG_CDATA_END | static Pattern | 匹配 CDATA 起止 |
PATTERN_TAG_TYPE_MAP | static Map<Pattern,TagType> | 模式 → 标签类型映射表 |
Element | static class | 内部元素,含 start/end/tag,实现 Comparable(按 start 排序) |
getElements(String xml) | List<ELEMENT> | 主入口:跑全部正则、排序、发间隙与匹配项 |
main(String[]) | static void | 内置自测,打印一段样例 XML 的分词结果 |
工作流程
mermaid
flowchart TD
A["getElements(xml)"] --> B["对 PATTERN_TAG_TYPE_MAP 每个模式跑 matcher.find()"]
B --> C["收集所有匹配为 Element(start,end,TagType)"]
C --> D["Collections.sort 按起始偏移排序"]
D --> E["顺序遍历 Element 列表"]
E --> F{"xmlPos < e.start?"}
F -- "是" --> G["间隙文本 → ELEMENT(XML_COMMENT)"]
F -- "否" --> H["按 TagType 映射到 Translator.TAG"]
G --> H
H --> I["匹配文本 → ELEMENT(对应 TAG),xmlPos = e.end"]
I --> J{"最后一个且 xmlPos < 末尾?"}
J -- "是" --> K["尾部文本 → ELEMENT(XML_DEFAULT)"]
J -- "否" --> L["继续 / 结束"]
K --> L设计要点
- 🔍 正则模式集中映射 — 静态
PATTERN_TAG_TYPE_MAP把每个Pattern绑定一个TagType,遍历一次即收集所有匹配,避免多次扫描文本。 - 📊 按偏移排序合并 — 所有匹配项先入列表再
Collections.sort(Element.compareTo比较 start),保证输出顺序与文本位置一致。 - 🧩 间隙文本兜底 — 相邻匹配间的文本统一发为
XML_COMMENT(虽非真注释,但作为「普通文本」着色槽位),末尾剩余文本发为XML_DEFAULT。 - 🔗 双层标签 — 内部
TagType与对外Translator.TAG解耦,getElements末尾用 switch 把内部类型映射到接口标签。 - 🧪 内置自测 —
main方法内嵌一段样例 manifest,直接打印分词结果便于人工核验。
协作关系
- 依赖:[[Translator]](产出
Translator.ELEMENT/Translator.TAG) - 被调用:[[AndroidXmlTranslator]](
getElementsList委托getElements)
已知问题 / TODO
- ⚠️ 间隙文本被统一标为
XML_COMMENT,语义上不精确(普通文本与注释同色),但作为着色方案可接受。 - ⚠️
TAG_CDATA_START用.*至行尾匹配,跨行 CDATA 可能被截断,依赖Pattern.MULTILINE的行为。 - 无明显功能性 bug。