From 4f49b16079b27d7ce633619e4cddfdf2bffbc952 Mon Sep 17 00:00:00 2001 From: cashmere Date: Fri, 4 Sep 2026 09:05:24 +0200 Subject: initial commit --- src/tree.js | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/tree.js (limited to 'src/tree.js') diff --git a/src/tree.js b/src/tree.js new file mode 100644 index 0000000..db4aa24 --- /dev/null +++ b/src/tree.js @@ -0,0 +1,72 @@ +/* Javascript to implement the file hierarchy tree. +*/ +(function(){ +function isExpanded(ul){ + return ul.className==''; +} + +function toggleDir(ul, useInitValue){ + if( !useInitValue ){ + expandMap[ul.id] = !isExpanded(ul); + history.replaceState(expandMap, ''); + } + ul.className = expandMap[ul.id] ? '' : 'collapsed'; +} + +function toggleAll(tree, useInitValue){ + var lists = tree.querySelectorAll('.subdir > ul > li ul'); + if( !useInitValue ){ + var expand = true; /* Default action: make all sublists visible */ + for( var i=0; lists[i]; i++ ){ + if( isExpanded(lists[i]) ){ + expand = false; /* Any already visible - make them all hidden */ + break; + } + } + expandMap = {'*': expand}; + history.replaceState(expandMap, ''); + } + var className = expandMap['*'] ? '' : 'collapsed'; + for( var i=0; lists[i]; i++ ){ + lists[i].className = className; + } +} + +function checkState(){ + expandMap = history.state || {}; + if( '*' in expandMap ) toggleAll(outer_ul, true); + for( var id in expandMap ){ + if( id!=='*' ) toggleDir(document.getElementById(id), true); + } +} + +function belowSubdir(node){ + do{ + node = node.parentNode; + if( node==subdir ) return true; + } while( node && node!=outer_ul ); + return false; +} + +var history = window.history || {}; +if( !history.replaceState ) history.replaceState = function(){}; +var outer_ul = document.querySelector('.filetree > ul'); +var subdir = outer_ul.querySelector('.subdir'); +var expandMap = {}; +checkState(); +outer_ul.onclick = function(e){ + e = e || window.event; + var a = e.target || e.srcElement; + if( a.nodeName!='A' ) return true; + if( a.parentNode.parentNode==subdir ){ + toggleAll(outer_ul); + return false; + } + if( !belowSubdir(a) ) return true; + var ul = a.parentNode.nextSibling; + while( ul && ul.nodeName!='UL' ) ul = ul.nextSibling; + if( !ul ) return true; /* This is a file link, not a directory */ + toggleDir(ul); + return false; +} +}()) -- cgit v1.3.1