171 lines
4.9 KiB
JavaScript
171 lines
4.9 KiB
JavaScript
|
String.interpret = function(value){
|
||
|
return value == null ? '' : String(value);
|
||
|
}
|
||
|
|
||
|
Object.extend(String.prototype, {
|
||
|
gsub: function(pattern, replacement) {
|
||
|
var result = '', source = this, match;
|
||
|
replacement = arguments.callee.prepareReplacement(replacement);
|
||
|
|
||
|
while (source.length > 0) {
|
||
|
if (match = source.match(pattern)) {
|
||
|
result += source.slice(0, match.index);
|
||
|
result += String.interpret(replacement(match));
|
||
|
source = source.slice(match.index + match[0].length);
|
||
|
} else {
|
||
|
result += source, source = '';
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
sub: function(pattern, replacement, count) {
|
||
|
replacement = this.gsub.prepareReplacement(replacement);
|
||
|
count = count === undefined ? 1 : count;
|
||
|
|
||
|
return this.gsub(pattern, function(match) {
|
||
|
if (--count < 0) return match[0];
|
||
|
return replacement(match);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
scan: function(pattern, iterator) {
|
||
|
this.gsub(pattern, iterator);
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
truncate: function(length, truncation) {
|
||
|
length = length || 30;
|
||
|
truncation = truncation === undefined ? '...' : truncation;
|
||
|
return this.length > length ?
|
||
|
this.slice(0, length - truncation.length) + truncation : this;
|
||
|
},
|
||
|
|
||
|
strip: function() {
|
||
|
return this.replace(/^\s+/, '').replace(/\s+$/, '');
|
||
|
},
|
||
|
|
||
|
stripTags: function() {
|
||
|
return this.replace(/<\/?[^>]+>/gi, '');
|
||
|
},
|
||
|
|
||
|
stripScripts: function() {
|
||
|
return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
|
||
|
},
|
||
|
|
||
|
extractScripts: function() {
|
||
|
var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
|
||
|
var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
|
||
|
return (this.match(matchAll) || []).map(function(scriptTag) {
|
||
|
return (scriptTag.match(matchOne) || ['', ''])[1];
|
||
|
});
|
||
|
},
|
||
|
|
||
|
evalScripts: function() {
|
||
|
return this.extractScripts().map(function(script) { return eval(script) });
|
||
|
},
|
||
|
|
||
|
escapeHTML: function() {
|
||
|
var div = document.createElement('div');
|
||
|
var text = document.createTextNode(this);
|
||
|
div.appendChild(text);
|
||
|
return div.innerHTML;
|
||
|
},
|
||
|
|
||
|
unescapeHTML: function() {
|
||
|
var div = document.createElement('div');
|
||
|
div.innerHTML = this.stripTags();
|
||
|
return div.childNodes[0] ? (div.childNodes.length > 1 ?
|
||
|
$A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
|
||
|
div.childNodes[0].nodeValue) : '';
|
||
|
},
|
||
|
|
||
|
toQueryParams: function(separator) {
|
||
|
var match = this.strip().match(/([^?#]*)(#.*)?$/);
|
||
|
if (!match) return {};
|
||
|
|
||
|
return match[1].split(separator || '&').inject({}, function(hash, pair) {
|
||
|
if ((pair = pair.split('='))[0]) {
|
||
|
var name = decodeURIComponent(pair[0]);
|
||
|
var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
|
||
|
|
||
|
if (hash[name] !== undefined) {
|
||
|
if (hash[name].constructor != Array)
|
||
|
hash[name] = [hash[name]];
|
||
|
if (value) hash[name].push(value);
|
||
|
}
|
||
|
else hash[name] = value;
|
||
|
}
|
||
|
return hash;
|
||
|
});
|
||
|
},
|
||
|
|
||
|
toArray: function() {
|
||
|
return this.split('');
|
||
|
},
|
||
|
|
||
|
succ: function() {
|
||
|
return this.slice(0, this.length - 1) +
|
||
|
String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
|
||
|
},
|
||
|
|
||
|
camelize: function() {
|
||
|
var parts = this.split('-'), len = parts.length;
|
||
|
if (len == 1) return parts[0];
|
||
|
|
||
|
var camelized = this.charAt(0) == '-'
|
||
|
? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
|
||
|
: parts[0];
|
||
|
|
||
|
for (var i = 1; i < len; i++)
|
||
|
camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
|
||
|
|
||
|
return camelized;
|
||
|
},
|
||
|
|
||
|
capitalize: function(){
|
||
|
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
|
||
|
},
|
||
|
|
||
|
underscore: function() {
|
||
|
return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
|
||
|
},
|
||
|
|
||
|
dasherize: function() {
|
||
|
return this.gsub(/_/,'-');
|
||
|
},
|
||
|
|
||
|
inspect: function(useDoubleQuotes) {
|
||
|
var escapedString = this.replace(/\\/g, '\\\\');
|
||
|
if (useDoubleQuotes)
|
||
|
return '"' + escapedString.replace(/"/g, '\\"') + '"';
|
||
|
else
|
||
|
return "'" + escapedString.replace(/'/g, '\\\'') + "'";
|
||
|
}
|
||
|
});
|
||
|
|
||
|
String.prototype.gsub.prepareReplacement = function(replacement) {
|
||
|
if (typeof replacement == 'function') return replacement;
|
||
|
var template = new Template(replacement);
|
||
|
return function(match) { return template.evaluate(match) };
|
||
|
}
|
||
|
|
||
|
String.prototype.parseQuery = String.prototype.toQueryParams;
|
||
|
|
||
|
var Template = Class.create();
|
||
|
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
|
||
|
Template.prototype = {
|
||
|
initialize: function(template, pattern) {
|
||
|
this.template = template.toString();
|
||
|
this.pattern = pattern || Template.Pattern;
|
||
|
},
|
||
|
|
||
|
evaluate: function(object) {
|
||
|
return this.template.gsub(this.pattern, function(match) {
|
||
|
var before = match[1];
|
||
|
if (before == '\\') return match[2];
|
||
|
return before + String.interpret(object[match[3]]);
|
||
|
});
|
||
|
}
|
||
|
}
|