diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 6af8bd2..7c562cd 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -6,7 +6,6 @@ from markdown import Markdown from typing import * import re - Extensions = { "Extra": "markdown.extensions.extra", "Abbreviations": "markdown.extensions.abbr", @@ -73,7 +72,7 @@ class Style(Preprocessor): """ return re.sub(r'\[(.*?)]-\((.*?)\)', r'\1', text) - def run(self, lines): + def run(self, lines: List[str]) -> List[str]: new_line = [] for line in lines: line = self.strikethrough(line) # 渲染删除线 @@ -85,12 +84,50 @@ class Style(Preprocessor): return new_line -class Core(Extension): +class Syllabus(Preprocessor): + def run(self, lines: List[str]) -> List[str]: + return [ + (lambda match, origen: + re.sub(f'^({match.groups()[0]})', # 按照提纲等级添加#和锚点 + fr'{"#" * len(match.groups()[0].split("."))} \1{{#' + match.groups()[0] + '}', origen) + if match is not None else origen) # 对于不是提纲的行,直接返回原始字符 + ((lambda x: re.match(r'^([\d.]+) ', x) # 判断是否是提纲 + if not any((x.startswith('.'), # 以.开头 + re.search('\. ', x) is not None, # 存在.+空格 + re.search('\.{2,}', x), # 存在连续的. + )) + else None)(line), line) # 排除.在提纲号开头或结尾的情况 + for line in lines # 分割并遍历文本的每一行 + ] + + +class Value(Preprocessor): + def run(self, lines: List[str]) -> List[str]: + values = { # 从text中提取所有变量并转换成字典 + key: value for key, value in [ + (lambda match: match.groups() if match is not None else ('', '')) # 未定义变量的行统一返回('', '') + (re.match(r'\{([^{}#]+)} ?= ?(.+?)(?=\n|$)', line)) for line in lines + ] + } + anchor = [ + re.match(r'\{#([^{}#]+)}', line) for line in lines + ] + print(anchor) + return lines + + +class Basic(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 - md.preprocessors.register(Style(md), 'custom_preprocessor', 0) + md.preprocessors.register(Style(md), 'style', 0) + md.preprocessors.register(Syllabus(md), 'syllabus', 0) -def main(text): - md = Markdown(extensions=[Core()] + list(Extensions.values())) +class More(Extension): + def extendMarkdown(self, md): + md.preprocessors.register(Value(md), 'values', 0) + + +def main(text: str) -> Tuple[str, Dict[str, List[str]]]: + md = Markdown(extensions=[Basic(), More()] + list(Extensions.values())) return md.convert(text), md.Meta diff --git a/README.html b/README.html index 17a6056..58fff18 100644 --- a/README.html +++ b/README.html @@ -29,6 +29,10 @@
自制的markdown,添加了一些自定义的语法
效果请见README.html
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 普通链接
+1.3.2 图片
+1.3.3 变量链接
+2 变量
-2.1 定义
+{变量名} = 值
-2.2 赋值
+{变量名} {锚点名}
提纲的编号已经自动配置为了锚点,可直接使用{2}
-2.3 添加锚点
+{#锚点名}
-3 代码块
-3.1 单行
3.1.1 LaTex
+单行
$CO_2$
$H_2O$
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.1 YAML
+A:
1. a
2. b
@@ -108,21 +176,21 @@
- a
- b
- c
3.2.2 Python
+python
print('CrossDown')
3.2.3 Mermaid
+mermaid
graph LR
A-->B
A-->C
B-->D
C-->D
4 转义
+\
\a
*
-5 引用
+-一级引用
@@ -142,37 +210,43 @@引文内添加斜体粗体下划线
删除线高亮
6 提纲
-6.1 提纲号
+以数字和点组成,通过空格与提纲名分隔,例如:
-6.1.1 提纲号示例
+点不能出现在开头或结尾,例如
.6.1.2 错误示范
6.1.3. 错误示范
不能出现两个及以上连续的点,例如:
6..1…4 错误示范
提纲号会被自动配置为锚点,可直接使用{6}{6.1}
-7 注释
-7.1 强注释
+|=
无论如何都会被移除
放在代码块里也没用
=|
7.2 弱注释
+只有在 // 后面才会被移除
// 代码中的注释弱不会被移除
8 列表
-8.1 有序列表
- 1. a
- 2. b
- 3. c
- 4. d
8.2 无序列表
- - A
- - B
- - C
- - D
9 表格
+10 警告
+这是一条警告
11 Emoji
+:person_biking:
:grinning_face_with_big_eyes:
+Don’t try this at home
+