|
@@ -2273,63 +2273,22 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
|
|
|
highlightNodeIds.add(sourceId);
|
|
highlightNodeIds.add(sourceId);
|
|
|
highlightNodeIds.add(targetId);
|
|
highlightNodeIds.add(targetId);
|
|
|
|
|
|
|
|
- // 如果是二阶边,显示完整路径
|
|
|
|
|
- if (clickedLink.type.startsWith("二阶_") && clickedLink.边详情) {{
|
|
|
|
|
|
|
+ // 如果是镜像边或二阶边,使用预计算的路径节点高亮
|
|
|
|
|
+ if ((clickedLink.type.startsWith("镜像_") || clickedLink.type.startsWith("二阶_")) && clickedLink.边详情) {{
|
|
|
const detail = clickedLink.边详情;
|
|
const detail = clickedLink.边详情;
|
|
|
- // 分类节点
|
|
|
|
|
- if (detail.分类节点1) highlightNodeIds.add(detail.分类节点1);
|
|
|
|
|
- if (detail.分类节点2) highlightNodeIds.add(detail.分类节点2);
|
|
|
|
|
- // 标签节点
|
|
|
|
|
- if (detail.标签节点1) highlightNodeIds.add(detail.标签节点1);
|
|
|
|
|
- if (detail.标签节点2) highlightNodeIds.add(detail.标签节点2);
|
|
|
|
|
-
|
|
|
|
|
- // 找出路径上的边
|
|
|
|
|
- links.forEach((link, i) => {{
|
|
|
|
|
- const lSrc = typeof link.source === "object" ? link.source.id : link.source;
|
|
|
|
|
- const lTgt = typeof link.target === "object" ? link.target.id : link.target;
|
|
|
|
|
|
|
+ const pathNodes = new Set([sourceId, targetId]);
|
|
|
|
|
|
|
|
- // 帖子->标签 的匹配边
|
|
|
|
|
- if (link.type.startsWith("匹配_")) {{
|
|
|
|
|
- if ((lSrc === sourceId && lTgt === detail.标签节点1) ||
|
|
|
|
|
- (lSrc === targetId && lTgt === detail.标签节点2)) {{
|
|
|
|
|
- highlightLinkIndices.add(i);
|
|
|
|
|
- }}
|
|
|
|
|
- }}
|
|
|
|
|
- // 标签->分类 的属于边
|
|
|
|
|
- if (link.type === "属于") {{
|
|
|
|
|
- if ((lSrc === detail.标签节点1 && lTgt === detail.分类节点1) ||
|
|
|
|
|
- (lSrc === detail.标签节点2 && lTgt === detail.分类节点2)) {{
|
|
|
|
|
- highlightLinkIndices.add(i);
|
|
|
|
|
- }}
|
|
|
|
|
- }}
|
|
|
|
|
- // 分类之间的边
|
|
|
|
|
- if ((lSrc === detail.分类节点1 && lTgt === detail.分类节点2) ||
|
|
|
|
|
- (lSrc === detail.分类节点2 && lTgt === detail.分类节点1)) {{
|
|
|
|
|
- highlightLinkIndices.add(i);
|
|
|
|
|
- }}
|
|
|
|
|
- }});
|
|
|
|
|
- }}
|
|
|
|
|
- // 如果是镜像边,显示对应的人设边
|
|
|
|
|
- else if (clickedLink.type.startsWith("镜像_") && clickedLink.边详情) {{
|
|
|
|
|
- const detail = clickedLink.边详情;
|
|
|
|
|
- if (detail.源人设节点) highlightNodeIds.add(detail.源人设节点);
|
|
|
|
|
- if (detail.目标人设节点) highlightNodeIds.add(detail.目标人设节点);
|
|
|
|
|
|
|
+ // 使用预计算的路径节点
|
|
|
|
|
+ (detail.路径节点 || []).forEach(n => pathNodes.add(n));
|
|
|
|
|
+
|
|
|
|
|
+ // 高亮路径上的所有节点
|
|
|
|
|
+ pathNodes.forEach(n => highlightNodeIds.add(n));
|
|
|
|
|
|
|
|
- // 找出对应的人设边和匹配边
|
|
|
|
|
|
|
+ // 高亮连接路径节点的边
|
|
|
links.forEach((link, i) => {{
|
|
links.forEach((link, i) => {{
|
|
|
const lSrc = typeof link.source === "object" ? link.source.id : link.source;
|
|
const lSrc = typeof link.source === "object" ? link.source.id : link.source;
|
|
|
const lTgt = typeof link.target === "object" ? link.target.id : link.target;
|
|
const lTgt = typeof link.target === "object" ? link.target.id : link.target;
|
|
|
-
|
|
|
|
|
- // 匹配边
|
|
|
|
|
- if (link.type.startsWith("匹配_")) {{
|
|
|
|
|
- if ((lSrc === sourceId && lTgt === detail.源人设节点) ||
|
|
|
|
|
- (lSrc === targetId && lTgt === detail.目标人设节点)) {{
|
|
|
|
|
- highlightLinkIndices.add(i);
|
|
|
|
|
- }}
|
|
|
|
|
- }}
|
|
|
|
|
- // 人设边
|
|
|
|
|
- if ((lSrc === detail.源人设节点 && lTgt === detail.目标人设节点) ||
|
|
|
|
|
- (lSrc === detail.目标人设节点 && lTgt === detail.源人设节点)) {{
|
|
|
|
|
|
|
+ if (pathNodes.has(lSrc) && pathNodes.has(lTgt)) {{
|
|
|
highlightLinkIndices.add(i);
|
|
highlightLinkIndices.add(i);
|
|
|
}}
|
|
}}
|
|
|
}});
|
|
}});
|