This commit is contained in:
跨越晨昏 2024-09-06 22:39:35 +08:00
parent 04ed134111
commit 946ec5464b
2 changed files with 58 additions and 14 deletions

View File

@ -9,6 +9,12 @@ class Header:
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
""" """
渲染标题 渲染标题
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
:return: 处理后的文本 :return: 处理后的文本
""" """
h6 = re.sub(r'###### (.*?)\n', r'<h6>\1</h6>\n', self.text) # H6 h6 = re.sub(r'###### (.*?)\n', r'<h6>\1</h6>\n', self.text) # H6
@ -34,54 +40,64 @@ class Style:
def italic(self): def italic(self):
""" """
斜体 *斜体*
:return: :return:
""" """
self.text = re.sub(r'\*([^*\n]+)\*', r'<i>\1</i>', self.text) self.text = re.sub(r'\*([^*\n]+)\*', r'<i>\1</i>', self.text)
def bold(self): def bold(self):
""" """
粗体 **粗体**
:return: :return:
""" """
self.text = re.sub(r'\*\*([^*\n]+)\*\*', r'<b>\1</b>', self.text) self.text = re.sub(r'\*\*([^*\n]+)\*\*', r'<b>\1</b>', self.text)
def underline(self): def underline(self):
""" """
下划线 ~下划线~
:return: :return:
""" """
self.text = re.sub(r'~([^~\n]+)~', r'<u>\1</u>', self.text) self.text = re.sub(r'~([^~\n]+)~', r'<u>\1</u>', self.text)
def strikethrough(self): def strikethrough(self):
""" """
删除线 ~~删除线~~
:return: :return:
""" """
self.text = re.sub(r'~~([^~\n]+)~~', r'<s>\1</s>', self.text) self.text = re.sub(r'~~([^~\n]+)~~', r'<s>\1</s>', self.text)
def highlight(self): def highlight(self):
""" """
高亮 ==高亮==
:return: :return:
""" """
self.text = re.sub(r'==([^=\n]+)==', r'<mark>\1</mark>', self.text) self.text = re.sub(r'==([^=\n]+)==', r'<mark>\1</mark>', self.text)
def up(self): def up(self):
""" """
在文本的正上方添加一行小文本,主要用于标拼音 [在文本的正上方添加一行小文本]^(主要用于标拼音)
:return: :return:
""" """
self.text = re.sub(r'\[(.*?)]\^\((.*?)\)', r'<ruby>\1<rt>\2</rt></ruby>', self.text) self.text = re.sub(r'\[(.*?)]\^\((.*?)\)', r'<ruby>\1<rt>\2</rt></ruby>', self.text)
def hide(self): def hide(self):
""" """
在指定的文本里面隐藏一段文本,只有鼠标放在上面才会显示隐藏文本 [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)
:return: :return:
""" """
self.text = re.sub(r'\[(.*?)]-\((.*?)\)', r'<span title="\2">\1</span>', self.text) self.text = re.sub(r'\[(.*?)]-\((.*?)\)', r'<span title="\2">\1</span>', self.text)
def split_line(self): def split_line(self):
"""
***
___
---
:return:
"""
self.text = re.sub(r'([*_-]){3}\n', r'<hr>', self.text) self.text = re.sub(r'([*_-]){3}\n', r'<hr>', self.text)
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
@ -116,14 +132,14 @@ class Function:
def image(self): def image(self):
""" """
实现链接 ![链接图片](链接地址)
:return: :return:
""" """
self.text = re.sub(r'!\[([^\[\]\n]+)]\(([^()\n]+)\)', r'<img src="\2" alt="\1">', self.text) self.text = re.sub(r'!\[([^\[\]\n]+)]\(([^()\n]+)\)', r'<img src="\2" alt="\1">', self.text)
def link(self): def link(self):
""" """
实现链接 [链接文本](链接地址)
:return: :return:
""" """
self.text = re.sub(r'\[([^\[\]\n]+)]\(([^()\n]+)\)', r'<a href="\2">\1</a>', self.text) self.text = re.sub(r'\[([^\[\]\n]+)]\(([^()\n]+)\)', r'<a href="\2">\1</a>', self.text)
@ -141,11 +157,17 @@ class Function:
class Value: class Value:
"""
定义: {变量名}:
赋值: {变量或锚点名}
锚点: #{锚点名}
"""
def __init__(self, text: str): def __init__(self, text: str):
self.text = text self.text = text
self.values = { self.values = {
key: value for key, value in re.findall(r'\{([^{}]+)} ?= ?(.+?)(?=\n|$)', text) key: value for key, value in re.findall(r'\{([^{}#]+)} ?= ?(.+?)(?=\n|$)', text)
} # 从text中提取所有变量并转换成字典 } # 从text中提取所有变量并转换成字典
self.anchor = re.findall(r'#\{([^{}]+)}', text) # TODO
def __call__(self, *args, **kwargs) -> Tuple[str, Dict[str, str]]: def __call__(self, *args, **kwargs) -> Tuple[str, Dict[str, str]]:
""" """
@ -155,6 +177,9 @@ class Value:
:return: 赋值后的正文 :return: 赋值后的正文
""" """
text = self.text text = self.text
for item in self.anchor:
text = re.sub(r'#\{(' + item + ')}', r'<span id="\1"></span>', text) # 添加锚点
text = re.sub(r'\{' + item + '}', fr'<a href="#{item}">{item}</a>', text) # 添加页内链接
for k, v in self.values.items(): for k, v in self.values.items():
text = re.sub(r'\{' + k + '} ?= ?(.+?)(?=\n|$)', '', text) # 移除变量的定义 text = re.sub(r'\{' + k + '} ?= ?(.+?)(?=\n|$)', '', text) # 移除变量的定义
text = re.sub(r'\{' + k + '}', fr'{v}', text) # 给变量赋值 text = re.sub(r'\{' + k + '}', fr'{v}', text) # 给变量赋值
@ -164,7 +189,7 @@ class Value:
class CodeBlock: class CodeBlock:
def __init__(self, text: str): def __init__(self, text: str):
""" """
找出代码块并移除代码标识 找出`代码块`并移除代码标识
:param text: 输入的文本 :param text: 输入的文本
""" """
self.codes = [i for i in re.findall(r'`([^`]*)`', text) if i != ''] # 找出代码快 self.codes = [i for i in re.findall(r'`([^`]*)`', text) if i != ''] # 找出代码快
@ -257,6 +282,9 @@ class Escape:
class Cite: class Cite:
"""
> 渲染引用 --[引用来源]
"""
def __init__(self, text): def __init__(self, text):
self.text = text self.text = text
@ -266,6 +294,21 @@ class Cite:
return self.text return self.text
class Syllabus:
"""
1. 找到提纲
1.1 找到符合若干个数字++数字且首尾都是数字的行
"""
def __init__(self, text):
self.text = text
self.syllabus = [num for num, txt in re.findall(r'([\.|\d]+) ([^ ]+?)\n', self.text) if not num.endswith('.')] # 找出提纲
def __call__(self, *args, **kwargs):
for num in self.syllabus:
# 检测层级
self.text = re.sub(f'({num}) .+?', '', self.text)
class Basic: class Basic:
def __init__(self, text: str): def __init__(self, text: str):
self.text: str = text self.text: str = text
@ -273,7 +316,7 @@ class Basic:
@staticmethod @staticmethod
def strong_annotation(text: str) -> str: def strong_annotation(text: str) -> str:
""" """
移除强注释 移除|=强注释=|
:param text: 原始文本 :param text: 原始文本
:return: 移除强注释后的文本 :return: 移除强注释后的文本
""" """
@ -282,7 +325,7 @@ class Basic:
@staticmethod @staticmethod
def week_annotation(text: str) -> str: def week_annotation(text: str) -> str:
""" """
移除弱注释 移除 // 弱注释
:param text: 原始文本 :param text: 原始文本
:return: 移除弱注释后的文本 :return: 移除弱注释后的文本
""" """
@ -290,7 +333,7 @@ class Basic:
def paragraph(self): def paragraph(self):
""" """
为普通的行套上段落标签 为普通的行套上<p>段落标签</p>
""" """
# TODO 有点问题 # TODO 有点问题
self.text = re.sub(r'<p>(<.+?>.*?<.+?>)</p>\n', self.text = re.sub(r'<p>(<.+?>.*?<.+?>)</p>\n',
@ -336,6 +379,7 @@ def body(text: str) -> Tuple[str, Dict[str, str]]:
text = Basic.week_annotation(text) # 移除弱注释 text = Basic.week_annotation(text) # 移除弱注释
text, values = Value(text)() # 提取变量并赋值到文本中 text, values = Value(text)() # 提取变量并赋值到文本中
text = Header(text)() # 渲染标题 text = Header(text)() # 渲染标题
Syllabus(text)()
text = Style(text)() # 渲染字体样式 text = Style(text)() # 渲染字体样式
text = Function(text)() # 渲染特殊功能 text = Function(text)() # 渲染特殊功能
text = Cite(text)() # 渲染引用 text = Cite(text)() # 渲染引用

0
Example.mdc Normal file
View File