mirror of
https://github.com/jackwener/wx-cli.git
synced 2026-10-08 15:45:46 +00:00
* perf(sns): parse_post_xml 单走 roxmltree DOM,去掉 regex+DOM 双解析 之前一份 SnsTimeLine.content 在 q_sns_feed / q_sns_search 全表扫描时 要被解两次:extract_xml_text 走字符串扫描取 createTime / contentDesc / username,parse_post_media 再 build 一次完整 roxmltree DOM 取媒体 列表。10k+ 行扫描时是显式的工作浪费。 本次重构: - parse_post_xml 一次性 Document::parse,定位到 TimelineObject 之后所有 字段(createTime / contentDesc / username / media / location)共用同 一个 doc,roxmltree 只 build 一次。 - 把 parse_post_media 拆成 parse_media_from_timeline(node),避免外部 parse 之后又重新 parse;旧的 parse_post_media(&str) 单测专用,标 #[cfg(test)]。 - 删除 sns_location_re(不再需要 regex 抽 poiName)。 - 副作用:roxmltree 自动解码 XML entity,所以 content / location / username 字段输出的是解码后文本(旧版字符串扫描原样保留 `<` 等)。 对下游是更正确的语义;新增 parse_decodes_xml_entities_in_content 单 测把行为锁住。 - 新增 parse_returns_defaults_for_malformed_xml 单测覆盖 DOM parse 失败 时的 fallback 路径(不 panic、author 走 column fallback)。 q_sns_search 的 LIKE 预筛仍走 extract_xml_text(contentDesc) 字符串扫描 做 false-positive 过滤——这一步比 build 一棵 DOM 更快,是真优化,保 留。q_sns_notifications 也仍用 extract_xml_text,本 PR 不动(每次只跑 ~limit 条,DOM 化收益小,避免扩大 scope)。 验证: - cargo check ×3 target ✅(darwin / windows-gnu / linux-gnu) - cargo test 39 passed ✅(37 → 39,新增 2 个) * refactor(sns): parse_post_xml dedup 两份 ParsedPost 早 return 块 merge 前自查发现 Document::parse 失败 / 找不到 TimelineObject 两条 fallback 路径写了完全相同的 9 行 ParsedPost 字面量。抽成 empty() 闭包,从 2×9 行降到 1×7 行 + 两个 return empty()。 行为完全等价(含 author = column fallback)。 * fix(sns): salvage scalar fields from malformed post xml