Markdown i w tym wiele plików


197

Czy istnieje rozwidlenie przeceny, które pozwala odwoływać się do innych plików, na przykład plik dołączony? W szczególności chcę utworzyć osobny plik przeceny z linkami, które często wywołuję, ale nie zawsze (nazywam to B.md), a następnie, gdy odsyłam przez odniesienie w pliku md, który piszę (A.md), jak to, aby pobrać link z innego pliku (B.md), a nie z końca bieżącego pliku (A.md).


1
Jeśli twoje pytanie dotyczy obniżki cen na githubie, możesz zajrzeć tutaj
Adi Prasetyo

3
Zasadniczą zasadą Markdown jest to, że odpowiedź na „Can Markdown ...” zwykle brzmi „Nie praktycznie, uniwersalnie lub łatwo”.
Michael Scheper

4
Otwarta dyskusja na temat tego, jak najlepiej to zrobić z Pandoc na stronie github.com/jgm/pandoc/issues/553 oraz na forum commonmark
naught101

Odpowiedzi:


217

Krótka odpowiedź brzmi: nie. Długa odpowiedź brzmi: tak. :-)

Markdown został zaprojektowany, aby umożliwić ludziom pisanie prostego, czytelnego tekstu, który można łatwo przekształcić w prosty znacznik HTML. Tak naprawdę nie układa dokumentu. Na przykład nie ma realnego sposobu wyrównywania obrazu do prawej lub lewej strony. Jeśli chodzi o twoje pytanie, nie ma polecenia markdown, które zawierałoby pojedynczy link z jednego pliku do drugiego w dowolnej wersji markdown (o ile mi wiadomo).

Pandoc jest najbliżej tej funkcjonalności . Pandoc pozwala łączyć pliki w ramach transformacji, co pozwala łatwo renderować wiele plików w jedno wyjście. Na przykład, jeśli tworzysz książkę, możesz mieć następujące rozdziały:

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

Możesz je scalić, wykonując polecenie w tym samym katalogu:

pandoc *.md > markdown_book.html

Ponieważ pandoc scali wszystkie pliki przed wykonaniem tłumaczenia, możesz dołączyć swoje linki do ostatniego pliku w następujący sposób:

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

Więc część twojego 01_preface.mdmoże wyglądać tak:

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

Część twojej 02_introduction.mdmoże wyglądać tak:

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

Tak długo, jak twój ostatni plik zawiera wiersz:

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

... to samo polecenie użyte wcześniej wykona scalenie i konwersję, jednocześnie włączając to łącze w całym tekście. Tylko upewnij się, że zostawiłeś pustą linię lub dwie na początku tego pliku. Dokumentacja pandoc mówi, że dodaje pustą linię między plikami, które są scalane w ten sposób, ale nie działało to dla mnie bez pustej linii.


6
To okazuje się dla mnie niezwykle przydatnym postem! Dzięki Aaron. Wydaje się, że powszechnym przykładem jest posiadanie katalogu / chapters dir, jednego skryptu, który buduje / łączy rozdziały, a następnie skryptu opakowującego najwyższego poziomu, który zawiera krok taki jak: --include-before-body $ (include_dir) / scaled_chapters .html. Takie podejście zastosuję, aby uzyskać korzyści organizacyjne.
Rob

1
Kolejną zaletą używania pandoc jest to, że obsługuje on ogromną różnorodność danych wyjściowych: możesz generować nie tylko HTML, ale także wszystko, od docx do LaTeXa do ePUB.
Chris Krycho

pandoc *.md > markdown_book.htmlpowoduje w pandoc: *.md: openfile: invalid argument (Invalid argument)- wydaje się, że nie obsługuje podanej składni.
Jason Young,

Działa w moim systemie. Utworzyłem przykładowe repozytorium na GitHub , abyś mógł wypróbować je ze wszystkimi używanymi plikami.
Aaron Massey

Możesz wyrównywać obrazy, włączając odpowiedni CSS, i tak prawdopodobnie powinieneś robić różne rzeczy.
naught101

50

Chciałbym tylko wspomnieć, że można użyć catpolecenia, aby połączyć pliki wejściowe przed ich potokowaniem, markdown_pyco ma taki sam efekt, jak w pandocprzypadku wielu plików wejściowych.

cat *.md | markdown_py > youroutputname.html

działa prawie tak samo jak powyższy przykład pandoc dla Python wersji Markdown na moim Macu.


1
@ tprk77: z wyjątkiem tego, że odpowiedź Aarona wyjaśnia, że ​​polecenie kota jest tutaj zbędne.
naught101

