1
0
mirror of https://github.com/lrsjng/h5ai.git synced 2025-08-29 08:40:34 +02:00

Compare commits

..

7 Commits

Author SHA1 Message Date
Lars Jung
9e521a188d More refactoring. Added global includes. 2011-06-17 02:46:32 +02:00
Lars Jung
490fe36947 Refactored, minor fixes. 2011-06-16 21:20:18 +02:00
Lars Jung
c045f0dc77 Updated readme. 2011-06-16 14:53:38 +02:00
Lars Jung
657f280826 Updated screenshots. 2011-06-16 14:41:38 +02:00
Lars Jung
bf57f4535c Fixes. 2011-06-16 03:06:46 +02:00
Lars Jung
0e5802f0d7 Fixes. 2011-06-16 01:59:52 +02:00
Lars Jung
9ca2b61a9c Fixes. 2011-06-16 01:53:16 +02:00
6 changed files with 274 additions and 200 deletions

View File

@@ -4,21 +4,13 @@ h5ai - a beautified Apache index
Screenshots
-----------
<a href="http://repo.larsjung.de/screens/h5ai.png"><img
width="400"
src="http://repo.larsjung.de/screens/h5ai.png"
alt="screenshot"
title="screenshot"
style="border: 1px solid #ccc"
/></a>
<a href="http://repo.larsjung.de/screens/h5ai-0.2.png"><img
width="400"
src="http://repo.larsjung.de/screens/h5ai-0.2.png"
alt="screenshot"
title="screenshot"
style="border: 1px solid #ccc"
/></a>
<a href="http://repo.larsjung.de/screens/h5ai-v0.2.1-details.png" target="_blank" style="float: left">
<img src="http://repo.larsjung.de/screens/h5ai-v0.2.1-details.png" width="400px" alt="screenshot" title="screenshot"/>
</a>
<a href="http://repo.larsjung.de/screens/h5ai-v0.2.1-icons.png" target="_blank" style="float: right">
<img src="http://repo.larsjung.de/screens/h5ai-v0.2.1-icons.png" width="400px" alt="screenshot" title="screenshot" />
</a>
<div style="clear: both"/>
Live example
@@ -34,22 +26,38 @@ Install
1. Copy the `h5ai` folder to the web-root directory of your server or alternativly set an alias `/h5ai/` to
this folder.
2. Add the content of file `dot.htaccess` to the `.htaccess` file in the directory
you want to be indexed (you might have to create this file). This directory and any subdirectories will be
styled.
you want to be styled (you might have to create this file). This directory and any subdirectories will be
styled by h5ai.
Changelog
---------
### v0.2.3
*2011-06-17*
* more refactoring in main.js
* added custom js support, and global includes
### v0.2.2
*2011-06-16*
* refactored a lot, added some comments
* included fixes from [NumEricR](http://github.com/NumEricR/h5ai)
* added top/bottom message support, only basicly styled
### v0.2.1
*2011-06-16*
* fixed croped filenames
* fixed missing .png extension in header
* removed .html extension from Header-/ReadmeName references in dot.htaccess
* added some color to the links
* added changelog
### v0.2
*2011-06-15*
@@ -59,9 +67,8 @@ Changelog
Author
------
Lars Jung
[project site](http://github.com/larrrs/h5ai)
[website](http://larsjung.de)
[Lars Jung](http://larsjung.de)
[h5ai on github](http://github.com/larrrs/h5ai)
License

View File

@@ -16,8 +16,8 @@
# h5ai header and footer
################################
HeaderName /h5ai/header
ReadmeName /h5ai/footer
HeaderName /h5ai/header.html
ReadmeName /h5ai/footer.html
################################

View File

@@ -1,6 +1,7 @@
<!-- generated code ends here -->
<div id="empty">empty</div>
<section id="h5ai-bottom"></section>
<!-- generated code ends here -->
</section>
<section id="icons"></section>
<section id="bottom"></section>
</section>
<footer>
<a id="html5" href="http://www.w3.org/html/logo/" target="_blank" title="HTML5 semantics, storage & CSS3">
@@ -9,7 +10,7 @@
<img class="techclass" src="/h5ai/images/html5-storage.png" alt="html5-storage" />
<img class="techclass" src="/h5ai/images/html5-css3.png" alt="html5-css3" />
</a>
<a href="http://github.com/larrrs/h5ai" target="_blank" title="h5ai v0.2.1">h5ai</a>
<a href="http://github.com/larrrs/h5ai" target="_blank" title="h5ai v0.2.3">h5ai</a>
using
<a href="http://html5boilerplate.com" target="_blank" title="a rock-solid default for HTML5 awesome">HTML5 Boilerplate</a>
and

View File

@@ -2,7 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<title>Index</title>
<title>Index - styled with h5ai</title>
<link rel="shortcut icon" href="/h5ai/icons/folder.png" />
<link rel="apple-touch-icon" href="/h5ai/images/folder.png">
<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold">
@@ -12,16 +12,17 @@
<nav>
<ul>
<li id="domain" class="crumb"><a href="/"><img src="/h5ai/icons/home.png" alt="domain" /><span>domain</span></a></li>
<li id="icons" class="view"><a href="#"><img src="/h5ai/icons/view-icons.png" alt="view-icons" />icons</a></li>
<li id="details" class="view" ><a href="#"><img src="/h5ai/icons/view-details.png" alt="view-details" />details</a></li>
<li id="viewicons" class="view"><a href="#"><img src="/h5ai/icons/view-icons.png" alt="view-icons" />icons</a></li>
<li id="viewdetails" class="view" ><a href="#"><img src="/h5ai/icons/view-details.png" alt="view-details" />details</a></li>
</ul>
<div class="clearfix"></div>
</nav>
<section id="content">
<section id="h5ai-top"></section>
<!--
The following code was generated by apache's autoindex module. It is not valid HTML 5 for the
reason, that 'align' and 'valign' attributes on the td element are obsolete. Both of them are
removed via javascript. The actual page should render as perfect HTML 5, even if the produced
source is not valid HTML 5.
-->
<section id="top"></section>
<section id="details">
<!--
The following code was generated by apache's autoindex module. It is not valid HTML 5 for the
reason, that 'align' and 'valign' attributes on the td element are obsolete. Both of them are
removed via javascript. The actual page should render as perfect HTML 5, even if the produced
source is not valid HTML 5.
-->

View File

@@ -21,15 +21,16 @@ a:hover {
nav {
position: fixed;
z-index: 1;
width: 100%;
left: 0px;
top: 0px;
left: 0;
top: 0;
font-size: 0.85em;
background-color: rgb(240,240,240);
border-bottom: 1px solid rgb(225,225,225);
-webkit-box-shadow: 0px 0px 30px #555;
-moz-box-shadow: 0px 0px 30px #555;
box-shadow: 0px 0px 30px #555;
-webkit-box-shadow: 0 0 30px #555;
-moz-box-shadow: 0 0 30px #555;
box-shadow: 0 0 30px #555;
}
nav li {
cursor: pointer;
@@ -45,15 +46,14 @@ nav li:hover, nav li:hover a {
opacity: 1.0;
}
nav a {
display: block
display: block;
height: 30px;
line-height: 30px;
padding: 4px 10px;
padding: 0 10px;
}
nav img {
vertical-align: bottom;
padding-right: 6px;
padding-bottom: 6px;
padding: 0 6px 6px 0;
}
nav li.crumb {
float: left;
@@ -65,47 +65,46 @@ nav li.view {
}
section#h5ai-top {
#top {
display: none;
padding: 0px 0px 10px 0px;
margin: 0px 0px 80px 0px;
border-bottom: 1px solid #999;
padding-bottom: 10px;
margin-bottom: 80px;
border-bottom: 2px dashed #ddd;
}
#bottom {
display: none;
padding-top: 10px;
margin-top: 80px;
border-top: 2px dashed #ddd;
}
section#h5ai-bottom {
display: none;
padding: 10px 0px 0px 0px;
margin: 80px 0px 0px 0px;
border-top: 1px solid #999;
}
section#content {
#content {
max-width: 980px;
margin: 0px auto;
margin: 0 auto;
}
table {
#details {
display: none;
}
#details table {
display: block;
width: 100%;
border-collapse: collapse;
}
table {
display: block;
}
table tr.entry:hover, table tr.entry:hover a {
#details tr.entry:hover, #details tr.entry:hover a {
background-color: rgb(235,245,250);
background-color: #f0f0f0;
color: #e80;
cursor: pointer;
}
table th, table td {
#details th, #details td {
padding: 3px 6px;
text-align: left;
border: none;
}
table th {
#details th {
padding-bottom: 18px;
opacity: 0.4;
-webkit-transition: all 0.2s ease-in-out;
@@ -113,70 +112,68 @@ table th {
-o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
table th.header:hover, table th.header:hover a {
#details th.header:hover, #details th.header:hover a {
color: #555;
cursor: pointer;
opacity: 0.9;
}
table th a, table th a:visited {
#details th a, #details th a:visited {
color: #555;
font-weight: normal;
}
table th a img {
#details th a img {
width: 12px;
height: 12px;
padding: 0px 8px;
padding: 0 8px;
}
table td {
#details td {
border: 1px solid #ddd;
border-left: 0px;
border-right: 0px;
border-left: none;
border-right: none;
}
table .icon {
#details .icon {
text-align: center;
width: 16px;
}
table .icon img {
#details .icon img {
width: 16px;
height: 16px;
padding-top: 2px;
}
table .name {
#details .name {
width: 682px;
max-width: 682px;
overflow: hidden;
white-space: nowrap;
}
table .date {
#details .date {
text-align: right;
width: 160px;
min-width: 160px;
white-space: nowrap;
}
table .size {
#details .size {
text-align: right;
width: 70px;
min-width: 70px;
white-space: nowrap;
}
div#empty {
display: none;
#details .empty {
text-align: center;
margin: 50px 0px;
margin: 50px 0;
color: #ddd;
font-size: 5em;
font-weight: bold;
}
#box {
#icons {
display: none;
padding: 10px;
border: 1px solid #eee;
border-radius: 15px;
}
#box .entry {
#icons .entry {
margin: 8px;
padding: 8px;
width: 100px;
@@ -188,41 +185,35 @@ div#empty {
cursor: pointer;
border: 1px solid rgba(0,0,0,0);
}
#box .entry:hover {
#icons .entry:hover {
color: #e80;
border-color: #eee;
-webkit-box-shadow: 0px 0px 20px #555;
-moz-box-shadow: 0px 0px 20px #555;
box-shadow: 0px 0px 20px #999;
-webkit-box-shadow: 0 0 20px #555;
-moz-box-shadow: 0 0 20px #555;
box-shadow: 0 0 20px #999;
}
#box .entry img {
#icons .entry img {
width: 48px;
height: 48px;
margin: 0px 0px 8px 0px;
}
section#special {
display: none;
text-align: center;
margin: 50px 0px;
margin-bottom: 8px;
}
footer {
position: fixed;
z-index: 1;
width: 100%;
left: 0px;
bottom: 0px;
padding: 10px 0px;
left: 0;
bottom: 0;
padding: 10px 0;
border-top: 1px solid rgb(225,225,225);
background-color: rgb(240,240,240);
color: #999;
font-size: 0.85em;
text-align: center;
-webkit-box-shadow: 0px 0px 30px #555;
-moz-box-shadow: 0px 0px 30px #555;
box-shadow: 0px 0px 30px #555;
-webkit-box-shadow: 0 0 30px #555;
-moz-box-shadow: 0 0 30px #555;
box-shadow: 0 0 30px #555;
}
footer a, footer a:visited {
color: #555;

View File

@@ -1,37 +1,85 @@
( function( $ ) {
var columnClasses = [ "icon", "name", "date", "size" ];
var defaultSortOrder = "C=N;O=A"
var h5aiPath = "/h5ai"
var views = [ "details", "icons" ];
/*******************************
* init after dom load
*******************************/
$( function() {
init();
applyViewmode();
initBreadcrumb();
initViews();
loadIncludes();
} );
function init () {
convertToHtml5();
addBreadcrumb();
addColumnClasses();
initTableRows();
addSortOrderIcons();
addTopAndBottom();
initViews();
checkView();
/*******************************
* config
*******************************/
var config = {
columnClasses: [ "icon", "name", "date", "size" ],
defaultSortOrder: "C=N;O=A",
viewmodes: [ "details", "icons" ],
store: {
viewmode: "h5ai.viewmode"
},
icons: {
crumb: "/h5ai/icons/crumb.png",
ascending: "/h5ai/icons/ascending.png",
descending: "/h5ai/icons/descending.png"
},
globalPath: "/h5ai/global/",
localPrefix: "h5ai.",
includes: {
top: "top.html",
bottom: "bottom.html",
include: "include.js"
}
};
function convertToHtml5() {
$( "td" ).removeAttr( "align" ).removeAttr( "valign" );
/*******************************
* local stored viewmode
*******************************/
function getViewmode() {
var viewmode = localStorage.getItem( config.store.viewmode );
if ( $.inArray( viewmode, config.viewmodes ) ) {
return viewmode;
};
return config.viewmodes[0];
};
function addBreadcrumb() {
function applyViewmode( viewmode ) {
if ( viewmode !== undefined ) {
localStorage.setItem( config.store.viewmode, viewmode );
}
if ( getViewmode() === "icons" ) {
$( "#details" ).hide();
$( "#icons" ).show();
} else {
$( "#details" ).show();
$( "#icons" ).hide();
}
};
/*******************************
* breadcrumb
*******************************/
function initBreadcrumb() {
$( "#domain span" ).text( document.domain );
var pathname = decodeURI( document.location.pathname );
@@ -42,7 +90,7 @@
var part = parts[idx];
if ( part !== "" ) {
path += part + "/";
$ul.append( $( "<li class=\"crumb\"><a href='" + path + "'><img src='" + h5aiPath + "/icons/crumb.png' alt='>' />" + part + "</a></li>" ) );
$ul.append( $( "<li class='crumb'><a href='" + path + "'><img src='" + config.icons.crumb + "' alt='>' />" + part + "</a></li>" ) );
}
}
@@ -55,18 +103,30 @@
};
/*******************************
* details view
*******************************/
function makeTableHtml5Conform() {
$( "#details td" ).removeAttr( "align" ).removeAttr( "valign" );
};
function getColumnClass( idx ) {
if ( idx >= 0 && idx < columnClasses.length ) {
return columnClasses[idx];
if ( idx >= 0 && idx < config.columnClasses.length ) {
return config.columnClasses[idx];
}
return "unknown";
};
function addColumnClasses() {
function initTableColumns() {
$( "tr" ).each( function () {
$( "#details tr" ).each( function () {
var colIdx = 0;
$( this ).find( "th,td" ).each( function () {
$( this ).addClass( getColumnClass( colIdx ) );
@@ -78,118 +138,132 @@
function initTableRows() {
$( "th a" ).closest( "th" )
$( "#details th a" ).closest( "th" )
.addClass( "header" )
.click( function () {
document.location.href = $( this ).find( "a" ).attr( "href" );
} );
$( "td.name a" ).closest( "tr" )
$( "#details td.name a" ).closest( "tr" )
.addClass( "entry" )
.click( function () {
document.location.href = $( this ).find( "td.name a" ).attr( "href" );
} );
$dataRows = $( "td" ).closest( "tr" );
$dataRows = $( "#details td" ).closest( "tr" );
if ( $dataRows.size() === 0 || $dataRows.size() === 1 && $dataRows.find( "td.name a" ).text() === "Parent Directory" ) {
$( "#empty" ).show();
$( "#details" ).append( $( "<div class='empty'>empty</div>" ) );
}
};
function addSortOrderIcons() {
function addSortOrderIcon() {
var order = document.location.search;
if ( order === "" ) {
order = defaultSortOrder;
order = config.defaultSortOrder;
}
var $icon;
if ( order.indexOf( "O=A" ) >= 0 ) {
$icon = $( "<img src='" + h5aiPath + "/icons/ascending.png' class='sort' alt='ascending' />" );
$icon = $( "<img src='" + config.icons.ascending + "' class='sort' alt='ascending' />" );
} else {
$icon = $( "<img src='" + h5aiPath + "/icons/descending.png' class='sort' alt='descending' />" );
$icon = $( "<img src='" + config.icons.descending + "' class='sort' alt='descending' />" );
}
if ( order.indexOf( "C=N" ) >= 0 ) {
$( "th.name a" ).append( $icon );
$( "#details th.name a" ).append( $icon );
} else if ( order.indexOf( "C=M" ) >= 0 ) {
$( "th.date a" ).prepend( $icon );
$( "#details th.date a" ).prepend( $icon );
} else if ( order.indexOf( "C=S" ) >= 0 ) {
$( "th.size a" ).prepend( $icon );
$( "#details th.size a" ).prepend( $icon );
}
};
function addTopAndBottom() {
function initDetailsView() {
$( "#h5ai-top" ).load( "h5ai.top.html", function( response, status, xhr ) {
if (status != "error") {
$( "#h5ai-top" ).show();
}
} );
$( "#h5ai-bottom" ).load( "h5ai.bottom.html", function( response, status, xhr ) {
if (status != "error") {
$( "#h5ai-bottom" ).show();
}
makeTableHtml5Conform();
initTableColumns();
initTableRows();
addSortOrderIcon();
};
/*******************************
* icons view
*******************************/
function initIconsView() {
var $div = $( "<div></div>" );
$( "#details td.name a" ).closest( "tr" ).each( function () {
var $tr = $( this );
var icon = $tr.find( "td.icon img" ).attr( "src" ).replace( "icons", "images" );
var $link = $tr.find( "td.name a" );
$( "<div class='entry'><img src='" + icon + "' /><div class='label'>" + $link.text() + "</div></div>" )
.click( function () {
document.location.href = $link.attr( "href" );
} ).
appendTo( $div );
} );
$div.append( $( "<div class='clearfix'></div>" ) );
$( "#icons" ).append( $div );
};
function checkView() {
if ( getView() === "icons" ) {
$( "#content table" ).hide();
$( "#content #empty" ).hide();
$( "#content #box" ).show();
} else {
$( "#content table" ).show();
$( "#content #empty" ).show();
$( "#content #box" ).hide();
}
};
function getView() {
var view = localStorage.getItem( "h5ai.view" );
if ( $.inArray( view, views ) ) {
return view;
};
return views[0];
};
/*******************************
* init views
*******************************/
function setView( view ) {
localStorage.setItem( "h5ai.view", view );
checkView();
};
function initViews() {
var $box = $( "<div id=\"box\"></div>" );
$( "td.name a" ).closest( "tr" ).each( function () {
var $tr = $( this );
var icon = $tr.find( "td.icon img" ).attr( "src" ).replace( "icon", "image" );
var name = $tr.find( "td.name a" ).text();
$( "<div class=\"entry\"></div>" )
.append( $( "<img src=\"" + icon + "\" />" ) )
.append( $( "<div class=\"label\">" + name + "</div>" ) )
.click( function () {
document.location.href = $tr.find( "td.name a" ).attr( "href" );
} ).
appendTo( $box );
initDetailsView();
initIconsView();
$( "#viewdetails" ).closest( "li" )
.click( function () {
applyViewmode( "details" );
} );
$( "#viewicons" ).closest( "li" )
.click( function () {
applyViewmode( "icons" );
} );
};
/*******************************
* includes
*******************************/
function loadIncludes() {
$( "#top" ).load( config.localPrefix + config.includes.top, function( response, status ) {
if (status !== "error") {
$( "#top" ).show();
} else {
$( "#top" ).load( config.globalPath + config.includes.top, function( response, status ) {
if (status !== "error") {
$( "#top" ).show();
}
} );
}
} );
$box.append( $( "<div class=\"clearfix\"></div>" ) );
$( "#content table" ).after( $box );
$( "#details" ).closest( "li" )
.click( function () {
setView( "details" );
} );
$( "#icons" ).closest( "li" )
.click( function () {
setView( "icons" );
} );
$( "#bottom" ).load( config.localPrefix + config.includes.bottom, function( response, status ) {
if (status !== "error") {
$( "#bottom" ).show();
} else {
$( "#bottom" ).load( config.globalPath + config.includes.bottom, function( response, status ) {
if (status !== "error") {
$( "#bottom" ).show();
}
} );
}
} );
$.getScript( config.globalPath + config.includes.include );
$.getScript( config.localPrefix + config.includes.include );
};
} )( jQuery );