much can be done globally with CSS files steering the actual page construction. Add a CSS editing capability and or CSS templates. This would help having to do repeated insertions of code for each page.
The page navigation is a good example.
This is the code I am using for https://rockedge.org/kernels . The code is orginally for a collapsing expanding navigation menu. I just modified it for a pseudo web file manager to offer some kernels and ISO's. It uses javascript with 1 CSS and 1 JS file. I am using PHP but as a navigation menu can be 100% html.
index.php
Code: Select all
<!DOCTYPE html>
<head>
<title>PL-KLV-WDL</title>
<link rel="stylesheet" type="text/css" href="simpletree.css" />
<link rel="stylesheet" type="text/css" href="kern.css" />
<script type="text/javascript" src="simpletreemenu.js"></script>
</head>
<?php
include "functions.php";
include "scandr2.php";
?>
<body>
<div class="controlBox">
<center>
<a href="javascript:ddtreemenu.flatten('treemenu3', 'expand')" style="font-family:'Arial';font-size:14pt;color:black;">Expand All</a> | <a href="javascript:ddtreemenu.flatten('treemenu3', 'contract')"style="font-family:'Arial';font-size:14pt;color:#000000;">Collapse All</a>
</center></div>
<div class="Box">
<img src='puppylinux-logo.png' width='150px' alt='image' onclick="this.style.display = 'none';">
</div>
<div><h2>Puppy Linux, WDL, KLV</h2></div>
<div id="tree" style="float:left; width:55%; border: 1px solid black;">
<ul id="treemenu3" class="treeview">
<?php
// $path = "/mnt/home/music";
// $path = "/mnt/home/kernel";
// $path = "/home/rockedg1/public_html/kernels/data";
$path = "/var/www";
$filestructure= scan_directory_recursively($path, false);
foreach($filestructure as $subcontent) {
if ($subcontent[kind] =='directory'){
echo "<li>".$subcontent[name]."\n";
echo "<ul>"."\n";
echo scan_dd($subcontent[content]);
echo "</ul>"."\n";
}else{
if ($subcontent[kind] =='file'){
$url =($subcontent[path]).($subcontent[name]);
//echo "<li><a href=".$url." download >".($subcontent[name])." ------------ ".($subcontent[size]/1024)." Kbytes</a>";
echo "<li><a href=".$url." download >".($subcontent[name])." ------------ ".huf($subcontent[size])."</a>";
}
}
}
?>
</ul>
<script type="text/javascript">
ddtreemenu.createTree("treemenu3", true)
</script>
</div>
</body>
simpletreemenu.js
Code: Select all
var persisteduls=new Object()
var ddtreemenu=new Object()
ddtreemenu.closefolder="closed.gif" //set image path to "closed" folder image
ddtreemenu.openfolder="open.gif" //set image path to "open" folder image
//////////No need to edit beyond here///////////////////////////
ddtreemenu.createTree=function(treeid, enablepersist, persistdays){
var ultags=document.getElementById(treeid).getElementsByTagName("ul")
if (typeof persisteduls[treeid]=="undefined")
persisteduls[treeid]=(enablepersist==true && ddtreemenu.getCookie(treeid)!="")? ddtreemenu.getCookie(treeid).split(",") : ""
for (var i=0; i<ultags.length; i++)
ddtreemenu.buildSubTree(treeid, ultags[i], i)
if (enablepersist==true){ //if enable persist feature
var durationdays=(typeof persistdays=="undefined")? 1 : parseInt(persistdays)
ddtreemenu.dotask(window, function(){ddtreemenu.rememberstate(treeid, durationdays)}, "unload") //save opened UL indexes on body unload
}
}
ddtreemenu.buildSubTree=function(treeid, ulelement, index){
ulelement.parentNode.className="submenu"
if (typeof persisteduls[treeid]=="object"){ //if cookie exists (persisteduls[treeid] is an array versus "" string)
if (ddtreemenu.searcharray(persisteduls[treeid], index)){
ulelement.setAttribute("rel", "open")
ulelement.style.display="block"
ulelement.parentNode.style.backgroundImage="url("+ddtreemenu.openfolder+")"
}
else
ulelement.setAttribute("rel", "closed")
} //end cookie persist code
else if (ulelement.getAttribute("rel")==null || ulelement.getAttribute("rel")==false) //if no cookie and UL has NO rel attribute explicted added by user
ulelement.setAttribute("rel", "closed")
else if (ulelement.getAttribute("rel")=="open") //else if no cookie and this UL has an explicit rel value of "open"
ddtreemenu.expandSubTree(treeid, ulelement) //expand this UL plus all parent ULs (so the most inner UL is revealed!)
ulelement.parentNode.onclick=function(e){
var submenu=this.getElementsByTagName("ul")[0]
if (submenu.getAttribute("rel")=="closed"){
submenu.style.display="block"
submenu.setAttribute("rel", "open")
ulelement.parentNode.style.backgroundImage="url("+ddtreemenu.openfolder+")"
}
else if (submenu.getAttribute("rel")=="open"){
submenu.style.display="none"
submenu.setAttribute("rel", "closed")
ulelement.parentNode.style.backgroundImage="url("+ddtreemenu.closefolder+")"
}
ddtreemenu.preventpropagate(e)
}
ulelement.onclick=function(e){
ddtreemenu.preventpropagate(e)
}
}
ddtreemenu.expandSubTree=function(treeid, ulelement){ //expand a UL element and any of its parent ULs
var rootnode=document.getElementById(treeid)
var currentnode=ulelement
currentnode.style.display="block"
currentnode.parentNode.style.backgroundImage="url("+ddtreemenu.openfolder+")"
while (currentnode!=rootnode){
if (currentnode.tagName=="UL"){ //if parent node is a UL, expand it too
currentnode.style.display="block"
currentnode.setAttribute("rel", "open") //indicate it's open
currentnode.parentNode.style.backgroundImage="url("+ddtreemenu.openfolder+")"
}
currentnode=currentnode.parentNode
}
}
ddtreemenu.flatten=function(treeid, action){ //expand or contract all UL elements
var ultags=document.getElementById(treeid).getElementsByTagName("ul")
for (var i=0; i<ultags.length; i++){
ultags[i].style.display=(action=="expand")? "block" : "none"
var relvalue=(action=="expand")? "open" : "closed"
ultags[i].setAttribute("rel", relvalue)
ultags[i].parentNode.style.backgroundImage=(action=="expand")? "url("+ddtreemenu.openfolder+")" : "url("+ddtreemenu.closefolder+")"
}
}
ddtreemenu.rememberstate=function(treeid, durationdays){ //store index of opened ULs relative to other ULs in Tree into cookie
var ultags=document.getElementById(treeid).getElementsByTagName("ul")
var openuls=new Array()
for (var i=0; i<ultags.length; i++){
if (ultags[i].getAttribute("rel")=="open")
openuls[openuls.length]=i //save the index of the opened UL (relative to the entire list of ULs) as an array element
}
if (openuls.length==0) //if there are no opened ULs to save/persist
openuls[0]="none open" //set array value to string to simply indicate all ULs should persist with state being closed
ddtreemenu.setCookie(treeid, openuls.join(","), durationdays) //populate cookie with value treeid=1,2,3 etc (where 1,2... are the indexes of the opened ULs)
}
////A few utility functions below//////////////////////
ddtreemenu.getCookie=function(Name){ //get cookie value
var re=new RegExp(Name+"=[^;]+", "i"); //construct RE to search for target name/value pair
if (document.cookie.match(re)) //if cookie found
return document.cookie.match(re)[0].split("=")[1] //return its value
return ""
}
ddtreemenu.setCookie=function(name, value, days){ //set cookei value
var expireDate = new Date()
//set "expstring" to either future or past date, to set or delete cookie, respectively
var expstring=expireDate.setDate(expireDate.getDate()+parseInt(days))
document.cookie = name+"="+value+"; expires="+expireDate.toGMTString()+"; path=/";
}
ddtreemenu.searcharray=function(thearray, value){ //searches an array for the entered value. If found, delete value from array
var isfound=false
for (var i=0; i<thearray.length; i++){
if (thearray[i]==value){
isfound=true
thearray.shift() //delete this element from array for efficiency sake
break
}
}
return isfound
}
ddtreemenu.preventpropagate=function(e){ //prevent action from bubbling upwards
if (typeof e!="undefined")
e.stopPropagation()
else
event.cancelBubble=true
}
ddtreemenu.dotask=function(target, functionref, tasktype){ //assign a function to execute to an event handler (ie: onunload)
var tasktype=(window.addEventListener)? tasktype : "on"+tasktype
if (target.addEventListener)
target.addEventListener(tasktype, functionref, false)
else if (target.attachEvent)
target.attachEvent(tasktype, functionref)
}
simpletree.css
Code: Select all
@charset "windows-1252";
.treeview ul{ /*CSS for Simple Tree Menu*/
margin: 0;
padding: 0;
font: 10px arial, sans-serif;
}
.treeview li{ /*Style for LI elements in general (excludes an LI that contains sub lists)*/
background: #D3D3EA url(b_globe.gif) no-repeat left center;
list-style-type: none;
padding-left: 22px;
margin-bottom: 3px;
opacity: 0.95;
filter:alpha(opacity=95); /* For IE8 and earlier */
font: 12px arial, sans-serif;
}
.treeview li.submenu{ /* Style for LI that contains sub lists (other ULs). */
background: white url(closed.gif) no-repeat left 1px;
cursor: hand !important;
cursor: pointer !important;
font: 12px arial, sans-serif;
font-weight:bold;
color:#000000;
}
.treeview li.submenu ul{ /*Style for ULs that are children of LIs (submenu) */
display: none; /*Hide them by default. Don't delete. */
font-weight:bold;
}
.treeview .submenu ul li{ /*Style for LIs of ULs that are children of LIs (submenu) */
cursor: default;
font-weight: ;
color:#000000;
}
A:link {text-decoration: none; color:#000000;}
A:visited {text-decoration: none; color:#000000;}
A:active {text-decoration: none; color:#000000;}
A:hover {text-decoration: underline; color: red;}
}
functions.php
Code: Select all
<?php
# functions pack
function scan_dd($array) {
foreach($array as $subcontent) {
$songs[$i][path] = $subcontent[path];
$songs[$i][name] = $subcontent[name];
$songs[$i][kind] = $subcontent[kind];
$songs[$i][size] = $subcontent[size];
$songs[$i][content] = $subcontent[content];
if ($songs[$i][kind] =='directory'){
echo "<li>".$subcontent[name]." \n";
echo "<ul>"."\n";;
$go_array = $subcontent[content];
echo scan_dd ($go_array);
echo "</ul>"."\n";
}
++$i;
}
$data = orderBy($songs);
foreach($data as $subcontent) {
if ($subcontent[kind] =='file'){
$url =get_path($subcontent[path]);
echo "<li><a href=".$url." download >".($subcontent[name])." ------------ ".($subcontent[size])." bytes</a>";
}
}
}
function orderBy($data) {
usort($data, function($a, $b) {
return $a['name'] <=> $b['name'];
});
return $data;
}
function get_path($path) {
$len = strlen($path);
$pos = (strpos($path,'/hiawatha/'))+(strlen('/hiawatha'));
$http_path = substr($path,$pos,$len);
$go_path = "http://".$_SERVER['SERVER_NAME'].$http_path;
return $go_path;
}
function huf($bytes, $decimals = 2) {
$sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>
It all works with <table>, <ul>, <li> tags. Make the menu using the list tags and the js can hide and display making a expanding collapsing menu.