Chicken.js
Jump to navigation
Jump to search
// js chicken highlight
// Please click "view source" and copy the code to your own personal .js file (Preferences)
function Hilitor(id, tag)
{
// private variables
var targetNode = document.getElementById(id) || document.body;
var hiliteTag = tag || "MARK";
var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM|SPAN)$");
var colors = ["#ff6"];
var wordColor = [];
var colorIdx = 0;
var matchRegExp = "";
var openLeft = false;
var openRight = false;
// characters to strip from start and end of the input string
var endRegExp = new RegExp('^[^\\w]+|[^\\w]+$', "g");
// characters used to break up the input string into words
var breakRegExp = new RegExp('[^\\w\'-]+', "g");
this.setEndRegExp = function(regex) {
endRegExp = regex;
return endRegExp;
};
this.setBreakRegExp = function(regex) {
breakRegExp = regex;
return breakRegExp;
};
this.setMatchType = function(type)
{
switch(type)
{
case "left":
this.openLeft = false;
this.openRight = true;
break;
case "right":
this.openLeft = true;
this.openRight = false;
break;
case "open":
this.openLeft = this.openRight = true;
break;
default:
this.openLeft = this.openRight = false;
}
};
this.setRegex = function(input)
{
input = input.replace(endRegExp, "");
input = input.replace(breakRegExp, "|");
input = input.replace(/^\||\|$/g, "");
if(input) {
var re = "(" + input + ")";
if(!this.openLeft) re = "\\b" + re;
if(!this.openRight) re = re + "\\b";
matchRegExp = new RegExp(re, "i");
return matchRegExp;
}
return false;
};
this.getRegex = function()
{
var retval = matchRegExp.toString();
retval = retval.replace(/(^\/(\\b)?|\(|\)|(\\b)?\/i$)/g, "");
retval = retval.replace(/\|/g, " ");
return retval;
};
// recursively apply word highlighting
this.hiliteWords = function(node)
{
if(node === undefined || !node) return;
if(!matchRegExp) return;
if(skipTags.test(node.nodeName)) return;
if(node.hasChildNodes()) {
for(var i=0; i < node.childNodes.length; i++)
this.hiliteWords(node.childNodes[i]);
}
if(node.nodeType == 3) { // NODE_TEXT
if((nv = node.nodeValue) && (regs = matchRegExp.exec(nv))) {
if(!wordColor[regs[0].toLowerCase()]) {
wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
}
var match = document.createElement(hiliteTag);
match.appendChild(document.createTextNode(regs[0]));
match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
match.style.color = "#000";
var after = node.splitText(regs.index);
after.nodeValue = after.nodeValue.substring(regs[0].length);
node.parentNode.insertBefore(match, after);
}
};
};
// remove highlighting
this.remove = function()
{
var arr = document.getElementsByTagName(hiliteTag);
while(arr.length && (el = arr[0])) {
var parent = el.parentNode;
parent.replaceChild(el.firstChild, el);
parent.normalize();
}
};
// start highlighting at target node
this.apply = function(input)
{
this.remove();
if(input === undefined || !input) return;
if(this.setRegex(input)) {
this.hiliteWords(targetNode);
}
return matchRegExp;
};
}
var myHilitor = new Hilitor("content"); // id of the element to parse
myHilitor.apply("chicken chickens");
<noinclude>[[Category:Chicken]][[Category:Chickens]]</noinclude>