Markdown e inclusione di più file


199

Esiste un fork di markdown che ti consente di fare riferimento ad altri file, qualcosa come un file include? In particolare, voglio creare un file markdown separato con collegamenti che chiamo spesso ma non sempre (chiamo questo B.md), quindi quando collego per riferimento nel file md che sto scrivendo (A.md), vorrei piace per estrarre il collegamento dall'altro file (B.md) anziché dalla fine del file corrente (A.md).


1
Se la tua domanda è relativa al markdown relativo a Github, potresti dare un'occhiata qui
Adi Prasetyo,

3
La regola empirica per Markdown è che la risposta a "Can Markdown ..." è di solito "Non praticamente, universalmente o facilmente".
Michael Scheper,

4
C'è una discussione aperta sul modo migliore per farlo con Pandoc su github.com/jgm/pandoc/issues/553 e sul forum Commonmark
naught101

Risposte:


217

La risposta breve è no. La lunga risposta è sì. :-)

Markdown è stato progettato per consentire alle persone di scrivere un testo semplice e leggibile che può essere facilmente convertito in un semplice markup HTML. Non fa davvero il layout del documento. Ad esempio, non esiste un modo reale per allineare un'immagine a destra o a sinistra. Per quanto riguarda la tua domanda, non esiste un comando markdown per includere un singolo link da un file all'altro in qualsiasi versione di markdown (per quanto ne so).

Il più vicino che potresti venire a questa funzionalità è Pandoc . Pandoc ti consente di unire i file come parte della trasformazione, il che ti consente di renderizzare facilmente più file in un singolo output. Ad esempio, se stavi creando un libro, potresti avere capitoli come questo:

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

Puoi unirli eseguendo questo comando nella stessa directory:

pandoc *.md > markdown_book.html

Poiché pandoc unirà tutti i file prima di eseguire la traduzione, è possibile includere i collegamenti nell'ultimo file in questo modo:

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

Quindi una parte del tuo 01_preface.mdpotrebbe apparire così:

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

E parte del tuo 02_introduction.mdpotrebbe apparire così:

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

Finché l'ultimo file include la riga:

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

... lo stesso comando usato in precedenza eseguirà l'unione e la conversione includendo al contempo quel collegamento. Assicurati di lasciare una riga o due all'inizio del file. La documentazione pandoc afferma che aggiunge una riga vuota tra i file che sono uniti in questo modo, ma questo non ha funzionato per me senza la riga vuota.


6
Questo risulta essere un post estremamente utile per me! Grazie Aaron. Sembra che sarebbe un caso d'uso comune avere una directory / chapters, uno script che costruisce / unisce i capitoli e quindi uno script wrapper di livello superiore che include un passaggio come: --include-before-body $ (include_dir) / merged_chapters .html. Questo è l'approccio che seguirò per ottenere alcuni vantaggi organizzativi.
Rob,

1
Un altro vantaggio dell'utilizzo di pandoc è che supporta un'enorme varietà di output: è possibile generare non solo HTML ma anche tutto, da docx a LaTeX a ePUB.
Chris Krycho il

pandoc *.md > markdown_book.htmlrisulta pandoc: *.md: openfile: invalid argument (Invalid argument)- non sembra supportare la sintassi specificata.
Jason Young,

Funziona sul mio sistema. Ho creato un repository di esempio su GitHub in modo da poterlo provare con tutti i file che ho usato.
Aaron Massey,

Puoi allineare le immagini includendo alcuni CSS appropriati, che è probabilmente il modo in cui dovresti comunque fare le cose.
101,

50

Vorrei solo menzionare che è possibile utilizzare il catcomando per concatenare i file di input prima di inviarli a piping markdown_pyche hanno lo stesso effetto di ciò che pandocaccade con più file di input in arrivo.

cat *.md | markdown_py > youroutputname.html

funziona più o meno come nell'esempio pandoc sopra per la versione Python di Markdown sul mio Mac.


1
@ tprk77: ad eccezione del fatto che la risposta di Aaron chiarisce che qui il comando cat è ridondante ..
nought101

