User:Conrad.Irwin/format.js
Jump to navigation
Jump to search
Note: You may have to bypass your browser’s cache to see the changes. In addition, after saving a sitewide CSS file such as MediaWiki:Common.css, it will take 5-10 minutes before the changes take effect, even if you clear your cache.
- Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
- Konqueror and Chrome: click Reload or press F5;
- Opera: clear the cache in Tools → Preferences;
- Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.
- This script lacks a documentation subpage. Please create it.
- Useful links: root page • root page’s subpages • links • redirects • your own
/**
* Header flow:
* elements->spares
* h2 (spares->header)
* elements->spares
* h3 (spares->h2 section)
* elements->h3 section
* h2 LOOP
* flush (spares->h2)
*
* Data Storage
* dom {} is an object storing DOM nodes, 'Language:Section(:head)' keyed
* layout {} is an object storing the wiktionary output layout in dom{} keys
* either layout[language][etymology 0-9][0-9]
* or layout[language][pos 0-9][0-9]
* or layout[language][0-9][0-9] ordered by homonym
* etc.
**/
/************* DEFINITIONS ***************/
var headers = {
'pos' : ["noun","verb","pronoun","adjective","adverb","preposition","interjection","letter","symbol"],
'lords': ["etymology","pronunciation"] //Things that appear above/before real things
};
var page={};
var layout={};
var oldPage;
var divideAndConquer=false;
function parseBody(){
var bc = document.getElementById('bodyContent');
oldPage=bc.innerHTML; //So that when we crash we can revert
var pos=0;
var el;
while(el=bc.childNodes[0]){
bc.removeChild(el);
if(el.nodeName.toUpperCase().indexOf("H")==0){
handleHead(el);
}else if(el.nodeName.toUpperCase()=="HR"){
delete el;
}else if(el.nodeName.toUpperCase()=="#COMMENT"){
delete el; //may as well...
}else if( el.nodeName.toUpperCase()=="DIV"
&& el.getAttribute("id")=="catlinks"){
handleCategories(el);
}else if( el.nodeName.toUpperCase()=="TABLE"
&& el.getAttribute("id")=="toc"){
delete el; //and good riddance
// }else if( el.nodeName.toUpperCase()=="P"){
// handleParagraph(el); //Possible special cases
}else{
includeElement(el);
}
}
// handleH2(false); //this is to ensure we don't leave stuff in spares[]
displayBody();
if(divideAndConquer){unscramblePage()};
finish();
}
if(wgIsArticle && wgNamespaceNumber==0 && wgAction=="view"){
addOnloadHook(parseBody);
};
function displayBody(){
var bc = document.getElementById('bodyContent');
var tabs = document.createElement("div");
tabs.style.margin="10px";
tabs.style.lineHeight="31px";
var firstTab=false;
for(var lang in layout['']){
if(lang!=""/*&&lang.indexOf(':')==-1*/){
window.scrollTo(0,0);
createLanguageTab(tabs,layout[''][lang]);
if(lang==window.location.href.replace(/[^#]+#?/,"")){
firstTab=tabs.childNodes[tabs.childNodes.length-2];
}
}
}
page.nowSelected=document.createElement("div");
if(page[':Heading']){
bc.appendChild(page[':Heading']);
}
if(tabs.childNodes[2]){
bc.appendChild(tabs);
}
bc.appendChild(page.nowSelected);
if(layout.catLinks){
bc.appendChild(layout.catLinks);
}
if(tabs.childNodes[0]){
if(!firstTab)firstTab=tabs.childNodes[0]
//Should try for non-language headings...
tabLanguage(firstTab);
}
};
/********* Parser functions **********/
var page={}; //Stores the DOM Nodes
var layout={}; //Stores the Heading heirarchy
var pos=[]; //Holds current position
var cPos=":Heading"; //Holds current position
var gotoHeader;
page[cPos]=document.createElement("div");//Start off somewhere
function handleHead(hd){
var level=hd.tagName.replace(/^H/,"")-2;
var span=getChildByClass(hd,"mw-headline");
if(span){
while(pos.length>level&&pos.length>0){
pos.pop();
}
var oPos=pos.join(':');
if(!layout[oPos]){
layout[oPos]=[];
}
pos[level]=span.innerHTML.replace(/<[^>]*>/g,"");
cPos=pos.join(':');
layout[oPos][layout[oPos].length]=pos[level];
page[cPos]=document.createElement("div");
page[cPos].setAttribute("id",cPos);
page[cPos+";head"]=hd;
}
}
function includeElement(el){
page[cPos].appendChild(el);
}
function finish(){
// alert(layout);
}
//function skipElement(el){delete el};
var categories = {};
function handleCategories(div){
/* var p = getChildByNode(div,'P');
if(p){
for(var span in p.childNodes){
/* if(p.childNodes[span].nodeName.toUpperCase()=="SPAN"){
var l = getChildByNode(p.childNodes[span],'A');
if(l){
var catName = l.innerText; //Urgh!
}
}
}
}*/
layout[":Categories"]=div;
}
/************ LANGUAGE TABS ************/
function createLanguageTab(tabs,lang){
//alert(lang);
var tab=document.createElement("span");
try{tab.addEventListener('click',function(e){tabLanguage(e.target)},false)}
catch(e){tab.attachEvent('onclick',function(){tabLanguage(window.event.srcElement)})};
tab.style.display="inline";
tab.style.backgroundColor="#BBB";
tab.style.border="1px solid #000";
tab.style.padding="5px";
tab.style.whiteSpace="nowrap";
tab.style.marginLeft="-5px";
//tab.setAttribute("style","display:inline; background-color: #BBB;border:1px solid #000000; padding:5px;white-space: nowrap;margin-left:-5px;");
tab.appendChild(document.createTextNode(lang));
tabs.appendChild(tab);
tabs.appendChild(document.createTextNode(" "));//to allow linebreaks in FF
}
function tabLanguage(tab){
disinheritChildNodes(page.nowSelected);
if(page[tab.innerHTML+";head"]){
page.nowSelected.appendChild(page[tab.innerHTML+";head"]);
}
page.nowSelected.appendChild(page[tab.innerHTML]);
recursiveAppendChild(page.nowSelected, layout[tab.innerHTML],tab.innerHTML+":");
if(ot=getChildByClass(tab.parentNode,"active_tab")){
ot.className="";
ot.style.backgroundColor="#BBB";
}
tab.className="active_tab";
tab.style.backgroundColor="#EEE";
}
/************* DOM HELPERS **************/
function getChildByClass(node,clsname){
if(!node) return;
for(var i=0;i<node.childNodes.length;i++){
if( node.childNodes[i].className==clsname){
return node.childNodes[i];
}
}
}
function disinheritChildNodes(node){
if(!node) return;
while(node.childNodes[0]){
node.removeChild(node.childNodes[0]);
}
}
function recursiveAppendChild(dest,lay,prefix){
for(var i in lay){
if(page[prefix+lay[i]+';head']){
dest.appendChild(page[prefix+lay[i]+';head']);
}else{
dest.appendChild(document.createTextNode('Failed:'+prefix+lay[i]+';head'));
}
if(page[prefix+lay[i]]){
dest.appendChild(page[prefix+lay[i]]);
}else{
dest.appendChild(document.createTextNode('Failed:'+'{{'+prefix+'}}'+lay[i]));
}
recursiveAppendChild(dest,layout[prefix+lay[i]],prefix+lay[i]+':');
}
}
/******************* Section Handlers :( *******************/
function unscramblePage(){ //EEEEKKK
for(var l=0;l<layout[''].length;l++){
lang= layout[''][l];
if(!layout[lang]){continue};
for(var sect=0; sect<layout[lang].length;sect++){
var c=0;
if(headers['pos'].indexOf(layout[lang][sect]
.toLowerCase().replace(/<[^>]*>/g,'').replace(/ +[0-9]*$/,''))>=0){
parsePOS(lang+':'+layout[lang][sect]);
}else{
}
}
}
}
var currentState=[];
var done=false;
var sense=[];
function dealWith(lang){
}
function parsePOS(sect){
// alert(sect);
var el = page[sect];
//Just leave inflection alone for the timebeing
for(var i=0;i<el.childNodes.length;i++){
var sect = el.childNodes[i];
if(sect.nodeName.toUpperCase() == 'OL'){
for(var j=0;j< sect.childNodes.length;j++){
var def = sect.childNodes[j];
if(def.nodeName.toUpperCase() == 'LI'){
var k = sense.length;
sense[k]={};
sense[k]['keys']=extractKeywords(def);
sense[k]['node']=def;
}
}
}
}
}
function extractKeywords(def){
//alert(def.innerHTML);
var str=def.innerHTML; //Assuming I am allowed to use this :)
str=str.toLowerCase();
if(str.indexOf('<dl>')>=0){
str=str.substr(0,str.indexOf('<dl>'));
}
str=str.replace(/<[^>]*>/g,' ');
str=str.replace(/[^a-z]+/g,' ');
var keys = str.split(' ');
return keys;
}