Markdown e incluye múltiples archivos


197

¿Hay alguna bifurcación de descuento que le permita hacer referencia a otros archivos, algo así como un archivo de inclusión? Específicamente, quiero crear un archivo de descuento por separado con enlaces que llamo a menudo pero no siempre (llame a esto B.md), luego, cuando enlace por referencia en el archivo md que estoy escribiendo (A.md), me gustaría desea que extraiga el enlace del otro archivo (B.md) en lugar del final del archivo actual (A.md).


1
Si su pregunta es un descuento relacionado con Github, puede echar un vistazo aquí
Adi Prasetyo

3
La regla general para Markdown es que la respuesta a 'Can Markdown ...' generalmente es 'No es práctica, universal o fácil'.
Michael Scheper

44
Hay una discusión abierta sobre la mejor manera de hacer esto con Pandoc en github.com/jgm/pandoc/issues/553 y en el foro de commonmark en talk.commonmark.org/t/…
naught101

Respuestas:


217

La respuesta corta es no. La respuesta larga es sí. :-)

Markdown fue diseñado para permitir que las personas escriban texto simple y legible que podría convertirse fácilmente en un marcado HTML simple. Realmente no hace el diseño del documento. Por ejemplo, no hay una forma real de alinear una imagen a la derecha o a la izquierda. En cuanto a su pregunta, no hay un comando de descuento para incluir un solo enlace de un archivo a otro en cualquier versión de descuento (hasta donde yo sé).

Lo más cercano a esta funcionalidad es Pandoc . Pandoc le permite fusionar archivos como parte de la transformación, lo que le permite renderizar fácilmente múltiples archivos en una sola salida. Por ejemplo, si estaba creando un libro, entonces podría tener capítulos como este:

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

Puede fusionarlos ejecutando este comando dentro del mismo directorio:

pandoc *.md > markdown_book.html

Dado que pandoc fusionará todos los archivos antes de hacer la traducción, puede incluir sus enlaces en el último archivo de esta manera:

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

Así que parte de tu 01_preface.mdpodría verse así:

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

Y parte de tu 02_introduction.mdpodría verse así:

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

Siempre que su último archivo incluya la línea:

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

... el mismo comando utilizado antes realizará la fusión y la conversión al tiempo que incluye ese enlace en todo momento. Solo asegúrese de dejar una o dos líneas en blanco al comienzo de ese archivo. La documentación de Pandoc dice que agrega una línea en blanco entre los archivos que se fusionan de esta manera, pero esto no funcionó para mí sin la línea en blanco.


66
¡Esto resulta ser una publicación extremadamente útil para mí! Gracias Aaron Parece que sería un caso de uso común tener un directorio / chapters, un script que crea / fusiona capítulos y luego un script de envoltura de nivel superior que incluye un paso como: --include-before-body $ (include_dir) / merged_chapters .html. Ese es el enfoque que tomaré para obtener algún beneficio organizacional.
Rob

1
Otra ventaja de usar pandoc es que admite una enorme variedad de resultados: puede generar no solo HTML sino también todo, desde docx hasta LaTeX y ePUB.
Chris Krycho

pandoc *.md > markdown_book.htmlda como resultado pandoc: *.md: openfile: invalid argument (Invalid argument)que no parece admitir la sintaxis que especificó.
Jason Young

Está funcionando en mi sistema. Creé un repositorio de muestra en GitHub para que pueda probarlo con todos los archivos que utilicé.
Aaron Massey

Puede alinear las imágenes correctamente al incluir un CSS apropiado, que es la forma en que probablemente debería estar haciendo las cosas de todos modos.
nada101

50

Solo mencionaría que puede usar el catcomando para concatenar los archivos de entrada antes de canalizarlos, lo markdown_pyque tiene el mismo efecto que lo que pandococurre con la entrada de múltiples archivos de entrada.

cat *.md | markdown_py > youroutputname.html

Funciona más o menos igual que el ejemplo de Pandoc anterior para la versión Python de Markdown en mi Mac.


1
@ tprk77: excepto que la respuesta de Aaron deja en claro que el comando cat es redundante aquí ...
nada101