1
L'uso di cat *.mdimplica una convenzione di denominazione dei file non flessibile. Non solo questa convenzione proibirebbe necessariamente le inclusioni ricorsive, per progetti di documentazione più grandi sarebbe doloroso aggiungere nuovi file nel mix. Dovresti fare molto conteggio e rinominazione. Il progetto di svalutazione ha avuto un preprocessore proprio per questo scopo dall'anno 2010.
ninegrid

@ninegrid Mentre MarkdownPP sembra molto utile, guardando il repository di origine a cui hai fatto riferimento nella tua risposta mi sembra (a) MarkdownPP è solo il progetto di John Reese; (b) non fa affatto parte del "progetto markdown" (uno dei vari gusti); e (c) MarkdownPP genera GFM, in particolare. Corretta? Come ho detto, sembra interessante e utile, ma il tuo commento qui fa sembrare che sia una caratteristica Markdown standard che dovrebbe venire con ogni implementazione di Markdown. Ma osservando il pronti contro termine, la situazione sembra essere l'esatto contrario.
FeRD

Impossibile convertire le tabelle MD in tabelle HTML.
james.garriss il

30

Puoi effettivamente utilizzare Markdown Preprocessor ( MarkdownPP ). Eseguendo l'esempio di libro ipotetico dalle altre risposte, creeresti .mdppfile che rappresentano i tuoi capitoli. I .mdppfile possono quindi utilizzare la !INCLUDE "path/to/file.mdpp"direttiva, che opera sostituendo in modo ricorsivo la direttiva con il contenuto del file di riferimento nell'output finale.

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

Avresti quindi bisogno di uno index.mdppche contenesse quanto segue:

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

Per rendere il tuo libro devi semplicemente eseguire il preprocessore su index.mdpp:

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

Non dimenticate di guardare il readme.mdppnel MarkdownPP repository per un'esposizione di preprocessore caratteristiche adatte per progetti di documentazione più grandi.


19

La mia soluzione è usare m4. È supportato sulla maggior parte delle piattaforme ed è incluso nel pacchetto binutils.

Per prima cosa includi una macro changequote()nel file per cambiare i caratteri di citazione in quello che preferisci (il valore predefinito è ``). La macro viene rimossa quando il file viene elaborato.

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

Sulla riga di comando:

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

2
m4è a malapena noto, ma è davvero uno strumento incredibilmente potente quando si tratta di tali esigenze di inclusione generiche. Abbastanza da menzionare la documentazione che può essere "abbastanza avvincente".
Uriel,

Ora, che è una soluzione! Genius
Brandt,

+1 per l'idea e il promemoria di m4 ! La cosa divertente è che quando ho visto le estensioni sopra come 'md' stavo pensando nella mia testa di m4 . Che tu includa un esempio è fantastico. Non sono sicuro che questa domanda chieda esattamente cosa sto cercando, ma potrebbe fare. Grazie in entrambi i casi.
Pryftan,

15

Proprio di recente ho scritto qualcosa di simile in Node chiamato markdown-include che ti permette di includere file markdown con sintassi in stile C, in questo modo:

#include "my-file.md"

Credo che questo si allinea perfettamente con la domanda che stai ponendo. Conosco questo vecchio, ma volevo aggiornarlo almeno.

Puoi includerlo in qualsiasi file markdown che desideri. Quel file può anche avere più inclusioni e markdown-include creerà un collegamento interno e farà tutto il lavoro per te.

Puoi scaricarlo tramite npm

npm install -g markdown-include

1
Questo è stato molto utile! Grazie!
Leas

@leas Sono contento di essere al servizio ... Non ci lavoro da parecchi anni, ma ho sempre intenzione di tornare ad un certo punto. Speriamo che vada bene per i tuoi scopi.
Sethen,

9

Multimarkdown ha questo nativamente. Lo chiama inclusione dei file :

{{some_other_file.txt}}

è tutto ciò che serve. Nome strano, ma spunta tutte le caselle.


ci sono editor gratuiti e open source per rendere questa sintassi? Ho fatto questa domanda qui con maggiori dettagli. Gradirei se mi potessi aiutare.
Foad,

1
@Foad: temo di essere un utente VIM e non sono a conoscenza di tali editor. Vedo sul tuo reddit Q che hai scoperto che Asciidoc e vari redattori lo supportano. Non lo sapevo, grazie.
eff

