Method code for $compiler.parse_string_new()

[Turn on line numbering]
arg vars, tokens;
var mode, out, word, token, i, tmp, ret;

if (!tokens)
    return [[], vars];
mode = ['spaces, 'plain];
i = 1;
out = [];
word = "";
while (i <= tokens.length()) {
    refresh();
    token = tokens[i++];
    switch (mode[1]) {
        case 'spaces:
            if (token != " ") {
                i--;
                mode = mode.subrange(2);
            }
        case 'plain:
            if (!(token in ["{", "["])) {
                if (token == " ") {
                    // No scatter because .check can throw
                    if ((| (ret = ._check_glue(tokens, i)) |)) {
                        i = ret[1];
                        mode = [ret[2], @mode];
                        if (word)
                            out += [word];
                        word = "";
                        continue;
                    }
                }
                word += token.sed("\\(.)", "%1", "g");
            } else {
                if (word)
                    out += [word];
                word = "";
                mode = ['spaces, token == "{" ? 'fmtname : 'genname, @mode];
            }
        case 'fmtname, 'genname:
            if (mode[1] == 'fmtname && token == "quote") {
                mode = mode.subrange(2);
                out += [$format.new_tag("quote", [], [tokens[i++]])];
                i++;
            } else {
                if (token in glue_table)
                    mode = [mode[1], 'spaces, @mode.subrange(2)];
                mode = ['spaces, 'flags, #[], token, @mode];
            }
        case 'flags:
            if (token in ["}", "]"]) {
                ret = (> ._make_tag(token, mode[4], vars, mode[3], mode[2], []) <);
                vars = ret[2];
                out += [ret[1]];
                mode = mode.subrange(5);
            } else if (token == "=") {
                throw(~parse, "Value flag with no key.");
            } else if (token == ":") {
                mode = ['spaces, 'args, out, mode[2], @mode.subrange(3)];
                out = [];
            } else if ((| tokens[i] == "=" |)) {
                mode = ['flagvalue, token, @mode];
                i++;
            } else {
                mode = mode.replace(2, mode[2].add(token, 1));
            }
        case 'flagvalue:
            if (token in ["}", "]", ":"]) {
                mode = mode.subrange(3);
                i--;
            } else if (token == " ") {
                mode = mode.subrange(3);
            } else if (!(token in ["[", "{"])) {
                mode = ['spaces, @mode.subrange(3).replace(2, mode[4].add(mode[2], token.sed("\\(.)", "%1", "g")))];
            } else {
                if (word)
                    out += [word];
                word = "";
                mode = ['spaces, token == "{" ? 'fmtname : 'genname, 'flagset, @mode.subrange(2)];
            }
        case 'flagset:
            i--;
            mode = ['spaces, @mode.subrange(3).replace(2, mode[4].add(mode[2], out[out.length()]))];
            out = out.subrange(1, out.length() - 1);
        case 'args:
            if (token in ["}", "]"]) {
                if (word) {
                    out += [word];
                    word = "";
                }
                ret = ._make_tag(token, mode[5], vars, mode[4], mode[3], out);
                vars = ret[2];
                out = mode[2] + [ret[1]];
                mode = mode.subrange(6);
            } else if (token in ["{", "["]) {
                if (word)
                    out += [word];
                word = "";
                mode = ['spaces, token == "{" ? 'fmtname : 'genname, @mode];
            } else {
                if (token == " ") {
                    if ((| (ret = ._check_glue(tokens, i)) |)) {
                        i = ret[1];
                        mode = [ret[2], @mode];
                        if (word)
                            out += [word];
                        word = "";
                        continue;
                    }
                }
                word += token.sed("\\(.)", "%1", "g");
            }
    }
}
if (word)
    out += [word];
while (mode[1] == 'spaces)
    mode = mode.subrange(2);
if (mode != ['plain])
    throw(~parse, "Unclosed tag.");
return [out, vars];

// Created 17-Jul-1996 as a part of ColdCore, see: @help Credit

Tlon