Blame | Last modification | View Log | RSS feed
if(!dojo._hasResource["dojox.dtl.filter.strings"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojox.dtl.filter.strings"] = true;dojo.provide("dojox.dtl.filter.strings");dojo.require("dojox.dtl.filter.htmlstrings");dojo.require("dojox.string.sprintf");dojo.require("dojox.string.tokenize");dojo.mixin(dojox.dtl.filter.strings, {addslashes: function(value){// summary: Adds slashes - useful for passing strings to JavaScript, for example.return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/'/g, "\\'");},capfirst: function(value){// summary: Capitalizes the first character of the valuevalue = "" + value;return value.charAt(0).toUpperCase() + value.substring(1);},center: function(value, arg){// summary: Centers the value in a field of a given widtharg = arg || value.length;value = value + "";var diff = arg - value.length;if(diff % 2){value = value + " ";diff -= 1;}for(var i = 0; i < diff; i += 2){value = " " + value + " ";}return value;},cut: function(value, arg){// summary: Removes all values of arg from the given stringarg = arg + "" || "";value = value + "";return value.replace(new RegExp(arg, "g"), "");},_fix_ampersands: /&(?!(\w+|#\d+);)/g,fix_ampersands: function(value){// summary: Replaces ampersands with ``&`` entitiesreturn value.replace(dojox.dtl.filter.strings._fix_ampersands, "&");},floatformat: function(value, arg){// summary: Format a number according to arg// description:// If called without an argument, displays a floating point// number as 34.2 -- but only if there's a point to be displayed.// With a positive numeric argument, it displays that many decimal places// always.// With a negative numeric argument, it will display that many decimal// places -- but only if there's places to be displayed.arg = parseInt(arg || -1);value = parseFloat(value);var m = value - value.toFixed(0);if(!m && arg < 0){return value.toFixed();}value = value.toFixed(Math.abs(arg));return (arg < 0) ? parseFloat(value) + "" : value;},iriencode: function(value){return dojox.dtl.text.urlquote(value, "/#%[]=:;$&()+,!");},linenumbers: function(value){// summary: Displays text with line numbersvar df = dojox.dtl.filter;var lines = value.split("\n");var output = [];var width = (lines.length + "").length;for(var i = 0, line; i < lines.length; i++){line = lines[i];output.push(df.strings.ljust(i + 1, width) + ". " + df.htmlstrings.escape(line));}return output.join("\n");},ljust: function(value, arg){value = value + "";arg = parseInt(arg);while(value.length < arg){value = value + " ";}return value;},lower: function(value){// summary: Converts a string into all lowercasereturn (value + "").toLowerCase();},make_list: function(value){// summary:// Returns the value turned into a list. For an integer, it's a list of// digits. For a string, it's a list of characters.var output = [];if(typeof value == "number"){value = value + "";}if(value.charAt){for(var i = 0; i < value.length; i++){output.push(value.charAt(i));}return output;}if(typeof value == "object"){for(var key in value){output.push(value[key]);}return output;}return [];},rjust: function(value, arg){value = value + "";arg = parseInt(arg);while(value.length < arg){value = " " + value;}return value;},slugify: function(value){// summary: Converts to lowercase, removes// non-alpha chars and converts spaces to hyphensvalue = value.replace(/[^\w\s-]/g, "").toLowerCase();return value.replace(/[\-\s]+/g, "-");},_strings: {},stringformat: function(value, arg){// summary:// Formats the variable according to the argument, a string formatting specifier.// This specifier uses Python string formating syntax, with the exception that// the leading "%" is dropped.arg = "" + arg;var strings = dojox.dtl.filter.strings._strings;if(!strings[arg]){strings[arg] = new dojox.string.sprintf.Formatter("%" + arg);}return strings[arg].format(value);},title: function(value){// summary: Converts a string into titlecasevar last, title = "";for(var i = 0, current; i < value.length; i++){current = value.charAt(i);if(last == " " || last == "\n" || last == "\t" || !last){title += current.toUpperCase();}else{title += current.toLowerCase();}last = current;}return title;},_truncatewords: /[ \n\r\t]/,truncatewords: function(value, arg){// summary: Truncates a string after a certain number of words// arg: Integer// Number of words to truncate afterarg = parseInt(arg);if(!arg){return value;}for(var i = 0, j = value.length, count = 0, current, last; i < value.length; i++){current = value.charAt(i);if(dojox.dtl.filter.strings._truncatewords.test(last)){if(!dojox.dtl.filter.strings._truncatewords.test(current)){++count;if(count == arg){return value.substring(0, j + 1);}}}else if(!dojox.dtl.filter.strings._truncatewords.test(current)){j = i;}last = current;}return value;},_truncate_words: /(&.*?;|<.*?>|(\w[\w-]*))/g,_truncate_tag: /<(\/)?([^ ]+?)(?: (\/)| .*?)?>/,_truncate_singlets: { br: true, col: true, link: true, base: true, img: true, param: true, area: true, hr: true, input: true },truncatewords_html: function(value, arg){arg = parseInt(arg);if(arg <= 0){return "";}var strings = dojox.dtl.filter.strings;var words = 0;var open = [];var output = dojox.string.tokenize(value, strings._truncate_words, function(all, word){if(word){// It's an actual non-HTML word++words;if(words < arg){return word;}else if(words == arg){return word + " ...";}}// Check for tagvar tag = all.match(strings._truncate_tag);if(!tag || words >= arg){// Don't worry about non tags or tags after our truncate pointreturn;}var closing = tag[1];var tagname = tag[2].toLowerCase();var selfclosing = tag[3];if(closing || strings._truncate_singlets[tagname]){}else if(closing){var i = dojo.indexOf(open, tagname);if(i != -1){open = open.slice(i + 1);}}else{open.unshift(tagname);}return all;}).join("");output = output.replace(/\s+$/g, "");for(var i = 0, tag; tag = open[i]; i++){output += "</" + tag + ">";}return output;},upper: function(value){return value.toUpperCase();},urlencode: function(value){return dojox.dtl.text.urlquote(value);},_urlize: /^((?:[(>]|<)*)(.*?)((?:[.,)>\n]|>)*)$/,_urlize2: /^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$/,urlize: function(value){return dojox.dtl.filter.strings.urlizetrunc(value);},urlizetrunc: function(value, arg){arg = parseInt(arg);return dojox.string.tokenize(value, /(\S+)/g, function(word){var matches = dojox.dtl.filter.strings._urlize.exec(word);if(!matches){return word;}var lead = matches[1];var middle = matches[2];var trail = matches[3];var startsWww = middle.indexOf("www.") == 0;var hasAt = middle.indexOf("@") != -1;var hasColon = middle.indexOf(":") != -1;var startsHttp = middle.indexOf("http://") == 0;var startsHttps = middle.indexOf("https://") == 0;var firstAlpha = /[a-zA-Z0-9]/.test(middle.charAt(0));var last4 = middle.substring(middle.length - 4);var trimmed = middle;if(arg > 3){trimmed = trimmed.substring(0, arg - 3) + "...";}if(startsWww || (!hasAt && !startsHttp && middle.length && firstAlpha && (last4 == ".org" || last4 == ".net" || last4 == ".com"))){return '<a href="http://' + middle + '" rel="nofollow">' + trimmed + '</a>';}else if(startsHttp || startsHttps){return '<a href="' + middle + '" rel="nofollow">' + trimmed + '</a>';}else if(hasAt && !startsWww && !hasColon && dojox.dtl.filter.strings._urlize2.test(middle)){return '<a href="mailto:' + middle + '">' + middle + '</a>';}return word;}).join("");},wordcount: function(value){return dojox.dtl.text.pySplit(value).length;},wordwrap: function(value, arg){arg = parseInt(arg);// summary: Wraps words at specified line lengthvar output = [];var parts = value.split(/ /g);if(parts.length){var word = parts.shift();output.push(word);var pos = word.length - word.lastIndexOf("\n") - 1;for(var i = 0; i < parts.length; i++){word = parts[i];if(word.indexOf("\n") != -1){var lines = word.split(/\n/g);}else{var lines = [word];}pos += lines[0].length + 1;if(arg && pos > arg){output.push("\n");pos = lines[lines.length - 1].length;}else{output.push(" ");if(lines.length > 1){pos = lines[lines.length - 1].length;}}output.push(word);}}return output.join("");}});}