惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
量子位
博客园 - 三生石上(FineUI控件)
Hacker News - Newest:
Hacker News - Newest: "LLM"
月光博客
月光博客
博客园 - 叶小钗
爱范儿
爱范儿
S
SegmentFault 最新的问题
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Security Archives - TechRepublic
Security Archives - TechRepublic
小众软件
小众软件
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
V
Visual Studio Blog
V
V2EX
Schneier on Security
Schneier on Security
Cloudbric
Cloudbric
有赞技术团队
有赞技术团队
C
Check Point Blog
T
Troy Hunt's Blog
Google DeepMind News
Google DeepMind News
Google DeepMind News
Google DeepMind News
TaoSecurity Blog
TaoSecurity Blog
Engineering at Meta
Engineering at Meta
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Schneier on Security
N
Netflix TechBlog - Medium
Project Zero
Project Zero
Last Week in AI
Last Week in AI
N
News and Events Feed by Topic
Microsoft Azure Blog
Microsoft Azure Blog
NISL@THU
NISL@THU
T
The Exploit Database - CXSecurity.com
AWS News Blog
AWS News Blog
博客园 - 聂微东
S
Securelist
腾讯CDC
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
About on SuperTechFans
Microsoft Security Blog
Microsoft Security Blog
B
Blog
博客园 - 【当耐特】
Y
Y Combinator Blog
N
News and Events Feed by Topic
Recorded Future
Recorded Future
Vercel News
Vercel News
PCI Perspectives
PCI Perspectives
Security Latest
Security Latest

WSH

凑数日子 2026年,大概将会是最后一个人口保持在14亿以上的年份 感谢之人 数字经济中的注意力交易 突然的噩耗 一株洋瓜藤 再见到姑妈 港澳掠影 Miniflux 中文搜索能力增强 慢慢吹~~~轻轻送~~~ 房子梦 探索云南-大理 证书过期导致的错误 过年被追问工资 在秋天开始 水里的鱼 斩断联系1 云南壮族婚恋 我有一颗乳牙 世界的底色是争,抢,偷 无题4 无题3 人来人往 AI见闻 无题2 滇池掠影 WebGIS 三维空间分析之参考超图实现的天际线分析 我原来是个同步单线程 往事如烟1 净月潭之行 一万次悲伤 开源丑闻的碎碎念 提高开发幸福感所做的举措之构建前端基础设施 浏览器标签页进程引发的性能问题 山的那边 想回到过去去去去去去去去去去去去~ WebGIS开发之glsl支持 WebGIS三维空间分析之坡度计算 WebGIS 三维分析之阴影率分析 幸福(或我的女儿叫波兰) 最后一课 上海掠影 Cesium/QGIS加载图新地球LRC自定义图层 端午粽子 如何清晰地写作 清明扫墓 自编写,自用的开源工具 饮食 AI在GIS领域的实践之QGIS-MCP 燕南飞 WebGIS 三维空间分析之剖面线分析 WebGIS三维开发中的面积量测 WebGIS空间分析之坡向分析的实现 收藏自由-新的书签工具 月夜杂谈 花海,指弹版 三维之Cesium分屏显示 请验证您是真人 GIS数据转换——从点到栅格 自定义「ONE · 一个」订阅源 西湖美人峰徒步 给开源RSS服务应用Miniflux添加「标题翻译」 五一青山湖骑行 将chatGPT集成到微信机器人 动手更换旧手机——google pixel3的电池 Vue组件检测无效属性 ArcGIS复杂插件处理 两件关于博客网站变更的事情 Vue开发个人守则 账户注销后遗症 《纳瓦尔宝典 财富与幸福》前两章的一些摘录 听一首黄歌—Yellow 坏事总是成双 出差消小记 cesium-控高分析 当你孤单你会想起谁 穿越城市-青山湖 Harry Browne关于个人金融安全17条黄金守则—财富之道 批量裁剪矢量数据的几种途径 小而美的软件 想回到过去 热!热!热! 那么近,又那么远——遥望 为什么win笔记本触摸板没有mac好用呢 一只猫 二月份的检讨 自定义Cesium缩放控件 线段简化的几种算法 今天看球了吗? HDF转为GeoTIFF QGIS插件编写 乐高风格地图 基于Python的遥感可视化记录 使用Python提取遥感影像中的土壤线 接触pandas QQ音乐评论可视化 拆分-应用-联合 阳光打在我身上 淘宝商品信息可视化
Markdown解析高亮及Mermaid
WSH · 2025-07-16 · via WSH

