48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
|
|
"""
|
||
|
|
Markdown AST Parser.
|
||
|
|
|
||
|
|
This module provides functionality to parse markdown content into an
|
||
|
|
Abstract Syntax Tree (AST) using the markdown-it library.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from markdown_it import MarkdownIt
|
||
|
|
|
||
|
|
|
||
|
|
def parse_markdown_to_ast(md_content: str):
|
||
|
|
"""
|
||
|
|
Parse markdown content into a JSON-serializable AST.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
md_content: Markdown text to parse
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
List of token dictionaries representing the AST
|
||
|
|
|
||
|
|
Example:
|
||
|
|
ast = parse_markdown_to_ast("# Hello\\n\\nWorld")
|
||
|
|
"""
|
||
|
|
# Enable table parsing and other common plugins
|
||
|
|
md = MarkdownIt("commonmark", {"tables": True}).enable(['table'])
|
||
|
|
tokens = md.parse(md_content)
|
||
|
|
|
||
|
|
# Convert to a JSON-serializable list of dicts
|
||
|
|
def token_to_dict(token):
|
||
|
|
d = {
|
||
|
|
'type': token.type,
|
||
|
|
'tag': token.tag,
|
||
|
|
'attrs': token.attrs,
|
||
|
|
'map': token.map,
|
||
|
|
'nesting': token.nesting,
|
||
|
|
'level': token.level,
|
||
|
|
'children': [token_to_dict(child) if child else None for child in token.children] if token.children else None,
|
||
|
|
'content': token.content,
|
||
|
|
'markup': token.markup,
|
||
|
|
'info': token.info,
|
||
|
|
'meta': token.meta,
|
||
|
|
'block': token.block,
|
||
|
|
'hidden': token.hidden
|
||
|
|
}
|
||
|
|
return {k: v for k, v in d.items() if v is not None} # Remove None values
|
||
|
|
|
||
|
|
return [token_to_dict(token) for token in tokens]
|