Markdown e incluindo vários arquivos

197

Existe alguma bifurcação de marcação que permita que você faça referência a outros arquivos, algo como um arquivo de inclusão? Especificamente, quero criar um arquivo de remarcação separado com links que chamo frequentemente, mas nem sempre (chamo isso de B.md); quando vinculo por referência no arquivo md que estou escrevendo (A.md), gostaria de extrair o link do outro arquivo (B.md) e não do final do arquivo atual (A.md).

David LaSpina
fonte
1
Se a sua pergunta estiver relacionada a descontos no github, você pode dar uma olhada aqui #
Adi Prasetyo
3
A regra de ouro para Markdown é que a resposta para 'Can Markdown ...' é geralmente 'Não prática, universal ou facilmente'.
Michael Scheper
4
Há uma discussão aberta sobre a melhor forma de fazer isso com Pandoc sobre a github.com/jgm/pandoc/issues/553 e no fórum commonmark em talk.commonmark.org/t/...
naught101

Respostas:

217

A resposta curta é não. A resposta longa é sim. :-)

O Markdown foi projetado para permitir que as pessoas escrevam texto simples e legível que pudesse ser facilmente convertido em uma simples marcação HTML. Realmente não faz o layout do documento. Por exemplo, não há uma maneira real de alinhar uma imagem à direita ou esquerda. Quanto à sua pergunta, não há comando de remarcação para incluir um único link de um arquivo para outro em qualquer versão da remarcação (até onde eu saiba).

O mais próximo que você pode chegar dessa funcionalidade é Pandoc . O Pandoc permite mesclar arquivos como parte da transformação, o que permite renderizar facilmente vários arquivos em uma única saída. Por exemplo, se você estivesse criando um livro, poderia ter capítulos como este:

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

Você pode mesclá-los executando este comando no mesmo diretório:

pandoc *.md > markdown_book.html

Como o pandoc mesclará todos os arquivos antes de fazer a tradução, você pode incluir seus links no último arquivo como este:

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

Portanto, parte do seu 01_preface.mdpode ser assim:

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

E parte do seu 02_introduction.mdpode ficar assim:

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

Contanto que seu último arquivo inclua a linha:

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

... o mesmo comando usado anteriormente executará a mesclagem e a conversão enquanto inclui esse link por toda parte. Apenas certifique-se de deixar uma ou duas linhas em branco no início desse arquivo. A documentação do pandoc diz que adiciona uma linha em branco entre os arquivos que são mesclados dessa maneira, mas isso não funcionou para mim sem a linha em branco.

Aaron Massey
fonte
6
Isso acaba sendo um post extremamente útil para mim! Obrigado Aaron. Parece que seria um caso de uso comum ter um / capítulos dir, um script que constrói / mescla capítulos e, em seguida, um script de wrapper de nível superior que inclui uma etapa como: --include-before-body $ (include_dir) / merged_chapters .html. Essa é a abordagem que adotarei para obter algum benefício organizacional.
Rob
1
Uma outra vantagem do uso do pandoc é que ele suporta uma enorme variedade de saídas: você pode gerar não apenas HTML, mas também tudo, de docx a LaTeX e ePUB.
Chris Krycho
pandoc *.md > markdown_book.htmlresulta em pandoc: *.md: openfile: invalid argument (Invalid argument)- parece não suportar a sintaxe especificada.
Jason Young
Está funcionando no meu sistema. Criei um repositório de amostra no GitHub para que você possa experimentá-lo com todos os arquivos que usei.
Aaron Massey
Você pode alinhar as imagens corretamente incluindo algum CSS apropriado, que é como você provavelmente deveria estar fazendo as coisas de qualquer maneira.
Naft101
50

Gostaria apenas de mencionar que você pode usar o catcomando para concatenar os arquivos de entrada antes de canalizá-los para os markdown_pyquais tem o mesmo efeito do que pandococorre com vários arquivos de entrada.

cat *.md | markdown_py > youroutputname.html

funciona da mesma forma que o exemplo pandoc acima para a versão Python do Markdown no meu Mac.

