Placeholder Forms

:discourse2: Summary Placeholder Forms will let you build dynamic documentation, by creating a form that replaces any occurrence of a =PATTERN= in your post with the value from a text or selectable input field.
:eyeglasses: Preview Preview on Discourse Theme Creator
:hammer_and_wrench: Repository Link https://github.com/discourse/discourse-placeholder-theme-component
:open_book: New to Discourse Themes? Beginner’s guide to using Discourse Themes

Install this theme component

Features

Add placeholders to posts in this format:

[wrap=placeholder key=NAME description="Your name"][/wrap]
[wrap=placeholder key=COUNTRY default=US defaults=FR,DE,US,CN,AU,CA][/wrap]

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

And this will result in:

This is used in mailing list

Your email: =ZNAME=-=ZCOUNTRY=@example.com

As seen above, text inside the wrapper will be used as a long description.

[wrap=placeholder key=NAME description="Your name"]
This is used in mailing list
[/wrap]

Available keys

  • key: The key that should be replaced in your post
  • default/defaults: default value(s)
  • description: a placeholder text for the input

Examples

# create a new plugin
rails g plugin =PLUGIN_NAME=
cd plugins/=PLUGIN_NAME=

We use it to create runbooks, howtos and reusable templates (it will work in code blocks). Please share your use cases!

Settings

Translation Default
toolbar.builder Add Placeholder
builder.errors.no_key A key is required.
builder.title Add Placeholder
builder.insert Insert
builder.key.label Key
builder.key.description The =Key= to be replaced in the post.
builder.description.label Description
builder.description.description Description displayed on input with no value set.
builder.values.label Default value(s)
builder.values.description Optional value(s) for your placeholder, if multiple values are defined, a select will be used.

:discourse2: Hosted by us? Theme components are available to use on our Standard, Business, and Enterprise plans.

Last edited by @JammyDodger 2024-06-13T22:28:45Z

Check documentPerform check on document:
66 лайков

Главная проблема такой обработки математики заключается в том, что требуется использовать eval(), а eval небезопасен, поэтому необходимо применять библиотеку, обеспечивающую безопасную версию eval с ограниченным подмножеством возможностей настоящего eval. Не уверен, что нам нужна вся эта сложность для такого редкого случая.

6 лайков

Я пробовал !, и это было бы круто — своего рода превью композера с использованием redux в основном посте, но.. :pensive: Вероятно, я что-то упускаю. Если я правильно понимаю, компонент «Шаблон ответа» работает с необработанным текстом и ищет «заменители», а компонент «Формы заполнителей» работает с отформатированным текстом?

Моя цель — помочь пользователям легко добавлять вопросы и ответы викторины в тему с минимальными техническими сложностями, кликами или даже нажатиями клавиш, :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 лайка

Прежде всего — отличный и действительно полезный компонент темы.