目录

    • 自定义解析扩展markdown语法
    • 解析mermaid代码

[TOC]

我平时用typora写记录,完稿后再上传到网站上,typora支持需要许多的第三方markdown扩展语法,写起来很方便,但是我网站使用的python解析库——markdown,将markdown文本转为html,它并不支持第三方语法,我比较烦心高亮和mermaid语法的支持,所以花了一点时间给markdown库写了两个插件,分别用来解析这两种语法。

解析,其实就是将目标文本替换成特定的其他文本,比如html标签,自定义的markdown库的插件,可以选择在它解析前后进行自定义解析,处理原理是一样的,不同的是,在markdow它解析前,你处理的对象是普通的markdow文本,而解析后处理的是htnl文本。

这里,我选择用正则表达式来实现具体的解析操作,高亮的语法是两个==包裹的文本内容,比如需要将其查找出来,并将其内容替换到mark标签内。

import markdown
import re
class HighlightExtension(markdown.Extension):
    def extendMarkdown(self, md: Markdown):
       """
       :param md: Markdown实例
       :return: list
       """
        md.registerExtension(self)
        md.preprocessors.register(HighlightPreprocessor(), 'highlight_preprocessor', 5)


class HighlightPreprocessor(markdown.preprocessors.Preprocessor):
    def run(self, lines: list) -> list:
       """
       执行函数
       :param lines: 文本列表
       :return: list
       """
        text = '\n'.join(lines)
        # 正则模式字符串
        pattern = r'==(.+?)=='
        # 替换匹配结果
        highlighted_text = re.sub(pattern, r'<mark>\1</mark>', text)
        return highlighted_text.splitlines()
      
# 测试
def md2html(text):
    """
    :param text: str
    :return: str
    """
    html = markdown.markdown(text, extensions=[
        HighlightExtension()# 引入自定义的插件
    ])
    return html
  
  

现在,就能正常解析高亮文本了,比如:==这是高亮内容==。

解析mermaid代码

Mermaid是一个基于Javascript的图表绘制工具,它能解析类似markd的语法,然后生成图像,让你像以写文章一样的方式的绘制图表,非常顺滑。

markdown 到mermaid的过程中,除了将mermaid的代码块解析为特定的标签,还需在html文档中引入mermaid的依赖文件,

<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>

然后添加一个js标签,待文档加载完成后渲染。

<script defer>
    mermaid.initialize({ startOnLoad: true });
</script>
import markdown
import re

# 继承Extension类
class MermaidExtension(markdown.Extension):
    def extendMarkdown(self, md: Markdown):
       """
       :param md: Markdown 实例
       :return: 
       """
        # 注册插件
        md.registerExtension(self)
        # 注册解析前处理器
        md.preprocessors.register(MermaidPreprocessor(), 'mermaid_preprocessor', 1000)
        # 注册解析后处理器
        # md.postprocessors.register(MermaidPostprocessor(), 'mermaid_postprocessor', 25)

# 解析前处理器
class MermaidPreprocessor(markdown.preprocessors.Preprocessor):
   def run(self, lines: list) -> list:
       """
       执行函数
       :param lines: 文本列表
       :return: list
       """
        text = '\n'.join(lines)
        post_text = re.sub(pattern, r'<div class="mermaid">\1</div>', text, flags=re.S)
        # 分解行
        return post_text.splitlines()

# 解析后处理器
class MermaidPostprocessor(markdown.postprocessors.Postprocessor):
   def run(self, text: str) -> str:
       """
       执行函数
       :param text: 文本
       :return: 
       """
       pattern = r"<code>mermaid(.+?)</code>"
       post_text = re.sub(pattern, r'<div class="mermaid">\1</div>', text, flags=re.S )
       return post_text



# 测试
def md2html(text):
    """
    :param text: str
    :return: str
    """
    html = markdown.markdown(text, extensions=[
        MermaidExtension(),# 引入自定义的插件
    ])
    return html

你看,现在就能直接在markdown中绘图了,amazing!

这是一个表示饼图的语法:

pie title 水果
    "香蕉" : 386
    "苹果" : 85
    "橘子" : 15

渲染之后如下:

pie title 水果
    "香蕉" : 386
    "苹果" : 85
    "橘子" : 15

流程图:

flowchart TD
    A[Christmas] -->|Get money| B(Go shopping)
    B --> C{Let me think}
    C -->|One| D[Laptop]
    C -->|Two| E[iPhone]
    C -->|Three| F[fa:fa-car Car]