Marty Heyman
fonte
1
@ tprk77: exceto que a resposta de Aaron deixa claro que o comando cat é redundante aqui ..
naught101
1
O uso de cat *.mdimplica uma convenção de nomenclatura de arquivos inflexível. Essa convenção não apenas proibiria necessariamente inclusões recursivas; para projetos de documentação maiores, seria doloroso adicionar novos arquivos à mistura. Você teria que contar muito e renomear. O projeto remarcação teve um pré-processador para este fim desde o ano de 2010.
ninegrid
@ninegrid Embora o MarkdownPP pareça muito útil, olhando para o repositório de origem que você referenciou na sua resposta, parece-me (a) o MarkdownPP é o projeto de John Reese, apenas; (b) não faz parte do "projeto de remarcação" (qualquer um dos vários sabores); e (c) o MarkdownPP gera GFM, especificamente. Corrigir? Como eu disse, parece interessante e útil, mas seu comentário aqui soa como um recurso padrão do Markdown que toda implementação do Markdown deve incluir. Mas, olhando o repositório, a situação parece ser completamente o oposto.
FeRD
Falha ao converter tabelas MD em tabelas HTML.
james.garriss 25/03
30

Você pode realmente usar o pré-processador Markdown ( MarkdownPP ). Correndo com o exemplo de livro hipotético das outras respostas, você criaria .mdpparquivos representando seus capítulos. Os .mdpparquivos podem usar a !INCLUDE "path/to/file.mdpp"diretiva, que opera recursivamente substituindo a diretiva pelo conteúdo do arquivo referenciado na saída final.

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

Você precisaria de um index.mdppque contivesse o seguinte:

!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 seu livro, basta executar o pré-processador em index.mdpp:

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

Não se esqueça de consultar o repositório readme.mdppdo MarkdownPP para obter uma exposição dos recursos do pré-processador adequados para projetos de documentação maiores.

ninegrídeo
fonte
19

Minha solução é usar m4. É suportado na maioria das plataformas e está incluído no pacote binutils.

Primeiro, inclua uma macro changequote()no arquivo para alterar os caracteres entre aspas para o que você preferir (o padrão é ``). A macro é removida quando o arquivo é processado.

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

Na linha de comando:

m4 -I./dir_containing_other_file/ input.md > _tmp.md
pandoc -o output.html _tmp.md
Ben Hochstedler
fonte
2
m4é pouco conhecido, mas é de fato uma ferramenta incrivelmente poderosa quando se trata de necessidades de inclusão tão genéricas. O suficiente para ter a documentação mencionada, pode ser "bastante viciante".
Uriel
Agora, essa é uma solução! Gênio
Brandt
+1 para a ideia e lembrete de m4 ! O engraçado é que, quando vi as extensões acima como 'md', pensei na minha cabeça do m4 . Que você inclua um exemplo é ótimo. Não tenho certeza se esta pergunta pergunta exatamente o que estou procurando, mas pode fazer. Obrigado de qualquer maneira.
Pryftan
15

Recentemente, escrevi algo assim no Node chamado markdown-include que permite incluir arquivos de markdown com sintaxe no estilo C, da seguinte forma:

#include "my-file.md"

Acredito que isso esteja alinhado com a pergunta que você está fazendo. Eu sei que isso é antigo, mas eu queria atualizá-lo pelo menos.

Você pode incluí-lo em qualquer arquivo de remarcação que desejar. Esse arquivo também pode ter mais inclusões e o markdown-include criará um link interno e fará todo o trabalho para você.

Você pode baixá-lo via npm

npm install -g markdown-include
Sethen
fonte
1
Isso tem sido muito útil! Obrigado!
leas
@ leas Fico feliz em ajudar ... Eu não trabalho nisso há alguns anos, mas sempre pretendo voltar a ele em algum momento. Espero que ele se dê bem para seus propósitos.
Sethen
9

Multimarkdown tem isso nativamente. Ele chama isso de transclusão de arquivo :

{{some_other_file.txt}}

é tudo o que é preciso. Nome estranho, mas marca todas as caixas.