1
El uso de cat *.mdimplica una convención de nomenclatura inflexible de archivos. Esta convención no solo prohibiría necesariamente las inclusiones recursivas, para proyectos de documentación más grandes sería doloroso agregar nuevos archivos a la mezcla. Tendría que contar y renombrar mucho. El proyecto de rebajas ha tenido un preprocesador para este mismo propósito desde el año 2010.
ninegrid

@ninegrid Si bien MarkdownPP se ve muy útil, al mirar el repositorio fuente al que hizo referencia en su respuesta, me parece (a) MarkdownPP es el proyecto de John Reese solamente; (b) no es parte del "proyecto de rebajas" (ninguno de los diversos sabores) en absoluto; y (c) MarkdownPP genera GFM, específicamente. ¿Correcto? Como dije, parece interesante y útil, pero su comentario aquí suena como si fuera una característica estándar de Markdown con la que debería venir toda implementación de Markdown. Pero al mirar el repositorio, la situación parece ser todo lo contrario.
FeRD

No puede convertir las tablas de MD en tablas HTML.
james.garriss

30

En realidad, puede usar el preprocesador Markdown ( MarkdownPP ). Con el ejemplo hipotético del libro de las otras respuestas, crearía .mdpparchivos que representan sus capítulos. Los .mdpparchivos pueden usar la !INCLUDE "path/to/file.mdpp"directiva, que opera de forma recursiva reemplazando la directiva con el contenido del archivo referenciado en la salida final.

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

Entonces necesitarías un index.mdppque contuviera lo siguiente:

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

Para renderizar su libro, simplemente ejecute el preprocesador en index.mdpp:

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

No se olvide de mirar el readme.mdppen el MarkdownPP repositorio para una exposición de preprocesador características adecuado para proyectos de documentación más grandes.


19

Mi solución es usar m4. Es compatible con la mayoría de las plataformas y está incluido en el paquete binutils.

Primero incluya una macro changequote()en el archivo para cambiar los caracteres entre comillas a lo que prefiera (el valor predeterminado es ``). La macro se elimina cuando se procesa el archivo.

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

En la línea de comando:

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

2
m4apenas se conoce, pero de hecho es una herramienta increíblemente poderosa cuando se trata de necesidades genéricas de inclusión. Lo suficiente como para que la documentación lo mencione puede ser "bastante adictivo".
Uriel

Ahora, esa es una solución! Genio
Brandt

¡+1 por la idea y el recordatorio de m4 ! Lo curioso es que cuando vi las extensiones anteriores como 'md' estaba pensando en mi cabeza de m4 . Que luego incluirías un ejemplo es genial. No estoy seguro de si esta pregunta pregunta exactamente qué es lo que busco, pero podría hacer. Gracias de cualquier manera.
Pryftan

15

Recientemente escribí algo como esto en Node llamado markdown-include que le permite incluir archivos de markdown con sintaxis de estilo C, de esta manera:

#include "my-file.md"

Creo que esto se alinea muy bien con la pregunta que haces. Sé que es viejo, pero quería actualizarlo al menos.

Puede incluir esto en cualquier archivo de descuento que desee. Ese archivo también puede tener más inclusiones y markdown-include hará un enlace interno y hará todo el trabajo por usted.

Puedes descargarlo a través de npm

npm install -g markdown-include

1
¡Esto ha sido muy util! ¡Gracias!
arrendamiento

@leas Me alegro de estar al servicio ... No he trabajado en eso en muchos años, pero siempre me refiero a volver en algún momento. Esperemos que le vaya bien para sus propósitos.
Sethen

9

Multimarkdown tiene esto de forma nativa. Lo llama transclusión de archivos :

{{some_other_file.txt}}

Es todo lo que se necesita. Nombre extraño, pero cumple todos los requisitos.


¿Hay editores de código abierto y gratuito para representar esta sintaxis? He hecho esta pregunta aquí con más detalles. Le agradecería si pudiera ayudarme con eso.
Foad

1
@Foad: me temo que soy un usuario de vim y no conozco ninguno de esos editores. Veo en su reddit Q que encontró que Asciidoc, y varios editores de, lo respaldan. No sabía esto, gracias.
eff

