Markdown und einschließlich mehrerer Dateien


197

Gibt es eine Markdown-Gabel, mit der Sie auf andere Dateien verweisen können, beispielsweise auf eine Includes-Datei? Insbesondere möchte ich eine separate Markdown-Datei mit Links erstellen, die ich häufig, aber nicht immer aufrufe (nennen Sie diese B.md). Wenn ich dann in der md-Datei, die ich schreibe (A.md), durch Verweisen verlinke, würde ich Es gefällt mir, den Link aus der anderen Datei (B.md) und nicht aus dem Ende der aktuellen Datei (A.md) zu ziehen.


1
Wenn Ihre Frage Github verwandten Abschlags ist, können Sie einen Blick hier
Adi Prasetyo

3
Als Faustregel für Markdown gilt, dass die Antwort auf "Can Markdown ..." normalerweise "Nicht praktisch, universell oder einfach" lautet.
Michael Scheper

4
Es gibt eine offene Diskussion darüber, wie dies am besten mit Pandoc unter github.com/jgm/pandoc/issues/553 und im Commonmark-Forum unter talk.commonmark.org/t/…
naught101

Antworten:


217

Die kurze Antwort lautet nein. Die lange Antwort lautet ja. :-)

Markdown wurde entwickelt, um Benutzern das Schreiben von einfachem, lesbarem Text zu ermöglichen, der leicht in ein einfaches HTML-Markup konvertiert werden kann. Das Dokumentlayout funktioniert nicht wirklich. Zum Beispiel gibt es keine echte Möglichkeit, ein Bild nach rechts oder links auszurichten. In Bezug auf Ihre Frage gibt es keinen Markdown-Befehl, um einen einzelnen Link von einer Datei zu einer anderen in eine Markdown-Version aufzunehmen (soweit ich weiß).

Am nächsten an dieser Funktionalität ist Pandoc . Mit Pandoc können Sie Dateien als Teil der Umwandlung zusammenführen, wodurch Sie problemlos mehrere Dateien in einer einzigen Ausgabe rendern können. Wenn Sie beispielsweise ein Buch erstellen, können Sie folgende Kapitel haben:

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

Sie können sie zusammenführen, indem Sie diesen Befehl im selben Verzeichnis ausführen:

pandoc *.md > markdown_book.html

Da pandoc alle Dateien vor der Übersetzung zusammenführt, können Sie Ihre Links wie folgt in die letzte Datei aufnehmen:

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

Ein Teil von Ihnen 01_preface.mdkönnte also so aussehen:

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

Und ein Teil von Ihnen 02_introduction.mdkönnte so aussehen:

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

Solange Ihre letzte Datei die Zeile enthält:

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

... der gleiche Befehl, der zuvor verwendet wurde, führt die Zusammenführung und Konvertierung durch, während dieser Link durchgehend eingeschlossen wird. Stellen Sie einfach sicher, dass Sie am Anfang dieser Datei ein oder zwei Leerzeilen lassen. In der Pandoc-Dokumentation heißt es, dass zwischen Dateien, die auf diese Weise zusammengeführt werden, eine Leerzeile eingefügt wird , aber ohne die Leerzeile hat dies bei mir nicht funktioniert.


6
Dies stellt sich als äußerst nützlicher Beitrag für mich heraus! Danke Aaron. Es scheint ein gängiger Anwendungsfall zu sein, ein / chapels-Verzeichnis zu haben, ein Skript, das Kapitel erstellt / zusammenführt, und dann ein Wrapper-Skript der obersten Ebene, das einen Schritt wie den folgenden enthält: --include-before-body $ (include_dir) / fusioned_chapters .html. Das ist der Ansatz, den ich verfolgen werde, um organisatorischen Nutzen zu erzielen.
Rob

1
Ein weiterer Vorteil der Verwendung von pandoc besteht darin, dass es eine enorme Vielfalt an Ausgaben unterstützt: Sie können nicht nur HTML, sondern auch alles von docx über LaTeX bis hin zu ePUB generieren.
Chris Krycho

pandoc *.md > markdown_book.htmlführt zu pandoc: *.md: openfile: invalid argument (Invalid argument)- es scheint nicht die von Ihnen angegebene Syntax zu unterstützen.
Jason Young

