pandoc自定义过滤器

news2024/9/19 17:35:30

pandoc自定义过滤器

pandoc是一个强大的文本转换工具,可以实现各种文本格式的互相转换。

在开发过程中常用的文档格式有rst、markdown、pdf、docx等,pandoc支持这些格式互转,但是对于一些特殊格式和排版支持不是太好,需要做一些适配和二次开发。

常见的方式用过滤器方式、模板方式、使用高级参数等来进行调整适配。

但要想达到高度定制,还是需要使用过滤器的方式。

pandoc的工作原理

pandoc使用语法树来进行解析,并且使用json来表示文档的内部抽象语法树,是pandoc文档内容的结构化表述。

pandoc允许用户通过解析和操作json结构来自定义文档内容和格式。

Pandoc 的 JSON 结构(schema)是 Pandoc 文档转换过程中的核心部分,它表示文档的抽象语法树 (AST),允许用户通过解析和操作 JSON 结构来自定义文档内容和格式。JSON schema 的细节可以帮助你理解 Pandoc 如何表示文档中的各类元素(如段落、标题、代码块、表格等)。

以下是 Pandoc JSON schema 的详细介绍:

1. 顶层结构

Pandoc 的 JSON 文件的顶层结构通常包括两个主要部分:

  • meta: 包含文档的元数据,如标题、作者、日期等。
  • blocks: 包含文档的主要内容,以列表的形式表示。每个列表项都是一个块元素,例如段落、标题、列表、表格等。

示例顶层结构:

{
  "meta": {
    "title": {
      "t": "MetaInlines",
      "c": [
        {"t": "Str", "c": "Sample Document"}
      ]
    }
  },
  "blocks": [
    {
      "t": "Para",
      "c": [
        {"t": "Str", "c": "Hello"},
        {"t": "Space"},
        {"t": "Str", "c": "world"}
      ]
    }
  ]
}
  • meta: 包含文档元数据的对象,通常包括 title, author, date
  • blocks: 是文档主体的内容,这里包含了一个段落 (Para)。

2. 元数据 (meta)

meta 包含文档的元数据信息,可以包括:

  • title: 文档的标题。
  • author: 作者列表。
  • date: 文档的日期。
    元数据可以有多种形式,包括字符串、内联元素或块元素。

示例:

{
  "title": {
    "t": "MetaInlines",
    "c": [{"t": "Str", "c": "My Document"}]
  },
  "author": {
    "t": "MetaInlines",
    "c": [{"t": "Str", "c": "Author Name"}]
  },
  "date": {
    "t": "MetaInlines",
    "c": [{"t": "Str", "c": "2024-09-15"}]
  }
}

3. 块元素 (blocks)

块元素表示文档的结构部分,它可以是段落、标题、列表、代码块等。常见的块元素包括:

  • Para: 段落,内容为内联元素的列表。
  • Header: 标题,包含一个级别(1-6)和内联元素。
  • CodeBlock: 代码块,包含代码和可选的属性。
  • BlockQuote: 引用块。
  • Table: 表格结构。
  • BulletListOrderedList: 列表。

段落 (Para) 示例:

{
  "t": "Para",
  "c": [
    {"t": "Str", "c": "This"},
    {"t": "Space"},
    {"t": "Str", "c": "is"},
    {"t": "Space"},
    {"t": "Str", "c": "a"},
    {"t": "Space"},
    {"t": "Str", "c": "paragraph."}
  ]
}

4. 内联元素 (Inlines)

内联元素是嵌入在段落或标题等块元素中的文本或小型元素。常见的内联元素包括:

  • Str: 字符串。
  • Emph: 斜体。
  • Strong: 粗体。
  • Code: 内联代码。
  • Link: 超链接。
  • Image: 图片。

内联代码 (Code) 示例:

{
  "t": "Code",
  "c": [{"t": "Str", "c": "print('Hello, world!')"}]
}

5. 表格 (Table)

Table 是一个复杂的结构,包含表头、表格主体、对齐方式、列宽等内容。表格的定义较为灵活,允许你指定每列的对齐、列宽、以及包含的内容。

表格的结构示例:

{
  "t": "Table",
  "c": [
    [{"t": "AlignLeft"}, {"t": "AlignCenter"}],  # 对齐方式
    [{"t": "ColWidthDefault"}, {"t": "ColWidthDefault"}],  # 列宽
    [[{"t": "Plain", "c": [{"t": "Str", "c": "Header 1"}]}],  # 表头
     [{"t": "Plain", "c": [{"t": "Str", "c": "Header 2"}]}]],
    [[[{"t": "Plain", "c": [{"t": "Str", "c": "Row 1, Col 1"}]}],  # 表格数据
      [{"t": "Plain", "c": [{"t": "Str", "c": "Row 1, Col 2"}]}]]]
  ]
}

6. Raw Block/Inline

有时,文档中可能包含特定格式的原始数据(如 HTML 或 LaTeX)。这些内容以 RawBlockRawInline 形式出现,用于保留特定格式的内容。

示例:

