如何从主题组件访问未编译的内容?

我正在开发一个主题组件,希望实现类似以下功能:

main() {
  printf("Hello World!\n");
}

输出结果为:

main() {
  printf("Hello World!\n");
}

我目前使用的是 api.decorateCooked(),但由于内容已经过“烹饪”(cooked)处理,所有“冗余”空格都被移除了,例如上面示例中 printf 前的空格。

如何获取用户输入的“未烹饪”原始文本?

明确一下:我的主题组件希望支持用户输入如下内容:

[mytag]
main() {
  printf("Hello World!\n");
}
[/mytag]

然后由我的主题组件识别该标签,并将其中的文本替换为某种转换后的形式。

要访问原始内容,你需要使用插件。

不过,你可以使用 wrap 辅助函数,这样你就有了一个可以操作的 div。

[wrap=test]
hello world
[/wrap]

渲染结果为:

<div class="d-wrap" data-wrap="test">
<p>hello world</p>
</div>
2 个赞

谢谢。

在 Discourse 托管的免费版实例中,是否可以安装自定义插件?我还没找到方法。

是否有可能为主题组件添加对 raw 的支持?如果可以,你们会接受为此提交的 PR 吗?

wrap 辅助函数并没有实现我想要的效果,它同样会移除缩进。

很遗憾,我们的免费版、标准版和商业版均不支持自定义插件。我们使用一个集群来托管众多客户,目前没有任何机制可以为单个客户单独运行插件。

关于通过主题组件注入 Markdown 扩展的功能,我过去曾考虑过,但我们目前没有具体的添加计划。实现这一功能将非常困难。

那么,双重包裹呢?这肯定能保留所有的缩进。

[wrap=test]
```
1
  1
    3
```
[/wrap]

也许甚至只需使用类似下面的方式就能奏效,您将拥有一个独立的元素可供操作:

```custom
test
```
3 个赞

这对您来说也极其困难,还是仅仅对像我这样没有实现经验的人来说困难?难点究竟在哪里?如果做一些更简单的事情,比如只读取原始内容的只读访问,而不是完整的 Markdown 扩展,会不会更容易?

是的,这可能是一个选项。谢谢。

前端无法获取 raw 帖子内容,只能获取已渲染(cooked)版本。这意味着传输到客户端的数据包更小。此外,服务器最终负责将 Markdown 转换为 HTML。如果我们在浏览器运行时执行这一转换,不仅会大幅增加额外成本,还会引入复杂的网络安全风险需要应对。

2 个赞

@sam 感谢您的帮助。您的建议效果很好,同时也为用户提供了相当不错的语法:

:sunglasses:

2 个赞

为了明确起见,您应该知道,如果您真正想要的是咖啡块,可以用三个反引号将代码块包裹起来,对吧?我无法判断您的例子在多大程度上是一个比喻。

@pfaffman 我不太明白你说的“咖啡块”是什么意思,但我知道三个反引号会生成代码块。

我也不明白为什么我的例子需要是一个隐喻。为了什么?我发布的图片是一张截图,用于展示我的主题组件针对给定代码生成的效果。

1 个赞

抱歉。在我的手机键盘上,咖啡和代码几乎是一样的。每次我写这个句子时都打错了!

我反复查看,但在你的示例中,看不出你的图片和标准代码块之间有什么区别。

我的主题组件添加的图表。

1 个赞

哦!所以你想要一个类似数学插件的东西,但是是为你的绘图语言而不是 TeX 设计的?

是的,我想是的。我还没见过数学插件,但听起来概念相似。它的基本功能与 Discourse Graphviz 相同,但这个插件能实现更高级的功能,比如图表之间的动画过渡,并提供大量选项来控制样式和外观。

1 个赞

还有一个链接:https://meta.discourse.org/t/graphviz-plugin/97554,我认为它仍然无法解决你的问题,因为你无法安装插件。

如果您感兴趣,这是 GitHub 仓库。由于我还需要先编写详细的使用文档,因此它尚未在任何地方正式部署。

看来这样就能行,也许我漏掉了什么,解决方案应该是提交您的更改作为 PR,然后我们的功能就会在商业计划中可用。

抱歉,我不明白您的意思。这是一个主题组件,无论管理员使用的是哪个套餐,都可以通过 Web 界面将其安装到任何 Discourse 实例中。

我可能没完全理解。但看起来,您想做的似乎是扩展 graphviz 插件以支持更多的 Graphviz 功能,并且认为将这些功能集成到该插件中更为合理。

不过,我确实不太清楚您的具体意图,所以我的理解可能完全跑偏了。

现在我明白您的意思了。不,由于我们使用的是免费版,无法使用该插件,因此我改开发了一个主题组件。额外功能算是个 bonus,因为它们基于另一个库,所以很容易添加。

插件和主题组件非常不同,我认为无法在它们之间复用代码。不过,如果有人感兴趣,应该可以为现有插件添加相同的功能。

2 个赞