Handle links on DOM's LinkItem.

This commit is contained in:
Sergio Martínez Portela 2022-05-06 20:18:44 +02:00
parent 9ef2a8ece6
commit 9b550ed2ea
2 changed files with 38 additions and 37 deletions

View File

@ -46,8 +46,10 @@ class Text:
class ListItem: class ListItem:
def __init__(self, content): def __init__(self, tag, content, orig=None):
self.tag = tag
self.content = content self.content = content
self.orig = orig
class BlockNode: class BlockNode:

View File

@ -176,6 +176,37 @@ def get_links_from_content(content):
else: else:
link_value.append(tok) link_value.append(tok)
def text_to_dom(tokens, item):
in_link = False
in_description = False
link_value = []
link_description = []
contents = []
for tok in tokens:
if isinstance(tok, LinkToken):
if tok.tok_type == LinkTokenType.OPEN_LINK:
in_link = True
open_link_token = tok
elif tok.tok_type == LinkTokenType.OPEN_DESCRIPTION:
in_description = True
elif tok.tok_type == LinkTokenType.CLOSE:
rng = RangeInRaw(item, open_link_token, tok)
contents.append(Link(
"".join(link_value),
"".join(link_description) if in_description else None,
rng,
))
elif isinstance(tok, str) and in_link:
if in_description:
link_description.append(tok)
else:
link_value.append(tok)
else:
contents.append(tok)
return contents
def get_line(item): def get_line(item):
if isinstance(item, Text): if isinstance(item, Text):
@ -324,39 +355,7 @@ class Headline:
assert type(current_node) in NON_FINISHED_GROUPS assert type(current_node) in NON_FINISHED_GROUPS
current_node = None current_node = None
contents = [] contents = []
tree.append(dom.Text(text_to_dom(line.contents, line)))
in_link = False
in_description = False
link_value = []
link_description = []
for tok in line.contents:
if isinstance(tok, LinkToken):
if tok.tok_type == LinkTokenType.OPEN_LINK:
in_link = True
open_link_token = tok
elif tok.tok_type == LinkTokenType.OPEN_DESCRIPTION:
in_description = True
elif tok.tok_type == LinkTokenType.CLOSE:
rng = RangeInRaw(content, open_link_token, tok)
contents.append(Link(
"".join(link_value),
"".join(link_description) if in_description else None,
rng,
))
elif isinstance(tok, str) and in_link:
if in_description:
link_description.append(tok)
else:
link_value.append(tok)
else:
contents.append(tok)
tree.append(dom.Text(contents))
in_link = False
in_description = False
link_value = []
link_description = []
elif isinstance(line, ListItem): elif isinstance(line, ListItem):
if current_node is None: if current_node is None:
@ -374,7 +373,7 @@ class Headline:
c c
for c in indentation_tree[-1].children for c in indentation_tree[-1].children
if isinstance(c, dom.ListItem) if isinstance(c, dom.ListItem)
][-1].content.indentation ][-1].orig.indentation
) )
< len(line.indentation) < len(line.indentation)
): ):
@ -390,7 +389,7 @@ class Headline:
c c
for c in indentation_tree[-1].children for c in indentation_tree[-1].children
if isinstance(c, dom.ListItem) if isinstance(c, dom.ListItem)
][-1].content.indentation ][-1].orig.indentation
) )
> len(line.indentation) > len(line.indentation)
): ):
@ -402,7 +401,7 @@ class Headline:
else: else:
current_node = indentation_tree[-1] current_node = indentation_tree[-1]
node = dom.ListItem(line) node = dom.ListItem(line.tag, text_to_dom(line.content, line), orig=line)
current_node.append(node) current_node.append(node)
elif ( elif (