magjac
(Magnus Jacobsson)
1
我正在开发一个主题组件,希望实现类似以下功能:
main() {
printf("Hello World!\n");
}
输出结果为:
main() {
printf("Hello World!\n");
}
我目前使用的是 api.decorateCooked(),但由于内容已经过“烹饪”(cooked)处理,所有“冗余”空格都被移除了,例如上面示例中 printf 前的空格。
如何获取用户输入的“未烹饪”原始文本?
明确一下:我的主题组件希望支持用户输入如下内容:
[mytag]
main() {
printf("Hello World!\n");
}
[/mytag]
然后由我的主题组件识别该标签,并将其中的文本替换为某种转换后的形式。
sam
(Sam Saffron)
2
要访问原始内容,你需要使用插件。
不过,你可以使用 wrap 辅助函数,这样你就有了一个可以操作的 div。
[wrap=test]
hello world
[/wrap]
渲染结果为:
<div class="d-wrap" data-wrap="test">
<p>hello world</p>
</div>
2 个赞
magjac
(Magnus Jacobsson)
3
谢谢。
在 Discourse 托管的免费版实例中,是否可以安装自定义插件?我还没找到方法。
是否有可能为主题组件添加对 raw 的支持?如果可以,你们会接受为此提交的 PR 吗?
wrap 辅助函数并没有实现我想要的效果,它同样会移除缩进。
sam
(Sam Saffron)
4
很遗憾,我们的免费版、标准版和商业版均不支持自定义插件。我们使用一个集群来托管众多客户,目前没有任何机制可以为单个客户单独运行插件。
关于通过主题组件注入 Markdown 扩展的功能,我过去曾考虑过,但我们目前没有具体的添加计划。实现这一功能将非常困难。
那么,双重包裹呢?这肯定能保留所有的缩进。
[wrap=test]
```
1
1
3
```
[/wrap]
也许甚至只需使用类似下面的方式就能奏效,您将拥有一个独立的元素可供操作:
```custom
test
```
3 个赞
magjac
(Magnus Jacobsson)
5
这对您来说也极其困难,还是仅仅对像我这样没有实现经验的人来说困难?难点究竟在哪里?如果做一些更简单的事情,比如只读取原始内容的只读访问,而不是完整的 Markdown 扩展,会不会更容易?
是的,这可能是一个选项。谢谢。
sam
(Sam Saffron)
6
前端无法获取 raw 帖子内容,只能获取已渲染(cooked)版本。这意味着传输到客户端的数据包更小。此外,服务器最终负责将 Markdown 转换为 HTML。如果我们在浏览器运行时执行这一转换,不仅会大幅增加额外成本,还会引入复杂的网络安全风险需要应对。
2 个赞
magjac
(Magnus Jacobsson)
7
@sam 感谢您的帮助。您的建议效果很好,同时也为用户提供了相当不错的语法:

2 个赞
pfaffman
(Jay Pfaffman)
8
为了明确起见,您应该知道,如果您真正想要的是咖啡块,可以用三个反引号将代码块包裹起来,对吧?我无法判断您的例子在多大程度上是一个比喻。
magjac
(Magnus Jacobsson)
9
@pfaffman 我不太明白你说的“咖啡块”是什么意思,但我知道三个反引号会生成代码块。
我也不明白为什么我的例子需要是一个隐喻。为了什么?我发布的图片是一张截图,用于展示我的主题组件针对给定代码生成的效果。
1 个赞
pfaffman
(Jay Pfaffman)
10
抱歉。在我的手机键盘上,咖啡和代码几乎是一样的。每次我写这个句子时都打错了!
我反复查看,但在你的示例中,看不出你的图片和标准代码块之间有什么区别。
pfaffman
(Jay Pfaffman)
12
哦!所以你想要一个类似数学插件的东西,但是是为你的绘图语言而不是 TeX 设计的?
magjac
(Magnus Jacobsson)
13
是的,我想是的。我还没见过数学插件,但听起来概念相似。它的基本功能与 Discourse Graphviz 相同,但这个插件能实现更高级的功能,比如图表之间的动画过渡,并提供大量选项来控制样式和外观。
1 个赞
pfaffman
(Jay Pfaffman)
14
magjac
(Magnus Jacobsson)
15
如果您感兴趣,这是 GitHub 仓库。由于我还需要先编写详细的使用文档,因此它尚未在任何地方正式部署。
pfaffman
(Jay Pfaffman)
16
看来这样就能行,也许我漏掉了什么,解决方案应该是提交您的更改作为 PR,然后我们的功能就会在商业计划中可用。
magjac
(Magnus Jacobsson)
17
抱歉,我不明白您的意思。这是一个主题组件,无论管理员使用的是哪个套餐,都可以通过 Web 界面将其安装到任何 Discourse 实例中。
pfaffman
(Jay Pfaffman)
18
我可能没完全理解。但看起来,您想做的似乎是扩展 graphviz 插件以支持更多的 Graphviz 功能,并且认为将这些功能集成到该插件中更为合理。
不过,我确实不太清楚您的具体意图,所以我的理解可能完全跑偏了。
magjac
(Magnus Jacobsson)
19
现在我明白您的意思了。不,由于我们使用的是免费版,无法使用该插件,因此我改开发了一个主题组件。额外功能算是个 bonus,因为它们基于另一个库,所以很容易添加。
插件和主题组件非常不同,我认为无法在它们之间复用代码。不过,如果有人感兴趣,应该可以为现有插件添加相同的功能。
2 个赞