Handlebars.registerHelper( "parse", function(text) { var wrap = wraplong(text); text = escape(text); text = colors(text); text = uri(text); if (wrap) { return "" + text + ""; } else { return text; } } ); function wraplong(text) { var wrap = false; var split = text.split(" "); for (var i in split) { if (split[i].length > 40) { wrap = true; } } return wrap; } function escape(text) { var e = { "<": "<", ">": ">", "'": "'" }; return text.replace(/[<>']/g, function (c) { return e[c]; }); } function uri(text) { return URI.withinString(text, function(url, start, end, source) { if (url.indexOf("javascript:") === 0) { return url; } var split = url.split("<"); url = "" + split[0] + ""; if (split[1]) { url += "<" + split[1]; } return url; }); } var regex = { color: /\003([0-9]{1,2})[,]?([0-9]{1,2})?([^\003]+)/, terminator: /\x0D/, styles: [ [/\002([^\002]+)(\002)?/, ["", ""]], [/\037([^\037]+)(\037)?/, ["", ""]], ] }; function colors(text) { if (!text) { return text; } if (regex.terminator.test(text)) { return $.map(text.split(regex.terminator), colors); } if (regex.color.test(text)) { var match; while (match = regex.color.exec(text)) { var color = "color-" + match[1]; var bg = match[2]; if (bg) { color += " bg-" + bg; } var text = text.replace( match[0], "" + match[3] + "" ); } } for (var i in regex.styles) { var pattern = regex.styles[i][0]; var style = regex.styles[i][1]; if (pattern.test(text)) { var match; while (match = pattern.exec(text)) { text = text.replace(match[0], style[0] + match[1] + style[1]); } } } return text; }