Switch to edit mode.
Name(s): token2tree token2tree_suspended1: "Converts a stream of tokens into a formatting tree."
2: ":token2tree({'<OL>', '<LI>', 'Come ', '<B>', 'here', '</B>', '! ', '</OL>'}, 0)"
3: " => {{{'<OL>', {'<LI>'}, 'Come ', {'<B>', 'here'}, '! '}}}"
4: {tokens, endtag} = args
5: susp = !!index(verb, "suspended")
6: tree = {}
7: while (tokens)
8: susp && $cmd_utils:suspend_if_needed()
9: token = tokens[1]
10: if (token && token[1] == "<")
11: "We have a tag"
12: if (token[$] != ">")
13: "Invalid tag, missing >. Let's add it and continue."
14: token = token + ">"
15: endif
16: name = token[2..(index(token, " ") || $) - 1]
17: if (name in this.single_tags)
18: "We have a tag that doesn't need to close (like <IMG>)"
19: tokens = listdelete(tokens, 1)
20: tree = {@tree, {token}}
21: elseif (name == endtag)
22: "We have our master end tag."
23: return {tree, tokens[2..$]}
24: elseif (name && name[1] == "/")
25: "We have an unnecessary close tag (like </P>)"
26: tokens = listdelete(tokens, 1)
27: else
28: "We have a tag that should have a close partner somewhere."
29: "{branch, ?tokens = {}} = this:(verb)(tokens[2..$], \"/\" + name);"
30: "<FOO BAR=BAZ>'s closing tag is </FOO> not </FOO BAR=BAZ> --Cecil"
31: {branch, ?tokens = {}} = this:(verb)(tokens[2..$], "/" + name)
32: tree = {@tree, {token, @branch}}
33: endif
34: else
35: "We have text"
36: tokens = listdelete(tokens, 1)
37: tree = {@tree, token}
38: endif
39: endwhile
40: return {tree}
41: "Last modified by manta (#7165) on Thu Oct 26 17:07:18 2000 MDT."