flowchart TD
    A[Christmas] -->|Get money| B(Go shopping)
    B --> C{Let me think}
    C -->|One| D[Laptop]
    C -->|Two| E[iPhone]
    C -->|Three| F[fa:fa-car Car]

类图:

classDiagram
    Animal <|-- Duck
    Animal <|-- Fish
    Animal <|-- Zebra
    Animal : +int age
    Animal : +String gender
    Animal: +isMammal()
    Animal: +mate()
    class Duck{
      +String beakColor
      +swim()
      +quack()
    }
    class Fish{
      -int sizeInFeet
      -canEat()
    }
    class Zebra{
      +bool is_wild
      +run()
    }
classDiagram
    Animal <|-- Duck
    Animal <|-- Fish
    Animal <|-- Zebra
    Animal : +int age
    Animal : +String gender
    Animal: +isMammal()
    Animal: +mate()
    class Duck{
      +String beakColor
      +swim()
      +quack()
    }
    class Fish{
      -int sizeInFeet
      -canEat()
    }
    class Zebra{
      +bool is_wild
      +run()
    }

状态图:

stateDiagram-v2
    [*] --> Still
    Still --> [*]
    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]
stateDiagram-v2
    [*] --> Still
    Still --> [*]
    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]

ER图:

erDiagram
    CUSTOMER }|..|{ DELIVERY-ADDRESS : has
    CUSTOMER ||--o{ ORDER : places
    CUSTOMER ||--o{ INVOICE : "liable for"
    DELIVERY-ADDRESS ||--o{ ORDER : receives
    INVOICE ||--|{ ORDER : covers
    ORDER ||--|{ ORDER-ITEM : includes
    PRODUCT-CATEGORY ||--|{ PRODUCT : contains
    PRODUCT ||--o{ ORDER-ITEM : "ordered in"
erDiagram
    CUSTOMER }|..|{ DELIVERY-ADDRESS : has
    CUSTOMER ||--o{ ORDER : places
    CUSTOMER ||--o{ INVOICE : "liable for"
    DELIVERY-ADDRESS ||--o{ ORDER : receives
    INVOICE ||--|{ ORDER : covers
    ORDER ||--|{ ORDER-ITEM : includes
    PRODUCT-CATEGORY ||--|{ PRODUCT : contains
    PRODUCT ||--o{ ORDER-ITEM : "ordered in"

甘特图:

gantt
    title A Gantt Diagram
    dateFormat  YYYY-MM-DD
    section Section
    A task           :a1, 2014-01-01, 30d
    Another task     :after a1  , 20d
    section Another
    Task in sec      :2014-01-12  , 12d
    another task      : 24d
gantt
    title A Gantt Diagram
    dateFormat  YYYY-MM-DD
    section Section
    A task           :a1, 2014-01-01, 30d
    Another task     :after a1  , 20d
    section Another
    Task in sec      :2014-01-12  , 12d
    another task      : 24d

旅程图:

journey
    title My working day
    section Go to work
      Make tea: 5: Me
      Go upstairs: 3: Me
      Do work: 1: Me, Cat
    section Go home
      Go downstairs: 5: Me
      Sit down: 3: Me
journey
    title My working day
    section Go to work
      Make tea: 5: Me
      Go upstairs: 3: Me
      Do work: 1: Me, Cat
    section Go home
      Go downstairs: 5: Me
      Sit down: 3: Me

Git关系图:

gitGraph
    commit
    commit
    branch develop
    checkout develop
    commit
    commit
    checkout main
    merge develop
    commit
    commit
gitGraph
    commit
    commit
    branch develop
    checkout develop
    commit
    commit
    checkout main
    merge develop
    commit
    commit

思维导图:

mindmap
  root((mindmap))
    Origins
      Long history
      ::icon(fa fa-book)
      Popularisation
        British popular psychology author Tony Buzan
    Research
      On effectivness<br/>and features
      On Automatic creation
        Uses
            Creative techniques
            Strategic planning
            Argument mapping
    Tools
      Pen and paper
      Mermaid
mindmap
  root((mindmap))
    Origins
      Long history
      ::icon(fa fa-book)
      Popularisation
        British popular psychology author Tony Buzan
    Research
      On effectivness<br/>and features
      On Automatic creation
        Uses
            Creative techniques
            Strategic planning
            Argument mapping
    Tools
      Pen and paper
      Mermaid

更多图表语法,可以前往该网站查看Online FlowChart & Diagrams Editor - Mermaid Live Editor