Es funktioniert auf meinem System. Ich habe ein Beispiel-Repository auf GitHub erstellt, damit Sie es mit allen von mir verwendeten Dateien ausprobieren können.
Aaron Massey

Sie können Bilder richtig ausrichten, indem Sie ein geeignetes CSS einbinden. So sollten Sie wahrscheinlich sowieso vorgehen.
naught101

50

Ich möchte nur erwähnen, dass Sie den catBefehl verwenden können, um die Eingabedateien zu verketten, bevor Sie sie weiterleiten. Dies markdown_pyhat den gleichen Effekt wie pandocbei mehreren eingehenden Eingabedateien.

cat *.md | markdown_py > youroutputname.html

funktioniert ziemlich genau wie das obige Pandoc- Beispiel für die Python-Version von Markdown auf meinem Mac.


1
@ tprk77: außer dass Aarons Antwort klar macht, dass der Befehl cat hier überflüssig ist ..
naught101

1
Die Verwendung von cat *.mdimpliziert eine unflexible Dateinamenskonvention. Diese Konvention würde nicht nur rekursive Includes zwangsläufig verbieten, bei größeren Dokumentationsprojekten wäre es schmerzhaft, neue Dateien in den Mix aufzunehmen. Sie müssten viel zählen und umbenennen. Das Markdown-Projekt hat seit dem Jahr 2010 einen Präprozessor für diesen Zweck.
Ninegrid

@ninegrid Während MarkdownPP sehr nützlich aussieht, scheint es mir, wenn ich mir das Quell-Repo ansehe, auf das Sie in Ihrer Antwort verwiesen haben, (a) MarkdownPP ist nur John Reeses Projekt; (b) es ist überhaupt nicht Teil des "Abschriftenprojekts" (einer der verschiedenen Geschmacksrichtungen); und (c) MarkdownPP gibt speziell GFM aus. Richtig? Wie gesagt, es sieht interessant und hilfreich aus, aber Ihr Kommentar hier lässt es so klingen, als wäre es eine Standard-Markdown-Funktion, mit der jede Markdown-Implementierung ausgestattet sein sollte. Aber wenn man sich das Repo ansieht, scheint die Situation genau das Gegenteil zu sein.
FeRD

MD-Tabellen können nicht in HTML-Tabellen konvertiert werden.
james.garriss

30

Sie können den Markdown-Präprozessor ( MarkdownPP ) tatsächlich verwenden . Wenn Sie das hypothetische Buchbeispiel aus den anderen Antworten verwenden, erstellen Sie .mdppDateien, die Ihre Kapitel darstellen. Die .mdppDateien können dann die !INCLUDE "path/to/file.mdpp"Direktive verwenden, die rekursiv die Direktive durch den Inhalt der referenzierten Datei in der endgültigen Ausgabe ersetzt.

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

Sie benötigen dann eine index.mdpp, die Folgendes enthält:

!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"

Um Ihr Buch zu rendern, führen Sie einfach den Präprozessor aus auf index.mdpp:

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

Vergessen Sie nicht, readme.mdppim MarkdownPP- Repository nach Informationen zu Präprozessorfunktionen zu suchen, die für größere Dokumentationsprojekte geeignet sind.


19

Meine Lösung ist die Verwendung von m4. Es wird auf den meisten Plattformen unterstützt und ist im binutils-Paket enthalten.