Felice che sia stato utile. Ma vim ha un'anteprima dal vivo per MultiMarkDown? saresti gentile a condividere i file di installazione e dot con qualche dettaglio in più?
Foad,

1
Nessuna anteprima dal vivo, non sono quel tipo di ragazzo. ;) Il motivo principale per cui ho usato il markdown era perché mira a essere leggibile dall'uomo quando non viene elaborato, quindi non mi dispiace molto per le anteprime (anche se capisco perché gli altri lo fanno). L'unica cosa che mi interessa, in questo caso, è l'evidenziazione della sintassi e l'evidenziazione della sintassi di markdown predefinita funziona abbastanza bene per me. Mi dispiace non essere di ulteriore aiuto.
eff

1
Sembra che potrebbe essere interessante, anche se non vedo alcun motivo per sceglierlo su markdown / asciidoc almeno per i miei (magri) scopi.
eff

8

Uso un includes.txtfile con tutti i miei file nell'ordine giusto, eseguo pandoc in questo modo:

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

Funziona come un fascino!


1
Grande approccio . Specificare l'ordine dei file è fondamentale, ma non si ottiene con i globmetodi se non si numerano i file.
ephsmith

Potresti includere una spiegazione dei passaggi? Sembra così potente! Vorrei sapere se è possibile ridurlo per fare altre conversioni come .pdf e .tex.
nilon,

6

In effetti puoi usare \input{filename}e \include{filename}quali sono i comandi in lattice, direttamente dentro Pandoc, perché supporta quasi tutti htmlelatex sintassi.

Ma attenzione, il file incluso verrà trattato come latexfile. Ma si può compilare il markdowna latexcon Pandoxfacilità.


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) è in realtà un ribasso sugli steroidi. Complessivamente, Asciidoc e Markdown appariranno molto simili ed è piuttosto facile cambiare. Un enorme vantaggio di Asciidoc rispetto al markdown è che supporta già include, per altri file Asciidoc ma anche per qualsiasi formato che ti piace. È anche possibile includere parzialmente i file in base ai numeri di riga o ai tag all'interno dei file inclusi.

Includere altri file è davvero un salvavita quando scrivi documenti.

Ad esempio, puoi avere un file asciidoc con tale contenuto:

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

e mantieni il tuo campione in script.pl

E sono sicuro che ti chiederai, quindi sì, Github supporta anche asciidoc.


Sembra esserci una bella promessa qui, ma non fornisce una risposta completa con i passaggi. È possibile indicare come convertire il documento multi-file in uno singolo?
nilon,

Questa è la migliore soluzione in questa pagina finora. Sono giunto a questa conclusione e ho affrontato la questione qui su Reddit . AsciiDoc ha incluso include ed è reso da GitHub. Atom e vscode hanno entrambi dei bei plugin anche per l'anteprima dal vivo. Mi chiedo perché AsciiDoc non sia già lo standard del settore!
Foad,

4

