0

序章

個人の Web サイト用に静的 XHTML を生成するために、Pandoc マークダウンを使用し始めました。Pandoc 引数を使用して$(NAME)、ファイルの を参照するいくつかのリンクを自動的に挿入することができました(以下を参照)。この Pandoc引数は、実際にはファイル名を含むように設計されているため、シェルの解釈に加えて、コマンドの出力リダイレクトを使用する必要がありました。.md-Bmakefile-Becho

問題

Pandoc の-B議論は長くなりすぎて、makefile. Bash 文字列の解釈を維持しながら、XHTML 文字列を別のファイルに戻したいと考えています。コマンドは Bashのcat一部ではないため、実行されません。

SHELL := /bin/bash
NAME  = $(basename $(wildcard *.md))

all: index.html
html: index.html

index.html: $(NAME).md
pandoc $< -S -o $@ \
-B <(echo "<div id=\"PDF\"><ul><li><a href=\"$(NAME).a4.pdf\">A4 PDF</a></li><li><a href=\"$(NAME).letter.pdf\">Letter PDF</a></li></ul></div><div id=\"source\"><ul><li><a href=\"../$(NAME).bib\">BibTeX references</a></li><li><a href=\"$(NAME).md\">Pandoc MarkDown</a></li><li><a href=\"makefile\">makefile</a></li></ul></div>")
4

3 に答える 3

1

解決策よりも一般的であるため、 loentarの編集された回答に感謝するようになりましたsedloentarによって提案されたソリューションは、テンプレート ファイル内の変数を解釈するだけ$(NAME)でなく、他のすべての種類の Bash 変数およびコマンドも解釈します。

それにもかかわらず、 loentarによって提案されたソリューションはpandoc、次の理由で機能しません。

  1. Bashコマンドはhere文字列<<<を作成しますが、引数とrequireファイルは作成します。この問題を修正します。-B-A<(echo string)
  2. もう 1 つの問題は、Bash がbefore.htmlおよびafter.htmlテンプレート ファイル内のすべての二重引用符を展開するため、検証されていない XHTML ファイルが生成されることです。これを解決するためsed 's/"/\\"/g'に、Bash 解釈の前にすべての二重引用符をバックスラッシュでエスケープします。

したがって、機能するソリューションは次のとおりです。

SHELL := /bin/bash
NAME  := $(basename $(wildcard *.md))
BEFORE := $(shell sed 's/"/\\"/g' before.html)
AFTER := $(shell sed 's/"/\\"/g' after.html)

all: index.html
html: index.html

index.html: $(NAME).md
    pandoc $< -S -o $@ \
    -B <(echo "$(eval RESULT:=$(BEFORE))$(RESULT)") \
    -A <(echo "$(eval RESULT:=$(AFTER))$(RESULT)")

たとえばbefore.html

<div id="PDF">
    <img src="../../images/pdf.png" alt="PDF" width="34" />
    <ul>
        <li><a href="$(NAME).a4.pdf">A4 PDF</a></li>
        <li><a href="$(NAME).letter.pdf">Letter PDF</a></li>
    </ul>
</div>
<div id="source">
    <ul>
        <li><a href="../$(NAME).bib">BibTeX references</a></li>
        <li><a href="$(NAME).md">Pandoc MarkDown</a></li>
        <li><a href="makefile">makefile</a></li>
    </ul>
</div>
</div>
于 2013-08-14T13:29:56.467 に答える
1

ファイル全体を変数に読み込み$(NAME)$(subst).

SHELL := /bin/bash
NAME  := $(basename $(wildcard *.md))
TEMPLATE := $(shell cat template.html)

all: index.html
html: index.html

index.html: $(NAME).md
    pandoc $< -S -o $@ -B <<< "$(subst $$(NAME),$(NAME),$(TEMPLATE))"

または、テンプレート ファイル内のすべての変数を解決する場合は、最後のファイルを次のように置き換えます。

pandoc $< -S -o $@ -B <<< "$(eval RESULT:=$(TEMPLATE))$(RESULT)"

template.html:

<div id="PDF"><ul><li><a href="$(NAME).a4.pdf">A4 PDF</a></li><li><a href="$(NAME).letter.pdf">Letter PDF</a></li></ul></div><div id="source"><ul><li><a href="../$(NAME).bib">BibTeX references</a></li><li><a href="$(NAME).md">Pandoc MarkDown</a></li><li><a href="makefile">makefile</a></li></ul></div>
于 2013-08-13T08:39:35.577 に答える
1

テンプレートで sed を使用するのはどうですか? たとえば、これはファイルで、単語テンプレートは次の{__NAME__}とおりです。

<div id="PDF"><ul><li><a href="{__NAME__}.a4.pdf">A4 PDF</a></li><li><a href="{__NAME__}.letter.pdf">Letter PDF</a></li></ul></div><div id="source"><ul><li><a href="../{__NAME__}.bib">BibTeX references</a></li><li><a href="{__NAME__}.md">Pandoc MarkDown</a></li><li><a href="makefile">makefile</a></li></ul></div>

sed を使用してそれらを置き換えることができます。

pandoc $< -S -o $@ \
-B <(sed -e "s|{__NAME__}|$(NAME)|g" file.txt)
于 2013-08-13T08:31:18.307 に答える