Fügen Sie zunächst ein Makro changequote()in die Datei ein, um die Anführungszeichen nach Ihren Wünschen zu ändern (Standard ist `'). Das Makro wird entfernt, wenn die Datei verarbeitet wird.

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

Auf der Kommandozeile:

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

2
m4ist kaum bekannt, aber in der Tat ein unglaublich leistungsfähiges Werkzeug, wenn es um solche generischen Einschlussbedürfnisse geht. Genug, um die Dokumentation erwähnen zu lassen, dass sie "ziemlich süchtig machen" kann.
Uriel

Nun, das ist eine Lösung! Genius
Brandt

+1 für die Idee und Erinnerung an m4 ! Lustige Sache ist, dass ich, als ich die Erweiterungen oben als 'md' sah, in meinem Kopf von m4 dachte . Dass Sie dann ein Beispiel hinzufügen würden, ist großartig. Ich bin mir nicht sicher, ob diese Frage genau fragt, wonach ich suche, aber es könnte funktionieren. Vielen Dank so oder so.
Pryftan

15

Erst kürzlich habe ich in Node so etwas mit dem Namen markdown-include geschrieben , mit dem Sie Markdown-Dateien mit C-Syntax einfügen können, wie folgt:

#include "my-file.md"

Ich glaube, das passt gut zu der Frage, die Sie stellen. Ich weiß, dass dies ein altes ist, aber ich wollte es zumindest aktualisieren.

Sie können dies in jede gewünschte Markdown-Datei aufnehmen. Diese Datei kann auch mehr Includes enthalten, und Markdown-Include stellt einen internen Link her und erledigt die gesamte Arbeit für Sie.

Sie können es über herunterladen npm

npm install -g markdown-include

1
Das war sehr hilfreich! Danke dir!
Leas

@leas Ich bin froh, Ihnen behilflich zu sein ... Ich habe seit einigen Jahren nicht mehr daran gearbeitet, aber ich möchte immer irgendwann darauf zurückkommen. Hoffentlich tut es gut für Ihre Zwecke.
Sethen

9

Multimarkdown hat dies nativ. Es nennt es Datei-Transklusion :

{{some_other_file.txt}}

ist alles was es braucht. Seltsamer Name, aber alle Kästchen ankreuzen.


Gibt es Free- und Open Source-Editoren, um diese Syntax zu rendern? Ich habe diese Frage hier mit weiteren Details gestellt. Ich würde mich freuen, wenn Sie mir dabei helfen könnten.
Foad

1
@Foad: Ich fürchte, ich bin ein Vim-Benutzer und kenne keine solchen Editoren. Ich sehe auf Ihrem reddit Q, dass Sie festgestellt haben, dass Asciidoc und verschiedene Redakteure von dies unterstützen. Ich wusste das nicht - danke.
Eff

Glücklich, dass es nützlich war. Aber hat vim eine Live-Vorschau für MultiMarkDown? Würden Sie gerne Ihre Setup- und Punktedateien mit weiteren Details teilen?
Foad

1
Keine Live-Vorschau, ich bin nicht so ein Typ. ;) Der Hauptgrund, warum ich Markdown überhaupt verwendet habe, war, dass es für Menschen lesbar sein soll, wenn es nicht verarbeitet wird. Daher macht es mir wirklich nichts aus, wenn ich zu viel auf Vorschauen schaue (obwohl ich verstehe, warum andere dies tun). Das einzige, was mich in diesem Fall interessiert, ist die Syntaxhervorhebung, und die Standard-Markdown-Syntaxhervorhebung funktioniert für mich gut genug. Tut mir leid, nicht weiter zu helfen.
Eff

1
Es sieht so aus, als könnte es interessant sein, obwohl ich keinen Grund sehe, es zumindest für meine (mageren) Zwecke gegenüber Markdown / Asciidoc zu wählen.
Eff

8

Ich verwende eine includes.txtDatei mit allen meinen Dateien in der richtigen Reihenfolge, in der ich Pandoc wie folgt ausführe:

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

Klappt wunderbar!


1
Toller Ansatz . Die Angabe der Dateireihenfolge ist von grundlegender Bedeutung, wird jedoch mit den globMethoden nur durchgeführt, wenn Sie Dateien nummerieren.
Ephsmith

Könnten Sie eine Erklärung der Schritte hinzufügen? Scheint so mächtig! Ich würde gerne wissen, ob es möglich ist, es zu kürzen, um andere Konvertierungen wie .pdf und .tex durchzuführen.
Nilon

6

In der Tat können Sie \input{filename}und \include{filename}das sind Latex-Befehle, direkt in Pandoc, weil es fast alle htmlund latexSyntax unterstützt.

Beachten Sie jedoch, dass die enthaltene Datei als latexDatei behandelt wird. Aber Sie können Ihre kompilieren markdownzu latexmit Pandoxleicht.


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) ist eigentlich ein Preisnachlass für Steroide. Insgesamt werden Asciidoc und Markdown sehr ähnlich aussehen und es ist ziemlich einfach zu wechseln. Ein großer Vorteil von Asciidoc gegenüber Markdown ist, dass es bereits Includes für andere Asciidoc-Dateien, aber auch für jedes gewünschte Format unterstützt. Sie können sogar teilweise Dateien basierend auf Zeilennummern oder Tags in Ihre enthaltenen Dateien aufnehmen.

Das Einschließen anderer Dateien ist wirklich ein Lebensretter, wenn Sie Dokumente schreiben.

Sie können beispielsweise eine Asciidoc-Datei mit folgenden Inhalten haben:

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

und pflegen Sie Ihre Probe in script.pl

Und ich bin sicher, Sie werden sich fragen, ja, Github unterstützt auch Asciidoc.


Hier scheint es ein schönes Versprechen zu geben, aber es gibt keine vollständige Antwort mit Anleitungen. Kann angegeben werden, wie das Dokument mit mehreren Dateien in ein einzelnes Dokument konvertiert werden soll?
Nilon

Dies ist die bisher beste Lösung auf dieser Seite. Ich bin zu diesem Schluss gekommen und habe das Problem hier auf Reddit angesprochen . AsciiDoc verfügt über ein integriertes Include und wird von GitHub gerendert. Atom und vscode haben auch nette Plugins für die Live-Vorschau. Ich frage mich, warum AsciiDoc nicht schon der Industriestandard ist!
Foad

4

Ich denke, wir sollten besser eine neue Syntax für die Aufnahme von Dateien verwenden (also nicht mit Codeblöcken durcheinander bringen, ich denke, die Aufnahme im C-Stil ist völlig falsch), und ich habe ein kleines Tool in Perl geschrieben, das benennt cat.pl, weil es so funktioniertcat ( cat a.txt b.txt c.txtwird zusammengeführt) drei Dateien), aber es werden Dateien in der Tiefe und nicht in der Breite zusammengeführt . Wie benutzt man?

$ perl cat.pl <your file>

Die Syntax im Detail lautet:

  • rekursive Include-Dateien: @include <-=path=
  • Fügen Sie einfach eines hinzu: %include <-=path=

Es kann richtig File Inclusion behandeln Loops (- b.txt, b.txt <- a.txt, dann , was Sie erwarten? Wenn a.txt <).

Beispiel:

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

Weitere Beispiele finden Sie unter https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md .

Ich habe auch eine Java-Version mit identischem Effekt geschrieben (nicht gleich, aber nah).


<<[include_file.md](Markiert 2 unter macOS): gist.github.com/district10/d46a0e207d888d0526aef94fb8d8998c
dvorak4tzx

Bemerkenswert @ist, wird für Zitate mit pandoc-citeproc(zB " @Darwin1859") verwendet.
PlasmaBinturong

4

Ich bin tatsächlich überrascht, dass niemand auf dieser Seite HTML-Lösungen angeboten hat. Soweit ich verstanden habe, können MarkDown-Dateien einen großen Teil (wenn nicht alle) von HTML-Tags enthalten. Befolgen Sie also diese Schritte:

  1. Von hier aus : Fügen Sie Ihre MarkDown-Dateien in <span style="display:block"> ... </span>Tags ein, um sicherzustellen, dass sie als Markdown gerendert werden. Sie haben viele andere Stileigenschaften, die Sie hinzufügen können. Der, den ich mag, ist der text-align:justify.

  2. Von hier aus : Fügen Sie die Dateien mit dem in Ihre Hauptdatei ein<iframe src="/path/to/file.md" seamless></iframe>

PS1. Diese Lösung funktioniert nicht auf allen MarkDown-Engines / Renderings. Beispielsweise hat Typora die Dateien korrekt gerendert, Visual Studio Code jedoch nicht. Es wäre großartig, wenn andere ihre Erfahrungen mit anderen Plattformen teilen könnten. Insbesondere würde ich gerne etwas über GitHub und GitLab hören ...

PS2. Bei weiteren Untersuchungen scheint es schwerwiegende Inkompatibilitätsprobleme zu geben, die dazu führen, dass dies auf vielen Plattformen, einschließlich Typora-, GitHub- und Visual Studio-Code, nicht ordnungsgemäß gerendert wird. Bitte verwenden Sie dies nicht, bis ich sie gelöst habe. Ich werde die Antwort nicht nur zur Diskussion löschen und wenn Sie vielleicht Ihre Meinung teilen können.

PS3. Um dieses Problem weiter zu untersuchen, habe ich diese Fragen hier auf StackOverflow und hier auf Reddit gestellt .

PS4. Nach einigen Studien kam ich zu dem Schluss, dass AsciiDoc im Moment eine bessere Option für die Dokumentation ist. Es verfügt über eine integrierte Include-Funktionalität, wird von GitHub gerendert und wichtige Code-Editoren wie Atom und vscode verfügen über Erweiterungen für die Live-Vorschau. Sie können Pandoc oder andere Tools verwenden, um vorhandenen MarkDown-Code mit geringfügigen Änderungen automatisch in AsciiDoc zu konvertieren.

PS5. Eine weitere einfache Markup-Sprache mit integrierter Include-Funktionalität ist reStructuredText. Es kommt .. include:: inclusion.txt standardmäßig mit Syntax. Es gibt auch einen ReText-Editor mit Live-Vorschau.


1

Ich weiß, dass dies eine alte Frage ist, aber ich habe keine Antworten auf diesen Effekt gesehen: Wenn Sie Ihre Datei mit Markdown und Pandoc in PDF konvertieren, können Sie sie in Ihre Yaml-Daten oben auf der Seite aufnehmen etwas wie das:

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

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

# Section

Blah blah

## Section 

Blah blah

Da Pandoc Latex verwendet, um alle Ihre Dokumente zu konvertieren, header-includesruft der Abschnitt das Paket pdfpages auf. Wenn Sie dann einschließen \includepdf{/path/to/pdf/document.pdf}, wird alles eingefügt, was in diesem Dokument enthalten ist. Darüber hinaus können Sie auf diese Weise mehrere PDF-Dateien einfügen.

Als Spaßbonus, und das nur, weil ich oft Markdown verwende, wenn Sie andere Dateien als Markdown einschließen möchten, zum Beispiel Latexdateien. Ich habe diese Antwort etwas geändert . Angenommen, Sie haben eine Markdown-Datei markdown1.md:

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

Und zwei zusätzliche Latexdateien document1, die so aussehen:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

Und noch eine, document2.tex, die so aussieht:

\section{Section

Glah

\subsection{Section}

Balh Balh

Angenommen, Sie möchten document1.tex und document2.tex in markdown1.md aufnehmen, würden Sie dies nur für markdown1.md tun

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

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

Führen Sie Pandoc darüber, z

im Terminal pandoc markdown1.md -o markdown1.pdf

Ihr endgültiges Dokument sieht ungefähr so ​​aus:

Etwas, das voll bedeutet

Sprechender Kopf

Sektion

Tiefe.

Sektion

Messers Schneide.

Sektion

Glah

Sektion

Balh Balh


0

Ich verwende Marked 2 unter Mac OS X. Es unterstützt die folgende Syntax zum Einschließen anderer Dateien.

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

Leider können Sie das nicht an pandoc weitergeben, da es die Syntax nicht versteht. Das Schreiben eines Skripts zum Entfernen der Syntax zum Erstellen einer Pandoc-Befehlszeile ist jedoch einfach genug.


7
Würdest du zufällig das Skript haben, anstatt nur zu sagen, dass es einfach ist? :)
Toobulkeh

0

Eine weitere HTML-basierte clientseitige Lösung mit Markdown-it und jQuery . Unten finden Sie einen kleinen HTML-Wrapper als Masterdokument, der unbegrenzte Einschlüsse von Markdown-Dateien unterstützt, jedoch keine verschachtelten Einschlüsse. Erläuterungen finden Sie in den JS-Kommentaren. Fehlerbehandlung entfällt.

<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, Sie können Ihr Ergebnis erhalten, indem Sie Ihre Eingabe * .md-Dateien wie folgt verketten:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.