Уценка и в том числе несколько файлов


199

Есть ли какой-нибудь форк уценки, который позволяет ссылаться на другие файлы, что-то вроде включаемого файла? В частности, я хочу создать отдельный файл разметки со ссылками, которые я называю часто, но не всегда (назовите это B.md), тогда, когда я делаю ссылку по ссылке в файле md, который я пишу (A.md), я бы Например, вытащить ссылку из другого файла (B.md), а не из конца текущего файла (A.md).


1
Если ваш вопрос относится к уценке, связанной с github, вы можете посмотреть здесь
Adi Prasetyo

3
Правильное правило для Markdown заключается в том, что ответом «Can Markdown ...» обычно является «Не практически, универсально или легко».
Майкл Шепер,

Ответы:


217

Краткий ответ: нет. Длинный ответ - да. :-)

Markdown был разработан, чтобы позволить людям писать простой, читаемый текст, который можно легко преобразовать в простую HTML-разметку. Это на самом деле не делает макет документа. Например, нет реального способа выровнять изображение вправо или влево. Что касается вашего вопроса, то нет команды уценки, которая бы включала одну ссылку из одного файла в другой в любой версии уценки (насколько я знаю).

Наиболее близким к этой функциональности может быть Pandoc . Pandoc позволяет объединять файлы как часть преобразования, что позволяет легко рендерить несколько файлов в один вывод. Например, если вы создавали книгу, у вас могли бы быть такие главы:

01_preface.md
02_introduction.md
03_why_markdown_is_useful.md
04_limitations_of_markdown.md
05_conclusions.md

Вы можете объединить их, выполнив эту команду в том же каталоге:

pandoc *.md > markdown_book.html

Поскольку pandoc объединит все файлы перед выполнением перевода, вы можете включить свои ссылки в последний файл, например так:

01_preface.md
02_introduction.md
03_why_markdown_is_useful.md
04_limitations_of_markdown.md
05_conclusions.md
06_links.md

Так что часть вашего 01_preface.mdможет выглядеть так:

I always wanted to write a book with [markdown][mkdnlink].

И часть вашего 02_introduction.mdможет выглядеть так:

Let's start digging into [the best text-based syntax][mkdnlink] available.

Пока ваш последний файл содержит строку:

[mkdnlink]: http://daringfireball.net/projects/markdown

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


6
Это оказывается чрезвычайно полезным постом для меня! Спасибо Аарон. Кажется, было бы распространенным вариантом использовать каталог / chapters dir, один сценарий, который создает / объединяет главы, а затем сценарий оболочки верхнего уровня, который включает в себя такой шаг: --include-before-body $ (include_dir) / merged_chapters .html. Именно такой подход я выберу, чтобы получить какую-то организационную выгоду.
Роб

1
Еще одно преимущество использования pandoc заключается в том, что он поддерживает огромное разнообразие выходных данных: вы можете создавать не только HTML, но и все, от docx до LaTeX и ePUB.
Крис Крычо

pandoc *.md > markdown_book.htmlв результате pandoc: *.md: openfile: invalid argument (Invalid argument)- он не поддерживает указанный вами синтаксис.
Джейсон Янг

Это работает в моей системе. Я создал пример репозитория на GitHub, чтобы вы могли попробовать его со всеми файлами, которые я использовал.
Аарон Мэсси

Вы можете выровнять изображения правильно, включив соответствующий CSS-код, что, в любом случае, вам следует делать.
naught101

50

Я бы просто упомянул, что вы можете использовать catкоманду для объединения входных файлов перед их конвейерной передачей, markdown_pyчто имеет тот же эффект, что pandocи при поступлении нескольких входных файлов.

cat *.md | markdown_py > youroutputname.html

работает почти так же, как и пример pandoc выше для версии Markdown для Python на моем Mac.


1
@ tprk77: за исключением того, что ответ Аарона проясняет, что команда cat здесь избыточна ..
naught101

1
Использование cat *.mdподразумевает негибкое соглашение об именовании файлов. Мало того, что это соглашение обязательно запретит рекурсивные включения, для больших проектов документации было бы болезненно добавлять новые файлы в смесь. Вы должны были бы сделать много подсчета и переименования. У проекта уценки был препроцессор для этой цели с 2010 года.
ninegrid

@ninegrid Хотя MarkdownPP выглядит очень полезным, из исходного репо, на которое вы указали в своем ответе, мне кажется (a) MarkdownPP - проект Джона Риза, только; (б) он вообще не является частью «проекта уценки» (любого из различных ароматов); и (c) MarkdownPP выводит GFM, в частности. Верный? Как я уже сказал, это выглядит интересно и полезно, но ваш комментарий здесь звучит так, как будто это стандартная функция Markdown, с которой должна идти каждая реализация Markdown. Но, глядя на репо, ситуация выглядит совершенно противоположной.
Февраль

