Как получить доступ к необработанному контенту из компонента темы?

Я разрабатываю компонент темы, в котором хочу реализовать что-то подобное:

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

что приводит к выводу:

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

Для этого я использую api.decorateCooked(), но поскольку контент уже обработан (cooked), все «лишние» пробелы были удалены, например, пробел перед printf в приведённом выше примере.

Как получить доступ к «необработанному» тексту, введённому пользователем?

Для ясности: то, что я хочу реализовать с помощью своего компонента темы, — это возможность для пользователя писать что-то вроде:

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

что мой компонент темы распознаёт и заменяет на преобразованный текст внутри [mytag] ... [/mytag].

Чтобы получить доступ к raw-коду, вам потребуется использовать плагин.

Однако вы можете использовать вспомогательную функцию wrap, чтобы получить div-элемент для работы.

[wrap=test]
hello world
[/wrap]

Это рендерится как:

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

Спасибо.

Возможно ли установить пользовательский плагин в экземпляр Discourse, размещённый на бесплатном тарифе в самом Discourse? Я, впрочем, так и не нашёл, как это сделать.

Было бы возможно реализовать поддержку raw для компонентов тем? Если да, примете ли вы pull request для этого?

Хелпер wrap не делает того, что я просил. Он также удаляет отступы.

К сожалению, наши бесплатные, стандартные и бизнес-тарифы не поддерживают пользовательские плагины. Мы используем кластер, который размещает множество различных клиентов, и у нас нет механизма для запуска плагина только для одного клиента.

Поддержка возможности внедрения расширения Markdown через компонент темы — это идея, которую я рассматривал в прошлом, но у нас нет конкретных планов по её реализации. Это было бы крайне сложно реализовать.

Как насчёт двойного оборачивания? Это, безусловно, сохранит все отступы.

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

Возможно, даже простое использование чего-то подобного сработает, и у вас будет отдельный элемент для работы:

```custom
test
```

Это крайне сложно и для вас, или только для кого-то вроде меня, без предварительных знаний о реализации? В чём именно заключается сложность? Не было бы проще сделать что-то более простое, чем полное расширение Markdown, например, доступ только для чтения к исходному коду?

Да, это может быть вариантом. Спасибо.

Фронтенд не получает содержимое поста в необработанном виде (raw). Он получает только обработанную версию. Это означает, что полезная нагрузка для клиента становится меньше. Кроме того, сервер в конечном итоге отвечает за преобразование Markdown в HTML. Если бы мы делали это всё во время выполнения в браузере, это привело бы к значительному увеличению дополнительных затрат и создало бы сложные векторы атак, о которых пришлось бы беспокоиться.

@sam Спасибо за помощь. Твоё предложение оказалось удачным и предоставило пользователю довольно приличный синтаксис:

:sunglasses:

Чтобы прояснить ситуацию: вы же знаете, что если вам на самом деле нужны блоки с кодом, вы можете заключить их в три обратных апострофа? Я не могу понять, в какой степени ваш пример является метафорой.

@pfaffman Не знаю, что вы имеете в виду под «блоками кофе», но да, я знаю, что три обратных апострофа создают блок кода.

Не понимаю, почему мой пример должен быть метафорой. Для чего? Изображение, которое я опубликовал, — это скриншот, демонстрирующий, что генерирует компонент моей темы для данного кода.

Извините. На моей мобильной клавиатуре слова «кофе» и «код» почти одинаковы. Каждый раз, когда я писал это предложение, клавиатура ошибалась!

Я долго искал, но не вижу в вашем примере никакой разницы между вашим изображением и стандартным блоком кода.

График, добавленный компонентом моей темы.

О! То есть вы хотите что-то вроде плагина для математики, но для вашего языка построения графиков, а не для TeX?

Да, я так полагаю. Я не видел плагин для математики, но, похоже, концепция схожа. Это та же базовая функция, что и в Discourse Graphviz, но этот плагин умеет гораздо больше: например, анимированные переходы между графами и множество опций для управления и стилизации.

Также есть Discourse Graphviz, но, как мне кажется, это всё равно не решит вашу проблему, так как вы не можете установить плагин.

Вот репозиторий на GitHub, если вам интересно. Он ещё официально нигде не развёрнут, так как мне сначала нужно написать подробную документацию по его использованию.

Тогда всё, кажется, работает, и, возможно, я что-то упускаю: решение заключается в том, чтобы отправить свои изменения через PR, и тогда они станут доступны в бизнес-планах.

Извините, я не понимаю, что вы имеете в виду. Это компонент темы, и его может установить администратор в любой экземпляр Discourse через веб-интерфейс, независимо от выбранного тарифного плана.

Скорее всего, я вас не понял. Но мне показалось, что вы хотите расширить плагин graphviz для поддержки дополнительных функций Graphviz, и что их логичнее было бы интегрировать именно в этот плагин.

Однако я не до конца понимаю, к чему вы стремитесь, поэтому могу сильно ошибаться.

Теперь я понял, что вы имели в виду. Нет, так как мы находимся на бесплатном плане, мы не могли использовать этот плагин, поэтому я разработал компонент темы вместо него. Дополнительные функции стали своего рода бонусом, который легко добавить, поскольку он основан на другой библиотеке, чем существующий плагин.

Плагины и компоненты темы очень различны, поэтому я не думаю, что возможно переиспользовать код между ними, но, полагаю, кто-то мог бы добавить тот же функционал в существующий плагин, если это будет интересно.