Відмітка та включення декількох файлів


199

Чи є вилка розмітки, яка дозволяє посилатися на інші файли, на кшталт файлу, що включає? Зокрема, я хочу створити окремий файл розмітки із посиланнями, які я дзвоню часто, але не завжди (називаю це B.md), тоді, коли я посилаюся за посиланням у файлі md, який я пишу (A.md), я б як-небудь, щоб перетягнути посилання з іншого файлу (B.md), а не з кінця поточного файлу (A.md).


1
Якщо ваше питання стосується розмітки, пов'язаної з github, ви можете подивитися тут
Аді Прасетьо

3
Основним правилом для Markdown є те, що відповідь на "Can Markdown ..." зазвичай "Не практично, ні універсально, ні легко".
Майкл Шепер

4
Існує відкрита дискусія про те, як найкраще це зробити з Pandoc на веб- сайті github.com/jgm/pandoc/isissue/553 та на загальноприйнятому форумі на talk.commonmark.org/t/…
naught101

Відповіді:


217

Коротка відповідь - ні. Довга відповідь - так. :-)

Розмітка була розроблена, щоб люди могли писати простий, читабельний текст, який можна було легко перетворити на просту розмітку 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
Це виявляється для мене надзвичайно корисною публікацією! Спасибі Аарон Здається, що звичайним випадком використання є dir / 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, наведений вище для версії Markton в Python на моєму Mac.


1
@ tprk77: за винятком того, що відповідь Аарона дає зрозуміти, що команда кішки тут зайва ..
naught101

1
Використання cat *.mdпередбачає негнучку домовленість іменування файлів. Мало того, що ця конвенція обов'язково забороняє рекурсивні включення, для більш великих документаційних проектів було б болісно додавати нові файли в суміш. Вам доведеться зробити багато підрахунків та перейменувань. Проект
відмітки

@ninegrid Хоча MarkdownPP виглядає дуже корисною, з огляду на джерело репо, на яке ви посилаєтесь у своїй відповіді, мені здається (a) MarkdownPP - проект Джона Різа, лише; (b) взагалі не є частиною "проекту розмітки" (будь-якого з різних ароматів); та (c) MarkdownPP виводить GFM, зокрема. Правильно? Як я вже говорив, це виглядає цікаво і корисно, але ваш коментар тут звучить так, що це стандартна функція Markdown, з якою повинна надходити кожна реалізація Markdown. Але з огляду на репо, ситуація здається цілком протилежною.
FeRD

Не вдалося перетворити таблиці 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"

Я вважаю, що це добре узгоджується з питанням, яке ви задаєте. Я знаю це старе, але хотів оновити його принаймні.

Ви можете включити це у будь-який файл розмітки, який бажаєте. Цей файл також може мати більше включень, а розмітка-включення зробить внутрішнє посилання та зробить всю роботу за вас.

Ви можете завантажити його через npm

npm install -g markdown-include

1
Це було дуже корисно! Дякую!
Leas

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

9

Multimarkdown має це споконвічно. Це називає переключення файлів :

{{some_other_file.txt}}

це все, що потрібно. Дивна назва, але галочки всі коробки.


чи є вільні редактори з відкритим кодом для візуалізації цього синтаксису? Я поставив це питання тут більш детально. Буду вдячний, якщо ви можете мені в цьому допомогти.
Foad

1
@Foad: Я боюсь, що я користувач vim і не знаю про таких редакторів. Я бачу, на вашому reddit Q ви виявили, що Asciidoc та різні редактори компанії це підтримують. Я цього не знав - дякую.
eff

Щасливий, що це було корисно. Але чи має vim попередній перегляд для MultiMarkDown? Ви б хотіли поділитися своїми налаштуваннями та крапковими файлами ще з деякими деталями?
Foad

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

1
Схоже, це може бути цікаво, хоча я не бачу причин вибирати це над розміткою / асцидоком для моїх (мізерних) цілей, принаймні.
eff

8

Я використовую includes.txtфайл із усіма своїми файлами у потрібному порядку, я виконую такий парадок:

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

Працює як шарм!


1
Чудовий підхід . Вказання порядку файлів є основним, але воно не виконується globметодами, якщо ви не нумеруєте файли.
ephsmith

Чи можете ви включити пояснення кроків? Здається, так потужно! Мені хотілося б знати, чи можна обрізати його, щоб зробити інші перетворення, такі як .pdf та .tex.
nilon

6

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

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


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) - насправді відмітка стероїдів. В цілому, Ассідок і Маркдаун будуть виглядати дуже схоже, і їх досить легко переключити. Величезна перевага над Asciidoc уцінкою, що він підтримує вже включає, для інших файлів Asciidoc , але і як будь-який формат. Ви навіть можете частково включати файли на основі номерів рядків або тегів всередині доданих файлів.

Включення інших файлів насправді зберігає життя під час написання документів.

Наприклад, ви можете мати файл asciidoc з таким вмістом:

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

і підтримувати свій зразок в script.pl

І я впевнений, що ви здивуєтеся так, Github також підтримує асцидок.


Тут, здається, є приємна обіцянка, але не дається повної відповіді з кроками, що виконуються. Чи можна вказати, як перетворити багатофайловий документ в єдиний?
nilon

Це найкраще рішення на цій сторінці поки що. Я прийшов до такого висновку і вирішив це питання тут, на 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").
ПлазмаБінтуронг

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 Code не виконала. Було б чудово, якби інші могли поділитися своїм досвідом з іншими платформами. Особливо я хотів би почути про GitHub та GitLab ...

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

PS3. Для подальшого дослідження цього питання я задав ці питання тут на StackOverflow та тут на Reddit .

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

PS5. Ще одна легка мова розмітки із вбудованою функціональністю включає 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 markdown1.md -o markdown1.pdf

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

Щось означає повне

Говорить голова

Розділ

Проникливість.

Розділ

Бритва краю.

Розділ

Глах

Розділ

Balh Balh


0

Я використовую Marked 2 на Mac OS X. Він підтримує наступний синтаксис для включення інших файлів.

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

На жаль, ви не можете подати його до pandoc, оскільки він не розуміє синтаксис. Однак написати сценарій для зняття синтаксису для побудови командного рядка pandoc досить просто.


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

0

Ще одне на базі HTML, клієнтське рішення, що використовує markdown-it та jQuery . Нижче наведено невелику обгортку HTML як основний документ, який підтримує необмежену кількість файлів розмітки, але не вкладених включає. Пояснення надано в коментарях до СВ. Помилка обробки відхилена.

<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

IMHO, Ви можете отримати свій результат, об'єднавши вхідні файли * .md на зразок:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.