Не в состоянии преобразовать таблицы MD в таблицы HTML.
james.garriss

30

Вы можете использовать препроцессор Markdown ( MarkdownPP ). Используя пример гипотетической книги из других ответов, вы создадите .mdppфайлы, представляющие ваши главы. Затем .mdppфайлы могут использовать !INCLUDE "path/to/file.mdpp"директиву, которая работает рекурсивно, заменяя директиву содержимым ссылочного файла в конечном выводе.

chapters/preface.mdpp
chapters/introduction.mdpp
chapters/why_markdown_is_useful.mdpp
chapters/limitations_of_markdown.mdpp
chapters/conclusions.mdpp

Затем вам понадобится index.mdppследующее:

!INCLUDE "chapters/preface.mdpp"
!INCLUDE "chapters/introduction.mdpp"
!INCLUDE "chapters/why_markdown_is_useful.mdpp"
!INCLUDE "chapters/limitations_of_markdown.mdpp"
!INCLUDE "chapters/conclusions.mdpp"

Для рендеринга вашей книги вы просто запускаете препроцессор index.mdpp:

$ markdown-pp.py index.mdpp mybook.md

Не забудьте заглянуть readme.mdppв репозиторий MarkdownPP, чтобы узнать о возможностях препроцессора, подходящих для больших проектов документации.


19

Мое решение состоит в том, чтобы использовать m4. Он поддерживается на большинстве платформ и входит в пакет binutils.

Сначала включите макрос changequote()в файл, чтобы изменить символы кавычек на те, которые вы предпочитаете (по умолчанию `'). Макрос удаляется при обработке файла.

changequote(`{{', `}}')
include({{other_file}})

В командной строке:

m4 -I./dir_containing_other_file/ input.md > _tmp.md
pandoc -o output.html _tmp.md

2
m4едва известен, но действительно является невероятно мощным инструментом, когда дело доходит до таких общих потребностей включения. Достаточно, чтобы в документации упоминалось, что это может быть «довольно захватывающим».
Уриэль

Теперь, что это решение! Гений
Брандт

+1 за идею и напоминание о m4 ! Забавно, что когда я увидел вышеприведенные расширения как «md», я подумал о своей голове в m4 . То, что вы бы включили в пример, это здорово. Я не уверен, если этот вопрос задает именно то, что я после, но это может сделать. Спасибо в любом случае.
Прифтан

15

Совсем недавно я написал что-то вроде этого в Node под названием markdown-include, что позволяет вам включать файлы уценки с синтаксисом в стиле C, например:

#include "my-file.md"

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

Вы можете включить это в любой файл уценки, который вы хотите. Этот файл также может иметь больше включений, а markdown-include создаст внутреннюю ссылку и сделает всю работу за вас.

Вы можете скачать его через npm

npm install -g markdown-include

1
Это было очень полезно! Спасибо!
Leas

@leas Рад быть полезным ... Я не работал над этим в течение нескольких лет, но я всегда хочу вернуться к этому в какой-то момент. Надеюсь, это хорошо для ваших целей.
Сетен

9

Multimarkdown имеет это изначально. Это называет это включением файла :

{{some_other_file.txt}}

это все, что нужно. Странное имя, но все галочки отмечены галочкой.


Существуют ли бесплатные и открытые редакторы для визуализации этого синтаксиса? Я задал этот вопрос здесь с более подробной информацией. Буду признателен, если вы поможете мне с этим.
Foad

1
@Foad: я боюсь, что я пользователь vim и не знаю ни о каких таких редакторах. Я вижу, на вашем Reddit Q вы обнаружили, что Asciidoc и различные редакторы поддерживают это. Я этого не знал - спасибо.
эфф

Рад, что это было полезно. Но есть ли у vim предварительный просмотр MultiMarkDown? Не могли бы вы поделиться своими настройками и точечными файлами с некоторыми подробностями?
Foad

1
Нет предварительного просмотра, я не такой парень. ;) Основная причина, по которой я вообще использовал уценку, заключалась в том, что она предназначена для удобочитаемости человеком, когда не обрабатывается, поэтому я действительно не возражаю против предварительного просмотра (хотя я понимаю, почему другие). В данном случае меня интересует только подсветка синтаксиса, и подсветка синтаксиса уценки по умолчанию работает для меня достаточно хорошо. Извините, что не могу помочь.
эфф

1
Похоже, это может быть интересно, хотя я не вижу смысла выбирать его вместо markdown / asciidoc для моих (скудных) целей, по крайней мере.
эфф

8

Я использую includes.txtфайл со всеми своими файлами в правильном порядке, когда я выполняю pandoc следующим образом:

pandoc -s $(cat includes.txt) --quiet -f markdown -t html5 --css pandoc.css -o index.html

Работает как шарм!


1
Отличный подход . Указание порядка файлов является фундаментальным, но оно не выполняется с помощью globметодов, если вы не пронумеровали файлы.
Ephsmith

Не могли бы вы включить объяснение шагов? Кажется, такой мощный! Я хотел бы знать, возможно ли урезать его, чтобы сделать другие преобразования, такие как .pdf и .tex.
Нилон

6

На самом деле вы можете использовать \input{filename}и \include{filename}латексные команды непосредственно внутри Pandoc, потому что он поддерживает почти все htmlи latexсинтаксис.

Но будьте осторожны, включенный файл будет рассматриваться как latexфайл. Но вы можете скомпилировать markdownTo latexс Pandoxлегкостью.


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) на самом деле является скидкой на стероиды. В целом, Asciidoc и Markdown будут выглядеть очень похоже, и их будет довольно легко переключать. Огромное преимущество над Asciidoc уценкой, что он поддерживает уже включает, для других файлов Asciidoc , но и как любой формат. Вы даже можете частично включать файлы на основе номеров строк или тегов внутри включенных файлов.

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

