0

介绍

我开始使用Pandoc markdown为我的个人网站生成静态 XHTML。我设法使用 Pandoc 参数自动插入了几个引用文件$(NAME)的链接(见下文)。这个 Pandoc参数实际上被设计为包含一个文件名,所以除了 shell 解释之外,我还必须使用命令的输出重定向。.md-Bmakefile-Becho

问题

Pandoc-B论点已经变得太长,无法在makefile. 我想将 XHTML 字符串移回单独的文件,同时保留 Bash 字符串解释。该cat命令不会这样做,因为它不是 Bash 的一部分。

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 命令在此处<<<创建一个字符串,而参数-B-A需要文件。<(echo string)纠正了这个问题。
  2. 另一个问题是 Bash 会扩展before.htmlafter.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)"

模板.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 回答