占位符表单

:discourse2: 摘要 占位符表单 将通过创建一个表单来替换帖子中任何出现的 =PATTERN= 为来自文本或可选输入字段的值,从而构建动态文档。
:eyeglasses: 预览 在 Discourse 主题创建器中预览
:hammer_and_wrench: 仓库链接 https://github.com/discourse/discourse-placeholder-theme-component
:open_book: 刚接触 Discourse 主题? 使用 Discourse 主题的初学者指南

安装此主题组件

功能

以以下格式在帖子中添加占位符:

[wrap=placeholder key=NAME description="您的姓名"][/wrap]
[wrap=placeholder key=COUNTRY default=US defaults=FR,DE,US,CN,AU,CA][/wrap]

您的邮箱:=NAME=-=COUNTRY=@example.com

结果将如下所示:

这用于邮件列表

您的邮箱:=ZNAME=-=ZCOUNTRY=@example.com

如上所示,包装器内的文本将用作长描述。

[wrap=placeholder key=NAME description="您的姓名"]
这用于邮件列表
[/wrap]

可用键

  • key:帖子中应被替换的键
  • default/defaults:默认值(多个值)
  • description:输入框的占位符文本

示例

# 创建新插件
rails g plugin =PLUGIN_NAME=
cd plugins/=PLUGIN_NAME=

我们用它来创建运行手册、操作指南和可重用模板(它将在代码块中生效)。请分享您的使用案例!

设置

翻译 默认值
toolbar.builder 添加占位符
builder.errors.no_key 需要提供键。
builder.title 添加占位符
builder.insert 插入
builder.key.label
builder.key.description 帖子中将被替换的 =Key=
builder.description.label 描述
builder.description.description 在未设置值时显示在输入框上的描述。
builder.values.label 默认值(多个值)
builder.values.description 占位符的可选值(多个值)。如果定义了多个值,将使用下拉选择框。

:discourse2: 由我们托管? 主题组件可在我们的标准版、商业版和企业版计划中使用。

66 个赞

像这样处理数学问题的主要问题是,你需要使用 eval(),而 eval 是不安全的,因此你需要使用某个库,它提供安全的 eval 实现,仅支持真实 eval 的一个有限子集。我不确定我们是否愿意为如此罕见的情况引入所有这些复杂性。

6 个赞

我试过了!这听起来像是一个很棒的“回复预览 + Redux + 原始帖子”功能,但是……:pensive: 我肯定漏掉了什么。如果我的理解没错,“回复模板”组件会处理原始内容(raw)并查找"占位符",而“占位符表单”组件装饰的却是渲染后的内容(cooked)?

我想做的是让用户轻松地在主题中添加一些问答(Q&A),尽量减少技术障碍、点击次数,甚至按键操作:heavy-sigh: :roll_eyes:

[wrap=placeholder key="question" description="question"][/wrap]
[wrap=placeholder key="réponse" description="réponse"][/wrap]

[wrap=template key="template-spoiler" action="reply" tagsList="#qui, #quand, #où, #comment"]

## 问题
=question=
### 回答
[spoiler]
=réponse=
[/spoiler]
---
*标签?*
[/wrap]

效果如下:

目前为止一切顺利,但不幸的是,点击模板按钮后,占位符 =question==réponse= 仍然保留在编辑器中。

是的,我不确定当时写这段内容时在想什么……我可能考虑的是不同的使用场景,但现在已经记不清了。

这种方式肯定行不通。我会再仔细思考一下……这两个主题组件当时都是实验性的,既然大家已经频繁使用它们,或许值得给予更好的对待。

7 个赞

谢谢!

happy lets go GIF by Shalita Grant

3 个赞

