核心思路是按行切分Markdown文本,通过前缀匹配识别标题(#级数1–6)、列表(-/*或数字序号),并用字符串方法提取内容、判断嵌套与边界,再转为HTML标签;强调与代码则依赖成对符号匹配及转义处理。

核心思路是把 Markdown 文本按行切分,逐行识别常见标记(如 #、*、`、```),用字符串方法匹配前缀、提取内容、判断嵌套和边界,再转换为对应 HTML 标签。不依赖正则也能实现基础功能,关键在准确识别起始/结束位置和层级关系。
识别标题与列表:靠前缀匹配和空格计数
标题用 # 开头,后面紧跟空格才算有效:
- 用 line.startswith('#') 初筛,再检查 line.lstrip('#').startswith(' ') 防止误判代码行
- 标题级别 = len(line) - len(line.lstrip('#')),但需限制 1–6 级
- 无序列表用 line.strip().startswith('- ') 或 '* ',注意前后空格;有序列表可匹配 r'^\d+\.\s'(简单场景可用 line.split('.', 1)[0].strip().isdigit())
处理强调与代码:找成对符号,避开转义和内部干扰
斜体 *text*、粗体 `code` 都依赖左右边界对称:
- 从左到右扫描,找到第一个未被反斜杠转义的起始符号(如 *),再向右找最近的匹配结束符
- 跳过中间已配对的同类型符号(例如 **a*b** 中,外层 ** 包含内层 *,不拆开)
- 行内代码用单个 `,需确保起始和结束 ` 不在同一单词内,且中间无换行
解析代码块:用状态机管理三重反引号的起始与结束
不同于行内元素,代码块跨多行,需维持解析状态:
- 初始化 in_code_block = False 和 code_lang = ''
- 遇到 line.strip() == '```' 或 line.startswith('```') 时切换状态;若带语言(如 ```python),提取 code_lang = line.strip()[3:].strip()
- 在代码块内,所有内容原样保留,直到再次遇到 ``` 行才退出
段落与换行:靠空行分隔,手动处理尾部换行
Markdown 段落由空行分隔,单个换行仅渲染为
:
- 连续非空行合并为一个段落;检测 line.strip() == '' 作为段落分界
- 段落内末尾有两空格(' ')则视为硬换行,替换为
后再包裹 - 避免把缩进代码行(如 4 空格开头)误判为段落——优先匹配代码块或列表规则


















