@verb #280:"token2tree token2tree_suspended" this none this rxdo #789
@program #280:"token2tree token2tree_suspended" this none this
"Copied from Base Rendering Object (#280):token2tree by Dax (#789)Mar 14 16:20:06 2000"
"Copied from HTML utilities (#52):token2tree by Dax (#789)Jan 4 12:11:19 2000"
"Converts a stream of tokens into a formatting tree."
":token2tree({'
', '- ', 'Come ', '', 'here', '', '! ', '
'}, 0)"
" => {{{'', {'- '}, 'Come ', {'', 'here'}, '! '}}}"
{tokens, endtag} = args
tree = {}
while (tokens)
token = tokens[1]
if (token && token[1] == "<")
" if (!(token[2..(token[$] == \">\") ? (index(token, \" \") || $) - 1 | $] in this.valid_tags))"
" \"Not a tag\";"
" tokens = listdelete(tokens, 1);"
" tree = {@tree, strsub(strsub(token, \"<\", \"<\"), \">\", \">\")};"
" else"
"We have a tag"
if (token[$] != ">")
"Invalid tag, missing >. Let's add it and continue."
token = token + ">"
endif
name = token[2..index(token, " ") || $ - 1]
if (name in $html_utils.single_tags)
"We have a tag that doesn't need to close (like
)"
tokens = listdelete(tokens, 1)
tree = {@tree, {token}}
elseif (name == endtag)
"We have our master end tag."
return {tree, tokens[2..$]}
elseif (name && name[1] == "/")
"We have an unnecessary close tag (like )"
tokens = listdelete(tokens, 1)
else
"We have a tag that should have a close partner somewhere."
"{branch, ?tokens = {}} = $html_utils:(verb)(tokens[2..$], \"/\" + name);"
"'s closing tag is not --Cecil"
{branch, ?tokens = {}} = $html_utils:(verb)(tokens[2..$], "/" + `name[1..(index(name, " ") || $ + 1) - 1] ! E_RANGE => name')
tree = {@tree, {token, @branch}}
endif
" endif"
else
"We have text"
tokens = listdelete(tokens, 1)
tree = {@tree, token}
endif
$command_utils:suspend_if_needed(0)
"I know Dax doesn't want suspends, but.. this shouldn't ALWAYS suspend, should it? --Cecil"
endwhile
return {tree}
"Last modified by Cecil (#7407) on Sun Sep 9 16:01:23 2001 MDT."
.