Ghan
1
我正在尝试学习如何编写 Markdown 规则,以利用本指南实现新的 BBCode 功能,但因为我遇到了太多未解释的内容,所以很难跟上其中的逻辑:
我也查阅了 markdown-it 的文档,但内容非常简略,似乎主要是对系统功能的高层概述。我有以下几个具体问题:
-
指南中有这样一行代码:// standard markdown it inline extension goes here.
这里的“标准 inline 扩展”指的是什么?这是否是你定义要推送到 ruler(规则管理器)的规则的地方?为什么它返回 false?
-
什么是 token 类型?我看到像 'link_open' 和 'html_inline' 这样的示例——它们是从哪里来的?是否有某个静态列表列出了所有可用的类型?我可以添加新的类型吗?解析器如何知道如何处理这些类型?
这是如何工作的?解析器如何知道 'code_inline' 的作用?state.push() 函数是做什么的,它应该如何被使用?
我觉得自己快要“明白”了,但似乎还缺少一些概念。我已经写出了最基本的规则,看起来也能正常工作——我只是需要更深入的理解才能继续前进。任何帮助都将不胜感激!
为什么你不查看现有的官方 BBCode 插件呢?它支持 [color] 等功能。
2 个赞
Ghan
3
我一直在反复研究官方的 BBCode 插件(https://github.com/discourse/discourse-bbcode),但到目前为止进展不大,我仍然不太了解其内部运作机制。
首先,我尝试构建一个 [table] BBCode 作为起点。我意识到 Markdown 本身已经支持表格,但(假设我能实现其他 BBCode 的支持)我们将把大约 2000 万篇帖子迁移到 Discourse,因此我希望现有的 BBCode 能够正确实现向后兼容。而 Markdown 中使用管道符(|)的方式,使得通过脚本转换表格几乎不可能。
我目前构建的 table 标签总是被删除。它在帖子中确实存在,但似乎(我推测)被 scrubber 持续移除了。这是我目前的内容:
md.block.bbcode.ruler.push("table", {
tag: "table",
wrap: function(token, tagInfo) {
token.attrs = [['class', "bbcode-table table-style-" + tagInfo.attrs['_default']]];
return true;
}
});
helper.whiteList([
"table.bbcode-table",
"table.table-style-*"
我尝试过其他白名单格式和 wrap 函数的写法,参考了我看到的其他示例,但到目前为止都没有成功。因此我推测,我对系统运作方式的一些基本原理还缺乏理解。我希望能更深入地理解这些机制,以便未来能更稳定地实现各种功能。
sam
(Sam Saffron)
4
表格可能是你能构建的最复杂的内容之一,强烈建议你从更简单的东西开始。
事实上,即使你能编写它,我也建议不要支持 bbcode 表格功能。
2 个赞
正如 Ghan 所解释的,我们有一个简单的 BBCode 列表需要支持,因为我们是一个拥有超过 2000 万用户的论坛。我们绝非小型社区,做出这个决定并不容易,但我们已确定 Discourse 是我们未来发展的最佳软件。我们已经解决了导入问题,目前阻碍我们迁移的唯一障碍就是搞定最后这一步。既然我们希望放弃任何 Discourse 或 Markdown 完全支持的 BBCode,我可以被说服放弃表格功能。然而,表格无法简单地重新烘焙为 Markdown 版本,因为将表格的 td、tr 等标签转换为正确的 Markdown 语法非常困难,甚至可以说几乎不可能。因此,放弃它也没问题;即使无法轻松重新烘焙,但学习如何实现它,很可能有助于我们解决其他所有问题。
例如,我们能够放弃 [h1],因为那个确实很容易修改,只需将所有 H 标签转换为相应数量的 # 即可。
我们的完整列表位于:https://www.rpnation.com/bbcode/。除了本线程中提到的那些,还有几个 BBCode 已经被放弃,因为它们可以非常简单地通过查找/替换转换为 Markdown 等效格式。
4 个赞
我知道这篇帖子来自 2020 年,但鉴于它从未得到解答(除了说“看看其他代码”和“表格太难了”),我想我应该尽我所能提供帮助,因为我目前正在编写自己的 bbcode 插件,并且在完全没有文档的情况下挣扎。
我看了一下你的 [table] bbcode 语法,这是一个非常合理的插件,它只是做了一些包装。说真的,我认为 sam 甚至没有看你发送的链接,因为你的表格 bbcode 格式几乎就是 html 表格格式,但使用了 bbcode 标签。
这篇帖子真的帮助我解释了如何做到这一点。
我现在没有时间解释如何做你想做的事情(并测试它是否真的有效),所以现在我可以告诉你 html_raw 和 html_block 令牌类型非常方便。此外,弄清楚它是否真的在工作的最好方法是,在 wrap 函数中放入 console.log(),然后在控制台中查看你实际收到的内容(并查看你正在做的事情是否有效,而不必担心 discourse 激进的清理器)。
1 个赞
在我们用 markdown 扩展取得一些进展后,我们开始开发一个新的 bbcode 插件,但最终认为它不会像我们希望的那样奏效。我们希望在今年夏天之前完成最后 3 个左右的插件,然后尽快迁移。
然而,表格很可能不会有 bbcode 等效项,用户将被指示使用 markdown 版本。没有人喜欢表格。
这看起来确实不错。我知道你已经放弃了 bbcode 表格,但如果你愿意,我仍然可以帮助创建一个脚本来让它工作。
1 个赞
欢迎随时查看仓库、提交 PR 或进行其他任何您想做的事情 :)!
2 个赞