1
Zastosowanie cat *.mdimplikuje nieelastyczną konwencję nazewnictwa plików. Konwencja ta nie tylko niekoniecznie zabrania stosowania rekurencyjnych, ale w przypadku większych projektów dokumentacji dodawanie nowych plików do miksu byłoby bolesne. Będziesz musiał dużo policzyć i zmienić nazwę. Projekt przeceny ma w tym celu preprocesor od 2010 roku.
ninegrid

@ninegrid Chociaż MarkdownPP wygląda bardzo przydatnie, patrząc na repozytorium źródłowe, na które się powołujesz w swojej odpowiedzi, wydaje mi się (a) MarkdownPP jest tylko projektem Johna Reese'a; (b) wcale nie jest częścią „projektu obniżki cen” (żadnego z różnych smaków); oraz (c) MarkdownPP wyprowadza GFM, w szczególności. Poprawny? Jak powiedziałem, wygląda interesująco i pomocnie, ale twój komentarz tutaj brzmi, jakby to była standardowa funkcja Markdown, z którą powinna być wyposażona każda implementacja Markdown. Ale patrząc na repo, sytuacja wydaje się zupełnie odwrotna.
FeRD

Nie można przekonwertować tabel MD na tabele HTML.
james.garriss

30

Możesz faktycznie użyć Markdown Preprocessor ( MarkdownPP ). Korzystając z hipotetycznego przykładu książki z innych odpowiedzi, tworzysz .mdpppliki reprezentujące twoje rozdziały. Te .mdpppliki mogą następnie korzystać z !INCLUDE "path/to/file.mdpp"dyrektywy, która działa rekursywnie zastępującej dyrektywę z zawartością pliku wskazanej w końcowej produkcji.

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

Potrzebny byłby wtedy plik index.mdppzawierający:

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

Aby renderować książkę, po prostu uruchom preprocesor na index.mdpp:

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

Nie zapomnij spojrzeć na readme.mdppw MarkdownPP repozytorium ekspozycja preprocesora funkcje dostosowane do większych projektów dokumentacji.


19

Moim rozwiązaniem jest użycie m4. Jest obsługiwany na większości platform i jest zawarty w pakiecie binutils.

Najpierw dołącz changequote()do pliku makro , aby zmienić znaki cudzysłowu na preferowane (domyślnie jest to ''). Makro jest usuwane podczas przetwarzania pliku.

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

W wierszu polecenia:

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

2
m4jest ledwo znany, ale w rzeczywistości jest niezwykle potężnym narzędziem, jeśli chodzi o takie ogólne potrzeby. Wystarczy wspomnieć o dokumentacji, że może być „dość uzależniająca”.
Uriel

Teraz, że jest to rozwiązanie! Geniusz
Brandt

+1 za pomysł i przypomnienie m4 ! Zabawne jest to, że kiedy zobaczyłem powyższe rozszerzenia jako „md”, myślałem w mojej głowie o m4 . To, że podasz przykład, jest świetne. Nie jestem pewien, czy to pytanie pyta dokładnie, o co mi chodzi, ale może to zrobić. Dziękuję tak czy inaczej.
Pryftan

15

Niedawno napisałem coś takiego w Node o nazwie markdown-include, która pozwala na dołączanie plików markdown ze składnią w stylu C, na przykład:

#include "my-file.md"

Wierzę, że to dobrze pasuje do pytania, które zadajesz. Wiem, że to stary, ale chciałem go przynajmniej zaktualizować.

Możesz dołączyć to do dowolnego pliku zniżki. Ten plik może również zawierać więcej włączeń, a tagowanie-dołączenie utworzy wewnętrzny link i wykona całą pracę za Ciebie.

Możesz pobrać go za pośrednictwem npm

npm install -g markdown-include

1
To było bardzo pomocne! Dziękuję Ci!
najmniej

@leas Cieszę się, że mogę służyć ... Nie pracowałem nad tym od kilku lat, ale zawsze chcę wrócić do tego w pewnym momencie. Mam nadzieję, że dobrze się spisuje.
Sethen

9

Multimarkdown ma to natywnie. Nazywa to transkluzją plików :

{{some_other_file.txt}}

wystarczy. Dziwne imię, ale zaznacza wszystkie pola.


czy są jakieś bezpłatne i otwarte edytory do renderowania tej składni? Zadałem to pytanie tutaj, podając więcej szczegółów. Byłbym wdzięczny, gdybyś mógł mi w tym pomóc.
Foad

1
@Foad: Obawiam się, że jestem użytkownikiem vima i nie znam takich edytorów. Widzę na twoim reddit Q, że znalazłeś, że Asciidoc i różni redaktorzy, obsługują to. Nie wiedziałem tego - dzięki.
eff

