实现了完整的markdown解析与渲染能力,包含IR中间节点定义、markdown解析器以及两种渲染风格(markdown格式与纯文本格式),支持常见markdown语法渲染
121 lines
2.0 KiB
Python
121 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
|
|
class IrNode:
|
|
pass
|
|
|
|
|
|
@dataclass
|
|
class Text(IrNode):
|
|
content: str
|
|
|
|
|
|
@dataclass
|
|
class Bold(IrNode):
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class Italic(IrNode):
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class BoldItalic(IrNode):
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class Strikethrough(IrNode):
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class InlineCode(IrNode):
|
|
code: str
|
|
|
|
|
|
@dataclass
|
|
class CodeBlock(IrNode):
|
|
code: str
|
|
language: str | None = None
|
|
|
|
|
|
@dataclass
|
|
class Link(IrNode):
|
|
url: str
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class Image(IrNode):
|
|
url: str
|
|
alt: str = ""
|
|
|
|
|
|
@dataclass
|
|
class Heading(IrNode):
|
|
level: int
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class Paragraph(IrNode):
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class BlockQuote(IrNode):
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class ListItem(IrNode):
|
|
children: list[IrNode] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class UnorderedList(IrNode):
|
|
items: list[ListItem] = field(default_factory=list)
|
|
marker: str = "-"
|
|
|
|
|
|
@dataclass
|
|
class OrderedList(IrNode):
|
|
items: list[ListItem] = field(default_factory=list)
|
|
start: int = 1
|
|
|
|
|
|
@dataclass
|
|
class ThematicBreak(IrNode):
|
|
pass
|
|
|
|
|
|
@dataclass
|
|
class LineBreak(IrNode):
|
|
pass
|
|
|
|
|
|
@dataclass
|
|
class TableCell(IrNode):
|
|
children: list[IrNode] = field(default_factory=list)
|
|
align: str | None = None
|
|
|
|
|
|
@dataclass
|
|
class TableRow(IrNode):
|
|
cells: list[TableCell] = field(default_factory=list)
|
|
is_header: bool = False
|
|
|
|
|
|
@dataclass
|
|
class Table(IrNode):
|
|
header: TableRow | None = None
|
|
rows: list[TableRow] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class Document(IrNode):
|
|
children: list[IrNode] = field(default_factory=list) |