C++ 烹饪

(这是我的第一篇帖子,请多包涵……)

我最近搭建了自己的 Discourse 论坛:https://crucible.hubbe.net/。总体来说,我对它非常满意。这个社区是面向一种类似 Arduino 的开发板的,主要用户是道具制作爱好者。因此,我们经常使用大量模板化的 C++ 代码。特别是,我们使用一种称为“样式(style)”的东西来配置灯光的显示方式。由于样式可能相当复杂,我编写了一个在线预览器/编辑器,并使用了 discourse-linkify 主题组件,使得样式能够自动链接到该编辑器。为了让 discourse-linkify 主题组件能够正确转义 URL 字符等,我进行了一些小的修改,这并不难;如果有人感兴趣,我可以为这些修改提交一个 PR。

效果可以在这里看到:StylePtr links - The Crucible - The Crucible

然而,有个问题……
由于存在大量的 <> 字符,某些模板化代码看起来有点像 HTML,而 Discourse 会在某个阶段移除其中一些“标签”。基本上,任何被 <> 包围的未知单词似乎都会被移除。下面这一行就是 < foo >,但去掉了空格:

<foo> < - foo 在这里

起初我以为这是 linkify 组件的问题,但经过一番排查后发现,在 linkify 运行之前,那些缺失的内容就已经不见了。所以,我想这些多余的标签是在“烹饪”过程中消失的?

我注意到在代码块(三反引号等)中,这些标签可以保留,但对我来说,最好能让它们始终保留。

有一段时间,我以为只需修改 discourse/lib/utilities.cs 中的 CODE_BLOCKS_REGEXP 就能解决这个问题,但 inCodeBlock 函数在很多地方都没有被使用,所以也许这个思路不对?此外,我还没有弄清楚如何从插件或主题组件中实际修改 CODE_BLOCKS_REGEXP

到底是什么代码负责移除了这些标签?
禁用它的最佳(最兼容)方法是什么?

1 个赞

我还想指出,由于人们有时会粘贴大段代码,很难察觉中间部分是否缺失。至少,将未知标签转换为闪烁的警告标志或某种能告知用户发生异常情况的提示,会更好一些。

问题:为什么不尝试使用 Markdown 代码块呢?

只需将代码用三个反引号 ` 字符包围起来:

就像这样:

here 
<foo>
is <some> </fooer> </foo>

这是我帖子的原始 Markdown 内容:https://meta.discourse.org/raw/187974/3


你需要教育你的用户,但这是你作为版主的工作,而且这将帮助每一位日后需要处理 Markdown 的用户。

你可以通过发布一个新的全局置顶主题来实现这一点,例如“如何在此网站嵌入代码”或“如何在此网站输入内容”。

你也可以引导他们访问这个链接:Markdown 参考(commonmark.org)

好的,我只是想顺便分享这个链接,以防其他人也遇到同样的问题。

看起来,使用与 piratize 插件相同的模式,添加反引号和链接,应该能解决这个问题。

因为我有更重要的事情要做,而不是去“哄猫”吗?
如果存在一种简单且正确的方法来处理事情,人们总是会选择简单的那条路。我想,如果我能够真正阻止人们将 StylePtr<> 模板放在预格式化文本之外,那么大家就不得不去做正确的事,但我该如何做到这一点呢?(此外,这感觉像是一种过于强硬的解决方案,因为它也可能阻止人们以完全有效的方式讨论 StylePtr<> 模板。)

我目前使用 linkify 链接 StylePtr<> 模板的方案在预格式化文本中也不起作用,因为 DOM 结构差异很大,但这只是一个可以通过少量编码修复的小问题。

也许吧。我想我会采用这种模式:如果反引号不存在,就自动添加它们,然后使用“烹饪后”回调(post-cooking callback)来进行链接。除非我理解有误,否则否则无法在预格式化文本的中间添加链接。

1 个赞

鼓励用户使用反引号表示行内代码、三个反引号表示代码块,是最佳的解决方案。或许你可以在论坛中创建一个置顶主题来宣传这一点?

此外,你还可以尝试使用 Unformatted Code Detector 这个主题组件。

6 个赞

未格式化代码检测器主题组件看起来很有前景。接下来,我只需要创建一个能处理预格式化代码内部链接的主题组件,而这原本就是我计划要做的事情。我肯定会尝试一下。

原来,我只需要在 linkify 模块中启用多行正则表达式支持,就能让它按我预期的方式运行。所以我认为问题已解决,前提是大家确实会注意到未格式化代码的检测器。

1 个赞