[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