Лучший способ включить контент * как есть * с помощью директивы AsciiDo c include - PullRequest
0 голосов
/ 11 июля 2020

Контекст

Я делаю сценарий, который динамически вставляет директивы include в блоки кода в файле AsciiDo c, а затем генерирует из него PDF-файл. Сгенерированный файл AsciiDo c может выглядеть так:

= Title

[source,java]
---
include::foo.java[]
---

Я хочу, чтобы пользователь мог свободно включать любой файл на основе символов, который он или она хочет, даже другие файлы AsciiDo c.

Проблемы

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

  • распознается как AsciiDo c из-за его расширения, поэтому любые директивы include, которые он имеет, интерпретируются. Мне не нужны вложенные включения, просто чтобы показать директиву include в блоке кода. Пример нежелательного поведения:

Unwanted nested includes

  • contains the code block delimiter ----, as seen on the image above when I end up with two code blocks instead of the intended single one. In this case, it does not matter if the file is recognized as an AsciiDoc file, the problem persists.

My workaround

My workaround

The script I am writing uses AsciidoctorJ , и я использую, что могу контролировать включение содержимого каждого файла с помощью include процессор . Используя процессор включения, я оборачиваю каждую строку каждого файла макросом pass:[]. Дополнительно активирую подстановку макросов на желаемом блоке кода. Демонстрация этой идеи показана на изображении выше.

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

РЕДАКТИРОВАТЬ для получения дополнительной информации

Я бы хотел:

  • не экранировать разделитель блоков. Я имею в виду не только ----, но и любой разделитель. Например, в ответе cirrus все еще есть проблема, когда строка включенного файла имеет .....
  • не нужно экранировать директивы include в файлах, распознаваемых как AsciiDo c.

В общем, я не хочу экранировать (или изменять каким-либо образом) какие-либо строки.

Проблема, которую я обнаружил с помощью обходного пути:

  • Если последний символ строки - это backsla sh (\), он экранирует закрывающую скобку макроса pass:[].

1 Ответ

0 голосов
/ 17 июля 2020

Вы можете попробовать использовать буквальный блок. На основе приведенного выше примера:

a.ado c:

= Title

....
include::c.adoc[]
....

Если вы используете include:: в c .ado c, asciidoctor все равно попытается найти и включите файл. Таким образом, вам нужно будет заменить include:: на \include::

c .ado c:

\include::foo.txt[]
----
----

Что должно вывести следующий pdf: pdfoutput

...