Например, вы можете получить файл asciidoc с таким содержимым:

// [source,perl]
// ----
// include::script.pl[]
// ----

и сохранить ваш образец в script.pl

И я уверен, что вам будет интересно, так что да, Github также поддерживает Asciidoc.


Здесь, кажется, есть хорошее обещание, но он не дает полного ответа с инструкциями. Можно ли указать, как конвертировать многофайловый документ в один?
Нилон

Это лучшее решение на этой странице. Я пришел к такому выводу и обратился к проблеме здесь, на Reddit . AsciiDoc имеет встроенное включение, и оно отображается GitHub. У Atom и vscode есть хорошие плагины для живого просмотра. Интересно, почему AsciiDoc уже не является отраслевым стандартом!
Foad

4

Я думаю, что нам лучше принять новый синтаксис включения файлов (так что не стоит путаться с блоками кода, я думаю, что включение в стиле C совершенно неверно), и я написал небольшой инструмент на Perl, назвав его cat.pl, потому что он работает какcat ( cat a.txt b.txt c.txtобъединится три файла), но он объединяет файлы по глубине , а не по ширине . Как пользоваться?

$ perl cat.pl <your file>

Синтаксис в деталях:

  • рекурсивные включаемые файлы: @include <-=path=
  • просто включите один: %include <-=path=

Он может правильно обрабатывать циклы включения файлов (если a.txt <- b.txt, b.txt <- a.txt, то чего вы ожидаете?).

Пример:

a.txt:

a.txt

    a <- b

    @include <-=b.txt=

a.end

b.txt:

b.txt

    b <- a

    @include <-=a.txt=

b.end

perl cat.pl a.txt > c.txt, c.txt:

