You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.6 KiB
109 lines
3.6 KiB
4 years ago
|
from __future__ import absolute_import, unicode_literals
|
||
|
|
||
|
from builtins import str
|
||
|
import json
|
||
|
from commonmark.node import is_container
|
||
|
|
||
|
|
||
|
def prepare(obj, topnode=False):
|
||
|
"""Walk the complete AST, only returning needed data.
|
||
|
|
||
|
This removes circular references and allows us to output
|
||
|
JSON.
|
||
|
"""
|
||
|
a = []
|
||
|
for subnode, entered in obj.walker():
|
||
|
rep = {
|
||
|
'type': subnode.t,
|
||
|
}
|
||
|
if subnode.literal:
|
||
|
rep['literal'] = subnode.literal
|
||
|
|
||
|
if subnode.string_content:
|
||
|
rep['string_content'] = subnode.string_content
|
||
|
|
||
|
if subnode.title:
|
||
|
rep['title'] = subnode.title
|
||
|
|
||
|
if subnode.info:
|
||
|
rep['info'] = subnode.info
|
||
|
|
||
|
if subnode.destination:
|
||
|
rep['destination'] = subnode.destination
|
||
|
|
||
|
if subnode.list_data:
|
||
|
rep['list_data'] = subnode.list_data
|
||
|
|
||
|
if is_container(subnode):
|
||
|
rep['children'] = []
|
||
|
|
||
|
if entered and len(a) > 0:
|
||
|
if a[-1]['children']:
|
||
|
a[-1]['children'].append(rep)
|
||
|
else:
|
||
|
a[-1]['children'] = [rep]
|
||
|
else:
|
||
|
a.append(rep)
|
||
|
return a
|
||
|
|
||
|
|
||
|
def dumpJSON(obj):
|
||
|
"""Output AST in JSON form, this is destructive of block."""
|
||
|
prepared = prepare(obj)
|
||
|
return json.dumps(prepared, indent=4, sort_keys=True)
|
||
|
|
||
|
|
||
|
def dumpAST(obj, ind=0, topnode=False):
|
||
|
"""Print out a block/entire AST."""
|
||
|
indChar = ("\t" * ind) + "-> " if ind else ""
|
||
|
print(indChar + "[" + obj.t + "]")
|
||
|
if not obj.title == "":
|
||
|
print("\t" + indChar + "Title: " + (obj.title or ''))
|
||
|
if not obj.info == "":
|
||
|
print("\t" + indChar + "Info: " + (obj.info or ''))
|
||
|
if not obj.destination == "":
|
||
|
print("\t" + indChar + "Destination: " + (obj.destination or ''))
|
||
|
if obj.is_open:
|
||
|
print("\t" + indChar + "Open: " + str(obj.is_open))
|
||
|
if obj.last_line_blank:
|
||
|
print(
|
||
|
"\t" + indChar + "Last line blank: " + str(obj.last_line_blank))
|
||
|
if obj.sourcepos:
|
||
|
print("\t" + indChar + "Sourcepos: " + str(obj.sourcepos))
|
||
|
if not obj.string_content == "":
|
||
|
print("\t" + indChar + "String content: " + (obj.string_content or ''))
|
||
|
if not obj.info == "":
|
||
|
print("\t" + indChar + "Info: " + (obj.info or ''))
|
||
|
if not obj.literal == "":
|
||
|
print("\t" + indChar + "Literal: " + (obj.literal or ''))
|
||
|
if obj.list_data.get('type'):
|
||
|
print("\t" + indChar + "List Data: ")
|
||
|
print("\t\t" + indChar + "[type] = " + obj.list_data.get('type'))
|
||
|
if obj.list_data.get('bullet_char'):
|
||
|
print(
|
||
|
"\t\t" + indChar + "[bullet_char] = " +
|
||
|
obj.list_data['bullet_char'])
|
||
|
if obj.list_data.get('start'):
|
||
|
print(
|
||
|
"\t\t" + indChar + "[start] = " +
|
||
|
str(obj.list_data.get('start')))
|
||
|
if obj.list_data.get('delimiter'):
|
||
|
print(
|
||
|
"\t\t" + indChar + "[delimiter] = " +
|
||
|
obj.list_data.get('delimiter'))
|
||
|
if obj.list_data.get('padding'):
|
||
|
print(
|
||
|
"\t\t" + indChar + "[padding] = " +
|
||
|
str(obj.list_data.get('padding')))
|
||
|
if obj.list_data.get('marker_offset'):
|
||
|
print(
|
||
|
"\t\t" + indChar + "[marker_offset] = " +
|
||
|
str(obj.list_data.get('marker_offset')))
|
||
|
if obj.walker:
|
||
|
print("\t" + indChar + "Children:")
|
||
|
walker = obj.walker()
|
||
|
nxt = walker.nxt()
|
||
|
while nxt is not None and topnode is False:
|
||
|
dumpAST(nxt['node'], ind + 2, topnode=True)
|
||
|
nxt = walker.nxt()
|