summaryrefslogtreecommitdiff
path: root/src/navtree.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/navtree.js')
-rw-r--r--src/navtree.js60
1 files changed, 36 insertions, 24 deletions
diff --git a/src/navtree.js b/src/navtree.js
index 1d739b2..3914be8 100644
--- a/src/navtree.js
+++ b/src/navtree.js
@@ -1,5 +1,3 @@
-var SYNCONMSG = 'click to disable panel synchronisation';
-var SYNCOFFMSG = 'click to enable panel synchronisation';
var navTreeSubIndices = new Array();
function getData(varName)
@@ -22,6 +20,21 @@ function stripPath2(uri)
return m ? uri.substring(i-6) : s;
}
+function hashValue()
+{
+ return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,'');
+}
+
+function hashUrl()
+{
+ return '#'+hashValue();
+}
+
+function pathName()
+{
+ return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, '');
+}
+
function localStorageSupported()
{
try {
@@ -44,7 +57,7 @@ function deleteLink()
{
if (localStorageSupported()) {
window.localStorage.setItem('navpath','');
- }
+ }
}
function cachedLink()
@@ -116,11 +129,13 @@ var animationInProgress = false;
function gotoAnchor(anchor,aname,updateLocation)
{
var pos, docContent = $('#doc-content');
- if (anchor.parent().attr('class')=='memItemLeft' ||
- anchor.parent().attr('class')=='fieldtype' ||
- anchor.parent().is(':header'))
+ var ancParent = $(anchor.parent());
+ if (ancParent.hasClass('memItemLeft') ||
+ ancParent.hasClass('fieldname') ||
+ ancParent.hasClass('fieldtype') ||
+ ancParent.is(':header'))
{
- pos = anchor.parent().position().top;
+ pos = ancParent.position().top;
} else if (anchor.position()) {
pos = anchor.position().top;
}
@@ -178,7 +193,7 @@ function newNode(o, po, text, link, childrenData, lastNode)
a.className = stripPath(link.replace('#',':'));
if (link.indexOf('#')!=-1) {
var aname = '#'+link.split('#')[1];
- var srcPage = stripPath($(location).attr('pathname'));
+ var srcPage = stripPath(pathName());
var targetPage = stripPath(link.split('#')[0]);
a.href = srcPage!=targetPage ? url : "javascript:void(0)";
a.onclick = function(){
@@ -272,14 +287,13 @@ function glowEffect(n,duration)
function highlightAnchor()
{
- var aname = $(location).attr('hash');
+ var aname = hashUrl();
var anchor = $(aname);
if (anchor.parent().attr('class')=='memItemLeft'){
- var rows = $('.memberdecls tr[class$="'+
- window.location.hash.substring(1)+'"]');
+ var rows = $('.memberdecls tr[class$="'+hashValue()+'"]');
glowEffect(rows.children(),300); // member without details
- } else if (anchor.parents().slice(2).prop('tagName')=='TR') {
- glowEffect(anchor.parents('div.memitem'),1000); // enum value
+ } else if (anchor.parent().attr('class')=='fieldname'){
+ glowEffect(anchor.parent().parent(),1000); // enum value
} else if (anchor.parent().attr('class')=='fieldtype'){
glowEffect(anchor.parent().parent(),1000); // struct field
} else if (anchor.parent().is(":header")) {
@@ -294,7 +308,7 @@ function selectAndHighlight(hash,n)
{
var a;
if (hash) {
- var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);
+ var link=stripPath(pathName())+':'+hash.substring(1);
a=$('.item a[class$="'+link+'"]');
}
if (a && a.length) {
@@ -405,14 +419,13 @@ function navTo(o,root,hash,relpath)
if (link) {
var parts = link.split('#');
root = parts[0];
- if (parts.length>1) hash = '#'+parts[1];
+ if (parts.length>1) hash = '#'+parts[1].replace(/[^\w\-]/g,'');
else hash='';
}
if (hash.match(/^#l\d+$/)) {
var anchor=$('a[name='+hash.substring(1)+']');
glowEffect(anchor.parent(),1000); // line number
hash=''; // strip line number anchors
- //root=root.replace(/_source\./,'.'); // source link to doc link
}
var url=root+hash;
var i=-1;
@@ -446,7 +459,7 @@ function toggleSyncButton(relpath)
if (navSync.hasClass('sync')) {
navSync.removeClass('sync');
showSyncOff(navSync,relpath);
- storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash'));
+ storeLink(stripPath2(pathName())+hashUrl());
} else {
navSync.addClass('sync');
showSyncOn(navSync,relpath);
@@ -486,7 +499,7 @@ function initNavTree(toroot,relpath)
}
$(window).load(function(){
- navTo(o,toroot,window.location.hash,relpath);
+ navTo(o,toroot,hashUrl(),relpath);
showRoot();
});
@@ -494,21 +507,20 @@ function initNavTree(toroot,relpath)
if (window.location.hash && window.location.hash.length>1){
var a;
if ($(location).attr('hash')){
- var clslink=stripPath($(location).attr('pathname'))+':'+
- $(location).attr('hash').substring(1);
- a=$('.item a[class$="'+clslink+'"]');
+ var clslink=stripPath(pathName())+':'+hashValue();
+ a=$('.item a[class$="'+clslink.replace(/</g,'\\3c ')+'"]');
}
if (a==null || !$(a).parent().parent().hasClass('selected')){
$('.item').removeClass('selected');
$('.item').removeAttr('id');
}
- var link=stripPath2($(location).attr('pathname'));
- navTo(o,link,$(location).attr('hash'),relpath);
+ var link=stripPath2(pathName());
+ navTo(o,link,hashUrl(),relpath);
} else if (!animationInProgress) {
$('#doc-content').scrollTop(0);
$('.item').removeClass('selected');
$('.item').removeAttr('id');
- navTo(o,toroot,window.location.hash,relpath);
+ navTo(o,toroot,hashUrl(),relpath);
}
})
}