a.txt

    a <- b

    b.txt

        b <- a

        a.txt

            a <- b

            @include <-=b.txt= (note:won't include, because it will lead to infinite loop.)

        a.end

    b.end

a.end

Дополнительные примеры на https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md .

Я также написал версию Java, имеющую идентичный эффект (не такой же, но близкий).


<<[include_file.md](Отмечено 2 в macOS): gist.github.com/district10/d46a0e207d888d0526aef94fb8d8998c
dvorak4tzx

Следует отметить, @что используется для ссылок с pandoc-citeproc(например, " @Darwin1859").
PlasmaBinturong

4

Я на самом деле удивлен тем, что никто на этой странице не предлагал никаких HTML-решений. Насколько я понял, файлы MarkDown могут включать в себя большую часть (если не все) тегов HTML. Так что следуйте этим шагам:

  1. От сюда : положить ваши файлы уценка в <span style="display:block"> ... </span>тегах , чтобы убедиться , что они будут визуализируются как уценка. У вас есть множество других стилевых свойств, которые вы можете добавить. Тот, который мне нравится, это text-align:justify.

  2. От сюда : Включить файлы в основной файл , используя<iframe src="/path/to/file.md" seamless></iframe>

PS1. Это решение не работает на всех движках / рендерах MarkDown. Например, Typora правильно отображала файлы, а код Visual Studio - нет. Было бы здорово, если бы другие могли поделиться своим опытом с другими платформами. Особенно хотелось бы услышать о GitHub и GitLab ...

PS2. При дальнейшем исследовании, как представляется, возникают серьезные проблемы несовместимости, приводящие к тому, что это неправильно отображается на многих платформах, включая Typora, GitHub и код Visual Studio. Пожалуйста, не используйте это, пока я не разрешаю их. Я не буду удалять ответ только ради обсуждения и, если возможно, вы можете поделиться своим мнением.

PS3. Для дальнейшего изучения этой проблемы я задавал эти вопросы здесь, в StackOverflow и здесь, в Reddit .

PS4. После некоторого изучения я пришел к выводу, что на данный момент AsciiDoc является лучшим вариантом для документации. Он поставляется со встроенной функцией включения, он обрабатывается GitHub, а основные редакторы кода, такие как Atom и vscode, имеют расширения для предварительного просмотра в реальном времени. Можно использовать Pandoc или другие инструменты для автоматического преобразования существующего кода MarkDown в AsciiDoc с небольшими изменениями.

ПС5. Еще один легкий язык разметки со встроенной функцией включения reStructuredText. Он поставляется с .. include:: inclusion.txt синтаксисом по стандарту. Также есть редактор ReText с предварительным просмотром.


1

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

---
header-includes:
- \usepackage{pdfpages}
output: pdf_document
---

\includepdf{/path/to/pdf/document.pdf}

# Section

Blah blah

## Section 

Blah blah

Поскольку pandoc использует латекс для конвертации всех ваших документов, этот header-includesраздел вызывает пакет pdfpages. Затем, когда вы включите \includepdf{/path/to/pdf/document.pdf}его, он вставит все, что включено в этот документ. Кроме того, вы можете включить несколько файлов PDF таким образом.

В качестве забавного бонуса, и это только потому, что я часто использую уценку, если вы хотите включить файлы, отличные от уценки, например, латексные файлы. Я несколько изменил этот ответ . Скажем, у вас есть файл уценки markdown1.md:

---
title: Something meaning full
author: Talking head
---

И два дополнительных латексных файла document1, которые выглядят так:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

И еще один, document2.tex, который выглядит так:

\section{Section

Glah

\subsection{Section}

Balh Balh

Предполагая, что вы хотите включить document1.tex и document2.tex в markdown1.md, вы просто сделаете это для markdown1.md

---
title: Something meaning full
author: Talking head
---

\input{/path/to/document1}
\input{/path/to/document2}

Запустите pandoc, например

в терминале pandoc markdown1.md -o markdown1.pdf

Ваш окончательный документ будет выглядеть примерно так:

Нечто Полное

Говорящая голова

Раздел

Основательность.

Раздел

Лезвие бритвы

Раздел

Glah

Раздел

Балх Балх


0

Я использую Marked 2 в Mac OS X. Он поддерживает следующий синтаксис для включения других файлов.

<<[chapters/chapter1.md]
<<[chapters/chapter2.md]
<<[chapters/chapter3.md]
<<[chapters/chapter4.md]

К сожалению, вы не можете передать это Пандоку, так как он не понимает синтаксис. Тем не менее, написание скрипта для удаления синтаксиса для построения командной строки pandoc достаточно просто.


7
у вас случился бы сценарий вместо того, чтобы просто сказать, что это легко? :)
toobulkeh

0

Другое основанное на HTML клиентское решение, использующее markdown-it и jQuery . Ниже приведена небольшая HTML-оболочка в качестве основного документа, которая поддерживает неограниченное количество включенных файлов уценок, но не вложенных. Объяснение предоставляется в комментариях JS. Обработка ошибок опущена.

<script src="/markdown-it.min.js"></script>
<script src="/jquery-3.5.1.min.js"></script>

<script> 
  $(function() {
    var mdit = window.markdownit();
    mdit.options.html=true;
    // Process all div elements of class include.  Follow up with custom callback
    $('div.include').each( function() {
      var inc = $(this);
      // Use contents between div tag as the file to be included from server
      var filename = inc.html();
      // Unable to intercept load() contents.  post-process markdown rendering with callback
      inc.load(filename, function () {
        inc.html( mdit.render(this.innerHTML) );
      });
  });
})
</script>
</head>

<body>
<h1>Master Document </h1>

<h1>Section 1</h1>
<div class="include">sec_1.md</div>
<hr/>
<h1>Section 2</h1>
<div class="include">sec_2.md</div>


-5

ИМХО, Вы можете получить свой результат, объединив свои входные * .md файлы, такие как:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.