eff
fonte
existem editores livres e de código aberto para renderizar essa sintaxe? Eu fiz essa pergunta aqui com mais detalhes. Eu apreciaria se você pudesse me ajudar com isso.
Foad 14/03/19
1
@Foad: Receio ser um usuário do vim e não ter conhecimento de nenhum desses editores. Vejo no seu reddit Q que você descobriu que o Asciidoc, e vários editores de, suportam isso. Eu não sabia disso - obrigado.
ef
Feliz por ter sido útil. Mas o vim tem visualização ao vivo para o MultiMarkDown? você gostaria de compartilhar seus arquivos de configuração e de pontos com mais alguns detalhes?
Foad 15/03/19
1
Sem visualização ao vivo, eu não sou esse tipo de cara. ;) A principal razão pela qual eu usei o markdown foi porque ele é legível por humanos quando não é processado, então eu realmente não me importo muito com visualizações (apesar de entender por que outras pessoas o fazem). A única coisa que me interessa, nesse caso, é o destaque da sintaxe, e o destaque da sintaxe de remarcação padrão funciona bem o suficiente para mim. Desculpe por não ser de mais ajuda.
FEP
1
Parece que poderia ser interessante, embora eu não veja motivo para escolher o markdown / asciidoc para meus objetivos (escassos), pelo menos.
FEP
8

Eu uso um includes.txtarquivo com todos os meus arquivos na ordem correta e executo o pandoc assim:

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

Funciona como um encanto!

Mike Mitterer
fonte
1
Ótima abordagem . A especificação da ordem dos arquivos é fundamental, mas não é realizada com os globmétodos, a menos que você numerar arquivos.
ephsmith
Você poderia incluir uma explicação das etapas? Parece tão poderoso! Gostaria de saber se é possível reduzi-lo para fazer outras conversões, como .pdf e .tex.
Nilon 25/02/19
6

De fato, você pode usar \input{filename}e \include{filename}quais são os comandos de látex diretamente Pandoc, porque suporta quase todos htmle latexsintaxe.

Mas cuidado, o arquivo incluído será tratado como latexarquivo. Mas você pode compilar o seu markdownpara latexcom Pandoxfacilmente.

Wung Hugh
fonte
6

