from typing import * import re class Header: def __init__(self, text: str): self.text = text def __call__(self, *args, **kwargs): """ 渲染标题 :return: 处理后的文本 """ h6 = re.sub(r'###### (.*?)\n', r'
{code}
'
elif head == 'shell':
pass
elif re.match(r'\$[^$]*\$', code): # 是LaTex代码
self.codes[index] = re.sub(fr'\$([^$]*)\$', r'\(\1\)', code)
def restore(self, new_text: str):
"""
将渲染好的代码重新放回处理好的正文
:param new_text: 处理好的正文
:return: 加上代码的文章
"""
for index, item in enumerate(self.codes):
new_text = re.sub(fr'-@@-{index}-@@-', f'{item}', new_text, flags=re.DOTALL)
return new_text
class Escape:
"""
转义\后字符
"""
def __init__(self, text: str):
"""
找出转义符并转义
:param text: 输入的文本
"""
self.text = text
self.escapes = {
i: f'--@|{i}|@--' for i in re.findall(r'\\(.)', text)
} # 找出要转义的字符
print(self.escapes)
def __call__(self, *args, **kwargs):
"""
临时移除代码块
:param args:
:param kwargs:
:return: 不含代码的文本
"""
# TODO
for index, item in enumerate(self.escapes): # 替换代码块为-@@-(ID)-@@-
self.text = re.sub(fr'{index}', f'-@@-{index}-@@-', self.text) # 同时转译特殊字符
return self.text
def restore(self, new_text: str):
"""
将渲染好的代码重新放回处理好的正文
:param new_text: 处理好的正文
:return: 加上代码的文章
"""
for index, item in enumerate(self.escapes):
new_text = re.sub(fr'-@@-{index}-@@-', f'{item}', new_text, flags=re.DOTALL)
return new_text
class Basic:
def __init__(self, text: str):
self.text: str = text
def paragraph(self):
"""
为普通的行套上段落标签
"""
self.text = re.sub(r'(<.+?>.*?<.+?>)
\n', r'\1\n', # 移除已被标签包裹的行的额外的标签 '\n'.join( [ f'
{line}
' for line in self.text.splitlines() if not re.search( # 把所有非空的行都套上标签 r'^\s*\n?$', line # 识别空行或空白行 TODO 还应识别-@@-n-@@- ) ] ) ) def __call__(self, *args, **kwargs): self.paragraph() return self.text 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) -> Tuple[str, Dict[str, str]]: """ 渲染正文部分 :param text: 输入正文 :return: 输出渲染后的正文 """ Escape(text) text, values = Value(text)() # 提取变量并赋值到文本中 text = Header(text)() # 渲染标题 text = Style(text)() # 渲染字体样式 text = Function(text)() # 渲染特殊功能 text = Basic(text)() # 渲染基础格式 # text = Basic.paragraph(text) # 渲染段落 return text, values def main(origen: str): # 预处理 code_block = CodeBlock(origen) # 获取代码内容 text = code_block() # 暂时移除代码 text, values = body(text) # 处理正文 code_block.rendering(values) # 渲染代码 return code_block.restore(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(f"""