Преобразование фрагментов многострочного кода в HTML в Markdown с помощью pandoc - PullRequest
1 голос
/ 17 апреля 2019

Я хочу перевести этот фрагмент HTML в Markdown, используя pandoc.

<code class="code_block"># chown root:root /boot/grub/grub.cfg<br/># chmod og-rwx /boot/grub/grub.cfg 
</code>

Вывод, который я хочу получить, примерно такой.

```
# chown root:root /boot/grub/grub.cfg
# chmod og-rwx /boot/grub/grub.cfg
```

Но вывод I никогда не включает <br> соответственно разрыв строки в файле уценки.

# chown root:root /boot/grub/grub.cfg# chmod og-rwx /boot/grub/grub.cfg

Я уже пробовал разные команды и расширения.

$ pandoc -f html -t markdown t.html
$ pandoc -f html -t markdown+hard_line_breaks t.html 
$ pandoc -f html -t markdown+raw_html+hard_line_breaks t.html
$ pandoc -f html -t markdown+raw_html+hard_line_breaks-inline_code_attributes t.html

Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Проблема в том, что ваш кодовый блок неправильно отформатирован как кодовый блок. Вам необходимо (как минимум) следующее:

<pre><code># chown root:root /boot/grub/grub.cfg
# chmod og-rwx /boot/grub/grub.cfg 

В дополнение к спецификации HTML , описанной в ответе @ tarleb, правила Markdown также различают код block и код span , основанный исключительно на существование (или нет) тега <pre>.

Обратите внимание, что исходные правила Markdown демонстрируют кодовый блок при создании этого HTML:

<pre><code>This is a code block.
Тег

<code>, завернутый в тег <pre>. Напротив, те же самые правила демонстрируют диапазон кода , генерирующий этот HTML:

<p>Use the <code>printf()</code> function.</p>

Обратите внимание, что используется только тег <code>, но это только встроенный интервал (заключенный в <p>, а не элемент уровня блока.

Когда Pandoc конвертирует из HTML обратно в Markdown, он придерживается того же соглашения в обратном порядке. Да, на вашем теге <code> установлено class="code_block", но Pandoc не знает, что это значит, и не должен. И да, ваш <code> элемент не обернут в <p>, но это просто плохо сформированный HTML (согласно спецификации HTML, <code> не является элементом уровня блока, но содержит контент * 1043) * то есть содержимое, которое оборачивается в элемент уровня блока, такой как <p> или <pre>).

А затем возникает проблема с вашим тегом <br>. Как Pandoc узнает, является ли это частью кода или хайлинга стиля? На самом деле это не так. Именно поэтому мы используем теги <pre> для многострочных блоков кода. С тегом <pre> пробелы сохраняются. Поэтому вам нужен только символ новой строки без тега <br>.

Для полноты картины я понимаю, что исходные правила Markdown не включают блоки изолированного кода, поэтому я также укажу на спецификацию GitHub Flavored Markdown, которая также демонстрирует блоки изолированного кода как создающие <pre><code> упакованные блоки. Естественно, чтобы вернуться в обратном направлении, вам нужно начать с <pre><code> обернутых блоков, чтобы закончить с изолированными блоками кода.

0 голосов
/ 18 апреля 2019

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

Обратите внимание, что вышеприведенный текст является довольно необычным способом написания многострочного кода. См., Например, документы MDN для элемента <code> :

Чтобы представить несколько строк кода, оберните элемент <code> в элемент <pre>. Элемент <code> сам по себе представляет только одну фразу кода или строку кода.

...