Sunday, August 05, 2007

prototype javascript library String.gsub example


<script type="text/javascript" charset="utf-8">
function doc (argument) {
document.write(argument);
document.write("<br />\n");
}

// Ruby String.gsub
// In the block form, the current match is passed in as a parameter,
// and variables such as $1, $2, $`, $&, and $' will be set appropriately.
// The value returned by the block will be substituted for the match on each call.
Object.extend(String.prototype, {
gsub: function(pattern, replacement) {
var result = '', source = this, match;
replacement = arguments.callee.prepareReplacement(replacement);
doc(replacement);
while (source.length > 0) {
if (match = source.match(pattern)) {
result += source.slice(0, match.index);
result += String.interpret(replacement(match));
// pass match (object) to replacement(function),
// return value replace match[0]...
// origin Template.evaluate function recursive invoke String.gsub function
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) {
//alert(match.index);
//alert(match[0]);
if (--count < 0) return match[0];
return replacement(match);
});
}
});

String.prototype.gsub.prepareReplacement = function(replacement) {
if (typeof replacement == 'function') return replacement;
var template = new Template(replacement);
return function(match) { return template.evaluate(match) };
}

var Template = Class.create();
Template.prototype = {
initialize: function(template, pattern) {
alert(template.toString());
this.template = template.toString();
},

evaluate: function(match_object) {
return '<font color="red">' + this.template + '</font>';
}
}

var str = 'ThereAreTest1AndTest2AndTest3.';
var txt = str.gsub(/test/i, 'Text');
doc(txt);

var txt2 = str.sub(/test/i, 'Text', 2);
doc(txt2);
</script>

No comments :