O Asciidoc ( http://www.methods.co.nz/asciidoc/ ) é na verdade uma redução dos esteróides. No geral, o Asciidoc e o Markdown serão muito parecidos e é bastante fácil alternar. Um grande benefício do Asciidoc sobre a remarcação é que ele já inclui inclusões, para outros arquivos Asciidoc, mas também para qualquer formato que você desejar. Você pode até incluir parcialmente arquivos com base em números de linha ou tags nos arquivos incluídos.

Incluir outros arquivos é realmente um salva-vidas quando você escreve documentos.

Você pode, por exemplo, ter um arquivo asciidoc com esse conteúdo:

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

e mantenha sua amostra em script.pl

E tenho certeza que você se perguntará, sim, o Github também suporta o asciidoc.

Wilfried Kopp
fonte
Parece haver uma boa promessa aqui, mas não fornece uma resposta completa com as etapas de instruções. É possível indicar como converter o documento com vários arquivos em um único?
Nilon 25/02/19
Esta é a melhor solução desta página até agora. Cheguei a essa conclusão e resolvi a questão aqui no Reddit . O AsciiDoc possui inclusão embutida e é renderizada pelo GitHub. Atom e vscode também possuem ótimos plugins para visualização ao vivo. Eu me pergunto por que o AsciiDoc ainda não é o padrão da indústria!
Foad 14/03/19
4

Eu acho que é melhor adotar uma nova sintaxe de inclusão de arquivo (para não atrapalhar os blocos de código, acho que a inclusão do estilo C está totalmente errada), e escrevi uma pequena ferramenta no Perl, nomeando cat.pl, porque funciona comocat ( cat a.txt b.txt c.txtirá mesclar três arquivos), mas mescla arquivos em profundidade , não em largura . Como usar?

$ perl cat.pl <your file>

A sintaxe em detalhes é:

  • arquivos de inclusão recursivos: @include <-=path=
  • inclua apenas um: %include <-=path=

Ele pode lidar adequadamente com os loops de inclusão de arquivo (se a.txt <- b.txt, b.txt <- a.txt, o que você espera?).

Exemplo:

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

Mais exemplos em https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md .

Também escrevi uma versão Java com um efeito idêntico (não o mesmo, mas próximo).

dvorak4tzx
fonte
<<[include_file.md](Marcado como 2 no macOS): gist.github.com/district10/d46a0e207d888d0526aef94fb8d8998c
dvorak4tzx
De nota, @é usado para citações com pandoc-citeproc(por exemplo, " @Darwin1859").
PlasmaBinturong
4

Estou realmente surpreso que ninguém nesta página tenha oferecido soluções em HTML. Até onde eu entendi, os arquivos MarkDown podem incluir uma grande parte (se não todas) das tags HTML. Portanto, siga estas etapas:

  1. A partir daqui : coloque seus arquivos MarkDown em <span style="display:block"> ... </span>tags para garantir que eles serão renderizados como descontos. Você tem várias outras propriedades de estilo que você pode adicionar. O que eu gosto é o text-align:justify.

  2. A partir daqui : inclua os arquivos no seu arquivo principal usando o<iframe src="/path/to/file.md" seamless></iframe>

PS1. esta solução não funciona em todos os mecanismos / renderizações do MarkDown. Por exemplo, Typora processou os arquivos corretamente, mas o Visual Studio Code não. Seria ótimo se outros pudessem compartilhar sua experiência com outras plataformas. Especialmente, gostaria de ouvir sobre o GitHub e o GitLab ...

PS2. Em uma investigação mais aprofundada, parece haver grandes problemas de incompatibilidade que fazem com que isso não seja processado corretamente em muitas plataformas, incluindo os códigos Typora, GitHub e Visual Studio. Por favor, não use isso até que eu os resolva. Não vou excluir a resposta apenas para fins de discussão e, se você puder compartilhar suas opiniões.

PS3. Para investigar mais esse problema, eu fiz essas perguntas aqui no StackOverflow e aqui no Reddit .

PS4. Depois de alguns estudos, cheguei à conclusão de que, no momento, o AsciiDoc é uma opção melhor para documentação. Ele vem com funcionalidade de inclusão embutida, é renderizado pelo GitHub, e os principais editores de código como Atom e vscode têm extensões para visualização ao vivo. Pode-se usar Pandoc ou outras ferramentas para converter automaticamente o código MarkDown existente em AsciiDoc com pequenas alterações.

PS5. Outra linguagem de marcação leve com a funcionalidade de inclusão integrada é reStructuredText. Ele vem com .. include:: inclusion.txt sintaxe por padrão. Há o editor ReText com visualização ao vivo também.

Foad
fonte
1

Sei que essa é uma pergunta antiga, mas ainda não vi respostas para esse efeito: essencialmente, se você estiver usando markdown e pandoc para converter seu arquivo em pdf, nos dados do yaml na parte superior da página, inclua algo assim:

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

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

# Section

Blah blah

## Section 

Blah blah

Como o pandoc usa o látex para converter todos os seus documentos, a header-includesseção chama o pacote pdfpages. Quando você incluir, \includepdf{/path/to/pdf/document.pdf}ele inserirá o que for incluído nesse documento. Além disso, você pode incluir vários arquivos pdf dessa maneira.

Como um bônus divertido, e isso é apenas porque geralmente uso remarcações, se você quiser incluir outros arquivos que não sejam remarcações, por exemplo, arquivos de látex. Eu modifiquei esta resposta um pouco. Digamos que você tenha um arquivo de remarcação markdown1.md:

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

E dois arquivos de látex adicionais document1, que são assim:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

E outro, document2.tex, que se parece com isso:

\section{Section

Glah

\subsection{Section}

Balh Balh

Supondo que você queira incluir document1.tex e document2.tex em markdown1.md, você faria isso apenas em markdown1.md

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

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

Execute o pandoc sobre ele, por exemplo

no terminal pandoc markdown1.md -o markdown1.pdf

Seu documento final será mais ou menos assim:

Algo Significado Completo

Talking Head

Seção

Profundidade.

Seção

Fio da navalha.

Seção

Glah

Seção

Balh Balh

redapemusic35
fonte
0

Uso Marcado 2 no Mac OS X. Ele suporta a seguinte sintaxe para incluir outros arquivos.

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

Infelizmente, você não pode alimentar isso como pandoc, pois ele não entende a sintaxe. No entanto, escrever um script para remover a sintaxe e construir uma linha de comando pandoc é bastante fácil.

paxos1977
fonte
7
você teria o script em vez de apenas dizer que é fácil? :)
toobulkeh
0

Outra solução baseada em HTML, no lado do cliente, usando markdown-it e jQuery . Abaixo está um pequeno invólucro HTML como documento mestre, que suporta inclusões ilimitadas de arquivos de descontos, mas não inclusas aninhadas. A explicação é fornecida nos comentários do JS. O tratamento de erros é omitido.

<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>
David Clarke
fonte
-5

IMHO, você pode obter seu resultado concatenando seus arquivos de entrada * .md como:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
variável
fonte