diff options
author | mensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f> | 2008-11-13 09:49:11 +0000 |
---|---|---|
committer | mensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f> | 2008-11-13 09:49:11 +0000 |
commit | e44a7e37b6c7b5961adaffc62b9042b8d442938e (patch) | |
tree | 95b67c356e93163467db2451f2b8cce84ed5d582 /includes/js/dojox/dtl/filter/strings.js | |
parent | a62b9742ee5e28bcec6872d88f50f25b820914f6 (diff) | |
download | semanticscuttle-e44a7e37b6c7b5961adaffc62b9042b8d442938e.tar.gz semanticscuttle-e44a7e37b6c7b5961adaffc62b9042b8d442938e.tar.bz2 |
New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit
git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f
Diffstat (limited to 'includes/js/dojox/dtl/filter/strings.js')
-rw-r--r-- | includes/js/dojox/dtl/filter/strings.js | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/includes/js/dojox/dtl/filter/strings.js b/includes/js/dojox/dtl/filter/strings.js new file mode 100644 index 0000000..1270574 --- /dev/null +++ b/includes/js/dojox/dtl/filter/strings.js @@ -0,0 +1,327 @@ +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, { + _urlquote: function(/*String*/ url, /*String?*/ safe){ + if(!safe){ + safe = "/"; + } + return dojox.string.tokenize(url, /([^\w-_.])/g, function(token){ + if(safe.indexOf(token) == -1){ + if(token == " "){ + return "+"; + }else{ + return "%" + token.charCodeAt(0).toString(16).toUpperCase(); + } + } + return token; + }).join(""); + }, + 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 value + value = "" + value; + return value.charAt(0).toUpperCase() + value.substring(1); + }, + center: function(value, arg){ + // summary: Centers the value in a field of a given width + arg = 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 string + arg = arg + "" || ""; + value = value + ""; + return value.replace(new RegExp(arg, "g"), ""); + }, + _fix_ampersands: /&(?!(\w+|#\d+);)/g, + fix_ampersands: function(value){ + // summary: Replaces ampersands with ``&`` entities + return 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.filter.strings._urlquote(value, "/#%[]=:;$&()+,!"); + }, + linenumbers: function(value){ + // summary: Displays text with line numbers + var 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 lowercase + return (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 hyphens + value = 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 titlecase + var 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 after + arg = 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 tag + var tag = all.match(strings._truncate_tag); + if(!tag || words >= arg){ + // Don't worry about non tags or tags after our truncate point + return; + } + 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.filter.strings._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 length + var 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(""); + } +}); + +} |