pandoc到预处理的包装包括(甚至是嵌套的)

include-pandoc的Python项目详细描述


包括pandoc

pandoc的一个包装器,进程包括行(比如!在标记文件中包含path/to/included/file),然后将它们传递给pandoc进行进一步处理。

它允许组合复杂/模块化文本,其中链接文本引用不同文件中包含的标题或链接定义。

它支持无限嵌套包含,并且句柄也支持相对包含路径。

include pandoc应该适用于任何linux版本和发行版。它也可以在windows和osx上运行,但还没有在这样的平台上进行测试。

<H2>1。安装

sudo pip install include pandoc&;sudo include pandoc--更新

或(作为用户)

pip安装--用户包含pandoc&;包含pandoc--更新

<H2>2。用法
include-pandoc [PANDOC_OPTIONS][FILES]|[--update]

只需调用include pandoc而不是pandoc,语法与使用pandoc时使用的语法相同。不放置任何文件,将处理标准输入。

如果在系统上更新pandoc,则在再次使用include pandoc之前,必须运行include pandoc--update(否则将出现错误);这将使用新安装版本实现的可能新pandoc选项更新包装。如果您将pandoc update安装为根用户,则必须调用include pandoc--update作为根用户(f.e.使用sudo)。

<H2>3。包含语法

includes必须位于单独的行中,且includes语句位于行的最开始处,且不带引号和不带转义字符。一些示例:

<代码>!包含相对路径/to/included/file.md

<代码>!include/absolute_path/to/include/file.md

<代码>!include path with spaces/to/included file.md

如果在include中使用相对路径,则它们被视为相对于包含包含行的文件的路径;同样在嵌套/递归include中,相对路径被视为相对于包含包含行的嵌套文件的路径,而不是相对于主/父文件路径

因此,如果main.md包含parts/part1.md而后者又包含parts/subparts/subpart1.md

  • main.md中的include行将是!包括零件/part1.md
  • part1.md中的include行将是!包括子部分/subpart1.md
<H2>4。基本原理

4.1问题

要在pandoc中实现include的现有解决方案通常是不完整的。

有一些仅处理代码块包含的过滤器,例如pandoc include code,它们工作良好,但仅用于特定目的(即包括降价指南中的代码)。

有类似于pandoc include的过滤器,允许在标记"父"文件的任何点包含任何类型的文件;但是,它们都受到pandoc体系结构的限制。荣> 如《pandoc指南》中所述 < Buff行情>

"过滤器"是在读写器之间修改AST的程序: input--reader--gt;ast--filter--gt;ast--writer--gt;输出。 过滤器是从标准输入读取并写入标准输出的"管道"。它们使用并生成pandoc ast的json表示。

问题是链接和链接定义是由pandoc的阅读器处理的,而过滤器只能在它之后处理,它们可以处理pandoc的ast而不是"原始"文本。

因此,当使用pandoc的include过滤器时,如果ce包含在包含文件(part1.md)中的链接文本([super goof]):

  • 引用包含在另一个包含文件(part2.md)中的头(super goof),

  • 在另一个包含的文件(definitions.md)中定义([super goof]:),

这样的链接将保持"未解析"(即,它将呈现为[super goof],而不会更改为链接),因为pandoc在包含筛选器合并所有包含的文件之前处理链接。

此限制阻止您通过pandoc中的include过滤器组装工作模块化文本文档

替代解决方案似乎也不可行。

  • 有些人建议在调用pandoc时连接文件,但与基于include的解决方案相比,这个解决方案可能会变得非常复杂,特别是在遇到复杂的modular文本:
    • 您需要将主文档分割成小块,每次您想移动或更改某些内容时,都需要进一步分割或重新合并这些小块,而处理包含其他文件片段的主文档则要简单得多。
  • 有些人建议使用m4作为预处理器,但这也会导致很多复杂问题,因为m4处理引用和宏的方式:
    • 例如,如果文本包含与M4宏相对应的单词,如changeQuotedefine()或其他,M4将它们作为宏处理,即使它们位于行的中间(在某些情况下,即使保留单词后面没有括号!);因此,您应该避免在文本中使用任何M4保留字,但这不是一个可接受的限制;
    • 此外,由于任何原因,您不能在文本中使用您设置为M4的开始引号和结束引号分隔符的字符序列-否则您可能会得到M4错误,例如悬挂引号错误-->;M4:stdin:2:error:end of file in stringly字符序列作为开始引号和结束引号分隔符,这反过来可能导致非常尴尬的包含行。

4.2解决方案

我为pandoc创建了一个包装器,以便在将文本传递给pandoc之前处理include。它处理系统中安装的pandoc版本的所有可用选项,并将它们透明地传递给pandoc,但在此之前,它会处理给定文件中包含的内容(如果未指定文件名,则在标准输入中)。所选的include语法不应干扰标记文本的其余部分(与m4语法相反)。 通过这种方式,您可以使用工作链接创建非常复杂的模块化文本,无论链接在何处定义或引用的标题在何处。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java调用外部进程exe   java跨源请求阻止Spring REST服务+AJAX   运行Eclipse创建的JAR时未显示java图像   带有自定义适配器的TimerTask期间的java更新列表视图   Java Netbeans 7.01中的swing注册表单空指针异常   java如何向所有HttpClient请求方法添加参数?   为什么在将json映射到JavaBean的过程中,Spring MVC将参数[“”]转换为[null]?   创建名为“messageDispatcher”的bean时发生java错误   java Apache骆驼线程JDBC   java Spring引导请求添加bean,即使存在   java如何以正确的方式编写单例?   JavaSpringBoot试图使用@JsonTest注释在测试中创建mongo存储库   java Android将gmt时间转换为可读日期   java“Serializable无法解析为类型”   spring我可以在Java注释中使用ScopedProxy模式时访问JobExecutionContext吗   java slf4j apache tomcat eclipse   通过HashMap的java循环   java无法在两个活动之间更改TextView?