Repository navigation
Replies: 1 comment
|
这是 Markdown 的转义规则吃掉的,不是路径解析丢的。写法换成正斜杠就能绕开。
今天就能用的两种写法: [文件](C:/Users/x/.cache/a.md)
[文件](file:///C:/Users/x/.cache/a.md)Windows API 接受正斜杠,页面和资源地址都会正常。尖括号包空格的那种写法同样受转义规则影响,换斜杠后一起解决。 上游要修的话,位置在 markdown 解析层而不是这两个消费点:要么保留原始 destination(micromark 的 token 上还留着 raw),要么在进 parser 之前把 Windows 反斜杠路径转成 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
版本:DSH 桌面版 0.2.1-rc.3(win-x64),Windows 11 10.0.26200
DSH 团队好:
反馈一个 Windows 桌面版的确定性 Bug,已定位到前端 Markdown 渲染层,附最小复现与实测证据。
一、环境
二、现象
在聊天回复里点击指向本地文件的 Markdown 链接,右侧文档页签打开后提示
「文件不存在,可能已被移动或删除」,但文件在磁盘上确实存在。
页签顶部的路径面包屑本身已经是坏路径,例如:
C:/Users/<用户名><.目录名>/<子目录>/<文件名>.md
(原文 C:\Users<用户名>.<目录名>... 中,. 前的反斜杠已被吃掉)
三、最小复现
C:\Users<用户名>.<目录名><子目录><文件名>.md
X:<父目录>[data]<含空格目录><文件名>.md
反斜杠裸路径:
文件
路径含空格时只能用尖括号:
[文件](<X:<父目录>[data]<含空格目录><文件名>.md>)
四、根因(实测,非推测)
DSH 前端渲染器(dsh-web-frontend 包内 vendor 的 micromark/mdast)在生成 link.url 时
对链接目标做了反斜杠转义解码:
. → . [ → [ _ → _ - → - ( → (
而字母、数字、中文前的反斜杠保留。
Windows 路径全程以 \ 为分隔符,因此只要路径中存在「以 ASCII 标点开头的目录段」
(.dirname、[dirname、_dirname、-dirname 等),分隔符就被吃掉,路径被拼错,最终 ENOENT。
实测对照(用安装包内原版 micromark 解析,再用真实寻址链校验):
| Markdown destination | 解析后 link.url | 结果 |
| C:\Users<用户名>.<目录名><子目录>\a.md | C:\Users<用户名>.<目录名><子目录>\a.md | 不存在 |
| <X:<父目录>[data]<含空格目录>\a.md> | X:<父目录>[data]<含空格目录>\a.md | 不存在 |
| X:/<父目录>/.<目录名>/<含%20空格目录>/a.md | 原样(%20 保留) | 正常打开 |
| <X:/<父目录>/.<目录名>/<含空格目录>/a.md> | 原样(空格保留) | 正常打开 |
补充:按 Markdown 规范,destination 含空格时裸写根本不生成链接(显示为纯文本),
因此用户/模型只能用 <> 包裹;而 <> 内的反斜杠转义同样被解码,等于 Windows 路径
没有可用的反斜杠写法(只剩正斜杠)。
五、期望行为
点击本地文件链接应在侧栏预览中打开正确文件;Windows 反斜杠绝对路径应原样传递,
不应做反斜杠转义解码。
六、建议修复方向
从原始 Markdown 源串切片取 destination(保留原始反斜杠);或对「盘符开头 /
UNC 开头」的路径豁免 escape 解码。
「文件不存在」,用户无法判断是拼错还是文件真缺)。
七、临时规避(已验证)
链接改用正斜杠绝对路径,空格写 %20,例如:
文件
八、补充说明
本帖未附图片;如需,我可以补充最小复现脚本(脚本内路径已全部脱敏为占位符)。
谢谢!
All reactions