HistoryCrumbs.user.js
From CSSEMediaWiki
(Difference between revisions)
Paul Clark (Talk | contribs) (User javascript to show 'History Crumbs' at the top of pages.) |
Paul Clark (Talk | contribs) m (Cleaned the script up a little, added delim vars up top.) |
||
Line 14: | Line 14: | ||
on the condition that this notice is left in tact. | on the condition that this notice is left in tact. | ||
*/ | */ | ||
− | |||
// ==UserScript== | // ==UserScript== | ||
// @name historyCrumb | // @name historyCrumb | ||
Line 23: | Line 22: | ||
− | var delim = '|'; | + | var delim = '|'; // used in the cookie |
+ | var trailDelim = ' | '; // used in the breadcrumb | ||
+ | var titleDelim = ' - '; // we will take the first token of the title when it is split with this | ||
var trailLength = 5; | var trailLength = 5; | ||
var chunks; | var chunks; | ||
Line 66: | Line 67: | ||
var contentDiv = document.getElementById('content'); | var contentDiv = document.getElementById('content'); | ||
var linkParen = document.createElement('span'); | var linkParen = document.createElement('span'); | ||
+ | linkParen.id = "histroyCrumbs"; | ||
for(var i in this.links){ | for(var i in this.links){ | ||
− | + | var haveWeBeenHereBefore = 'false'; | |
− | + | for(var j in this.links){ | |
− | + | if (haveWeBeenHereBefore != 'true' && j < i && this.links[j] == this.links[i]) { | |
− | + | // we have been here before | |
− | + | haveWeBeenHereBefore = 'true'; | |
− | + | } else if (this.links[j] == this.links[i] && j < i ) { | |
− | + | // first time here, add the link | |
− | haveWeBeenHereBefore = 'false'; | + | haveWeBeenHereBefore = 'false'; |
+ | } | ||
+ | } | ||
+ | if (haveWeBeenHereBefore == 'false') { | ||
+ | var linkElem = document.createElement('a'); | ||
+ | if(i==this.links.length-1){ | ||
+ | // if this is the last link then it is the page we are currently on, dont bother adding an href | ||
+ | if (i != 0) { | ||
+ | linkParen.appendChild(document.createTextNode(trailDelim)); | ||
+ | } | ||
+ | linkElem.innerText = this.text[i].split(titleDelim)[0] ; | ||
+ | } else { | ||
+ | if (i != 0) { | ||
+ | linkParen.appendChild(document.createTextNode(trailDelim)); | ||
+ | } | ||
+ | linkElem.href = this.links[i]; | ||
+ | linkElem.innerText = this.text[i].split(titleDelim)[0]; | ||
+ | } | ||
+ | linkParen.appendChild(linkElem); | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
contentDiv.insertBefore(linkParen,contentDiv.firstChild); | contentDiv.insertBefore(linkParen,contentDiv.firstChild); | ||
Line 122: | Line 131: | ||
+ expiry.toGMTString(); | + expiry.toGMTString(); | ||
chunks = document.cookie.split("; "); | chunks = document.cookie.split("; "); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function getElementsByClassName(node,classname) { | ||
+ | if (node.getElementsByClassName) { // use native implementation if available | ||
+ | return node.getElementsByClassName(classname); | ||
+ | } else { | ||
+ | return (function getElementsByClass(searchClass,node) { | ||
+ | if ( node == null ) | ||
+ | node = document; | ||
+ | var classElements = [], | ||
+ | els = node.getElementsByTagName("*"), | ||
+ | elsLen = els.length, | ||
+ | pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"), i, j; | ||
+ | |||
+ | for (i = 0, j = 0; i < elsLen; i++) { | ||
+ | if ( pattern.test(els[i].className) ) { | ||
+ | classElements[j] = els[i]; | ||
+ | j++; | ||
+ | } | ||
+ | } | ||
+ | return classElements; | ||
+ | })(classname, node); | ||
} | } | ||
} | } | ||
</pre> | </pre> |
Latest revision as of 12:58, 26 July 2010
Modifications
I just changed the crumbListShow() function to
- Show add the breadcrumbs as the first child element of the div with id='content', and
- Not show pages in the list multiple times, and
- Just save the first part of the title (using ' - ' as a delimiter).
The second modification is a bit messy, and some people probably wont want it.
I also added the UserScript block at the top and the top level function call.
/* Copyright Justin Whitford 2006. http://www.whitford.id.au/ Perpetual, non-exclusive license to use this code is granted on the condition that this notice is left in tact. */ // ==UserScript== // @name historyCrumb // @namespace http://no.name.space/ // @description Display percentage of plays and statistics on user profile // @include http://wiki3.cosc.canterbury.ac.nz/* // ==/UserScript== var delim = '|'; // used in the cookie var trailDelim = ' | '; // used in the breadcrumb var titleDelim = ' - '; // we will take the first token of the title when it is split with this var trailLength = 5; var chunks; var DAY = 24 * 60 * 60 * 1000; doCrumbs(); function doCrumbs(){ if(cookieTest('xxx')){ crumbList = new CrumbList(); if(getCookie('trailLinks')){ var staleLinkCrumbs = getCookie('trailLinks').split(delim); var staleTextCrumbs = getCookie('trailText').split(delim); var startPos= (staleTextCrumbs.length<trailLength || document.location==staleLinkCrumbs[staleLinkCrumbs.length-1]) ?0:1; for(i=startPos;i<staleLinkCrumbs.length;i++){ crumbList.add(staleLinkCrumbs[i],staleTextCrumbs[i]); } } if(document.location!=crumbList.links[crumbList.links.length-1]){ crumbList.add(document.location,document.title); } setCookie('trailLinks',crumbList.links.join(delim),1); setCookie('trailText',crumbList.text.join(delim),1); crumbList.output(); } } function CrumbList(){ this.links=new Array(); this.text=new Array(); this.add = crumbListAdd; this.output = crumbListShow; } function crumbListAdd(href,text){ this.links[this.links.length]=href; this.text[this.text.length]=text; } function crumbListShow(){ var contentDiv = document.getElementById('content'); var linkParen = document.createElement('span'); linkParen.id = "histroyCrumbs"; for(var i in this.links){ var haveWeBeenHereBefore = 'false'; for(var j in this.links){ if (haveWeBeenHereBefore != 'true' && j < i && this.links[j] == this.links[i]) { // we have been here before haveWeBeenHereBefore = 'true'; } else if (this.links[j] == this.links[i] && j < i ) { // first time here, add the link haveWeBeenHereBefore = 'false'; } } if (haveWeBeenHereBefore == 'false') { var linkElem = document.createElement('a'); if(i==this.links.length-1){ // if this is the last link then it is the page we are currently on, dont bother adding an href if (i != 0) { linkParen.appendChild(document.createTextNode(trailDelim)); } linkElem.innerText = this.text[i].split(titleDelim)[0] ; } else { if (i != 0) { linkParen.appendChild(document.createTextNode(trailDelim)); } linkElem.href = this.links[i]; linkElem.innerText = this.text[i].split(titleDelim)[0]; } linkParen.appendChild(linkElem); } } contentDiv.insertBefore(linkParen,contentDiv.firstChild); } function cookieTest(name){ try{ setCookie(name,'true',1); chunks = document.cookie.split("; "); return (getCookie(name)=='true'); }catch(e){ return false; } } function getCookie(name) { var returnVal = null; for (var i in chunks) { var chunk = chunks[i].split("="); returnVal = (chunk[0] == name) ?unescape(chunk[1]) :returnVal; } return returnVal; } function setCookie(name, value, days) { if (value != null && value != "" && days > 0){ var expiry= new Date(new Date().getTime() + days * DAY); document.cookie= name +"="+ escape(value) +"; expires=" + expiry.toGMTString(); chunks = document.cookie.split("; "); } } function getElementsByClassName(node,classname) { if (node.getElementsByClassName) { // use native implementation if available return node.getElementsByClassName(classname); } else { return (function getElementsByClass(searchClass,node) { if ( node == null ) node = document; var classElements = [], els = node.getElementsByTagName("*"), elsLen = els.length, pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"), i, j; for (i = 0, j = 0; i < elsLen; i++) { if ( pattern.test(els[i].className) ) { classElements[j] = els[i]; j++; } } return classElements; })(classname, node); } }