智能标点符号,无需IP符号

是否有可能调整当前的 Markdown 排版器(也称为“智能标点”)配置,以启用 Unicode 标点符号(如引号和破折号),同时禁用 (c)、™ 以及其他此类专用符号?

我是一名律师,经常就商标和版权提供咨询,包括在 Discourse 论坛上。我从未建议任何人修改帖子以添加版权或商标符号,而非法律专业人士往往严重高估这些符号的实用性和必要性。相反,我曾无数次编辑帖子,试图让 Markdown 渲染器 渲染 © 符号。

这个问题在列举列表中尤为常见。例如:

(a) 苹果
(b) 香蕉
(c) 版权?
(d) 日期

这种列举方式在法律、合同、政策及其他受法律风格影响的正式写作中非常普遍。它也是一种常见的提纲格式。我在美国读小学时,就被教导这是“标准”的提纲格式。

我看到当前的设置在 标点符号 方面提供了一定的灵活性,但据我所知,似乎没有任何方法可以在启用智能标点的同时禁用智能符号。

9 个赞

我对此并没有强烈的看法。我觉得“需要”输入版权符号的情况极为罕见,因此这个快捷键可以保留。考虑到其“极其罕见”的实用性,与相对常见但略显不雅观的 (a) (b) (c) 格式列表相比……我完全同意 @sam 的意见,可以直接移除这个特定的快捷键。

6 个赞

我也支持直接移除 (c)

毕竟搜索“版权符号”、复制并粘贴并不困难。极客们也可以输入 ©

从可用性的角度来看,我会提供一个包含所有扩展的列表。我强烈怀疑这些扩展带来的惊讶感多于实际帮助。

5 个赞

好吧,对于这一项,收益(微乎其微)似乎要大于风险(相当大!)。

5 个赞

这看起来不太可配置,我们需要打补丁来让 markdown.it 支持这种灵活性,或者基于 markdown.it 自己写一个 prettify 实现。

唯一的简单修复方案就是直接关闭整个功能。

5 个赞

嗯,奇怪,它竟然完全无法配置。真遗憾。所以

(c) (tm) (r) (p) → (c) ™ (r) (p)

3 个赞

好处是引擎的可配置性很高,我们可以关闭 markdown.it 中的规则,复制代码并实现我们自己的替换逻辑,就像 @Roman 所实现的那样。

花几天时间进行工程优化以清理这部分代码固然可惜,但如果我们要进行分支开发,重复发布相同代码的情况在一定程度上是不可避免的。

3 个赞

自 markdown-it master 分支的提交 7b8969ce5cb2edc54f2c1aa39a85a3a08076337d 起,相关源文件为 lib/rules_core/replacements.js,相关测试数据文件为 test/fixtures/markdown-it/typographer.txt

所有的替换规则都是硬编码的。它们包括 (c) → ©、(tm) → ™、(r) → ® 以及 (p) → ℗,这些被归类为“限定缩写”。

顺便提一下,我并未将 (p) 映射为 §。这几乎肯定应该是 ℗,即录音符号。

我打算对此进行一些探索,看看能否提出一个补丁,使“排版符号”功能更具可配置性。

7 个赞

这也让我抓狂。我每周至少都会遇到一次。

9 个赞

首先,补充性公关工作,修复对 (p)(P) 的解析:Fix typographer interpretation of `(p)` by kemitchell · Pull Request #761 · markdown-it/markdown-it · GitHub

7 个赞

关闭替换组的 PR:Configurable typographer by kemitchell · Pull Request #762 · markdown-it/markdown-it · GitHub

3 个赞

维护者的响应非常迅速,他几分钟内就会关闭我的 PR :stuck_out_tongue_winking_eye:

据我了解,他极其不愿意引入任何破坏性变更,即使是在新版本中,哪怕只是像将 (P) 渲染为 § 这样的小事。他还非常排斥允许 typographer: {A: true, B: false} 这类选项,即使 typographer: true 仍然可用,因为他认为这会增加复杂度。

我从中读出了言外之意:他是一位用英语写作的俄罗斯开发者。但我感觉他认为 markdown-it 已经定型了。

怀着感激之情,或许值得 fork 这个实现,将其重写为 ES Modules,并移除当前捆绑的所有类插件功能,包括链接化和替换功能,其中也包含排版符号的标点替换。

3 个赞

维护者对捆绑包中无编号的重复代码问题不感兴趣。同样,对于并非“所有用户都必需”或阻碍插件实现的 API 非破坏性变更,他们也不感兴趣。这导致了一种两难境地:按照该理念,他们正在分发的两个高度插件化的子模块(用于链接化和智能标点)本应作为独立的 npm 包发布。但这种情况确实发生了。

作为背景,markdown-it 近期曾有过重要版本发布。值得一提的是,Alex Kocharin 在去年 11 月带来了一项性能改进。

要修复 (c) 问题、处理 (p) 问题,并实现我们对箭头等其他符号的构想,最佳方案可能是提交一个补丁,将链接化和智能标点子模块从核心中移除,改为在 Discourse 中以插件形式加载。可以使用 GitHub Action 或定时任务来监控 markdown-it 的主分支,并尝试自动变基。如果维护者继续如此保守地对待变更,该补丁在相当长一段时间内都应能顺利应用。除非他们做出重大跨越,例如将项目从 CommonJS 重写为 ES 模块。

6 个赞

我们内部讨论了此事,决定对 typographer 进行硬分叉。

我们基本上将在 markdown.it 中禁用 typographer,并在 Discourse 中实现其副本。markdown.it 具有极高的可扩展性,这主要只是“复制粘贴”。

完成复制粘贴后,我们可以添加测试,并自定义和修改部分规则。

9 个赞

嘿,抱歉再次提起这个话题。由于我正在寻找禁用 ... -> … 的方法,我想知道这个功能是否有进展,以及未来是否有可能启用或禁用单独的规则。

谢谢!

2 个赞

这是一个站点设置,只需禁用排版功能即可。

2 个赞

好吧,我已经试过那个方法了,但显然不起作用。无论我启用还是禁用排版器,替换都会执行(顺便一提,(c) 似乎也不起作用)。

2 个赞

您需要先禁用,然后在您想要的帖子中重新构建 HTML。

5 个赞

现在这已经非常完整了 :confetti_ball:

2 个赞