Cieszę się, że było to przydatne. Ale czy vim ma podgląd na żywo dla MultiMarkDown? czy byłbyś uprzejmy podzielić się swoimi plikami instalacyjnymi i kropkowymi z kilkoma szczegółami?
Foad

1
Brak podglądu na żywo, nie jestem takim facetem. ;) Głównym powodem, dla którego w ogóle korzystałem z markdown, było to, że ma on być czytelny dla ludzi, gdy nie jest przetwarzany, więc naprawdę nie mam nic przeciwko zbytnim podglądom (chociaż rozumiem, dlaczego inni to robią). W tym przypadku jedyne, co mnie interesuje, to podświetlanie składni, a domyślne podświetlanie składni markdown działa wystarczająco dobrze dla mnie. Przepraszam, że nie pomogłem.
eff

1
Wygląda na to, że może być interesujący, chociaż nie widzę powodu, aby wybierać go zamiast markdown / asciidoc, przynajmniej dla moich (skromnych) celów.
eff

8

Używam includes.txtpliku ze wszystkimi moimi plikami we właściwej kolejności i wykonuję pandoc w następujący sposób:

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

Działa jak marzenie!


1
Świetne podejście . Określanie kolejności plików jest fundamentalne, ale nie można tego osiągnąć globmetodami, chyba że numerujesz pliki.
ephsmith,

Czy możesz podać wyjaśnienie kroków? Wydaje się tak potężny! Chciałbym wiedzieć, czy można to przyciąć, aby wykonać inne konwersje, takie jak .pdf i .tex.
nilon

6

W rzeczywistości możesz używać \input{filename}i \include{filename}które są komendami lateksowymi, bezpośrednio w Pandoc, ponieważ obsługuje prawie wszystkie htmli latexskładnię.

Ale uwaga, dołączony plik będzie traktowany jako latexplik. Ale można skompilować markdownTO latexz Pandoxłatwością.


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) jest tak naprawdę zniżką na sterydy. Ogólnie rzecz biorąc, Asciidoc i Markdown będą wyglądać bardzo podobnie i raczej łatwo je zmienić. Ogromna korzyść asciidoc nad obniżki jest obsługa obejmuje już inne pliki asciidoc ale również dla dowolnego formatu chcesz. Możesz nawet częściowo dołączyć pliki na podstawie numerów linii lub znaczników do dołączonych plików.

Dołączanie innych plików jest naprawdę ratowaniem życia podczas pisania dokumentów.

Możesz na przykład mieć plik asciidoc z taką zawartością:

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

i zachowaj swoją próbkę w script.pl

I jestem pewien, że będziesz się zastanawiać, więc tak, Github obsługuje również asciidoc.


Wydaje się, że jest tu miła obietnica, ale nie daje pełnej odpowiedzi z instrukcjami. Czy można określić, jak przekonwertować dokument z wieloma plikami na jeden?
nilon

To jak dotąd najlepsze rozwiązanie na tej stronie. Doszedłem do tego wniosku i zająłem się tą kwestią tutaj na Reddit . AsciiDoc ma wbudowane dołączanie i jest renderowane przez GitHub. Atom i vscode mają również ładne wtyczki do podglądu na żywo. Zastanawiam się, dlaczego AsciiDoc nie jest już standardem branżowym!
Foad

4

Myślę, że lepiej przyjąć nową składnię dołączania plików (więc nie zepsują się blokami kodu, myślę, że włączenie stylu C jest całkowicie niepoprawne) i napisałem małe narzędzie w Perlu, nazywając go cat.pl, ponieważ działa jakcat ( cat a.txt b.txt c.txtscali się trzy pliki), ale łączy pliki głęboko , a nie w szerokość . Jak używać?

$ perl cat.pl <your file>

Szczegółowa składnia to:

  • rekurencyjne obejmują pliki: @include <-=path=
  • wystarczy dołączyć jeden: %include <-=path=

Może poprawnie obsługiwać pętle dołączania plików (jeśli a.txt <- b.txt, b.txt <- a.txt, to czego oczekujesz?).

Przykład:

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

Więcej przykładów na https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md .

Napisałem również wersję Java, która ma identyczny efekt (nie taki sam, ale zamknięty).


<<[include_file.md](Oznaczony jako 2 na macOS): gist.github.com/district10/d46a0e207d888d0526aef94fb8d8998c
dvorak4tzx

Warto zauważyć, że @jest używany do cytowań z pandoc-citeproc(np. „ @Darwin1859”).
PlasmaBinturong

4

