⚠️ Warning: This is a draft ⚠️
This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.
If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.
//
/*
### ==================================
This comparison script was written by
Tyrok1 and has been tested in Cr 12 and
Fx 5.
### ==================================
*/
//define the relationship between the CSS classes and what they do
var highlightClasses = [
{ cssBase: "co", description: "Comments" },
{ cssBase: "nu", description: "Numbers" },
{ cssBase: "kw", description: "Keywords" },
{ cssBase: "sy", description: "Operators" },
{ cssBase: "st", description: "Strings" },
{ cssBase: "re", description:
"Variables/Erlang Funs" },
{ cssBase: "br", description: "Brackets/Parens" },
{ cssBase: "co", description:
"Comments/Compiler directives" },
{ cssBase: "me", description: "Class methods" }
];
function AddHandler(el, handlerType, func)
{
//add an event handler in a more cross-browser way
if(el.addEventListener)
{
el.addEventListener(handlerType, func, false);
}
else if(el.attachEvent)
{
el.attachEvent("on" + handlerType, func);
}
else
{
eval("el.on" + handlerType + " = func;");
}
}
function HighlightCode(codeEl)
{
//find all instances of elements with the classes in a given
//code block and update their colors
var allSpans = codeEl.getElementsByTagName("span");
for(var s = 0; s < allSpans.length; ++s)
{
if(allSpans[s].className)
{
for(var c in highlightClasses)
{
var cssBase = allSpans[s].className
.substring(0, highlightClasses[c].cssBase.length);
if(cssBase == highlightClasses[c].cssBase)
{
var colorEl = document.getElementById(
"HighlightColor" + c);
var dropdownVal = colorEl.options[
colorEl.selectedIndex].value;
allSpans[s].style.color =
(dropdownVal == "auto" ? null : dropdownVal);
}
}
}
}
}
function HighlightUpdate()
{
//look for language examples
var allPres = document.getElementsByTagName("pre");
for(var p = 0; p < allPres.length; ++p)
{
if(allPres[p].className &&
allPres[p].className.indexOf("highlighted_source") >= 0)
{
HighlightCode(allPres[p]);
}
}
//save defaults to cookie
var defaults = "";
for(var c in highlightClasses)
{
var colorEl = document.getElementById("HighlightColor" + c);
defaults += (defaults == "" ? "" : ",") +
highlightClasses[c].cssBase + "-" +
colorEl.options[colorEl.selectedIndex].value;
}
document.cookie = ("highlightDefaults=" + defaults +
"; expires=" + (new Date((new Date()).getTime() +
1000 * 60 * 60 * 24 * 365)).toGMTString() + "; path=/");
}
function HighlightAddToolbox()
{
//check the cookie for default colors from last time
var cookies = document.cookie.split(";");
for(var c in cookies)
{
var nameVal = cookies[c].split("=", 2);
if(nameVal[0].replace(/^ */, "") == "highlightDefaults")
{
var defaults = nameVal[1].split(",");
for(var d in defaults)
{
var defaultNameVal = defaults[d].split("-", 2);
for(var h in highlightClasses)
{
if(highlightClasses[h].cssBase == defaultNameVal[0])
{
highlightClasses[h].defaultColor =
defaultNameVal[1];
}
}
}
}
}
//add the toolbox
var hexDigits = ["0", "3", "6", "9", "c", "f"];
var sideColumn = document.getElementById("column-one");
var portletEl = sideColumn.appendChild(document.createElement("div"));
portletEl.className = "portlet";
portletEl.id = "HighlightToolbox";
portletEl.style.position = "relative";
portletEl.appendChild(document.createElement("h5"))
.appendChild(document.createTextNode("Highlight Colors"));
var pBodyEl = portletEl.appendChild(document.createElement("div"));
pBodyEl.className = "pBody";
//add a definition list of color types
var dlEl = pBodyEl.appendChild(document.createElement("dl"));
for(var c in highlightClasses)
{
//add the text label
var labelEl = dlEl.appendChild(document.createElement("dt"))
.appendChild(document.createElement("label"));
labelEl.setAttribute("for", "HighlightColor" + c);
labelEl.appendChild(
document.createTextNode(highlightClasses[c].description));
//add the dropdown
var inputEl = document.createElement("select");
inputEl.id = "HighlightColor" + c;
inputEl = dlEl.appendChild(document.createElement("dd"))
.appendChild(inputEl);
inputEl.onclick = HighlightUpdate;
inputEl.onchange = HighlightUpdate;
inputEl.onkeyup = HighlightUpdate;
//add an option for (Default)
var optionEl = inputEl.appendChild(
document.createElement("option"));
optionEl.value = "auto";
optionEl.appendChild(document.createTextNode("(Default)"));
//add each of the color options
var optionNum = 1;
for(h1 in hexDigits)
{
for(h2 in hexDigits)
{
for(h3 in hexDigits)
{
var optionEl = inputEl.appendChild(
document.createElement("option"));
var color = "#" + hexDigits[h1] +
hexDigits[h2] + hexDigits[h3];
optionEl.value = color;
optionEl.style.color = color;
optionEl.appendChild(document.createTextNode(color));
if(highlightClasses[c].defaultColor &&
color.toLowerCase() ==
highlightClasses[c].defaultColor.toLowerCase())
{
inputEl.selectedIndex = optionNum;
}
++optionNum;
}
}
}
}
}
function HighlightScroll(e)
{
//event handler for scrolling to stick the highlight color
//toolbox to the top of the screen when scrolled down
var toolboxEl = document.getElementById("HighlightToolbox");
if(!toolboxEl.originalTop)
{
toolboxEl.originalTop = toolboxEl.offsetTop;
}
var pageScroll = (document.body.scrollTop ?
document.body.scrollTop : window.pageYOffset);
var newTop = (pageScroll - toolboxEl.originalTop);
toolboxEl.style.top = (newTop >= 0 ? newTop : 0) + "px";
}
function HighlightActivate()
{
//check to see if we're looking at a task page
var catLinksEl = document.getElementById("catlinks");
var isTask = false;
if(catLinksEl)
{
var aEls = catLinksEl.getElementsByTagName("a");
for(var a = 0; a < aEls.length; ++a)
{
if(aEls[a].getAttribute("title") ==
"Category:Programming Tasks")
{
//it's a task
isTask = true;
break;
}
}
}
if(!isTask)
{
return;
}
//add the toolbox
HighlightAddToolbox();
//add the event handler for scrolling
AddHandler(window, "scroll", HighlightScroll);
//update the syntax highlight colors to bring in settings
//from the cookie
HighlightUpdate();
}
//register the script with the window's load event
AddHandler(window, "load", HighlightActivate);
//