:grin: 我不清楚厨师厨房里在忙些什么,但通常我在等待时会往嘴里塞开心果之类的零食,结果居然弄好了(当然只是针对我特定的用途,毕竟我几乎不知道自己到底在做什么,不过嘛…… :sweat_smile:

4 个赞

理想情况下,我希望允许管理员自定义替换规则,但 eval 存在风险(在安全的 CSP 下甚至无法实现),因此我不确定该如何实现这一点……

3 个赞

首先,这是一个非常棒且实用的主题组件。

不过,我认为发现了一个 bug。如果在代码片段中使用包含反引号(`)的占位符,它将无法正常工作。例如,以下是一个 SQL 代码片段:

DELETE FROM `=TABLENAME=`
WHERE id NOT IN(
        SELECT
            id FROM (
                SELECT
                    id FROM `=TABLENAME=`
                ORDER BY
                    id DESC
                LIMIT 20
) subquery);

TABLENAME 占位符永远不会被替换。

如果这也包含一些类似 Jinja2 的条件就好了。这样,例如,有人可以创建一个名为 red 的键,并将其映射到图标 :red_circle:orange 将映射到 :orange_circle:。当然,没有这些我也可以,但拥有这些测试条件会很棒。

我真的很喜欢这个组件。 :star_struck:


“你真的靠着=NOUN_1=生活吗?真是个=ADJECTIVE_1=的生活!”

“靠着它,和它一起,在它上面,在它里面,”=PERSON_1=说。“它是我的兄弟姐妹,是我的阿姨,是我的=NOUN_2=,是我的食物和饮料,是(=ADJECTIVE_2=)=VERBING_1=。它是我的=NOUN_3=,我不需要别的。它没有的东西不值得=VERBING_2=,它不知道的东西不值得=VERBING_3=。天哪!我们一起经历了多少=NOUNS_1=!无论是冬天还是夏天,春天还是秋天,它总是有它的=NOUN_4=和它的=NOUNS_2=。当二月=NOUNS_3=的时候,我的=NOUNS_4=和地下室里堆满了对我没用的=NOUN_5=,=COLOR_1=的=NOUN_6=从我最好的=NOUN_7=窗户边流过;或者当一切=ADVERB_1=地落下,露出像=FOOD_1=一样气味的=NOUN_8=斑块,=NOUNS_5=和=NOUNS_6=堵塞了水道,我可以=VERB_1=着=MOISTURE=的=NOUN_9=在大部分=NOUN_10=上,找到新鲜的=FOOD_2=吃,还有那些=ADJECTIVE_3=的人从=NOUNS_7=里掉出来的东西!”


原文来自 Standard Ebooks 版本《柳林风声》在线阅读(搜索 By it and with it)。

10 个赞

你好 :wave:

感谢这个组件 :heart: 它完美地契合了我现在想要实现的目标。实际上,我最初的想法是,如果能与 回复模板 组件结合使用就太棒了。但遗憾的是,正如上面的帖子所解释的,这是不可能的。:confused:


我找到了一个变通方法,可以用作模板,它与 链接到新主题链接到新个人消息 一起使用。

这是我的做法:

  1. 创建一个占位符表单(为简单起见,我使用了 OP 中的示例)

Your email: =NAME=-=COUNTRY=@example.com


  1. 创建一个新主题的链接:
    我在链接中设置了:
  2. 类别
  3. 标题
  4. 正文

如果你想添加空行,请使用 \,这样它就不会破坏链接,或者为了让它不可见,你可以使用  ,它会在新行中添加一个空格。它将成为模板的一部分,并创建空行,

<a href="https://meta.discourse.org/new-topic?category==CATEGORY=&title=This is a topic created by =NAME=&body=Hello :wave:
&nbsp;
This is a test topic... Let's see the placeholder form.
\
Your email: =NAME=-=COUNTRY=@example.com">Use template as new topic</a>

  1. 创建一个主题预览

Selected category

=CATEGORY=

Topic title

This is a topic created by =NAME=

Topic body

Hello :wave:

This is a test topic… Let’s see the placeholder form.

Your email: =NAME=-=COUNTRY=@example.com


  1. 创建“用作新主题的模板”按钮(在上面的示例中,这是一个链接,你可以将其制作为按钮)

用这个文本创建一个 [wrap] 元素。这使得它可以通过 CSS 进行定位和样式设置。我将其添加到下面。

<a href="https://meta.discourse.org/new-topic?category==CATEGORY=&title=This is a topic created by =NAME=&body=Hello :wave:
&nbsp;
This is a test topic... Let's see the placeholder form.
\
Your email: =NAME=-=COUNTRY=@example.com">[wrap=template-button]Use template as new topic[/wrap]</a>

样式化 [wrap=template-button]
类似这样 :arrow_down_small:

Common / CSS

[data-wrap="template-button"] {
  background: var(--tertiary);
  color: var(--secondary);
  border-radius: var(--d-button-border-radius);
  padding: 0.5em 0.65em;
  transition: background 0.25s;
  &:focus,
  &:hover {
    background: var(--tertiary-hover);
    color: var(--secondary);
  }
}

模板按钮看起来会像这样 :arrow_down_small:

template-button


演示

Use template as new topic


希望这个小教程能帮助到需要类似功能的人 :slightly_smiling_face:

编辑:我设置了一个类别选择器,它增加了在不同类别中创建主题的功能。


查看此帖子的原始版本…

9 个赞

太棒了,Don,谢谢你。这实际上非常符合我的一个需求 :slight_smile:

2 个赞

需要注意的是,代码块有时会引起问题:

usermod -aG sudo =USERNAME=

在这种情况下,highlight.js 会将其假定为 Java 并将代码块转换为:

<code class="hljs language-java" data-highlighted="yes">
  usermod -
  <span class="hljs-type">aG</span>
  <span class="hljs-variable">sudo</span>
  <span class="hljs-operator">=</span>
  USERNAME=
</code>

我可以通过将其标记为实际上是 shell 命令来修复它:

    ```shell
    usermod -aG sudo =USERNAME=
    ```

结果是:

usermod -aG sudo =USERNAME=

如果所有其他方法都失败了,text 可以阻止 highlight.js 干扰占位符。

一个更通用的解决方案(Meta Discourse 似乎正在使用)是将 default code lang 设置从 auto 更改为 plaintext 或其他类似选项。 :wink:


虽然这关系不大,但使用 java 是避免在你想写关于占位符时占位符展开的一种方法。

1 个赞

预览链接好像坏了,你能检查一下吗?

1 个赞

这是一个很棒的功能,我可以看到它的许多用途。
但是,在我们的回复中,是否有可能在用户开始在文本框中键入之前隐藏=(name)=?我认为用户(尤其是新用户)可能不理解它的用途,或者它看起来格式不正确。

我想我有一个又能用了 (:crossed_fingers: :slight_smile:)

https://discourse.theme-creator.io/theme/Discourse/placeholder-forms

我也把它添加到了 try.discourse.org,这样你就可以更深入地体验它了。:+1:

1 个赞

也许您可以输入一个将显示为默认值的条目。

1 个赞

那奏效了!谢谢!

2 个赞

此变通办法似乎不再有效。

是否有其他选项可以将 reply-templateplaceholder-forms 结合起来?

4 个帖子已拆分为新主题:链接在占位符表单中不起作用