Однако, похоже, я обнаружил ошибку. Если я использую плейсхолдер в фрагменте кода, который содержит обратные кавычки (`), он не работает. Пример — фрагмент кода SQL:

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

Плейсхолдер TABLENAME никогда не заменяется (если существует плейсхолдер TABLENAME).

Было бы круто, если бы это также включало условия, подобные Jinja2. Например, кто-то мог бы создать ключ red и сопоставить его с иконкой :red_circle:, а orange — с :orange_circle:. Конечно, можно обойтись и без этого, но было бы здорово иметь такие условия для тестирования.

Мне очень нравится этот компонент. :star_struck:


«И вы действительно живёте по =СУЩЕСТВИТЕЛЬНОЕ_1=? Какая =ПРИЛАГАТЕЛЬНОЕ_1= жизнь!»

«И по ней, и с ней, и на ней, и в ней», — сказал =ИМЯ_1=. «Она мне и брат, и сестра, и тёти, и =СУЩЕСТВИТЕЛЬНОЕ_2=, и еда, и питьё, и (=ПРИЛАГАТЕЛЬНОЕ_2=) =ГЛАГОЛ_1=. Это мой =СУЩЕСТВИТЕЛЬНОЕ_3=, и я не хочу никакого другого. То, чего у неё нет, не стоит =ГЛАГОЛ_2=, а то, чего она не знает, не стоит =ГЛАГОЛ_3=. Господи, каких =СУЩЕСТВИТЕЛЬНЫЕ_1= мы пережили вместе! Будь то зима или лето, весна или осень, у неё всегда есть свои =СУЩЕСТВИТЕЛЬНОЕ_4= и свои =СУЩЕСТВИТЕЛЬНЫЕ_2=. Когда в феврале распускаются =СУЩЕСТВИТЕЛЬНЫЕ_3=, а мои =СУЩЕСТВИТЕЛЬНЫЕ_4= и подвал переполнены =СУЩЕСТВИТЕЛЬНОЕ_5=, который мне ни к чему, и =ЦВЕТ_1= =СУЩЕСТВИТЕЛЬНОЕ_6= течёт мимо моего лучшего =СУЩЕСТВИТЕЛЬНОЕ_7= окна; или же когда всё это падает =НАРЕЧИЕ_1= и обнажает пятна =СУЩЕСТВИТЕЛЬНОЕ_8=, пахнущего =ЕДА_1=, и =СУЩЕСТВИТЕЛЬНЫЕ_5= и =СУЩЕСТВИТЕЛЬНЫЕ_6= забивают каналы, и я могу =ГЛАГОЛ_4= по =ВЛАЖНОСТЬ= =СУЩЕСТВИТЕЛЬНОЕ_9= над большей частью =СУЩЕСТВИТЕЛЬНОЕ_10= и найти свежую =ЕДА_2=, чтобы поесть, и вещи, которые =ПРИЛАГАТЕЛЬНОЕ_3= люди выбросили из =СУЩЕСТВИТЕЛЬНЫЕ_7=!»


Оригинал взят из версии Standard Ebooks книги Ветер в ивах, доступной для чтения онлайн (ищите фразу По ней, и с ней, и на ней, и в ней).

10 лайков

Привет :wave:

Спасибо за этот компонент :heart: Он идеально подходит для того, что я сейчас пытаюсь реализовать. Изначально я думал, что было бы здорово, если бы его можно было объединить с компонентом Reply Template. Но, к сожалению, это невозможно, как объяснялось в предыдущих сообщениях. :confused:


Я нашел обходной путь, чтобы использовать его как шаблон. Это работает с ссылками на новые темы и ссылками на новые личные сообщения.

Вот как я это сделал:

1. Создайте форму-заполнитель (для простоты я использую пример из исходного сообщения):

Ваш email: =NAME=-=COUNTRY=@example.com


2. Создайте ссылку на новую тему:
В ссылке я указал:

  1. категорию
  2. заголовок
  3. тело сообщения

Если нужно добавить пустые строки, используйте \, чтобы ссылка не разорвалась, или используйте  , чтобы добавить пробел на новой строке. Это станет частью шаблона и создаст пустую строку.

<a href="https://meta.discourse.org/new-topic?category==CATEGORY=&title=Это тема, созданная =NAME=&body=Привет :wave:
&nbsp;
Это тестовая тема... Давайте посмотрим на форму-заполнитель.
\
Ваш email: =NAME=-=COUNTRY=@example.com
">Использовать шаблон как новую тему</a>

3. Создайте предварительный просмотр темы

Выбранная категория

=CATEGORY=

Заголовок темы

Это тема, созданная =NAME=

Тело темы

Привет :wave:

Это тестовая тема… Давайте посмотрим на форму-заполнитель.

Ваш email: =NAME=-=COUNTRY=@example.com


4. Создайте кнопку «Использовать шаблон как новую тему» (в примере выше это ссылка, из которой можно сделать кнопку)

Создайте элемент [wrap] из этого текста. Это позволит нацеливать его с помощью CSS и стилизовать. Я добавил это ниже.

<a href="https://meta.discourse.org/new-topic?category==CATEGORY=&title=Это тема, созданная =NAME=&body=Привет :wave:
&nbsp;
Это тестовая тема... Давайте посмотрим на форму-заполнитель.
\
Ваш email: =NAME=-=COUNTRY=@example.com
">[wrap=template-button]Использовать шаблон как новую тему[/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


Демо

Использовать шаблон как новую тему


Надеюсь, этот небольшой урок поможет тем, кому нужно что-то подобное :slightly_smiling_face:

Редактирование: Я настроил выбор категории, который добавляет возможность создания тем в разных категориях.


Посмотреть исходный код этого сообщения…

9 лайков

Это потрясающе, Дон, спасибо. Это как раз очень хорошо подходит для одной из моих потребностей :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
    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-template и placeholder-forms?

4 сообщения были перенесены в новую тему: Ссылки не работают в формах-заглушках