Jestem właściwie zaskoczony, że nikt na tej stronie nie zaoferował żadnych rozwiązań HTML. O ile rozumiem, pliki MarkDown mogą zawierać szeroką część (jeśli nie wszystkie) znaczników HTML. Wykonaj następujące kroki:

  1. Od tutaj : umieścić swoje pliki Przecena w <span style="display:block"> ... </span>tagach mieć pewność, będą renderowane jako obniżki. Masz wiele innych właściwości stylu, które możesz dodać. Ten, który lubię to text-align:justify.

  2. Od tutaj : Dołącz pliki w głównym pliku za pomocą<iframe src="/path/to/file.md" seamless></iframe>

PS1. to rozwiązanie nie działa na wszystkich silnikach / renderach MarkDown. Na przykład Typora poprawnie renderuje pliki, ale nie Visual Studio Code. Byłoby wspaniale, gdyby inni mogli podzielić się swoimi doświadczeniami z innymi platformami. Szczególnie chciałbym usłyszeć o GitHub i GitLab ...

PS2. Po dalszych badaniach wydaje się, że występują poważne problemy z niekompatybilnością, które prowadzą do nieprawidłowego renderowania na wielu platformach, w tym w Typorze, GitHub i kodzie Visual Studio. Nie używaj tego, dopóki ich nie rozwiążę. Nie usunę odpowiedzi tylko ze względu na dyskusję i jeśli możesz podzielić się swoimi opiniami.

PS3. Aby dokładniej zbadać ten problem, zadałem to pytanie tutaj na StackOverflow i tutaj na Reddit .

PS4. Po kilku badaniach doszedłem do wniosku, że na razie AsciiDoc jest lepszą opcją dla dokumentacji. Ma wbudowaną funkcję włączania, jest renderowany przez GitHub, a główne edytory kodu, takie jak Atom i vscode, mają rozszerzenia do podglądu na żywo. Można użyć Pandoc lub innych narzędzi do automatycznej konwersji istniejącego kodu MarkDown na AsciiDoc z niewielkimi zmianami.

PS5. Innym lekkim językiem znaczników z wbudowaną funkcją włączania jest reStructuredText. .. include:: inclusion.txt Standardowo ma składnię. Istnieje również edytor ReText z podglądem na żywo.


1

Wiem, że to stare pytanie, ale nie widziałem żadnych odpowiedzi na ten efekt: Zasadniczo, jeśli używasz Markdown i Pandoc do konwersji pliku na pdf, w swoich danych yaml u góry strony, możesz dołączyć coś takiego:

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

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

# Section

Blah blah

## Section 

Blah blah

Ponieważ pandoc używa lateksu do konwersji wszystkich dokumentów, header-includessekcja wywołuje pakiet pdfpages. Następnie, jeśli dodasz \includepdf{/path/to/pdf/document.pdf}, wstawi wszystko, co jest zawarte w tym dokumencie. Ponadto można w ten sposób dołączyć wiele plików pdf.

Jako bonus zabawy, a to tylko dlatego, że często używam Markdown, jeśli chcesz dołączyć pliki inne niż Markdown, na przykład pliki lateksowe. Zmodyfikowałem nieco tę odpowiedź . Powiedz, że masz plik markdown markdown1.md:

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

I dwa dodatkowe dokumenty z lateksu1, które wyglądają tak:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

I kolejny, document2.tex, który wygląda następująco:

\section{Section

Glah

\subsection{Section}

Balh Balh

Zakładając, że chcesz dołączyć document1.tex i document2.tex do markdown1.md, po prostu zrób to dla markdown1.md

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

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

Uruchom nad nim pandoc, np

w terminalu pandoc markdown1.md -o markdown1.pdf

Twój końcowy dokument będzie wyglądał mniej więcej tak:

Coś oznacza pełne

Gadająca głowa

Sekcja

Głębia.

Sekcja

Krawędź żyletki.

Sekcja

Glah

Sekcja

Balh Balh


0

Używam Marked 2 na Mac OS X. Obsługuje następującą składnię do dołączania innych plików.

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

Niestety nie można tego karmić pandocem, ponieważ nie rozumie on składni. Jednak napisanie skryptu usuwającego składnię w celu utworzenia wiersza poleceń pandoc jest dość łatwe.


7
czy zdarzy ci się, że masz skrypt zamiast po prostu powiedzieć, że jest to łatwe? :)
toobulkeh

0

Kolejne rozwiązanie po stronie klienta oparte na HTML, wykorzystujące markdown-it i jQuery . Poniżej znajduje się małe opakowanie HTML jako dokument główny, który obsługuje nieograniczoną liczbę plików przeceny, ale nie obejmuje zagnieżdżonych. Wyjaśnienie znajduje się w komentarzach JS. Obsługa błędów jest pomijana.

<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, Możesz uzyskać wynik, łącząc pliki wejściowe * .md, takie jak:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.