Feliz de que haya sido útil. ¿Pero vim tiene vista previa en vivo para MultiMarkDown? ¿Le gustaría compartir su configuración y archivos de puntos con más detalles?
Foad

1
No hay vista previa en vivo, no soy ese tipo de persona. ;) La razón principal por la que utilicé Markdown fue porque pretende ser legible para humanos cuando no se procesa, por lo que realmente no me importan demasiado las vistas previas (aunque entiendo por qué otros lo hacen). Lo único que me interesa, en este caso, es el resaltado de sintaxis, y el resaltado de sintaxis de marcado predeterminado funciona bastante bien para mí. Lamento no ser de más ayuda.
eff

1
Parece que podría ser interesante, aunque no veo ninguna razón para elegirlo en lugar de markdown / asciidoc para mis (escasos) propósitos, al menos.
Eff

8

Utilizo un includes.txtarchivo con todos mis archivos en el orden correcto y ejecuto pandoc de esta manera:

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

¡Funciona de maravilla!


1
Gran acercamiento . Especificar el orden de los archivos es fundamental, pero no se logra con los globmétodos a menos que numere los archivos.
ephsmith

¿Podría incluir una explicación de los pasos? ¡Parece tan poderoso! Me gustaría saber si es posible recortarlo para hacer otras conversiones como .pdf y .tex.
nilon

6

De hecho, puede usar \input{filename}y \include{filename}cuáles son comandos de látex, directamente Pandoc, porque admite casi todos htmlylatex sintaxis.

Pero cuidado, el archivo incluido será tratado como un latexarchivo. Pero se puede compilar el markdownque latexcon Pandoxfacilidad.


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) es en realidad un descuento en los esteroides. En general, Asciidoc y Markdown se verán muy similares y es bastante fácil de cambiar. Un enorme ventaja de Asciidoc sobre el descuento es que ya admite incluir, para otros archivos de Asciidoc, pero también para cualquier formato que desee. Incluso puede incluir en parte archivos basados ​​en números de línea o etiquetas dentro de sus archivos incluidos.

Incluir otros archivos es realmente un salvavidas cuando escribes documentos.

Por ejemplo, puede tener un archivo asciidoc con dicho contenido:

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

y mantenga su muestra en script.pl

Y estoy seguro de que te preguntarás, así que sí, Github también es compatible con el asciidoc.


Parece que hay una buena promesa aquí, pero no da una respuesta completa con los pasos a seguir. ¿Es posible establecer cómo convertir el documento de varios archivos en uno solo?
nilon

Esta es la mejor solución en esta página hasta ahora. Llegué a esta conclusión y abordé el problema aquí en Reddit . AsciiDoc tiene una función incorporada incluida y está representada por GitHub. Atom y vscode tienen buenos complementos para la vista previa en vivo también. ¡Me pregunto por qué AsciiDoc ya no es el estándar de la industria!
Foad

4

Creo que es mejor que adoptemos una nueva sintaxis de inclusión de archivos (por lo que no se equivocará con los bloques de código, creo que la inclusión del estilo C es totalmente incorrecta), y escribí una pequeña herramienta en Perl, nombrando cat.pl, porque funciona comocat ( cat a.txt b.txt c.txtse fusionará tres archivos), pero combina archivos en profundidad , no en ancho . ¿Cómo utilizar?

$ perl cat.pl <your file>

La sintaxis en detalle es:

  • incluyen archivos recursivos: @include <-=path=
  • solo incluye uno: %include <-=path=

Puede manejar adecuadamente los bucles de inclusión de archivos (si a.txt <- b.txt, b.txt <- a.txt, ¿entonces qué espera?).

Ejemplo:

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

Más ejemplos en https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md .

También escribí una versión de Java que tiene un efecto idéntico (no el mismo, pero cercano).



Es de destacar que @se utiliza para citas con pandoc-citeproc(por ejemplo, " @Darwin1859").
PlasmaBinturong

4

