leo-editor 中将 Markdown 内容转成 asciidoc 格式

经常用 asciidoctor 进行写作和记笔记的,所以需要把从 AI 粘贴的 Markdown 内容转成 asciidoc 格式。目前用到的转换方法有两种:

  1. 让 AI 进行转换,问题是需要进行多次会话才可以达到想要的效果。
  2. 自己写个转换的功能,下面代码步骤为:
    • 预处理将公式用特殊字符占位,分为块公式和行内公式两种情况。
    • 用 pandoc 进行 Markdown 到 asciidoc 要格式转换。
    • 将 特殊字符占位还原为 AsciiDoc 的 stem 公式语法
    • 清理 pandoc 强加的字符
    • 消除多余空行
  3. pandoc 的相应文档
python 复制代码
import subprocess
import re

# 获取当前节点的内容
p = c.p
markdown_text = p.b

try:
    math_blocks = []
    math_inlines = []
    
    # 1. 预处理:使用纯字母数字占位符
def block_replacer(match):
    math_blocks.append(match.group(1).strip())
    return f"\nMATHTOKENBLOCK{len(math_blocks) - 1}XYZ\n"

markdown_text = re.sub(r'\\\[\s*(.*?)\s*\\\]', block_replacer, markdown_text, flags=re.DOTALL)

def inline_replacer(match):
    math_inlines.append(match.group(1).strip())
    return f"MATHTOKENINLINE{len(math_inlines) - 1}XYZ"

markdown_text = re.sub(r'\\\(\s*(.*?)\s*\\\)', inline_replacer, markdown_text)

# 2. 传给 Pandoc
result = subprocess.run(
    [
        "pandoc",
        "-f", "markdown",
        "-t", "asciidoc",
        "--wrap=none",
    ],
    input=markdown_text,
    capture_output=True,
    text=True,
    encoding="utf-8",
    check=True,
)

adoc_content = result.stdout

# 3. 后处理:还原为 AsciiDoc 的 stem 语法
for i, content in enumerate(math_blocks):
    placeholder = f"MATHTOKENBLOCK{i}XYZ"
    adoc_content = adoc_content.replace(placeholder, f"[stem]\n++++\n{content}\n++++")

for i, content in enumerate(math_inlines):
    placeholder = f"MATHTOKENINLINE{i}XYZ"
    adoc_content = adoc_content.replace(placeholder, f"stem:[{content}]")

# 4. 清理和排版优化
adoc_content = re.sub(r' \+\n', '\n', adoc_content)           # 清除行尾加号
adoc_content = adoc_content.replace("{plus}=", "+=")
adoc_content = adoc_content.replace("{plus}", "+")

# 5. 核心:将 3 个或以上的连续换行符压缩为标准的 2 个,消除多余空行
adoc_content = re.sub(r'\n{3,}', '\n\n', adoc_content)


    # 创建子节点存放结果
    new_p = p.insertAfter()
    new_p.h = f"Converted: {p.h}"
    new_p.b = adoc_content

    c.redraw()
    g.es("转换成功!已完美解决公式转义与空行过多的问题。")

except subprocess.CalledProcessError as e:
    g.es(f"Pandoc 转换失败: {e}\n{e.stderr}")

except Exception as e:
    g.es(f"发生错误: {e}")

我是用 leo-editor 进行知识管理的,所以在 myLeoSettings.leo 中创建了全局的 script-button`,如下图:

需要进行转换的 markdown 内容节点如下图:

转换成功后的 asciidoc 内容节点如下图:

asciidoctor 编译成 html 后的效果如下图:

小结:记录了 python 脚本转换 Markdown 到 Asciidoc 的方式,以及部分 leo-editor 的全局 script-button 配置。

相关推荐
LucianaiB10 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
excel10 小时前
JavaScript 对象池:减少高频对象创建与 GC 压力
前端
陈随易12 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
子兮曰13 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome
IT_陈寒13 小时前
Redis连接池泄漏那次,我差点把生产环境搞崩了
前端·人工智能·后端
强尼银手13 小时前
我花一天做了个格斗游戏原型,判定全对,然后被「美术」劝退了
前端·javascript
石小石Orz14 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
陈随易14 小时前
专注飞机 FocusFlight,两个人把番茄钟做成了一趟航班
前端·后端·程序员
总要学点什么15 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
10share15 小时前
基于大模型的 i18n 方案:把中文原文当 Key,轻松搞定多语言维护
前端·vue.js