parent $root object $string var $string alphabet "abcdefghijklmnopqrstuvwxyz" var $string numbers "1234567890" var $string non_alphanumeric "!@#$%^&*()_+-=~`'{}[]|/?\"\\,.<>;: " method left arg str, width, [fchar]; // will NOT chop off 'str' if it is longer than width, use pad() for that. if (fchar) return str + (strlen(str) < width ? pad("", width - strlen(str), fchar[1]) | ""); else return str + (strlen(str) < width ? pad("", width - strlen(str)) | ""); . method center arg text, len, [args]; var lfill, rfill, textlen, padlen; // args[1] == string to center // args[2] == integer of width to center in // args[3] <op> == what to fill the left|right side with. // args[4] <op> == what to fill the right side with. lfill = listlen(args) >= 1 && args[1] || " "; rfill = listlen(args) >= 2 ? args[2] | lfill == " " ? "" | lfill; textlen = strlen(text); padlen = (len - textlen) / 2; if (textlen < len) return .fill(padlen, lfill) + text + (rfill ? .fill(padlen, rfill) | ""); else return len > 0 ? text | pad(text, len); . method trim arg string, [args]; var rl, chars, type; // remove leading and trailing characters. // if args includes a string, it takes that as the strip string. // args can also include symbols of what edge to trim: 'left 'right (or both) // left and right defaults on. rl = []; while (args) { type = type(args[1]); if (type == 'string) chars = args[1]; else if (type == 'symbol) rl = [@rl, args[1]]; args = sublist(args, 2); } if (!chars) chars = " "; if (!rl) rl = ['left, 'right]; if ('left in rl) { // strip from left while (string && string[1] in chars) string = substr(string, 2); } if ('right in rl) { // strip from right while (string && string[strlen(string)] in chars) string = substr(string, 1, strlen(string) - 1); } return string; . method to_list arg str, [sep]; var result, list; // separate a string into a list of strings, breaking wherever 'sep' appears. // if not provided, sep defaults to a comma. // One word of warning. sep should not contain an asterisk. If it does, // this routine will separate the string oddly, most likely losing bits. if (!str) return []; sep = "*" + (sep ? sep[1] | ",") + "*"; list = []; while (1) { result = match_pattern(sep, str); if (result) { list = list + [result[1]]; str = result[2]; } else { return list + [str]; } } . method right arg str, width, [fchar]; // will not chop off 'str' if it is longer than width (unlike pad()) if (fchar) return pad("", width - strlen(str), fill_char[1]) + str; else return pad("", width - strlen(str)) + str; . method alphabet return alphabet; . method numbers return numbers; . method cap arg string; // Capitalizes the first character of a word. return uppercase(string[1]) + substr(string, 2); . method is_numeric arg string; return toint(string) || string == "0"; . method a_or_an arg string; if (lowercase(string[1]) in "aeiou") return "an"; return "a"; . method strip arg string, strip; var new_str, char; // strips all of "strip" characters from the string // if "strip" is -1 it will use .non_alphanumeric() if (type(string) != 'string || type(strip) != 'string && strip != -1) throw(~type, "First argument must be a string, second can be -1"); new_str = ""; if (strip == -1) new_str = non_alphanumeric; for char in [1 .. strlen(string)] { if (!(string[char] in strip)) new_str = new_str + string[char]; } return new_str; . method non_alphanumeric return non_alphanumeric; . method chop arg str, len, [end]; // chops string off strlen(end) characters before len and appends len end = [@end, "..."][1]; if (strlen(str) < len) return str; if (strlen(str) < strlen(end)) return str; return pad(str, len - strlen(end)) + end; . method explode arg [args]; return (> explode(@args) <); . method match_template arg [args]; return (> match_template(@args) <); . method match_pattern arg [args]; return (> match_pattern(@args) <); . method match_regexp arg [args]; return (> match_regexp(@args) <); . method toliteral arg [args]; return (> toliteral(@args) <); . method last arg str; return str[strlen(str)]; . method explode_quoted arg str; var out, result; out = []; while (str) { result = match_pattern("*\"*\"*", str); if (result) { out = [@out, @explode(result[1]), result[2].trim()]; str = result[3]; } else { out = [@out, @explode(str)]; str = ""; } } return out; . method rindex arg str, c; var i; i = strlen(str); while (i) { if (str[i] == c) return i; i = i - 1; } return 0; .