De hecho, estoy sorprendido de que nadie en esta página haya ofrecido soluciones HTML. Hasta donde he entendido, los archivos de MarkDown pueden incluir una gran parte (si no todas) de etiquetas HTML. Entonces siga estos pasos:

  1. Desde aquí : coloque sus archivos MarkDown en <span style="display:block"> ... </span>etiquetas para asegurarse de que se mostrarán como rebajas. Tiene muchas otras propiedades de estilo que puede agregar. El que me gusta es el text-align:justify.

  2. Desde aquí : incluya los archivos en su archivo principal utilizando el<iframe src="/path/to/file.md" seamless></iframe>

PS1 Esta solución no funciona en todos los motores / renders MarkDown. Por ejemplo, Typora renderizó los archivos correctamente pero Visual Studio Code no lo hizo. Sería genial si otros pudieran compartir su experiencia con otras plataformas. Especialmente me gustaría escuchar sobre GitHub y GitLab ...

PS2 En una investigación adicional, parece haber importantes problemas de incompatibilidad que llevan a que esto no se represente correctamente en muchas plataformas, incluidos Typora, GitHub y el código de Visual Studio. Por favor, no use esto hasta que los resuelva. No eliminaré la respuesta solo por el debate y si tal vez puedes compartir tus opiniones.

PS3 Para investigar más este problema, he hecho estas preguntas aquí en StackOverflow y aquí en Reddit .

PS4 Después de estudiar un poco, llegué a la conclusión de que por el momento AsciiDoc es una mejor opción para la documentación. Viene con la funcionalidad de inclusión incorporada, está representada por GitHub y los principales editores de código como Atom y vscode tienen extensiones para la vista previa en vivo. Se puede usar Pandoc u otras herramientas para convertir automáticamente el Código MarkDown existente a AsciiDoc con pequeños cambios.

PS5 Otro lenguaje de marcado ligero con funcionalidad de inclusión incorporada es reStructuredText. Viene con .. include:: inclusion.txt sintaxis de serie. También hay un editor ReText con vista previa en vivo.


1

Sé que esta es una pregunta antigua, pero no he visto ninguna respuesta a este efecto: esencialmente, si está utilizando Markdown y Pandoc para convertir su archivo a PDF, en sus datos de YAML en la parte superior de la página, puede incluir algo como esto:

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

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

# Section

Blah blah

## Section 

Blah blah

Dado que Pandoc usa latex para convertir todos sus documentos, la header-includessección llama al paquete pdfpages. Luego, cuando lo incluya \includepdf{/path/to/pdf/document.pdf}, insertará todo lo que se incluya en ese documento. Además, puede incluir múltiples archivos pdf de esta manera.

Como un bono divertido, y esto es solo porque a menudo uso Markdown, si desea incluir archivos que no sean Markdown, por ejemplo, archivos de látex. He modificado esta respuesta un poco. Supongamos que tiene un archivo de descuento markdown1.md:

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

Y dos archivos de látex adicionales document1, que se ve así:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

Y otro, document2.tex, que se ve así:

\section{Section

Glah

\subsection{Section}

Balh Balh

Suponiendo que desea incluir document1.tex y document2.tex en markdown1.md, simplemente haría esto en markdown1.md

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

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

Ejecute pandoc sobre él, p. Ej.

en terminal pandoc markdown1.md -o markdown1.pdf

Su documento final se verá más o menos así:

Algo que significa completo

Cabeza hablante

Sección

Profundidad.

Sección

Filo de la navaja.

Sección

Glah

Sección

Balh Balh


0

Uso Marked 2 en Mac OS X. Admite la siguiente sintaxis para incluir otros archivos.

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

Lamentablemente, no puede alimentar eso a pandoc ya que no entiende la sintaxis. Sin embargo, escribir un script para eliminar la sintaxis para construir una línea de comando pandoc es bastante fácil.


77
¿Tendría el script en lugar de decir que es fácil? :)
toobulkeh

0

Otra solución del lado del cliente basada en HTML que utiliza markdown-it y jQuery . A continuación se muestra un pequeño contenedor HTML como documento maestro, que admite inclusiones ilimitadas de archivos de descuento, pero no incluye anidadas. La explicación se proporciona en los comentarios de JS. Se omite el manejo de errores.

<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

En mi humilde opinión, puede obtener su resultado concatenando sus archivos de entrada * .md como:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.