diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 7c562cd..6683f38 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -89,7 +89,7 @@ class Syllabus(Preprocessor): return [ (lambda match, origen: re.sub(f'^({match.groups()[0]})', # 按照提纲等级添加#和锚点 - fr'{"#" * len(match.groups()[0].split("."))} \1{{#' + match.groups()[0] + '}', origen) + fr'{"#" * len(match.groups()[0].split("."))} \1', origen) if match is not None else origen) # 对于不是提纲的行,直接返回原始字符 ((lambda x: re.match(r'^([\d.]+) ', x) # 判断是否是提纲 if not any((x.startswith('.'), # 以.开头 @@ -116,6 +116,16 @@ class Value(Preprocessor): return lines +class Header(Treeprocessor): + def run(self, root): + """ + 通过修改AST来给标题添加锚点 + """ + for header in root.iter(): + if header.tag in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): # 查找标题 + header.set('id', header.text.split(' ')[0]) # 给标题添加锚点 + + class Basic(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 @@ -128,6 +138,11 @@ class More(Extension): md.preprocessors.register(Value(md), 'values', 0) +class Decorate(Extension): + def extendMarkdown(self, md): + md.treeprocessors.register(Header(md), 'header', 0) + + def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), More()] + list(Extensions.values())) + md = Markdown(extensions=[Basic(), More()] + list(Extensions.values()) + [Decorate()]) return md.convert(text), md.Meta diff --git a/CrossDown/Extra.py b/CrossDown/Extra.py new file mode 100644 index 0000000..e69de29 diff --git a/README.html b/README.html index 58fff18..d3cb82c 100644 --- a/README.html +++ b/README.html @@ -29,8 +29,8 @@
-

CrossDown

+

CrossDown

自制的markdown,添加了一些自定义的语法
效果请见README.html

-

1{#1} 基本语法

-

1.1{#1.1} 标题

-

一级标题

-

二级标题

-

三级标题

-

四级标题

-
五级标题
-
六级标题
-

1.2{#1.2} 样式

-

1.2.1{#1.2.1} 斜体

-

1.2.2{#1.2.2} 粗体

-

1.2.3{#1.2.3} 粗斜体

-

1.2.4{#1.2.4} 下划线

-

1.2.5{#1.2.5} 删除线

-

1.2.6{#1.2.6} 高亮

-

1.2.7{#1.2.7} 在文本的正上方添加一行小文本主要用于标拼音

-

1.2.8{#1.2.8} 在指定的文本里面隐藏一段文本

-

1.2.9{#1.2.9} 分割线

+

1 基本语法

+

1.1 标题

+

一级标题

+

二级标题

+

三级标题

+

四级标题

+
五级标题
+
六级标题
+

1.2 样式

+

1.2.1 斜体

+

1.2.2 粗体

+

1.2.3 粗斜体

+

1.2.4 下划线

+

1.2.5 删除线

+

1.2.6 高亮

+

1.2.7 在文本的正上方添加一行小文本主要用于标拼音

+

1.2.8 在指定的文本里面隐藏一段文本

+

1.2.9 分割线




-

1.3{#1.3} 链接

-

1.3.1{#1.3.1} 普通链接

+

1.3 链接

+

1.3.1 普通链接

链接文本

CrossDark

https://crossdark.net/

-

1.3.2{#1.3.2} 图片

+

1.3.2 图片

链接图片

sea

-

1.3.3{#1.3.3} 变量链接

+

1.3.3 变量链接

链接文本

-

2{#2} 变量

-

2.1{#2.1} 定义

+

2 变量

+

2.1 定义

{变量名} = 值

-

2.2{#2.2} 赋值

+

2.2 赋值

{变量名} {锚点名}

提纲的编号已经自动配置为了锚点,可直接使用{2}

-

2.3{#2.3} 添加锚点

+

2.3 添加锚点

{#锚点名}

-

3{#3} 代码块

-

3.1{#3.1} 单行

-

3.1.1{#3.1.1} LaTex

+

3 代码块

+

3.1 单行

+

3.1.1 LaTex

$CO_2$

$H_2O$

-

3.1.2{#3.1.2} 函数

+

3.1.2 函数

¥y=x*2+1¥ // 不定义范围

¥y=x**2¥€-50,50€ // 定义了x范围

¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

-

3.2{#3.2} 多行

-

3.2.1{#3.2.1} YAML

+

3.2 多行

+

3.2.1 YAML

A: 1. a 2. b @@ -176,21 +176,21 @@ - a - b - c

-

3.2.2{#3.2.2} Python

+

3.2.2 Python

python print('CrossDown')

-

3.2.3{#3.2.3} Mermaid

+

3.2.3 Mermaid

mermaid graph LR A-->B A-->C B-->D C-->D

-

4{#4} 转义

+

4 转义

\

\a

*

-

5{#5} 引用

+

5 引用

一级引用

@@ -210,43 +210,43 @@

引文内添加斜体粗体下划线删除线高亮

-

6{#6} 提纲

-

6.1{#6.1} 提纲号

+

6 提纲

+

6.1 提纲号

以数字和点组成,通过空格与提纲名分隔,例如:

-

6.1.1{#6.1.1} 提纲号示例

+

6.1.1 提纲号示例

点不能出现在开头或结尾,例如

.6.1.2 错误示范

6.1.3. 错误示范

不能出现两个及以上连续的点,例如:

6..1…4 错误示范

提纲号会被自动配置为锚点,可直接使用{6}{6.1}

-

7{#7} 注释

-

7.1{#7.1} 强注释

+

7 注释

+

7.1 强注释

|=
无论如何都会被移除
放在代码块里也没用
=|

-

7.2{#7.2} 弱注释

+

7.2 弱注释

只有在 // 后面才会被移除

// 代码中的注释弱不会被移除

-

8{#8} 列表

-

8.1{#8.1} 有序列表

+

8 列表

+

8.1 有序列表

  1. a
  2. b
  3. c
  4. d
-

8.2{#8.2} 无序列表

+

8.2 无序列表

-

9{#9} 表格

+

9 表格

@@ -268,15 +268,15 @@
-

10{#10} 警告

+

10 警告

这是一条警告

-

11{#11} Emoji

+

11 Emoji

:person_biking:

:grinning_face_with_big_eyes:

-

12{#12} 扩展语法

-

12.1{#12.1} 警告

+

12 扩展语法

+

12.1 警告

Don’t try this at home