[Turn off line numbering]1: arg vars, tokens; 2: var mode, out, word, token, i, tmp, ret; 3: 4: if (!tokens) 5: return [[], vars]; 6: mode = ['spaces, 'plain]; 7: i = 1; 8: out = []; 9: word = ""; 10: while (i <= tokens.length()) { 11: refresh(); 12: token = tokens[i++]; 13: switch (mode[1]) { 14: case 'spaces: 15: if (token != " ") { 16: i--; 17: mode = mode.subrange(2); 18: } 19: case 'plain: 20: if (!(token in ["{", "["])) { 21: if (token == " ") { 22: // No scatter because .check can throw 23: if ((| (ret = ._check_glue(tokens, i)) |)) { 24: i = ret[1]; 25: mode = [ret[2], @mode]; 26: if (word) 27: out += [word]; 28: word = ""; 29: continue; 30: } 31: } 32: word += token.sed("\\(.)", "%1", "g"); 33: } else { 34: if (word) 35: out += [word]; 36: word = ""; 37: mode = ['spaces, token == "{" ? 'fmtname : 'genname, @mode]; 38: } 39: case 'fmtname, 'genname: 40: if (mode[1] == 'fmtname && token == "quote") { 41: mode = mode.subrange(2); 42: out += [$format.new_tag("quote", [], [tokens[i++]])]; 43: i++; 44: } else { 45: if (token in glue_table) 46: mode = [mode[1], 'spaces, @mode.subrange(2)]; 47: mode = ['spaces, 'flags, #[], token, @mode]; 48: } 49: case 'flags: 50: if (token in ["}", "]"]) { 51: ret = (> ._make_tag(token, mode[4], vars, mode[3], mode[2], []) <); 52: vars = ret[2]; 53: out += [ret[1]]; 54: mode = mode.subrange(5); 55: } else if (token == "=") { 56: throw(~parse, "Value flag with no key."); 57: } else if (token == ":") { 58: mode = ['spaces, 'args, out, mode[2], @mode.subrange(3)]; 59: out = []; 60: } else if ((| tokens[i] == "=" |)) { 61: mode = ['flagvalue, token, @mode]; 62: i++; 63: } else { 64: mode = mode.replace(2, mode[2].add(token, 1)); 65: } 66: case 'flagvalue: 67: if (token in ["}", "]", ":"]) { 68: mode = mode.subrange(3); 69: i--; 70: } else if (token == " ") { 71: mode = mode.subrange(3); 72: } else if (!(token in ["[", "{"])) { 73: mode = ['spaces, @mode.subrange(3).replace(2, mode[4].add(mode[2], token.sed("\\(.)", "%1", "g")))]; 74: } else { 75: if (word) 76: out += [word]; 77: word = ""; 78: mode = ['spaces, token == "{" ? 'fmtname : 'genname, 'flagset, @mode.subrange(2)]; 79: } 80: case 'flagset: 81: i--; 82: mode = ['spaces, @mode.subrange(3).replace(2, mode[4].add(mode[2], out[out.length()]))]; 83: out = out.subrange(1, out.length() - 1); 84: case 'args: 85: if (token in ["}", "]"]) { 86: if (word) { 87: out += [word]; 88: word = ""; 89: } 90: ret = ._make_tag(token, mode[5], vars, mode[4], mode[3], out); 91: vars = ret[2]; 92: out = mode[2] + [ret[1]]; 93: mode = mode.subrange(6); 94: } else if (token in ["{", "["]) { 95: if (word) 96: out += [word]; 97: word = ""; 98: mode = ['spaces, token == "{" ? 'fmtname : 'genname, @mode]; 99: } else { 100: if (token == " ") { 101: if ((| (ret = ._check_glue(tokens, i)) |)) { 102: i = ret[1]; 103: mode = [ret[2], @mode]; 104: if (word) 105: out += [word]; 106: word = ""; 107: continue; 108: } 109: } 110: word += token.sed("\\(.)", "%1", "g"); 111: } 112: } 113: } 114: if (word) 115: out += [word]; 116: while (mode[1] == 'spaces) 117: mode = mode.subrange(2); 118: if (mode != ['plain]) 119: throw(~parse, "Unclosed tag."); 120: return [out, vars];
// Created 17-Jul-1996 as a part of ColdCore, see: @help Credit