下载最新版本,你说的问题都解决了。
第二版有些用法没有第一版那么多,但是感觉阅读起来清爽很多。
欧路用户将css里的:root修改为*,就可以正常显示颜色。
以词组为主的词典的痛点 ![]()
这个恐怕要程序上做大更新才行。@xiaoyifang
• 结论:当前源码支持 @@@LINK=take 这种 MDX 内部重定向,但不支持把 @@@LINK=take#take-off 解释成“跳到词条 take 的锚点 take-off”。
### 当前行为
MDX 读取到 @@@LINK= 后,会把等号后的全部内容直接交给词头索引查询:
- /goldendict-ng/src/dict/mdx.cc:605
- /goldendict-ng/src/dict/mdx.cc:610
因此:
@@@LINK=take
会查询词头 take,可以正常重定向。
而:
@@@LINK=take#take-off
会查询字面词头 take#take-off,并没有拆成:
word = take
anchor = take-off
除非词典里恰好存在名为 take#take-off 的词头,否则通常会得不到目标文章;即使存在,也不会执行锚点滚动。
### 普通 HTML 锚点链接是另一套机制
软件确实支持:
<a href="entry://take#take-off">
MDX 过滤器会把它转换成:
gdlookup://localhost/take?gdanchor=take-off
对应代码在 /goldendict-ng/src/dict/mdx.cc:972。
页面加载完成后,ArticleView 通过设置全局:
window.location.hash = "take-off"
完成滚动,见 /goldendict-ng/src/ui/articleview.cc:550。
所以当前能力可以概括为:
写法 查目标词条 跳锚点 多词典隔离
━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━ ━━━━━━━━━━ ━━━━━━━━━━━━
@@@LINK=take 支持 不涉及 支持
─────────────────────── ──────────────── ────────── ────────────
@@@LINK=take#take-off 不支持正确解析 不支持 —
─────────────────────── ──────────────── ────────── ────────────
entry://take#take-off 支持 基本支持 不隔离
### 多部词典时是否影响其他词典
@@@LINK 本身是词典内部重定向,天然具有较好的隔离性。
一次查询中,ArticleMaker 会把原查询词分别传给每一部词典,见 /goldendict-ng/src/article_maker.cc:503。只
有遇到 @@@LINK 的那部 MDX 词典会在自己的 MdxArticleRequest 内继续查询目标词;其他词典仍然查询原来的词。
例如查询 takeoff:
词典 A:takeoff → @@@LINK=take
词典 B:正常查询 takeoff
词典 C:正常查询 takeoff
最终结果是:
词典 A 显示 take 的正文
词典 B、C 仍显示 takeoff 的结果
页面主查询词仍是 takeoff
这一点已经满足“跳转不影响其他词典查词”。
但是普通 entry://take#take-off 不同:它会调用一次新的 showDefinition("take", 当前词典组, ...),整个词典组都会重新查询
take,见 /goldendict-ng/src/ui/articleview.cc:1186。所以它会改变其他词典的查词内容。
此外,当前锚点滚动使用整个文档的 window.location.hash,而多部词典文章只是被包在不同的 <article> 中,见 /
goldendict-ng/src/article_maker.cc:631。词典内部的 id="take-off" 没有加词典命名空间。若多部词典都存在同名 ID,浏览器可
能跳到页面中第一个匹配项,而不一定是发起重定向的词典。
### 推荐修改方案
若目标只是正确支持:
@@@LINK=take#take-off
并保持其他词典不受影响,属于“小到中等”修改,不需要重构查词架构。
建议这样实现:
1. 在 MdxArticleRequest::run() 中解析 @@@LINK=:
targetWord = take
targetAnchor = take-off
仅将 targetWord 传给 findArticles()。
2. 在 MdxArticleRequest 中保存目标锚点,不能只丢进全局 gdanchor,因为那样无法确定属于哪部词典。
3. ArticleMaker 输出对应词典的 <article> 时,增加类似:
<article
data-gd-id="dictionary-id"
data-gd-anchor="take-off">
4. 页面加载完成后,在该 <article> 内局部查找:
article.querySelector('[id="take-off"]')
找不到时再查 name="take-off",然后:
- 展开被折叠的词典文章;
- 激活对应词典;
- 对目标元素执行 scrollIntoView()。
这种方案即使两部词典都有 id="take-off",也只会在发生重定向的词典容器内部查找,不会串到另一部词典。
预计涉及:
- src/dict/mdx.cc
- src/dict/dictionary.hh,如果采用正式的请求元数据接口
- src/article_maker.cc
- src/scripts/gd-builtin.js
大约是 60–120 行有效修改,加上手工测试词典。实现和验证通常约半天到一天半。仓库中没有找到现成的 MDX 重定向单元测试,因
此最好补一个最小 MDX 测试样本,覆盖重定向链、重复锚点和折叠文章。
### 如果还要求普通链接不改变其他词典
如果希望点击:
entry://take#take-off
时只替换当前词典的文章,同时保留页面中其他词典原来的查询结果,那么修改明显更大。当前页面由一次 gdlookup 请求统一生成,
各词典不是独立可导航的子页面。
这需要增加“单词典局部重新加载”机制,可能包括:
- 链接携带源词典 ID;
- 单独请求指定词典文章;
- 在现有 DOM 中替换一个 <article>;
- 独立处理历史记录、折叠状态、发音、当前词典和锚点;
- 防止异步请求覆盖新页面。
这大约会涉及 5–8 个核心文件、200–500 行以上修改,合理工期约 3–7 天。
因此,最合适的路线是:先只扩展 @@@LINK,把它做成“MDX 词典内部、容器作用域内的锚点重定向”。这正好满足目标,而且不会让其
他词典重新查 take。
这种问题只能是另起一个mdict规范。。。而不是让软件强行做mdx超集
mdx根本没有标准,而且软件也不是对mdict作为标准实现的,没什么不能改的。png格式最近还出了3.0呢。
1 Like
如果词条本身有#的转义问题呢。参考什么方式。urlencode?
这个词典好啊,casio早期的机器上有,后来就没有收录了,有的时候用着还是感觉到释义挺好的
日本编纂的英语书大部分都比较细致
谢谢分享。关于“close”词条,该义项导航似乎失效。
这个和楼上的问题都修复了,请重新下载
3 Likes
这些是第二版外研社自己加的内容,也没有对应日文版,这个词典是第一版不是第二版。
1 Like

















