diff --git a/CrossDown.py b/CrossDown.py index e79da3e..0f424b8 100644 --- a/CrossDown.py +++ b/CrossDown.py @@ -22,6 +22,7 @@ class Style: """ 渲染字体样式 """ + def __init__(self, text: str): """ 初始化 @@ -34,35 +35,35 @@ class Style: 斜体 :return: """ - self.text = re.sub(r'\*([^*\n]+)\*', r'\1\n', self.text) + self.text = re.sub(r'\*([^*\n]+)\*', r'\1', self.text) def bold(self): """ 粗体 :return: """ - self.text = re.sub(r'\*\*([^*\n]+)\*\*', r'\1\n', self.text) + self.text = re.sub(r'\*\*([^*\n]+)\*\*', r'\1', self.text) def underline(self): """ 下划线 :return: """ - self.text = re.sub(r'~([^~\n]+)~', r'\1\n', self.text) + self.text = re.sub(r'~([^~\n]+)~', r'\1', self.text) def strikethrough(self): """ 删除线 :return: """ - self.text = re.sub(r'~~([^~\n]+)~~', r'\1\n', self.text) + self.text = re.sub(r'~~([^~\n]+)~~', r'\1', self.text) def highlight(self): """ 高亮 :return: """ - self.text = re.sub(r'==([^=\n]+)==', r'\1\n', self.text) + self.text = re.sub(r'==([^=\n]+)==', r'\1', self.text) def __call__(self, *args, **kwargs): """ @@ -92,7 +93,7 @@ class Function: self.text = text def link(self): - self.text = re.sub(r'\[([^\[\]\n]+)]\(([^()\n]+)\)', r'\1\n', self.text) + self.text = re.sub(r'\[([^\[\]\n]+)]\(([^()\n]+)\)', r'\1', self.text) def __call__(self, *args, **kwargs): """ @@ -105,23 +106,96 @@ class Function: return self.text +class Value: + def __init__(self, text: str): + self.text = text + self.values = { + key: value for key, value in re.findall(r'\[([^]]+)]: (.+?)(?=\n|$)', text) + } # 从text中提取所有变量并转换成字典 + + def __call__(self, *args, **kwargs): + """ + 将所有变量赋值并移除变量定义 + :param args: + :param kwargs: + :return: 赋值后的正文 + """ + text = self.text + for k, v in self.values.items(): + text = re.sub(fr'\[([^]]+)]\({k}\)', fr'[\1]({v})', text) + text = re.sub(fr'\[{k}]: (.+?)(?=\n|$)', '', text) + return text + + +class CodeBlock: + def __init__(self, text: str): + self.text = text + self.codes = [i for i in re.findall('`([^`]*)`', self.text) if i != ''] + print(self.codes) + + def __call__(self, *args, **kwargs): + return re.sub(r'`[^`]*`', '', self.text) + + class Basic: - @ staticmethod - def paragraph(text): + @staticmethod + def paragraph(text: str): return re.sub(r'(.*?)\n', r'

\1

\n', text) -def main(text: str) -> str: +def add_indent_to_string(input_string: str, indent_spaces: int = 4): + """ + 给字符串中的每一行前面加上缩进。 + :param input_string: 原始字符串,可以包含多行。 + :param indent_spaces: 每行前面要添加的空格数,默认为4。 + + :return: 带缩进的新字符串。 + """ + # 使用字符串的splitlines()方法分割原始字符串为行列表 + lines = input_string.splitlines() + + # 遍历行列表,给每行前面加上相应的缩进,并重新组合成字符串 + indented_string = "\n".join(f"{' ' * indent_spaces}{line}" for line in lines) + + return indented_string + + +def body(text: str) -> str: + """ + 渲染正文部分 + :param text: 输入正文 + :return: 输出渲染后的正文 + """ + text = Value(text)() # 提取变量并赋值到文本中 text = Header.header(text) # 渲染标题 - text = Style(text)() - text = Function(text)() + text = Style(text)() # 渲染字体样式 + text = Function(text)() # 渲染特殊功能 # text = Basic.paragraph(text) # 渲染段落 return text +def main(origen: str): + # 预处理 + text = CodeBlock(origen)() + return body(text) # 处理正文 + # + + if __name__ == '__main__': with open('test.md', encoding='utf-8') as test: cd = main(test.read()) with open('test.html', 'w', encoding='utf-8') as html: - html.write(cd) + html.write(f""" + + + + + UTF-8编码示例 + + + + {add_indent_to_string(cd, 4)} + + + """)