Appearance
通用 URI 解析
这一页只回答 3 个问题:
mqqapi://markdown/node在运行时分成哪几条支路- 每类 query 参数当前到底在哪一层被消费
- 哪些字段仍未闭环
1. 入口形态
当前常见形态:
markdown
[](mqqapi://markdown/node?nodeType=richui&json=...)
[](mqqapi://markdown/node?nodeType=quoteArea&nodeID=quoteArea&state=start&text=...)
[](mqqapi://markdown/node?nodeType=replace&nodeID=quoteArea)
[](mqqapi://markdown/node-data?nodeID=aidrawPic&index=0&picUrl=...)这里要注意两点:
- 当前实现里同时能看到
nodeId和nodeID两种命名痕迹 - 运行时真正按 query map 读值时,至少已实锤
nodeType、nodeID、state
2. 运行时主分支
a2.e.a(...) 已恢复出可读方法体。当前最重要的结论如下。[1]
2.1 nodeType=replace
运行时动作:
- 创建
h2.e - 只写
nodeID -> h2.e.f4603a - 包进
h2.b h2.b.f4598a = 0
当前已实锤消费字段:
| 字段 | 当前消费点 | 结论 |
|---|---|---|
nodeID | a2.e、l1.g、u1.e | 已实锤 |
text | 未找到 replace 专属读点 | 未闭环 |
state | 未找到 replace 专属读点 | 未闭环 |
index | 未找到 replace 专属读点 | 未闭环 |
下游当前只会这样用它:
- 先从
replace占位节点取nodeID - 再回查
a2.c.b[nodeID] - 取真实 start 节点的
nodeType
也就是说,replace 当前最严格的实锤语义是:
- 它是一个“按
nodeID回指真实节点类型”的占位节点
2.2 普通 mqqapi://markdown/node?...
运行时动作:
- 创建
h2.f h2.f.b = nodeIDh2.f.f4605c = nodeTypeh2.f.d = 整个 query attrMapstate=start -> h2.f.f4604a = 1state=end -> h2.f.f4604a = 2
随后:
start节点写入a2.c.b[nodeID]end节点写入a2.c.f14c[nodeID]
这条分支当前直接支撑了:
quoteArea(start/end)thinkAreamultiPic- 其他 custom syntax 节点类型识别
2.3 mqqapi://markdown/node-data?...
运行时动作:
- 创建
h2.d h2.d.f4602a = nodeIDh2.d.b = 整个 query attrMap- 包进
h2.b h2.b.f4598a = 2- 聚合到
a2.c.f13a[nodeID]
这条分支当前最明确的真实消费链是 multiPic。[2]
3. 参数分层
3.1 分发参数
| 参数 | 所在分支 | 当前状态 | 说明 |
|---|---|---|---|
nodeType | node / replace | 已实锤 | 分支选择与真实节点类型 |
nodeID | replace / node / node-data | 已实锤 | 关联键 |
state | 普通 node | 已实锤 | start/end |
3.2 载荷参数
| 参数 | 当前真实消费层 | 当前结论 |
|---|---|---|
json | richui | 已实锤 |
text | 普通 node 的 attrMap / 预处理器 | 已实锤有读点,但语义未全闭环 |
index | node-data -> multiPic | 已实锤 |
itemsPerRow | multiPic | 已实锤 |
itemsNum | multiPic | 已实锤 |
3.3 当前不能再混写的结论
index不能再默认写成replace参数itemsPerRow/itemsNum不能再默认写成quoteArea参数text当前只能说“进入过普通node的attrMap并被部分预处理器读取”,不能直接写死成标题
4. quoteArea 当前能确认到哪一层
4.1 AST / custom node 层
l1.e明确把quoteArea识别为一种 custom syntax[3]a2.e的普通node分支会把nodeType=quoteArea写入h2.fNetSearchMDPreprocessor与MarkerCustomProcessor都会直接读取extra.F["text"][4]
4.2 展示态层
MarkdownCustomQuoteAreaKt渲染时直接从extra.G.d取j2.b[5]j2.b字段当前已明确:f4993a: titleb: statusf4994c: itemsd: msgId
4.3 半浮层层
MarkdownHandlerImpl.b(j2.b)点击后只消费j2.b.f4994c- 它会把
List<j2.c>序列化为quoteAreaItems QuoteHalfFloatingPage再从quoteAreaItems反序列化出j2.c列表
5. replace 当前能确认到哪一层
5.1 已实锤
replace运行时确实有专门分支- 它当前只写
nodeID - 下游当前也只按
nodeID回查真实 start 节点类型
5.2 未闭环
replace.textreplace.statereplace.indexreplace -> j2.b的任何直接装配
6. 当前最重要的缺口
目前最关键的未闭环点不是入口,而是中间装配:
- 谁给
a2.e.d赋值 - 谁构造
j2.b quoteArea.text -> j2.b.f4993a是否成立
7. 关键源码
a2.e.a(...)已恢复出可读方法体,见../../jadx_retry_a2_e_simple.java:339-400与../../jadx_single_a2_e.java:503-612。 ↩︎node-data.index在multiPic链的真实消费见../../classes14_src/f2/c.java:78-154;itemsPerRow/itemsNum解析见../../classes18_src/com/tencent/qqnt/markdown/data/multipic/f.java。 ↩︎quoteAreacustom syntax 识别见../../classes14_src/l1/e.java:582-606。 ↩︎extra.F["text"]读点见../../classes14_src/net_search/markdown/NetSearchMDPreprocessor.java:153-192与../../classes14_src/base/markdown/processor/parser/MarkerCustomProcessor.java:121-159。 ↩︎MarkdownCustomQuoteAreaKt读取extra.G.d见../../classes14_src/base/markdown/renderer/compose/elements/custom_syntax/MarkdownCustomQuoteAreaKt.java:106-120,j2.b结构见../../classes14_src/j2/b.java:8-20,31-52。 ↩︎