Penso che dovremmo adottare una nuova sintassi di inclusione dei file (quindi non fare confusione con i blocchi di codice, penso che l'inclusione in stile C sia totalmente sbagliata) e ho scritto un piccolo strumento in Perl, nominando cat.pl, perché funziona comecat ( cat a.txt b.txt c.txtsi fonderanno tre file), ma unisce i file in profondità , non in larghezza . Come usare?

$ perl cat.pl <your file>

La sintassi in dettaglio è:

  • file include ricorsivi: @include <-=path=
  • includine solo uno: %include <-=path=

Può gestire correttamente i cicli di inclusione dei file (se a.txt <- b.txt, b.txt <- a.txt, quindi cosa ti aspetti?).

Esempio:

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

Altri esempi su https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md .

Ho anche scritto una versione Java con un effetto identico (non uguale, ma vicino).


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

Da notare, @è usato per citazioni con pandoc-citeproc(es. " @Darwin1859").
PlasmaBinturong,

4

In realtà sono sorpreso che nessuno in questa pagina abbia offerto soluzioni HTML. Per quanto ho capito, i file MarkDown possono includere un'ampia porzione (se non tutti) di tag HTML. Quindi segui questi passaggi:

  1. Da qui : inserisci i tuoi file MarkDown nei <span style="display:block"> ... </span>tag per assicurarti che vengano visualizzati come markdown. Hai molte altre proprietà di stile che puoi aggiungere. Quello che mi piace è il text-align:justify.

  2. Da qui : includi i file nel tuo file principale usando il<iframe src="/path/to/file.md" seamless></iframe>

PS1. questa soluzione non funziona su tutti i motori / render MarkDown. Ad esempio, Typora ha eseguito correttamente il rendering dei file, ma Visual Studio Code no. Sarebbe bello se gli altri potessero condividere la loro esperienza con altre piattaforme. In particolare, vorrei sapere di GitHub e GitLab ...

PS2. Su ulteriori indagini sembrano esserci importanti problemi di incompatibilità che portano a non renderlo correttamente su molte piattaforme, tra cui Typora, GitHub e Visual Studio. Si prega di non utilizzare questo fino a quando non li risolverò. Non eliminerò la risposta solo per motivi di discussione e se forse puoi condividere le tue opinioni.

PS3. Per approfondire ulteriormente questo problema, ho posto queste domande qui su StackOverflow e qui su Reddit .

PS4. Dopo alcuni studi, sono giunto alla conclusione che per il momento AsciiDoc è un'opzione migliore per la documentazione. Viene fornito con funzionalità di inclusione integrata, è reso da GitHub e i principali editor di codice come Atom e vscode hanno estensioni per l'anteprima dal vivo. Si può usare Pandoc o altri strumenti per convertire automaticamente il codice MarkDown esistente in AsciiDoc con modifiche minori.

PS5. Un altro linguaggio di markup leggero con funzionalità di inclusione integrata è reStructuredText. Viene fornito con la .. include:: inclusion.txt sintassi di serie. C'è anche l'editor ReText con anteprima dal vivo.


1

So che questa è una vecchia domanda, ma non ho visto alcuna risposta a questo effetto: essenzialmente, se stai usando markdown e pandoc per convertire il tuo file in pdf, nei tuoi dati yaml nella parte superiore della pagina, puoi includere qualcosa come questo:

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

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

# Section

Blah blah

## Section 

Blah blah

Poiché pandoc utilizza il lattice per convertire tutti i tuoi documenti, la header-includessezione chiama il pacchetto pdfpages. Quindi, quando includi \includepdf{/path/to/pdf/document.pdf}, inserirà tutto ciò che è incluso in quel documento. Inoltre, puoi includere più file pdf in questo modo.

Come bonus divertente, e questo solo perché uso spesso markdown, se desideri includere file diversi dal markdown, ad esempio file in lattice. Ho modificato in qualche modo questa risposta . Supponi di avere un file markdown markdown1.md:

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

E due file di lattice addizionale document1, che assomiglia a questo:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

E un altro, document2.tex, che assomiglia a questo:

\section{Section

Glah

\subsection{Section}

Balh Balh

Supponendo che si desidera includere document1.tex e document2.tex in markdown1.md, si dovrebbe semplicemente fare questo per markdown1.md

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

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

Passaci sopra, ad es

nel terminale pandoc markdown1.md -o markdown1.pdf

Il tuo documento finale sarà in qualche modo simile a questo:

Qualcosa che significa pieno

Testa parlante

Sezione

Profondità.

Sezione

Lama del rasoio.

Sezione

Glah

Sezione

Balh Balh


0

Uso Marked 2 su Mac OS X. Supporta la sintassi seguente per includere altri file.

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

Purtroppo, non puoi dargli da pandoc perché non capisce la sintassi. Tuttavia, scrivere uno script per eliminare la sintassi e costruire una riga di comando pandoc è abbastanza semplice.


7
ti capita di avere la sceneggiatura invece di dire semplicemente che è facile? :)
toobulkeh,

0

Un'altra soluzione lato client basata su HTML che utilizza markdown-it e jQuery . Di seguito è riportato un piccolo wrapper HTML come documento master, che supporta inclusioni illimitate di file markdown, ma non include nidificate. La spiegazione è fornita nei commenti su JS. La gestione degli errori è stata omessa.

<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, puoi ottenere il tuo risultato concatenando i tuoi file di input * .md come:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.