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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

WSH

凑数日子 2026年,大概将会是最后一个人口保持在14亿以上的年份 感谢之人 数字经济中的注意力交易 突然的噩耗 一株洋瓜藤 再见到姑妈 港澳掠影 Miniflux 中文搜索能力增强 慢慢吹~~~轻轻送~~~ 房子梦 探索云南-大理 证书过期导致的错误 过年被追问工资 在秋天开始 水里的鱼 斩断联系1 云南壮族婚恋 我有一颗乳牙 世界的底色是争,抢,偷 无题4 无题3 人来人往 AI见闻 无题2 滇池掠影 WebGIS 三维空间分析之参考超图实现的天际线分析 我原来是个同步单线程 往事如烟1
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