{
  "t": "RawBlock",
  "c": ["html", "<div class='custom-class'>Custom HTML Content</div>"]
}

如何查看pandoc的json格式

以rst文件为例:

pandoc input.rst -f rst -t json

rst转markdown

markdown由于历史原因为了支持更多的格式,衍生出多种markdown方言,pandoc在转换时支持指定gfm、markdown、markdown-strict、commonmark,来确定你所转换的markdown方言。

这里我们想要转换为docsuaurus(Facebook开源的一个文档框架)能识别的格式,因而只能使用commonmark来转换。其转换命令如下:

pandoc rst/input.rst -f rst -t commonmark -o md/output.md

在这里使用一个带有表格、图片、列表、代码块、告警的rst文件,将其转换为md。

图片

rst的代码如下:

.. image:: https://docusaurus.io/zh-CN/img/undraw_typewriter.svg
   :alt: element

换后的md格式如下:

![element](https://docusaurus.io/zh-CN/img/undraw_typewriter.svg)

可以看到就是markdown的标准语法。

但是rst有一种类型的图片语法,使用figure关键字,pandoc将其转为md后变成了html标签:

rst的代码如下:

.. figure:: https://docusaurus.io/zh-CN/img/docusaurus.svg

转换后的md文件如下:

<figure>
<img src="https://docusaurus.io/zh-CN/img/docusaurus.svg"
alt="https://docusaurus.io/zh-CN/img/docusaurus.svg" />
</figure>

可以看到直接变成了html标签,这个不太符合我们的格式要求,需要对其进行适配。

需要编写figure_filter.py的过滤器,用于对输入内容进行转换,其脚本内容如下:

#!/usr/bin/env python3

from pandocfilters import toJSONFilter, Para, RawInline

def figure_to_markdown(key, value, format, meta):
    if key == 'Figure':
        # 获取 Figure 内部的 Plain 节点
        plain_node = value[2][0]
        if plain_node['t'] == 'Plain':
            # 遍历 Plain 中的元素,找到 Image
            for item in plain_node['c']:
                if item['t'] == 'Image':
                    # 获取 Image 节点中的图片 URL
                    image_info = item['c']
                    image_url = image_info[2][0]  # 获取图片 URL
                    
                    # 使用 RawInline 插入原始 Markdown 代码,并将其放入 Para 块中
                    return Para([RawInline('markdown', f'![]({image_url})')])

if __name__ == "__main__":
    toJSONFilter(figure_to_markdown)

在转换时使用如下命令进行转换:

pandoc rst/input.rst -t commonmark -o md/output_filter_figure.md --filter=./src/figure_filter.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2146694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络】传输层协议TCP

TCP协议 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793定义。TCP在IP&#xff08;Internet Protocol&#xff0c;互联网协议&#xff09;网络层上提供…

【Linux】—— muduo网络库的安装配置与使用

muduo网络库编程 Linux环境下Epollpthread线程库 Boost库安装与使用 安装Boost库 下载boost库源码&#xff0c;linux环境解压 tar -zxvf boost_1_69_0.tar.gz 解压完成后&#xff0c;进入该目录&#xff0c;查看内容 运行bootstrap.sh工程编译构建程序 ./bootstrap.sh …

javascript-代码执行原理

js 是解释型语言 js 引擎执行流程 分为两个阶段: 语法分析执行阶段执行阶段涉及的数据结构: 调用栈。处理执行上下文和执行代码内存堆。给对象分配内存任务队列。暂存待执行的任务,分为宏任务队列和微任务队列语法分析 词法分析 > 语法分析 > 代码生成(字节码) …

封装svg图片

前言 项目中有大量svg图片&#xff0c;为了方便引入&#xff0c;所以对svg进行了处理 一、svg是什么&#xff1f; svg是可缩放矢量图形&#xff0c;是一种图片格式 二、使用步骤 1.创建icons文件夹 将icons文件夹放进src中&#xff0c;并创建一个svg文件夹和index.js&…

深入探索迭代器模式的原理与应用

&#x1f3af; 设计模式专栏&#xff0c;持续更新中 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 迭代器模式 &#x1f4bb; 迭代器模式 (Iterator Pattern) 是一种行为设计模…

【LeetCode】每日一题 2024_9_19 最长的字母序连续子字符串的长度(字符串,双指针)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;坐上公交的最晚时间 代码与解题思路 func longestContinuousSubstring(s string) (ans int) { // 题目要求&#xff1a; 最长 的 字母序连续子字符串 的长度// 双指针&#xff0c;start …

【学习笔记】线段树分裂

前言 有线段树合并就应该有线段树分裂。它是线段树合并的逆过程。具体的&#xff0c;你需要以权值线段树中第 k 小的数为分界线&#xff0c;把线段树分成两半。 算法流程 和线段树上二分类似。假设原来的线段树为 u&#xff0c;要分裂出线段树 v 记左子树的权值为 val。如果…

CodeMeter助力软件授权与IP保护,保障工业自动化与物联网安全

随着工业自动化的飞速发展&#xff0c;Hilscher的开放工业4.0联盟&#xff08;OI4&#xff09;旗舰店应运而生&#xff0c;将应用商店模式引入工业领域。凭借CodeMeter授权和加密技术的支持&#xff0c;该商店为工业用户提供了一个安全且开放的应用程序和解决方案平台。该平台不…

超声波清洗机哪个品牌好用又实惠?精选业内四款优质清洗机推荐

超声波清洗机作为一种创新的清洁解决方案&#xff0c;凭借其深入微观的清洁效能、简便的操作方式以及对物品的细腻呵护&#xff0c;正逐渐成为广受喜爱的清洁良品。不过&#xff0c;市面上品牌林立、型号多样&#xff0c;价格亦波动不一&#xff0c;这无疑为消费者选购时平添了…

ATT&CK靶机实战系列之vulnstack2

声明: 本文章只是用于网络安全交流与学习&#xff0c;若学者用学到的东西做一些与网络安全不相关的事情&#xff0c;结果均与本人无关&#xff01;&#xff01;&#xff01; 靶场环境: 使用kali作为hacker的攻击机器&#xff0c;来对web pc dc进行攻击。 这里声明一下: 关于…

Cesium billboard 自定义shader实现描边效果

Cesium billboard 自定义shader实现描边效果 uniform sampler2D u_atlas;uniform vec2 dimensions;in vec2 v_textureCoordinates;in vec4 v_pickColor;in vec4 v_color;in float v_splitDirection;void main(){if (v_splitDirection < 0.0 && gl_FragCoord.x > …

一文详解可视化大屏技术在地震监测中的作用!

昨天&#xff0c;安徽合肥市肥东县发生地震&#xff0c;震级达到4.7级&#xff0c;震源深度12千米。这一事件再次提醒我们&#xff0c;地震的威胁无处不在&#xff0c;及时有效的地震预警对于减少灾害损失至关重要。四川省作为地震活动频繁的地区&#xff0c;近年来在地震监测和…

配置环境-keil

配置keil -- 先将keil安装配置好&#xff0c;包括库 一、STM32 -- STM32是意法半导体&#xff08;意大利&#xff09;采用ARM公司设计的内核&#xff0c;设计一系列32位单片机芯片。 1、STM32开发的几种方式 2、STM32寄存器和库函数版本的工程创建 新建文件夹 复制相关文件…

【机器学习(八)】分类和回归任务-因子分解机(Factorization Machines,FM)-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09; FM表达式&#xff08;二&#xff09;时间复杂度&#xff08;三&#xff09;回归和分类 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、FM分类任务实现对比&#xff08;一&…

【2024华为杯研究生数学建模竞赛】比赛思路、代码、论文更新中.....

目录 赛中助攻华为杯常用建模算法&#x1f5d2;️&#x1f5d2;️历年优秀论文⭐⭐论文模板1&#xff09;论文模板2&#xff09;基础画图能力 绘图与数据分析软件SPSSPRO 2024研究生数学建模竞赛时间为9月21日&#xff08;周六&#xff09;8:00至9月25日&#xff08;周三&#…

互联网前端之 CSS 常见属性与三层结构

目录 现在互联网前端三层 CSS 常见属性 关注作者微信公众号&#xff0c;开启探索更多 CSS 知识的精彩之旅。在这里&#xff0c;你将收获丰富的CSS专业内容&#xff0c;深入了解这一网页开发语言的奥秘&#xff0c;不断拓展你的知识边界&#xff0c;提升技能水平。快来关注吧&…

对想学习人工智能或者大模型技术从业者的建议,零基础入门到精通,收藏这一篇就够了

“ 技术的价值在于应用&#xff0c;理论与实践相结合才能事半功倍**”** 写这个关于AI技术的公众号也有差不多五个月的时间了&#xff0c;最近一段时间基本上都在保持日更状态&#xff0c;而且写的大部分都是关于大模型技术理论和技术方面的东西。‍‍‍‍‍‍‍‍‍ 然后最近…

Windows安全日志分析(事件ID详解)

目录 如何查看Windows安全日志 常见事件ID列表 事件ID 1116 - 防病毒软件检测到恶意软件 事件ID 4624 - 账户登录成功 事件ID 4625 - 账户登录失败 事件ID 4672 - 为新登录分配特殊权限 事件ID 4688 - 新进程创建 事件ID 4689 - 进程终止 事件ID 4720 - 用户账户创建 …

3款免费的GPT类工具

前言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;的崛起与发展已经成为我们生活中不可或缺的一部分。它的出现彻底改变了我们与世界互动的方式&#xff0c;并为各行各业带来了前所未有的便利。 一、Kimi 网址&#xff1a;点我前往 国产AI模型Kimi是一…

C++第八节课 日期类的补充

在上节课我们提交的代码中&#xff0c;还有着一些不足&#xff1a; 如果我们想要运行下面的函数&#xff1a; void test4() {Date d1(2023, 5, 5);d1 -50;d1.Print();Date d2(2023, 5, 5);d2 - -50;d2.Print(); } 我们发现之前的代码没有考虑day为负数的情况&#xff0c;可以…