Switches indentation to tabs.

This commit is contained in:
Lars Jung
2012-02-12 22:35:38 +01:00
parent 231ba3013b
commit 20858a1f43
39 changed files with 3437 additions and 3440 deletions

View File

@@ -31,6 +31,7 @@ h5ai is provided under the terms of the [MIT License](http://github.com/lrsjng/h
### v0.18 - *2012-02-??* ### v0.18 - *2012-02-??*
* updates year in `LICENSE.TXT` * updates year in `LICENSE.TXT`
* updates es translation
### v0.17 - *2011-11-28* ### v0.17 - *2011-11-28*

118
build.xml
View File

@@ -1,75 +1,75 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<project <project
name="h5ai" name="h5ai"
basedir="." basedir="."
default="release" default="release"
> >
<import file="tools/wepp.ant.xml" /> <import file="tools/wepp.ant.xml" />
<target name="init"> <target name="init">
<property file="build.properties" /> <property file="build.properties" />
<tstamp> <tstamp>
<format property="build.stamp" pattern="yyyy-MM-dd-HHmmss" /> <format property="build.stamp" pattern="yyyy-MM-dd-HHmmss" />
</tstamp> </tstamp>
<property name="build.label" value="${project.name} ${project.version} b${build.stamp}" /> <property name="build.label" value="${project.name} ${project.version} b${build.stamp}" />
<echo>Build: ${build.label}</echo> <echo>Build: ${build.label}</echo>
</target> </target>
<target name="clean" depends="init"> <target name="clean" depends="init">
<delete dir="${build.dir}" /> <delete dir="${build.dir}" />
<delete dir="${release.dir}" /> <delete dir="${release.dir}" />
</target> </target>
<target name="build-prepare" depends="clean"> <target name="build-prepare" depends="clean">
<mkdir dir="${build.dir}" /> <mkdir dir="${build.dir}" />
<copy todir="${build.dir}"> <copy todir="${build.dir}">
<fileset dir="${src.dir}" /> <fileset dir="${src.dir}" />
<fileset file="LICENSE.txt" /> <fileset file="LICENSE.txt" />
<fileset file="README.md" /> <fileset file="README.md" />
</copy> </copy>
<replace dir="${build.dir}"> <replace dir="${build.dir}">
<replacefilter token="%BUILD%" value="${build.label}" /> <replacefilter token="%BUILD%" value="${build.label}" />
<replacefilter token="%BUILD_NAME%" value="${project.name}" /> <replacefilter token="%BUILD_NAME%" value="${project.name}" />
<replacefilter token="%BUILD_VERSION%" value="${project.version}" /> <replacefilter token="%BUILD_VERSION%" value="${project.version}" />
<replacefilter token="%BUILD_STAMP%" value="${build.stamp}" /> <replacefilter token="%BUILD_STAMP%" value="${build.stamp}" />
</replace> </replace>
</target> </target>
<target name="build" depends="build-prepare"> <target name="build" depends="build-prepare">
<wepp.dir dir="${build.dir}/_h5ai/css" /> <wepp.dir dir="${build.dir}/_h5ai/css" />
<wepp.dir dir="${build.dir}/_h5ai/js" /> <wepp.dir dir="${build.dir}/_h5ai/js" />
</target> </target>
<target name="build-uncompressed" depends="build-prepare"> <target name="build-uncompressed" depends="build-prepare">
<wepp.dir dir="${build.dir}/_h5ai/css" args="--nc" /> <wepp.dir dir="${build.dir}/_h5ai/css" args="--nc" />
<wepp.dir dir="${build.dir}/_h5ai/js" args="--nc" /> <wepp.dir dir="${build.dir}/_h5ai/js" args="--nc" />
</target> </target>
<target name="release" depends="build"> <target name="release" depends="build">
<mkdir dir="${release.dir}" /> <mkdir dir="${release.dir}" />
<zip destfile="${release.dir}/${project.name}-${project.version}.zip" basedir="${build.dir}" /> <zip destfile="${release.dir}/${project.name}-${project.version}.zip" basedir="${build.dir}" />
</target> </target>
<target name="pre-xint" depends="build-prepare"> <target name="pre-xint" depends="build-prepare">
<wepp file="${tool.jsxint.file}" tofile="${tool.jsxint.file}" args="--nc" /> <wepp file="${tool.jsxint.file}" tofile="${tool.jsxint.file}" args="--nc" />
</target> </target>
<target name="lint" depends="pre-xint"> <target name="lint" depends="pre-xint">
<echo>JSLint "${tool.jsxint.file}"</echo> <echo>JSLint "${tool.jsxint.file}"</echo>
<exec executable="${tool.jslint}" failonerror="true"> <exec executable="${tool.jslint}" failonerror="true">
<arg value="${tool.jsxint.file}" /> <arg value="${tool.jsxint.file}" />
</exec> </exec>
</target> </target>
<target name="hint" depends="pre-xint"> <target name="hint" depends="pre-xint">
<echo>JSHint "${tool.jsxint.file}"</echo> <echo>JSHint "${tool.jsxint.file}"</echo>
<exec executable="${tool.jshint}" failonerror="true"> <exec executable="${tool.jshint}" failonerror="true">
<arg value="${tool.jsxint.file}" /> <arg value="${tool.jsxint.file}" />
</exec> </exec>
</target> </target>
<target name="xint" depends="lint,hint"> <target name="xint" depends="lint,hint">
</target> </target>
</project> </project>

View File

@@ -19,17 +19,17 @@ AddType text/html .php
# cache images, css and js for 52 weeks # cache images, css and js for 52 weeks
<IfModule headers_module> <IfModule headers_module>
<FilesMatch "\.png$"> <FilesMatch "\.png$">
Header set Cache-Control "max-age=31449600, public" Header set Cache-Control "max-age=31449600, public"
</FilesMatch> </FilesMatch>
<FilesMatch "\.css$"> <FilesMatch "\.css$">
Header set Cache-Control "max-age=31449600, public" Header set Cache-Control "max-age=31449600, public"
</FilesMatch> </FilesMatch>
<FilesMatch "\.js$"> <FilesMatch "\.js$">
Header set Cache-Control "max-age=31449600, public" Header set Cache-Control "max-age=31449600, public"
</FilesMatch> </FilesMatch>
<FilesMatch "thumb-.*\.jpg$"> <FilesMatch "thumb-.*\.jpg$">
Header set Cache-Control "max-age=31449600, public" Header set Cache-Control "max-age=31449600, public"
</FilesMatch> </FilesMatch>
</IfModule> </IfModule>

View File

@@ -7,405 +7,405 @@
var H5AI_CONFIG = { var H5AI_CONFIG = {
"options": { "options": {
/* /*
* The absolute links to webroot and h5ai. * The absolute links to webroot and h5ai.
* Do not change this unless you know what you are doing. * Do not change this unless you know what you are doing.
*/ */
"rootAbsHref": "/", "rootAbsHref": "/",
"h5aiAbsHref": "/_h5ai/", "h5aiAbsHref": "/_h5ai/",
/* /*
* Filenames of customized header and footer files to look for * Filenames of customized header and footer files to look for
* in each folder. * in each folder.
*/ */
"customHeader": "_h5ai.header.html", "customHeader": "_h5ai.header.html",
"customFooter": "_h5ai.footer.html", "customFooter": "_h5ai.footer.html",
/* /*
* An array of view modes the user may choose from. Currently there * An array of view modes the user may choose from. Currently there
* are two possible values: "details" and "icons". The first value * are two possible values: "details" and "icons". The first value
* indicates the default view mode. If only one value is given the * indicates the default view mode. If only one value is given the
* view mode is fixed and the selector buttons are hidden. * view mode is fixed and the selector buttons are hidden.
* The user selected view mode is also stored local in modern browsers * The user selected view mode is also stored local in modern browsers
* so that it will be persistent. * so that it will be persistent.
*/ */
"viewmodes": ["details", "icons"], "viewmodes": ["details", "icons"],
/* /*
* Default sort order is a two letter code. The first letter specifies * Default sort order is a two letter code. The first letter specifies
* the column: "n" for "Name", "d" for "Date" or "s" for "Size". The * the column: "n" for "Name", "d" for "Date" or "s" for "Size". The
* second letter specifies the sort order: "a" for "ascending" or "d" * second letter specifies the sort order: "a" for "ascending" or "d"
* for "descending". * for "descending".
*/ */
"sortorder": "na", "sortorder": "na",
/* /*
* Show a folder tree, boolean. * Show a folder tree, boolean.
* Note that this tree might have side effects as it sends HEAD requests * Note that this tree might have side effects as it sends HEAD requests
* to the folders, and therefore will invoke index.php scripts. Use * to the folders, and therefore will invoke index.php scripts. Use
* folderStatus below to avoid such requests. * folderStatus below to avoid such requests.
* It might also affect performance significantly. * It might also affect performance significantly.
*/ */
"showTree": true, "showTree": true,
/* /*
* Slide tree bar into viewport if there is enough space, boolean. * Slide tree bar into viewport if there is enough space, boolean.
*/ */
"slideTree": true, "slideTree": true,
/* /*
* Associative array of folders and their HTTP status codes to * Associative array of folders and their HTTP status codes to
* avoid HEAD requests to that folders. The key (folder) must start * avoid HEAD requests to that folders. The key (folder) must start
* and end with a slash (/). * and end with a slash (/).
* For example: * For example:
* "/some/folder/": 200 * "/some/folder/": 200
* will always return HTTP status 200 (OK), which will be interpreted * will always return HTTP status 200 (OK), which will be interpreted
* as a non auto indexed folder, that means a folder containing an * as a non auto indexed folder, that means a folder containing an
* appropriate default index file. * appropriate default index file.
*/ */
"folderStatus": {}, "folderStatus": {},
/* /*
* Localization, for example "en", "de" etc. - see h5aiLangs below for * Localization, for example "en", "de" etc. - see h5aiLangs below for
* possible values. Adjust it to your needs. If lang is not found in * possible values. Adjust it to your needs. If lang is not found in
* h5aiLangs it defaults to "en". * h5aiLangs it defaults to "en".
*/ */
"lang": "en", "lang": "en",
/* /*
* Try to use browser language, falls back to previous specified lang. * Try to use browser language, falls back to previous specified lang.
*/ */
"useBrowserLang": true, "useBrowserLang": true,
/* /*
* Set parent folder labels to real folder names. * Set parent folder labels to real folder names.
*/ */
"setParentFolderLabels": true, "setParentFolderLabels": true,
/* /*
* Link the hover effects between crumb, extended view and tree. * Link the hover effects between crumb, extended view and tree.
*/ */
"linkHoverStates": true, "linkHoverStates": true,
/* /*
* Date format in detailed view, for example: "yyyy-MM-dd HH:mm:ss" * Date format in detailed view, for example: "yyyy-MM-dd HH:mm:ss"
* Syntax as specified by date.js * Syntax as specified by date.js
* http://code.google.com/p/datejs/wiki/FormatSpecifiers * http://code.google.com/p/datejs/wiki/FormatSpecifiers
*/ */
"dateFormat": "yyyy-MM-dd HH:mm", "dateFormat": "yyyy-MM-dd HH:mm",
/* /*
* Requires PHP on the server. * Requires PHP on the server.
* Show thumbnails for image files. * Show thumbnails for image files.
*/ */
"showThumbs": false, "showThumbs": false,
/* /*
* Requires PHP on the server. * Requires PHP on the server.
* Enable zipped download of selected entries. * Enable zipped download of selected entries.
*/ */
"zippedDownload": false "zippedDownload": false
}, },
/* /*
* File types mapped to file extensions. * File types mapped to file extensions.
*/ */
"types": { "types": {
"archive": [".tar.bz2", ".tar.gz", ".tgz"], "archive": [".tar.bz2", ".tar.gz", ".tgz"],
"audio": [".aif", ".m4a", ".mid", ".mp3", ".mpa", ".ra", ".ogg", ".wav", ".wma"], "audio": [".aif", ".m4a", ".mid", ".mp3", ".mpa", ".ra", ".ogg", ".wav", ".wma"],
"authors": ["authors"], "authors": ["authors"],
"bin": [".class", ".o", ".so"], "bin": [".class", ".o", ".so"],
"blank": [], "blank": [],
"bmp": [".bmp"], "bmp": [".bmp"],
"c": [".c"], "c": [".c"],
"calc": [".ods", ".ots", ".xlr", ".xls", ".xlsx"], "calc": [".ods", ".ots", ".xlr", ".xls", ".xlsx"],
"cd": [".cue", ".iso"], "cd": [".cue", ".iso"],
"copying": ["copying", "license"], "copying": ["copying", "license"],
"cpp": [".cpp"], "cpp": [".cpp"],
"css": [".css", ".less"], "css": [".css", ".less"],
"deb": [".deb"], "deb": [".deb"],
"default": [], "default": [],
"doc": [".doc", ".docx", ".odm", ".odt", ".ott"], "doc": [".doc", ".docx", ".odm", ".odt", ".ott"],
"draw": [".drw"], "draw": [".drw"],
"eps": [".eps"], "eps": [".eps"],
"exe": [".exe"], "exe": [".exe"],
"folder": [], "folder": [],
"folder-home": [], "folder-home": [],
"folder-open": [], "folder-open": [],
"folder-page": [], "folder-page": [],
"folder-parent": [], "folder-parent": [],
"gif": [".gif"], "gif": [".gif"],
"gzip": [".gz"], "gzip": [".gz"],
"h": [".h"], "h": [".h"],
"hpp": [".hpp"], "hpp": [".hpp"],
"html": [".htm", ".html", ".shtml"], "html": [".htm", ".html", ".shtml"],
"ico": [".ico"], "ico": [".ico"],
"image": [".xpm"], "image": [".xpm"],
"install": ["install"], "install": ["install"],
"java": [".java"], "java": [".java"],
"jpg": [".jpg", ".jpeg"], "jpg": [".jpg", ".jpeg"],
"js": [".js", ".json"], "js": [".js", ".json"],
"log": [".log", "changelog"], "log": [".log", "changelog"],
"makefile": [".pom", "build.xml", "pom.xml"], "makefile": [".pom", "build.xml", "pom.xml"],
"package": [], "package": [],
"pdf": [".pdf"], "pdf": [".pdf"],
"php": [".php"], "php": [".php"],
"playlist": [".m3u"], "playlist": [".m3u"],
"png": [".png"], "png": [".png"],
"pres": [".odp", ".otp", ".pps", ".ppt", ".pptx"], "pres": [".odp", ".otp", ".pps", ".ppt", ".pptx"],
"psd": [".psd"], "psd": [".psd"],
"py": [".py"], "py": [".py"],
"rar": [".rar"], "rar": [".rar"],
"rb": [".rb"], "rb": [".rb"],
"readme": ["readme"], "readme": ["readme"],
"rpm": [".rpm"], "rpm": [".rpm"],
"rss": [".rss"], "rss": [".rss"],
"rtf": [".rtf"], "rtf": [".rtf"],
"script": [".conf", ".csh", ".ini", ".ksh", ".sh", ".shar", ".tcl"], "script": [".conf", ".csh", ".ini", ".ksh", ".sh", ".shar", ".tcl"],
"source": [], "source": [],
"sql": [], "sql": [],
"tar": [".tar"], "tar": [".tar"],
"tex": [".tex"], "tex": [".tex"],
"text": [".markdown", ".md", ".text", ".txt"], "text": [".markdown", ".md", ".text", ".txt"],
"tiff": [".tiff"], "tiff": [".tiff"],
"unknown": [], "unknown": [],
"vcal": [".vcal"], "vcal": [".vcal"],
"video": [".avi", ".flv", ".mov", ".mp4", ".mpg", ".rm", ".swf", ".vob", ".wmv"], "video": [".avi", ".flv", ".mov", ".mp4", ".mpg", ".rm", ".swf", ".vob", ".wmv"],
"xml": [".xml"], "xml": [".xml"],
"zip": [".bz2", ".jar", ".war", ".z", ".Z", ".zip"] "zip": [".bz2", ".jar", ".war", ".z", ".Z", ".zip"]
}, },
/* /*
* Available translations. * Available translations.
*/ */
"langs": { "langs": {
"en": { "en": {
"lang": "english", "lang": "english",
"details": "details", "details": "details",
"icons": "icons", "icons": "icons",
"name": "Name", "name": "Name",
"lastModified": "Last modified", "lastModified": "Last modified",
"size": "Size", "size": "Size",
"parentDirectory": "Parent Directory", "parentDirectory": "Parent Directory",
"empty": "empty", "empty": "empty",
"folders": "folders", "folders": "folders",
"files": "files", "files": "files",
"download": "download" "download": "download"
}, },
"bg": { "bg": {
"lang": "български", "lang": "български",
"details": "детайли", "details": "детайли",
"icons": "икони", "icons": "икони",
"name": "Име", "name": "Име",
"lastModified": "Последна промяна", "lastModified": "Последна промяна",
"size": "Размер", "size": "Размер",
"parentDirectory": "Предходна директория", "parentDirectory": "Предходна директория",
"empty": "празно", "empty": "празно",
"folders": "папки", "folders": "папки",
"files": "файлове", "files": "файлове",
"download": "download" "download": "download"
}, },
"cs": { "cs": {
"lang": "čeština", "lang": "čeština",
"details": "podrobnosti", "details": "podrobnosti",
"icons": "ikony", "icons": "ikony",
"name": "Název", "name": "Název",
"lastModified": "Upraveno", "lastModified": "Upraveno",
"size": "Velikost", "size": "Velikost",
"parentDirectory": "Nadřazený adresář", "parentDirectory": "Nadřazený adresář",
"empty": "prázdný", "empty": "prázdný",
"folders": "složek", "folders": "složek",
"files": "souborů", "files": "souborů",
"download": "download" "download": "download"
}, },
"de": { "de": {
"lang": "deutsch", "lang": "deutsch",
"details": "Details", "details": "Details",
"icons": "Icons", "icons": "Icons",
"name": "Name", "name": "Name",
"lastModified": "Geändert", "lastModified": "Geändert",
"size": "Größe", "size": "Größe",
"parentDirectory": "Übergeordnetes Verzeichnis", "parentDirectory": "Übergeordnetes Verzeichnis",
"empty": "leer", "empty": "leer",
"folders": "Ordner", "folders": "Ordner",
"files": "Dateien", "files": "Dateien",
"download": "Download" "download": "Download"
}, },
"es": { "es": {
"lang": "español", "lang": "español",
"details": "Detalles", "details": "Detalles",
"icons": "Íconos", "icons": "Íconos",
"name": "Nombre", "name": "Nombre",
"lastModified": "Última modificación", "lastModified": "Última modificación",
"size": "Tamaño", "size": "Tamaño",
"parentDirectory": "Directorio superior", "parentDirectory": "Directorio superior",
"empty": "vacío", "empty": "vacío",
"folders": "Directorios", "folders": "Directorios",
"files": "Archivos", "files": "Archivos",
"download": "Descargar" "download": "Descargar"
}, },
"fr": { "fr": {
"lang": "français", "lang": "français",
"details": "détails", "details": "détails",
"icons": "icônes", "icons": "icônes",
"name": "Nom", "name": "Nom",
"lastModified": "Dernière modification", "lastModified": "Dernière modification",
"size": "Taille", "size": "Taille",
"parentDirectory": "Dossier parent", "parentDirectory": "Dossier parent",
"empty": "vide", "empty": "vide",
"folders": "Répertoires", "folders": "Répertoires",
"files": "Fichiers", "files": "Fichiers",
"download": "télécharger" "download": "télécharger"
}, },
"it": { "it": {
"lang": "italiano", "lang": "italiano",
"details": "dettagli", "details": "dettagli",
"icons": "icone", "icons": "icone",
"name": "Nome", "name": "Nome",
"lastModified": "Ultima modifica", "lastModified": "Ultima modifica",
"size": "Dimensione", "size": "Dimensione",
"parentDirectory": "Cartella Superiore", "parentDirectory": "Cartella Superiore",
"empty": "vuota", "empty": "vuota",
"folders": "cartelle", "folders": "cartelle",
"files": "file", "files": "file",
"download": "download" "download": "download"
}, },
"lv": { "lv": {
"lang": "latviešu", "lang": "latviešu",
"details": "detaļas", "details": "detaļas",
"icons": "ikonas", "icons": "ikonas",
"name": "Nosaukums", "name": "Nosaukums",
"lastModified": "Pēdējoreiz modificēts", "lastModified": "Pēdējoreiz modificēts",
"size": "Izmērs", "size": "Izmērs",
"parentDirectory": "Vecākdirektorijs", "parentDirectory": "Vecākdirektorijs",
"empty": "tukšs", "empty": "tukšs",
"folders": "mapes", "folders": "mapes",
"files": "faili", "files": "faili",
"download": "lejupielādēt" "download": "lejupielādēt"
}, },
"nl": { "nl": {
"lang": "nederlands", "lang": "nederlands",
"details": "details", "details": "details",
"icons": "iconen", "icons": "iconen",
"name": "Naam", "name": "Naam",
"lastModified": "Laatste wijziging", "lastModified": "Laatste wijziging",
"size": "Grootte", "size": "Grootte",
"parentDirectory": "Bovenliggende map", "parentDirectory": "Bovenliggende map",
"empty": "lege", "empty": "lege",
"folders": "folders", "folders": "folders",
"files": "files", "files": "files",
"download": "download" "download": "download"
}, },
"pl": { "pl": {
"lang": "polski", "lang": "polski",
"details": "szczegóły", "details": "szczegóły",
"icons": "ikony", "icons": "ikony",
"name": "Nazwa", "name": "Nazwa",
"lastModified": "Ostatnia modyfikacja", "lastModified": "Ostatnia modyfikacja",
"size": "Rozmiar", "size": "Rozmiar",
"parentDirectory": "Katalog nadrzędny", "parentDirectory": "Katalog nadrzędny",
"empty": "pusty", "empty": "pusty",
"folders": "foldery", "folders": "foldery",
"files": "pliki", "files": "pliki",
"download": "download" "download": "download"
}, },
"pt": { "pt": {
"lang": "português", "lang": "português",
"details": "detalhes", "details": "detalhes",
"icons": "ícones", "icons": "ícones",
"name": "Nome", "name": "Nome",
"lastModified": "Última modificação", "lastModified": "Última modificação",
"size": "Tamanho", "size": "Tamanho",
"parentDirectory": "Diretório superior", "parentDirectory": "Diretório superior",
"empty": "vazio", "empty": "vazio",
"folders": "pastas", "folders": "pastas",
"files": "arquivos", "files": "arquivos",
"download": "download" "download": "download"
}, },
"ru": { "ru": {
"lang": "русский", "lang": "русский",
"details": "детали", "details": "детали",
"icons": "иконки", "icons": "иконки",
"name": "Имя", "name": "Имя",
"lastModified": "Последние изменения", "lastModified": "Последние изменения",
"size": "Размер", "size": "Размер",
"parentDirectory": "Главная директория", "parentDirectory": "Главная директория",
"empty": "пусто", "empty": "пусто",
"folders": "папки", "folders": "папки",
"files": "файлы", "files": "файлы",
"download": "download" "download": "download"
}, },
"sk": { "sk": {
"lang": "slovenčina", "lang": "slovenčina",
"details": "podrobnosti", "details": "podrobnosti",
"icons": "ikony", "icons": "ikony",
"name": "Názov", "name": "Názov",
"lastModified": "Upravené", "lastModified": "Upravené",
"size": "Velkosť", "size": "Velkosť",
"parentDirectory": "Nadriadený priečinok", "parentDirectory": "Nadriadený priečinok",
"empty": "prázdny", "empty": "prázdny",
"folders": "priečinkov", "folders": "priečinkov",
"files": "súborov", "files": "súborov",
"download": "download" "download": "download"
}, },
"sv": { "sv": {
"lang": "svenska", "lang": "svenska",
"details": "detaljerad", "details": "detaljerad",
"icons": "ikoner", "icons": "ikoner",
"name": "Filnamn", "name": "Filnamn",
"lastModified": "Senast ändrad", "lastModified": "Senast ändrad",
"size": "Filstorlek", "size": "Filstorlek",
"parentDirectory": "Till överordnad mapp", "parentDirectory": "Till överordnad mapp",
"empty": "tom", "empty": "tom",
"folders": "folders", "folders": "folders",
"files": "files", "files": "files",
"download": "download" "download": "download"
}, },
"tr": { "tr": {
"lang": "türkçe", "lang": "türkçe",
"details": "detaylar", "details": "detaylar",
"icons": "ikonlar", "icons": "ikonlar",
"name": "İsim", "name": "İsim",
"lastModified": "Son Düzenleme", "lastModified": "Son Düzenleme",
"size": "Boyut", "size": "Boyut",
"parentDirectory": "Üst Dizin", "parentDirectory": "Üst Dizin",
"empty": "boş", "empty": "boş",
"folders": "klasörler", "folders": "klasörler",
"files": "dosyalar", "files": "dosyalar",
"download": "indir" "download": "indir"
}, },
"zh-cn": { "zh-cn": {
"lang": "简体中文", "lang": "简体中文",
"details": "详情", "details": "详情",
"icons": "图标", "icons": "图标",
"name": "文件名", "name": "文件名",
"lastModified": "上次修改", "lastModified": "上次修改",
"size": "大小", "size": "大小",
"parentDirectory": "上层文件夹", "parentDirectory": "上层文件夹",
"empty": "空文件夹", "empty": "空文件夹",
"folders": "文件夹", "folders": "文件夹",
"files": "文件", "files": "文件",
"download": "download" "download": "download"
} }
} }
}; };

View File

@@ -1,280 +1,280 @@
#extended.details-view { #extended.details-view {
display: none; display: none;
ul { ul {
margin: 0; margin: 0;
padding: 0; padding: 0;
list-style: none; list-style: none;
li { li {
position: relative; position: relative;
white-space: nowrap; white-space: nowrap;
clear: both; clear: both;
&.header { &.header {
a, a:active, a:visited { a, a:active, a:visited {
padding-bottom: 18px; padding-bottom: 18px;
color: #555; color: #555;
text-decoration: none; text-decoration: none;
opacity: 0.4; opacity: 0.4;
cursor: pointer; cursor: pointer;
.transition(all 0.2s ease-in-out); .transition(all 0.2s ease-in-out);
img.ascending, img.descending { img.ascending, img.descending {
position: relative; position: relative;
top: -2px; top: -2px;
display: none; display: none;
width: 12px; width: 12px;
height: 12px; height: 12px;
padding: 0 8px; padding: 0 8px;
} }
&:hover { &:hover {
color: #555; color: #555;
opacity: 0.9; opacity: 0.9;
} }
&.ascending img.ascending { &.ascending img.ascending {
display: inline; display: inline;
} }
&.descending img.descending { &.descending img.descending {
display: inline; display: inline;
} }
} }
} }
&.entry { &.entry {
a, a:active, a:visited { a, a:active, a:visited {
display: block; display: block;
color: #555; color: #555;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
border-bottom: 1px solid #ddd; border-bottom: 1px solid #ddd;
&:hover, &.hover { &:hover, &.hover {
background-color: #f6f6f6; background-color: #f6f6f6;
color: #e80; color: #e80;
} }
&.selected:not(.selecting), &.selecting:not(.selected) { &.selected:not(.selecting), &.selecting:not(.selected) {
border-color: rgba(240,100,0,0.2); border-color: rgba(240,100,0,0.2);
background-color: rgba(240,100,0,0.2); background-color: rgba(240,100,0,0.2);
} }
} }
&.error { &.error {
a, a:active, a:visited { a, a:active, a:visited {
color: #aaa; color: #aaa;
.label { .label {
.hint { .hint {
margin-left: 12px; margin-left: 12px;
font-size: 0.9em; font-size: 0.9em;
color: #c55; color: #c55;
} }
} }
&:hover, &.hover { &:hover, &.hover {
opacity: 1; opacity: 1;
background-color: #f6f6f6; background-color: #f6f6f6;
color: #e80; color: #e80;
} }
} }
} }
&.folder-parent { &.folder-parent {
.date, .size { .date, .size {
display: none; display: none;
} }
} }
&.folder { &.folder {
.size { .size {
display: none; display: none;
} }
} }
} }
.icon, .label, .date, .size { .icon, .label, .date, .size {
padding: 6px; padding: 6px;
} }
.icon { .icon {
display: inline-block; display: inline-block;
position: absolute; position: absolute;
left: 0; left: 0;
top: -2px; top: -2px;
width: 16px; width: 16px;
img { img {
width: 16px; width: 16px;
height: 16px; height: 16px;
&.thumb { &.thumb {
border: 1px solid #eee; border: 1px solid #eee;
} }
} }
} }
.icon.big { .icon.big {
display: none; display: none;
} }
.label { .label {
display: block; display: block;
margin: 0 270px 0 24px; margin: 0 270px 0 24px;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-align: left; text-align: left;
} }
.date { .date {
position: absolute; position: absolute;
right: 100px; right: 100px;
top: 0; top: 0;
text-align: right; text-align: right;
width: 160px; width: 160px;
white-space: nowrap; white-space: nowrap;
} }
.size { .size {
position: absolute; position: absolute;
right: 0; right: 0;
top: 0; top: 0;
text-align: right; text-align: right;
width: 80px; width: 80px;
white-space: nowrap; white-space: nowrap;
} }
&.entry.thumb .icon.small { &.entry.thumb .icon.small {
overflow: hidden; overflow: hidden;
padding: 5px; padding: 5px;
img { img {
background-color: #eee; background-color: #eee;
width: 16px; width: 16px;
height: 16px; height: 16px;
border: 1px solid #ddd; border: 1px solid #ddd;
overflow: hidden; overflow: hidden;
} }
} }
} }
} }
.empty { .empty {
text-align: center; text-align: center;
margin: 50px 0; margin: 50px 0;
color: #ddd; color: #ddd;
font-size: 5em; font-size: 5em;
font-weight: bold; font-weight: bold;
} }
} }
#selection-rect { #selection-rect {
display: none; display: none;
position: absolute; position: absolute;
left: 0; left: 0;
top: 0; top: 0;
z-index: 2; z-index: 2;
border: 1px dashed rgba(240,100,0,0.5); border: 1px dashed rgba(240,100,0,0.5);
background-color: rgba(240,100,0,0.2); background-color: rgba(240,100,0,0.2);
} }
#extended.icons-view { #extended.icons-view {
display: none; display: none;
padding: 3px; padding: 3px;
border: 1px solid #eee; border: 1px solid #eee;
border-radius: 15px; border-radius: 15px;
ul { ul {
margin: 0; margin: 0;
padding: 0; padding: 0;
list-style: none; list-style: none;
li { li {
&.header { &.header {
display: none; display: none;
} }
&.entry { &.entry {
float: left; float: left;
a, a:active, a:visited { a, a:active, a:visited {
display: block; display: block;
margin: 8px; margin: 8px;
padding: 8px; padding: 8px;
width: 100px; width: 100px;
height: 120px; height: 120px;
float: left; float: left;
text-align: center; text-align: center;
text-decoration: none; text-decoration: none;
overflow: hidden; overflow: hidden;
border-radius: 5px; border-radius: 5px;
color: #555; color: #555;
cursor: pointer; cursor: pointer;
border: 2px solid rgba(0,0,0,0); border: 2px solid rgba(0,0,0,0);
&:hover, &.hover { &:hover, &.hover {
color: #e80; color: #e80;
border-color: #eee; border-color: #eee;
background-color: #f6f6f6; background-color: #f6f6f6;
} }
&.selected:not(.selecting), &.selecting:not(.selected) { &.selected:not(.selecting), &.selecting:not(.selected) {
border-color: rgba(240,100,0,0.2); border-color: rgba(240,100,0,0.2);
background-color: rgba(240,100,0,0.2); background-color: rgba(240,100,0,0.2);
} }
.icon { .icon {
display: block; display: block;
img { img {
min-width: 48px; min-width: 48px;
min-height: 48px; min-height: 48px;
margin-bottom: 8px; margin-bottom: 8px;
&.thumb { &.thumb {
border: 1px solid #eee; border: 1px solid #eee;
} }
} }
} }
.icon.small { .icon.small {
display: none; display: none;
} }
.label { .label {
display: block; display: block;
word-wrap: break-word; word-wrap: break-word;
} }
.date, .size { .date, .size {
display: none; display: none;
} }
} }
&.error { &.error {
a, a:active, a:visited { a, a:active, a:visited {
color: #aaa; color: #aaa;
text-decoration: none; text-decoration: none;
.label { .label {
.hint { .hint {
padding: 0 6px; padding: 0 6px;
font-size: 0.9em; font-size: 0.9em;
color: #c55; color: #c55;
} }
} }
&:hover, &.hover { &:hover, &.hover {
color: #e80; color: #e80;
border-color: #eee; border-color: #eee;
background-color: #f6f6f6; background-color: #f6f6f6;
} }
} }
} }
} }
&.entry.thumb .icon.big { &.entry.thumb .icon.big {
width: 100px; width: 100px;
height: 58px; height: 58px;
overflow: hidden; overflow: hidden;
img { img {
background-color: #eee; background-color: #eee;
min-width: 46px; min-width: 46px;
min-height: 46px; min-height: 46px;
min-width: 12px; min-width: 12px;
min-height: 12px; min-height: 12px;
border: 1px solid #ddd; border: 1px solid #ddd;
overflow: hidden; overflow: hidden;
} }
} }
} }
} }
.empty { .empty {
padding: 16px; padding: 16px;
height: 120px; height: 120px;
text-align: center; text-align: center;
color: #ddd; color: #ddd;
font-size: 5em; font-size: 5em;
font-weight: bold; font-weight: bold;
} }
} }

View File

@@ -4,116 +4,116 @@
html.js { html.js {
.hideOnJs { .hideOnJs {
display: none; display: none;
} }
} }
html.no-js { html.no-js {
.hideOnNoJs { .hideOnNoJs {
display: none; display: none;
} }
} }
body { body {
font-family: Ubuntu, sans-serif; font-family: Ubuntu, sans-serif;
font-size: 16px; font-size: 16px;
color: #555; color: #555;
background-color: #fff; background-color: #fff;
margin: 80px 30px; margin: 80px 30px;
} }
body > nav { body > nav {
position: fixed; position: fixed;
z-index: 1; z-index: 1;
width: 100%; width: 100%;
left: 0; left: 0;
top: 0; top: 0;
font-size: 0.85em; font-size: 0.85em;
background-color: rgb(241,241,241); background-color: rgb(241,241,241);
border-bottom: 2px solid rgb(210,210,210); border-bottom: 2px solid rgb(210,210,210);
span.jsDisabledFallback { span.jsDisabledFallback {
display: block; display: block;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
padding: 0 10px; padding: 0 10px;
color: #999; color: #999;
} }
a, a:active, a:visited { a, a:active, a:visited {
color: #555; color: #555;
cursor: pointer; cursor: pointer;
text-decoration: none; text-decoration: none;
opacity: 0.7; opacity: 0.7;
.transition(all 0.2s ease-in-out); .transition(all 0.2s ease-in-out);
display: block; display: block;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
padding: 0 10px; padding: 0 10px;
&:hover, &.hover { &:hover, &.hover {
color: #e80; color: #e80;
background-color: rgba(255,255,255,0.5); background-color: rgba(255,255,255,0.5);
opacity: 1.0; opacity: 1.0;
} }
} }
.current a { .current a {
background-color: rgba(255,255,255,0.5); background-color: rgba(255,255,255,0.5);
opacity: 1.0; opacity: 1.0;
} }
img { img {
position: relative; position: relative;
top: -2px; top: -2px;
width: 16px; width: 16px;
height: 16px; height: 16px;
} }
img + span { img + span {
margin-left: 6px; margin-left: 6px;
} }
.crumb { .crumb {
float: left; float: left;
border-right: 1px solid rgb(231,231,231); border-right: 1px solid rgb(231,231,231);
.hint { .hint {
margin-left: 8px; margin-left: 8px;
font-style: italic; font-style: italic;
color: #999; color: #999;
} }
img.hint { img.hint {
width: 10px; width: 10px;
height: 10px; height: 10px;
} }
} }
.view { .view {
float: right; float: right;
border-left: 1px solid rgb(231,231,231); border-left: 1px solid rgb(231,231,231);
} }
#download { #download {
display: none; display: none;
float: right; float: right;
border-left: 1px solid rgb(231,231,231); border-left: 1px solid rgb(231,231,231);
} }
} }
#content { #content {
max-width: 960px; max-width: 960px;
margin: 0 auto; margin: 0 auto;
> header { > header {
display: none; display: none;
padding-bottom: 10px; padding-bottom: 10px;
margin-bottom: 80px; margin-bottom: 80px;
border-bottom: 2px dashed #ddd; border-bottom: 2px dashed #ddd;
} }
> footer { > footer {
display: none; display: none;
padding-top: 10px; padding-top: 10px;
margin-top: 80px; margin-top: 80px;
border-top: 2px dashed #ddd; border-top: 2px dashed #ddd;
} }
} }
@@ -123,114 +123,114 @@ body > nav {
body > footer { body > footer {
position: fixed; position: fixed;
z-index: 1; z-index: 1;
width: 100%; width: 100%;
left: 0; left: 0;
bottom: 0; bottom: 0;
padding: 6px 0 8px 0; padding: 6px 0 8px 0;
background-color: rgb(241,241,241); background-color: rgb(241,241,241);
border-top: 2px solid rgb(210,210,210); border-top: 2px solid rgb(210,210,210);
color: #999; color: #999;
font-size: 0.85em; font-size: 0.85em;
text-align: center; text-align: center;
a, a:active, a:visited { a, a:active, a:visited {
color: #555; color: #555;
text-decoration: none; text-decoration: none;
.transition(all 0.2s ease-in-out); .transition(all 0.2s ease-in-out);
opacity: 0.7; opacity: 0.7;
&:hover { &:hover {
color: #e80; color: #e80;
opacity: 1; opacity: 1;
} }
} }
.left { .left {
display: block; display: block;
padding: 0 8px; padding: 0 8px;
float: left float: left
} }
.center { .center {
display: block; display: block;
margin: 0 100px; margin: 0 100px;
} }
.right { .right {
display: block; display: block;
padding: 0 8px; padding: 0 8px;
float: right float: right
} }
.noJsMsg { .noJsMsg {
color: #c33; color: #c33;
margin-left: 16px; margin-left: 16px;
} }
.status { .status {
.sep { .sep {
display: inline-block; display: inline-block;
padding: 0 6px; padding: 0 6px;
} }
&.default { &.default {
} }
&.dynamic { &.dynamic {
display: none; display: none;
} }
} }
#langSelector { #langSelector {
position: relative; position: relative;
cursor: pointer; cursor: pointer;
.langOptions { .langOptions {
position: absolute; position: absolute;
z-index: 2; z-index: 2;
overflow: auto; overflow: auto;
display: none; display: none;
right: 0; right: 0;
top: 0; top: 0;
max-height: 200px; max-height: 200px;
background-color: rgb(241,241,241); background-color: rgb(241,241,241);
border: 1px solid rgb(210,210,210); border: 1px solid rgb(210,210,210);
> .scrollbar { > .scrollbar {
margin: 0; margin: 0;
width: 6px; width: 6px;
background-color: rgb(210,210,210); background-color: rgb(210,210,210);
.drag { .drag {
background-color: rgb(180,180,180); background-color: rgb(180,180,180);
} }
&.dragOn .drag { &.dragOn .drag {
background-color: rgb(150,150,150); background-color: rgb(150,150,150);
} }
} }
ul { ul {
margin: 0; margin: 0;
padding: 0; padding: 0;
list-style: none; list-style: none;
text-align: left; text-align: left;
li { li {
padding: 8px 24px 10px 24px; padding: 8px 24px 10px 24px;
white-space: nowrap; white-space: nowrap;
border-top: 1px solid rgb(231,231,231); border-top: 1px solid rgb(231,231,231);
.transition(all 0.2s ease-in-out); .transition(all 0.2s ease-in-out);
&.current { &.current {
color: #333; color: #333;
background-color: rgba(255,255,255,0.8); background-color: rgba(255,255,255,0.8);
} }
&:hover { &:hover {
color: #e80; color: #e80;
background-color: rgba(255,255,255,0.8); background-color: rgba(255,255,255,0.8);
} }
} }
li:nth-child(3n+1) { li:nth-child(3n+1) {
} }
} }
} }
} }
} }
@import "responsive"; @import "responsive";

View File

@@ -1,38 +1,38 @@
.border-radius (@radius) { .border-radius (@radius) {
-moz-border-radius: @radius; -moz-border-radius: @radius;
-webkit-border-radius: @radius; -webkit-border-radius: @radius;
border-radius: @radius; border-radius: @radius;
} }
.box-shadow (@shadow) { .box-shadow (@shadow) {
-moz-box-shadow: @shadow; -moz-box-shadow: @shadow;
-webkit-box-shadow: @shadow; -webkit-box-shadow: @shadow;
box-shadow: @shadow; box-shadow: @shadow;
} }
.transition (@transition) { .transition (@transition) {
-moz-transition: @transition; -moz-transition: @transition;
-ms-transition: @transition; -ms-transition: @transition;
-o-transition: @transition; -o-transition: @transition;
-webkit-transition: @transition; -webkit-transition: @transition;
transition: @transition; transition: @transition;
} }
.transform (@transform) { .transform (@transform) {
-moz-transform: @transform; -moz-transform: @transform;
-o-transform: @transform; -o-transform: @transform;
-webkit-transform: @transform; -webkit-transform: @transform;
transform: @transform; transform: @transform;
} }
.background-size (@size) { .background-size (@size) {
-moz-background-size: @size; -moz-background-size: @size;
-webkit-background-size: @size; -webkit-background-size: @size;
background-size: @size; background-size: @size;
} }

View File

@@ -1,36 +1,36 @@
@media only screen and (max-width: 500px) { @media only screen and (max-width: 500px) {
body > nav { body > nav {
.view span { .view span {
display: none; display: none;
} }
} }
#extended.icons-view { #extended.icons-view {
padding: 0; padding: 0;
border: none; border: none;
margin: 0 -14px; margin: 0 -14px;
} }
} }
@media only screen and (max-width: 350px) { @media only screen and (max-width: 350px) {
body > nav { body > nav {
.crumb { .crumb {
display: none; display: none;
} }
.current { .current {
display: block; display: block;
} }
} }
#extended.details-view { #extended.details-view {
.header .label, .entry .label { .header .label, .entry .label {
margin-right: 110px; margin-right: 110px;
} }
.header .date, .entry .date { .header .date, .entry .date {
display: none; display: none;
} }
} }
body > footer { body > footer {
.center { .center {
display: none; display: none;
} }
} }
} }

View File

@@ -1,68 +1,68 @@
#table { #table {
table { table {
display: block; display: block;
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
th, td { th, td {
padding: 3px 6px; padding: 3px 6px;
text-align: left; text-align: left;
border: none; border: none;
} }
th { th {
padding-bottom: 18px; padding-bottom: 18px;
opacity: 0.4; opacity: 0.4;
.transition(all 0.2s ease-in-out); .transition(all 0.2s ease-in-out);
&:hover, &:hover a { &:hover, &:hover a {
color: #555; color: #555;
cursor: pointer; cursor: pointer;
opacity: 0.9; opacity: 0.9;
} }
a, a:visited { a, a:visited {
color: #555; color: #555;
font-weight: normal; font-weight: normal;
img { img {
width: 12px; width: 12px;
height: 12px; height: 12px;
padding: 0 8px; padding: 0 8px;
} }
} }
} }
td { td {
border: 1px solid #ddd; border: 1px solid #ddd;
border-left: none; border-left: none;
border-right: none; border-right: none;
} }
td:nth-child(1), th:nth-child(1) { td:nth-child(1), th:nth-child(1) {
text-align: center; text-align: center;
width: 16px; width: 16px;
img { img {
width: 16px; width: 16px;
height: 16px; height: 16px;
padding-top: 2px; padding-top: 2px;
} }
} }
td:nth-child(2), th:nth-child(2) { td:nth-child(2), th:nth-child(2) {
width: 682px; width: 682px;
max-width: 682px; max-width: 682px;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
} }
td:nth-child(3), th:nth-child(3) { td:nth-child(3), th:nth-child(3) {
text-align: right; text-align: right;
width: 160px; width: 160px;
min-width: 160px; min-width: 160px;
white-space: nowrap; white-space: nowrap;
} }
td:nth-child(4), th:nth-child(4) { td:nth-child(4), th:nth-child(4) {
text-align: right; text-align: right;
width: 70px; width: 70px;
min-width: 70px; min-width: 70px;
white-space: nowrap; white-space: nowrap;
} }
} }
} }

View File

@@ -1,130 +1,130 @@
#tree { #tree {
display: none; display: none;
position: fixed; position: fixed;
left: 0; left: 0;
top: 82px; top: 82px;
z-index: 1; z-index: 1;
overflow: auto; overflow: auto;
font-size: 0.85em; font-size: 0.85em;
padding: 8px; padding: 8px;
background-color: rgb(241,241,241); background-color: rgb(241,241,241);
border: 1px solid rgb(210,210,210); border: 1px solid rgb(210,210,210);
border-left: none; border-left: none;
.border-radius(0 10px 10px 0); .border-radius(0 10px 10px 0);
> .scrollbar { > .scrollbar {
margin: 8px 8px 8px 0; margin: 8px 8px 8px 0;
width: 6px; width: 6px;
background-color: rgb(210,210,210); background-color: rgb(210,210,210);
.border-radius(3px); .border-radius(3px);
.drag { .drag {
background-color: rgb(180,180,180); background-color: rgb(180,180,180);
.border-radius(3px); .border-radius(3px);
} }
&.dragOn .drag { &.dragOn .drag {
background-color: rgb(150,150,150); background-color: rgb(150,150,150);
} }
} }
.entry { .entry {
.blank, .indicator { .blank, .indicator {
display: inline-block; display: inline-block;
width: 16px; width: 16px;
height: 25px; height: 25px;
float: left; float: left;
} }
.indicator { .indicator {
opacity: 0.7; opacity: 0.7;
.transition(all 0.2s ease-in-out); .transition(all 0.2s ease-in-out);
cursor: pointer; cursor: pointer;
&:hover { &:hover {
opacity: 1; opacity: 1;
} }
img { img {
position: relative; position: relative;
left: 0; left: 0;
top: 3px; top: 3px;
width: 12px; width: 12px;
height: 12px; height: 12px;
vertical-align: bottom; vertical-align: bottom;
.transition(all 0.2s ease-in-out); .transition(all 0.2s ease-in-out);
} }
&.open { &.open {
img { img {
.transform(rotate(90deg)); .transform(rotate(90deg));
} }
} }
&.unknown { &.unknown {
opacity: 0.3; opacity: 0.3;
} }
} }
> a, > a:active, > a.visited { > a, > a:active, > a.visited {
margin-left: 16px; margin-left: 16px;
padding: 4px 6px; padding: 4px 6px;
border: 1px solid rgba(0,0,0,0); border: 1px solid rgba(0,0,0,0);
.border-radius(5px); .border-radius(5px);
display: block; display: block;
color: #555; color: #555;
text-decoration: none; text-decoration: none;
opacity: 0.7; opacity: 0.7;
&:hover, &.hover { &:hover, &.hover {
color: #e80; color: #e80;
background-color: rgba(255,255,255,0.5); background-color: rgba(255,255,255,0.5);
opacity: 1; opacity: 1;
} }
.label { .label {
display: inline-block; display: inline-block;
} }
.icon { .icon {
display: inline-block; display: inline-block;
width: 20px; width: 20px;
img { img {
width: 16px; width: 16px;
height: 16px; height: 16px;
vertical-align: bottom; vertical-align: bottom;
} }
} }
.hint { .hint {
display: inline-block; display: inline-block;
margin-left: 12px; margin-left: 12px;
font-size: 0.9em; font-size: 0.9em;
color: #ccc; color: #ccc;
img { img {
width: 10px; width: 10px;
height: 10px; height: 10px;
vertical-align: baseline; vertical-align: baseline;
} }
} }
} }
&.file { &.file {
display: none; display: none;
} }
&.current { &.current {
> a, > a:active, > a:visited { > a, > a:active, > a:visited {
border: 1px solid rgb(221,221,221); border: 1px solid rgb(221,221,221);
background-color: rgba(255,255,255,0.5); background-color: rgba(255,255,255,0.5);
opacity: 1; opacity: 1;
} }
} }
&.error { &.error {
> a, > a:active, > a:visited { > a, > a:active, > a:visited {
color: #999; color: #999;
&:hover, &.hover { &:hover, &.hover {
color: #e80; color: #e80;
} }
} }
.hint { .hint {
color: #c55; color: #c55;
} }
} }
.content, ul.content { .content, ul.content {
list-style: none; list-style: none;
margin: 0; margin: 0;
padding: 0 0 0 24px; padding: 0 0 0 24px;
} }
} }
} }

View File

@@ -1,3 +1,2 @@
@import "inc/main"; @import "inc/main";

View File

@@ -3,15 +3,15 @@
#table { #table {
display: none; display: none;
} }
#tree, #content > header, #content > footer { #tree, #content > header, #content > footer {
display: block; display: block;
} }
html.no-js { html.no-js {
#extended.details-view, #extended.icons-view { #extended.details-view, #extended.icons-view {
display: block; display: block;
} }
} }

View File

@@ -1,34 +1,34 @@
<!-- generated code ends here --> <!-- generated code ends here -->
</section> </section>
<section id="extended" class="clearfix"></section> <section id="extended" class="clearfix"></section>
<footer></footer> <footer></footer>
</section> </section>
<section id="tree"></section> <section id="tree"></section>
<footer class="clearfix"> <footer class="clearfix">
<span class="left"> <span class="left">
<a href="http://larsjung.de/h5ai" target="_blank" title="h5ai project page">h5ai %BUILD_VERSION% (js)</a> <a href="http://larsjung.de/h5ai" target="_blank" title="h5ai project page">h5ai %BUILD_VERSION% (js)</a>
<span class="hideOnJs noJsMsg"> ⚡ JavaScript is disabled! ⚡ </span> <span class="hideOnJs noJsMsg"> ⚡ JavaScript is disabled! ⚡ </span>
</span> </span>
<span class="right"> <span class="right">
<span id="langSelector"> <span id="langSelector">
<span class="lang">en</span> - <span class="l10n-lang">english</span> <span class="lang">en</span> - <span class="l10n-lang">english</span>
<span class="langOptions"></span> <span class="langOptions"></span>
</span> </span>
</span> </span>
<span class="center"> <span class="center">
<span class="hideOnNoJs"> <span class="hideOnNoJs">
<span class="status default"> <span class="status default">
<span class="folderTotal"></span> <span class="l10n-folders">folders</span> <span class="folderTotal"></span> <span class="l10n-folders">folders</span>
<span class='sep'>·</span> <span class='sep'>·</span>
<span class="fileTotal"></span> <span class="l10n-files">files</span> <span class="fileTotal"></span> <span class="l10n-files">files</span>
</span> </span>
<span class="status dynamic"> <span class="status dynamic">
</span> </span>
</span> </span>
</span> </span>
</footer> </footer>
<script src="/_h5ai/js/libs.js"></script> <script src="/_h5ai/js/libs.js"></script>
<script src="/_h5ai/config.js"></script> <script src="/_h5ai/config.js"></script>
<script src="/_h5ai/js/main-js.js"></script> <script src="/_h5ai/js/main-js.js"></script>
</body> </body>
</html> </html>

View File

@@ -1,4 +1,4 @@
<!-- generated code ends here --> <!-- generated code ends here -->
</section> </section>
</body> </body>
</html> </html>

View File

@@ -4,28 +4,28 @@
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]--> <!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]--> <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Directory index · styled with h5ai</title> <title>Directory index · styled with h5ai</title>
<meta name="h5ai-version" content="h5ai %BUILD_VERSION% (js)"> <meta name="h5ai-version" content="h5ai %BUILD_VERSION% (js)">
<meta name="description" content="Directory index styled with h5ai (http://larsjung.de/h5ai)"> <meta name="description" content="Directory index styled with h5ai (http://larsjung.de/h5ai)">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/png" href="/_h5ai/images/h5ai-16x16.png"> <link rel="shortcut icon" type="image/png" href="/_h5ai/images/h5ai-16x16.png">
<link rel="apple-touch-icon" type="image/png" href="/_h5ai/images/h5ai-48x48.png"> <link rel="apple-touch-icon" type="image/png" href="/_h5ai/images/h5ai-48x48.png">
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold"> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold">
<link rel="stylesheet" href="/_h5ai/css/main-js.css"> <link rel="stylesheet" href="/_h5ai/css/main-js.css">
<script src="/_h5ai/js/modernizr.min.js"></script> <script src="/_h5ai/js/modernizr.min.js"></script>
</head> </head>
<body> <body>
<div id="selection-rect"></div> <div id="selection-rect"></div>
<nav class="clearfix hideOnNoJs"> <nav class="clearfix hideOnNoJs">
<ul id="navbar"></ul> <ul id="navbar"></ul>
</nav> </nav>
<section id="content"> <section id="content">
<header></header> <header></header>
<section id="table" class="hideOnJs"> <section id="table" class="hideOnJs">
<!-- <!--
The following code was generated by Apache's autoindex module. It is not valid HTML5, but this The following code was generated by Apache's autoindex module. It is not valid HTML5, but this
section gets removed from the DOM tree as soon as its information is parsed. The actual page section gets removed from the DOM tree as soon as its information is parsed. The actual page
should render as valid HTML5, even if the produced source is not valid HTML5. should render as valid HTML5, even if the produced source is not valid HTML5.
--> -->

View File

@@ -5,56 +5,56 @@
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]--> <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<?php include "php/main.php"; ?> <?php include "php/main.php"; ?>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title><?php echo $h5ai->getTitle(); ?></title> <title><?php echo $h5ai->getTitle(); ?></title>
<meta name="h5ai-version" content="h5ai %BUILD_VERSION% (php)"> <meta name="h5ai-version" content="h5ai %BUILD_VERSION% (php)">
<meta name="description" content="Directory index styled with h5ai (http://larsjung.de/h5ai)"> <meta name="description" content="Directory index styled with h5ai (http://larsjung.de/h5ai)">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/png" href="/_h5ai/images/h5ai-16x16.png"> <link rel="shortcut icon" type="image/png" href="/_h5ai/images/h5ai-16x16.png">
<link rel="apple-touch-icon" type="image/png" href="/_h5ai/images/h5ai-48x48.png"> <link rel="apple-touch-icon" type="image/png" href="/_h5ai/images/h5ai-48x48.png">
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold"> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold">
<link rel="stylesheet" href="/_h5ai/css/main-php.css"> <link rel="stylesheet" href="/_h5ai/css/main-php.css">
<script src="/_h5ai/js/modernizr.min.js"></script> <script src="/_h5ai/js/modernizr.min.js"></script>
</head> </head>
<body> <body>
<div id="selection-rect"></div> <div id="selection-rect"></div>
<nav class="clearfix"> <nav class="clearfix">
<ul id="navbar"> <ul id="navbar">
<?php echo $crumb->toHtml(); ?> <?php echo $crumb->toHtml(); ?>
</ul> </ul>
</nav> </nav>
<?php echo $tree->toHtml(); ?> <?php echo $tree->toHtml(); ?>
<section id="content"> <section id="content">
<?php echo $customize->getHeader(); ?> <?php echo $customize->getHeader(); ?>
<?php echo $extended->toHtml(); ?> <?php echo $extended->toHtml(); ?>
<?php echo $customize->getFooter(); ?> <?php echo $customize->getFooter(); ?>
</section> </section>
<footer class="clearfix"> <footer class="clearfix">
<span class="left"> <span class="left">
<a href="http://larsjung.de/h5ai" target="_blank" title="h5ai project page">h5ai %BUILD_VERSION% (php)</a> <a href="http://larsjung.de/h5ai" target="_blank" title="h5ai project page">h5ai %BUILD_VERSION% (php)</a>
<span class="hideOnJs noJsMsg"> ⚡ JavaScript is disabled! ⚡ </span> <span class="hideOnJs noJsMsg"> ⚡ JavaScript is disabled! ⚡ </span>
</span> </span>
<span class="right"> <span class="right">
<span id="langSelector"> <span id="langSelector">
<span class="lang">en</span> - <span class="l10n-lang">english</span> <span class="lang">en</span> - <span class="l10n-lang">english</span>
<span class="langOptions"></span> <span class="langOptions"></span>
</span> </span>
</span> </span>
<span class="center"> <span class="center">
<span class="hideOnNoJs"> <span class="hideOnNoJs">
<span class="status default"> <span class="status default">
<span class="folderTotal"></span> <span class="l10n-folders">folders</span> <span class="folderTotal"></span> <span class="l10n-folders">folders</span>
<span class='sep'>·</span> <span class='sep'>·</span>
<span class="fileTotal"></span> <span class="l10n-files">files</span> <span class="fileTotal"></span> <span class="l10n-files">files</span>
</span> </span>
<span class="status dynamic"> <span class="status dynamic">
</span> </span>
</span> </span>
</span> </span>
</footer> </footer>
<script src="/_h5ai/js/libs.js"></script> <script src="/_h5ai/js/libs.js"></script>
<script src="/_h5ai/config.js"></script> <script src="/_h5ai/config.js"></script>
<script src="/_h5ai/js/main-php.js"></script> <script src="/_h5ai/js/main-php.js"></script>
<section id="table"> <section id="table">
<!-- The following code was generated by Apache's autoindex module and gets ignored and removed from the DOM tree. --> <!-- The following code was generated by Apache's autoindex module and gets ignored and removed from the DOM tree. -->

View File

@@ -1,115 +1,115 @@
(function ($, H5AI) { (function ($, H5AI) {
H5AI.connector = (function () { H5AI.connector = (function () {
var cache = {}, var cache = {},
pathnameStatusCache = {}, pathnameStatusCache = {},
contentTypeRegEx = /^text\/html;h5ai=/, contentTypeRegEx = /^text\/html;h5ai=/,
getPath = function (folder, tableRow) { getPath = function (folder, tableRow) {
var absHref = H5AI.util.getAbsHref(folder, tableRow), var absHref = H5AI.util.getAbsHref(folder, tableRow),
path = cache[absHref]; path = cache[absHref];
if (!path) { if (!path) {
path = H5AI.Path(folder, tableRow); path = H5AI.Path(folder, tableRow);
if (!path.isParentFolder) { if (!path.isParentFolder) {
cache[path.absHref] = path; cache[path.absHref] = path;
} }
} }
return path; return path;
}, },
fetchStatus = function (pathname, callback) { fetchStatus = function (pathname, callback) {
if (H5AI.core.settings.folderStatus[pathname]) { if (H5AI.core.settings.folderStatus[pathname]) {
callback(H5AI.core.settings.folderStatus[pathname]); callback(H5AI.core.settings.folderStatus[pathname]);
return; return;
} else if (pathnameStatusCache[pathname]) { } else if (pathnameStatusCache[pathname]) {
callback(pathnameStatusCache[pathname]); callback(pathnameStatusCache[pathname]);
return; return;
} }
$.ajax({ $.ajax({
url: pathname, url: pathname,
type: "HEAD", type: "HEAD",
complete: function (xhr) { complete: function (xhr) {
var status = xhr.status; var status = xhr.status;
if (status === 200 && contentTypeRegEx.test(xhr.getResponseHeader("Content-Type"))) { if (status === 200 && contentTypeRegEx.test(xhr.getResponseHeader("Content-Type"))) {
status = "h5ai"; status = "h5ai";
} }
pathnameStatusCache[pathname] = status; pathnameStatusCache[pathname] = status;
callback(status); callback(status);
} }
}); });
}, },
updatePath = function (path) { updatePath = function (path) {
if (path.isFolder && !path.isParentFolder && path.status === undefined) { if (path.isFolder && !path.isParentFolder && path.status === undefined) {
fetchStatus(path.absHref, function (status) { fetchStatus(path.absHref, function (status) {
if (status !== "h5ai") { if (status !== "h5ai") {
path.status = status; path.status = status;
} }
H5AI.html.updateHtml(path); H5AI.html.updateHtml(path);
H5AI.core.linkHoverStates(); H5AI.core.linkHoverStates();
}); });
} }
}, },
updatePaths = function () { updatePaths = function () {
$.each(cache, function (ref, cached) { $.each(cache, function (ref, cached) {
updatePath(cached); updatePath(cached);
}); });
}, },
fetchStatusAndContent = function (pathname, includeParent, callback) { fetchStatusAndContent = function (pathname, includeParent, callback) {
fetchStatus(pathname, function (status) { fetchStatus(pathname, function (status) {
if (status !== "h5ai") { if (status !== "h5ai") {
callback(status, {}); callback(status, {});
return; return;
} }
$.ajax({ $.ajax({
url: pathname, url: pathname,
type: "GET", type: "GET",
dataType: "html", dataType: "html",
error: function (xhr) { error: function (xhr) {
callback(xhr.status, {}); // since it was checked before this should never happen callback(xhr.status, {}); // since it was checked before this should never happen
}, },
success: function (html, status, xhr) { success: function (html, status, xhr) {
var content = {}; var content = {};
if (!contentTypeRegEx.test(xhr.getResponseHeader("Content-Type"))) { if (!contentTypeRegEx.test(xhr.getResponseHeader("Content-Type"))) {
callback(xhr.status, {}); // since it was checked before this should never happen callback(xhr.status, {}); // since it was checked before this should never happen
return; return;
} }
$(html).find("#table td").closest("tr").each(function () { $(html).find("#table td").closest("tr").each(function () {
var path = getPath(pathname, this); var path = getPath(pathname, this);
if (path.isFolder && (!path.isParentFolder || includeParent)) { if (path.isFolder && (!path.isParentFolder || includeParent)) {
content[path.absHref] = path; content[path.absHref] = path;
updatePath(path); updatePath(path);
} }
}); });
callback("h5ai", content); callback("h5ai", content);
} }
}); });
}); });
}; };
return { return {
getPath: getPath, getPath: getPath,
updatePaths: updatePaths, updatePaths: updatePaths,
fetchStatusAndContent: fetchStatusAndContent fetchStatusAndContent: fetchStatusAndContent
}; };
}()); }());
}(jQuery, H5AI)); }(jQuery, H5AI));

View File

@@ -1,399 +1,399 @@
(function (window, $, H5AI, config) { (function (window, $, H5AI, config) {
H5AI.core = (function () { H5AI.core = (function () {
var $window = $(window), var $window = $(window),
defaults = { defaults = {
store: { store: {
viewmode: "h5ai.pref.viewmode", viewmode: "h5ai.pref.viewmode",
lang: "h5ai.pref.lang" lang: "h5ai.pref.lang"
}, },
callbacks: { callbacks: {
pathClick: [] pathClick: []
}, },
rootAbsHref: "/", rootAbsHref: "/",
h5aiAbsHref: "/_h5ai/", h5aiAbsHref: "/_h5ai/",
customHeader: "_h5ai.header.html", customHeader: "_h5ai.header.html",
customFooter: "_h5ai.footer.html", customFooter: "_h5ai.footer.html",
viewmodes: ["details", "icons"], viewmodes: ["details", "icons"],
sortorder: "na", sortorder: "na",
showTree: true, showTree: true,
slideTree: true, slideTree: true,
folderStatus: {}, folderStatus: {},
lang: null, lang: null,
useBrowserLang: true, useBrowserLang: true,
setParentFolderLabels: true, setParentFolderLabels: true,
linkHoverStates: true, linkHoverStates: true,
dateFormat: "yyyy-MM-dd HH:mm", dateFormat: "yyyy-MM-dd HH:mm",
showThumbs: false, showThumbs: false,
zippedDownload: false zippedDownload: false
}, },
settings = $.extend({}, defaults, config.options), settings = $.extend({}, defaults, config.options),
currentDateFormat = settings.dateFormat, currentDateFormat = settings.dateFormat,
extToFileType = (function (types) { extToFileType = (function (types) {
var map = {}; var map = {};
$.each(types, function (type, exts) { $.each(types, function (type, exts) {
$.each(exts, function (idx, ext) { $.each(exts, function (idx, ext) {
map[ext] = type; map[ext] = type;
}); });
}); });
return map; return map;
}(config.types)), }(config.types)),
api = function () { api = function () {
return settings.h5aiAbsHref + "php/api.php"; return settings.h5aiAbsHref + "php/api.php";
}, },
image = function (id) { image = function (id) {
return settings.h5aiAbsHref + "images/" + id + ".png"; return settings.h5aiAbsHref + "images/" + id + ".png";
}, },
icon = function (id, big) { icon = function (id, big) {
return settings.h5aiAbsHref + "icons/" + (big ? "48x48" : "16x16") + "/" + id + ".png"; return settings.h5aiAbsHref + "icons/" + (big ? "48x48" : "16x16") + "/" + id + ".png";
}, },
viewmode = function (viewmode) { viewmode = function (viewmode) {
var $viewDetails = $("#viewdetails"), var $viewDetails = $("#viewdetails"),
$viewIcons = $("#viewicons"), $viewIcons = $("#viewicons"),
$extended = $("#extended"); $extended = $("#extended");
if (viewmode) { if (viewmode) {
amplify.store(settings.store.viewmode, viewmode); amplify.store(settings.store.viewmode, viewmode);
} else { } else {
viewmode = amplify.store(settings.store.viewmode); viewmode = amplify.store(settings.store.viewmode);
} }
viewmode = $.inArray(viewmode, settings.viewmodes) >= 0 ? viewmode : settings.viewmodes[0]; viewmode = $.inArray(viewmode, settings.viewmodes) >= 0 ? viewmode : settings.viewmodes[0];
$viewDetails.add($viewIcons).removeClass("current"); $viewDetails.add($viewIcons).removeClass("current");
if (viewmode === "details") { if (viewmode === "details") {
$viewDetails.addClass("current"); $viewDetails.addClass("current");
$extended.addClass("details-view").removeClass("icons-view").show(); $extended.addClass("details-view").removeClass("icons-view").show();
} else if (viewmode === "icons") { } else if (viewmode === "icons") {
$viewIcons.addClass("current"); $viewIcons.addClass("current");
$extended.removeClass("details-view").addClass("icons-view").show(); $extended.removeClass("details-view").addClass("icons-view").show();
} else { } else {
$extended.hide(); $extended.hide();
} }
}, },
initTopSpace = function () { initTopSpace = function () {
var $body = $("body"), var $body = $("body"),
$tree = $("#tree"), $tree = $("#tree"),
adjustTopSpace = function () { adjustTopSpace = function () {
var winHeight = $window.height(), var winHeight = $window.height(),
navHeight = $("body > nav").outerHeight(), navHeight = $("body > nav").outerHeight(),
footerHeight = $("body > footer").outerHeight(), footerHeight = $("body > footer").outerHeight(),
contentSpacing = 50, contentSpacing = 50,
treeSpacing = 30; treeSpacing = 30;
$body.css({ $body.css({
"margin-top": navHeight + contentSpacing, "margin-top": navHeight + contentSpacing,
"margin-bottom": footerHeight + contentSpacing "margin-bottom": footerHeight + contentSpacing
}); });
$tree.css({ $tree.css({
top: navHeight + treeSpacing, top: navHeight + treeSpacing,
height: winHeight - navHeight - footerHeight - 18 - 2 * treeSpacing height: winHeight - navHeight - footerHeight - 18 - 2 * treeSpacing
}); });
try { try {
$tree.get(0).updateScrollbar(); $tree.get(0).updateScrollbar();
} catch (err) {} } catch (err) {}
}; };
$window.resize(function () { $window.resize(function () {
adjustTopSpace(); adjustTopSpace();
}); });
adjustTopSpace(); adjustTopSpace();
}, },
initViews = function () { initViews = function () {
var $navbar = $("#navbar"), var $navbar = $("#navbar"),
$extended = $("#extended"); $extended = $("#extended");
$("#table").remove(); $("#table").remove();
if (settings.viewmodes.length > 1) { if (settings.viewmodes.length > 1) {
if ($.inArray("icons", settings.viewmodes) >= 0) { if ($.inArray("icons", settings.viewmodes) >= 0) {
$("<li id='viewicons' class='view'><a href='#'><img alt='view-icons' /><span class='l10n-icons'>icons</span></a></li>") $("<li id='viewicons' class='view'><a href='#'><img alt='view-icons' /><span class='l10n-icons'>icons</span></a></li>")
.find("img").attr("src", image("view-icons")).end() .find("img").attr("src", image("view-icons")).end()
.click(function () { viewmode("icons"); }) .click(function () { viewmode("icons"); })
.appendTo($navbar); .appendTo($navbar);
} }
if ($.inArray("details", settings.viewmodes) >= 0) { if ($.inArray("details", settings.viewmodes) >= 0) {
$("<li id='viewdetails' class='view'><a href='#'><img alt='view-details' /><span class='l10n-details'>details</span></a></li>") $("<li id='viewdetails' class='view'><a href='#'><img alt='view-details' /><span class='l10n-details'>details</span></a></li>")
.find("img").attr("src", image("view-details")).end() .find("img").attr("src", image("view-details")).end()
.click(function () { viewmode("details"); }) .click(function () { viewmode("details"); })
.appendTo($navbar); .appendTo($navbar);
} }
} }
// status update // status update
$extended.find(".entry a").hover( $extended.find(".entry a").hover(
function () { function () {
if ($extended.hasClass("icons-view")) { if ($extended.hasClass("icons-view")) {
var $this = $(this); var $this = $(this);
$(".status.default").hide(); $(".status.default").hide();
$(".status.dynamic") $(".status.dynamic")
.empty() .empty()
.append($this.find(".label").clone()) .append($this.find(".label").clone())
.append($("<span class='sep'>·</span>")) .append($("<span class='sep'>·</span>"))
.append($this.find(".date").clone()) .append($this.find(".date").clone())
.show(); .show();
if (!$this.closest(".entry").hasClass("folder")) { if (!$this.closest(".entry").hasClass("folder")) {
$(".status.dynamic") $(".status.dynamic")
.append($("<span class='sep'>·</span>")) .append($("<span class='sep'>·</span>"))
.append($this.find(".size").clone()); .append($this.find(".size").clone());
} }
} }
}, },
function () { function () {
$(".status.default").show(); $(".status.default").show();
$(".status.dynamic").empty().hide(); $(".status.dynamic").empty().hide();
} }
); );
}, },
shiftTree = function (forceVisible, dontAnimate) { shiftTree = function (forceVisible, dontAnimate) {
var $tree = $("#tree"), var $tree = $("#tree"),
$extended = $("#extended"); $extended = $("#extended");
if ((settings.slideTree && $tree.outerWidth() < $extended.offset().left) || forceVisible) { if ((settings.slideTree && $tree.outerWidth() < $extended.offset().left) || forceVisible) {
if (dontAnimate) { if (dontAnimate) {
$tree.stop().css({ left: 0 }); $tree.stop().css({ left: 0 });
} else { } else {
$tree.stop().animate({ left: 0 }); $tree.stop().animate({ left: 0 });
} }
} else { } else {
if (dontAnimate) { if (dontAnimate) {
$tree.stop().css({ left: 18 - $tree.outerWidth() }); $tree.stop().css({ left: 18 - $tree.outerWidth() });
} else { } else {
$tree.stop().animate({ left: 18 - $tree.outerWidth() }); $tree.stop().animate({ left: 18 - $tree.outerWidth() });
} }
} }
}, },
initTree = function () { initTree = function () {
$("#tree").hover( $("#tree").hover(
function () { shiftTree(true); }, function () { shiftTree(true); },
function () { shiftTree(); } function () { shiftTree(); }
); );
$window.resize(function () { shiftTree(); }); $window.resize(function () { shiftTree(); });
shiftTree(false, true); shiftTree(false, true);
}, },
selectLinks = function (href) { selectLinks = function (href) {
var elements = []; var elements = [];
$("a[href^='/']").each(function () { $("a[href^='/']").each(function () {
if ($(this).attr("href") === href) { if ($(this).attr("href") === href) {
elements.push(this); elements.push(this);
} }
}); });
return $(elements); return $(elements);
}, },
linkHoverStates = function () { linkHoverStates = function () {
if (settings.linkHoverStates) { if (settings.linkHoverStates) {
$("a[href^='/']:not(.linkedHoverStates)").each(function () { $("a[href^='/']:not(.linkedHoverStates)").each(function () {
var $a = $(this).addClass("linkedHoverStates"), var $a = $(this).addClass("linkedHoverStates"),
href = $a.attr("href"); href = $a.attr("href");
$a.hover( $a.hover(
function () { selectLinks(href).addClass("hover"); }, function () { selectLinks(href).addClass("hover"); },
function () { selectLinks(href).removeClass("hover"); } function () { selectLinks(href).removeClass("hover"); }
); );
}); });
} }
}, },
formatDates = function (dateFormat) { formatDates = function (dateFormat) {
if (dateFormat) { if (dateFormat) {
currentDateFormat = dateFormat; currentDateFormat = dateFormat;
} }
$("#extended .entry .date").each(function () { $("#extended .entry .date").each(function () {
var $this = $(this), var $this = $(this),
time = $this.data("time"), time = $this.data("time"),
formattedDate = time ? new Date(time).toString(currentDateFormat) : ""; formattedDate = time ? new Date(time).toString(currentDateFormat) : "";
$this.text(formattedDate); $this.text(formattedDate);
}); });
}, },
localize = function (langs, lang, useBrowserLang) { localize = function (langs, lang, useBrowserLang) {
var storedLang = amplify.store(settings.store.lang), var storedLang = amplify.store(settings.store.lang),
browserLang, selected, key; browserLang, selected, key;
if (langs[storedLang]) { if (langs[storedLang]) {
lang = storedLang; lang = storedLang;
} else if (useBrowserLang) { } else if (useBrowserLang) {
browserLang = navigator.language; browserLang = navigator.language;
if (langs[browserLang]) { if (langs[browserLang]) {
lang = browserLang; lang = browserLang;
} else if (browserLang.length > 2 && langs[browserLang.substr(0, 2)]) { } else if (browserLang.length > 2 && langs[browserLang.substr(0, 2)]) {
lang = browserLang.substr(0, 2); lang = browserLang.substr(0, 2);
} }
} }
if (!langs[lang]) { if (!langs[lang]) {
lang = "en"; lang = "en";
} }
selected = langs[lang]; selected = langs[lang];
if (selected) { if (selected) {
$.each(selected, function (key, value) { $.each(selected, function (key, value) {
$(".l10n-" + key).text(value); $(".l10n-" + key).text(value);
}); });
$(".lang").text(lang); $(".lang").text(lang);
$(".langOption").removeClass("current"); $(".langOption").removeClass("current");
$(".langOption." + lang).addClass("current"); $(".langOption." + lang).addClass("current");
} }
formatDates(selected.dateFormat || settings.dateFormat); formatDates(selected.dateFormat || settings.dateFormat);
}, },
initLangSelector = function (langs) { initLangSelector = function (langs) {
var $langOptions = $("#langSelector .langOptions"), var $langOptions = $("#langSelector .langOptions"),
sortedLangsKeys = [], sortedLangsKeys = [],
$ul; $ul;
$.each(langs, function (lang) { $.each(langs, function (lang) {
sortedLangsKeys.push(lang); sortedLangsKeys.push(lang);
}); });
sortedLangsKeys.sort(); sortedLangsKeys.sort();
$ul = $("<ul />"); $ul = $("<ul />");
$.each(sortedLangsKeys, function (idx, lang) { $.each(sortedLangsKeys, function (idx, lang) {
$("<li class='langOption' />") $("<li class='langOption' />")
.addClass(lang) .addClass(lang)
.text(lang + " - " + langs[lang].lang) .text(lang + " - " + langs[lang].lang)
.appendTo($ul) .appendTo($ul)
.click(function () { .click(function () {
amplify.store(settings.store.lang, lang); amplify.store(settings.store.lang, lang);
localize(langs, lang, false); localize(langs, lang, false);
}); });
}); });
$langOptions $langOptions
.append($ul) .append($ul)
.scrollpanel(); .scrollpanel();
$("#langSelector").hover( $("#langSelector").hover(
function () { function () {
$langOptions $langOptions
.css("top", "-" + $langOptions.outerHeight() + "px") .css("top", "-" + $langOptions.outerHeight() + "px")
.stop(true, true) .stop(true, true)
.fadeIn(); .fadeIn();
$langOptions.get(0).updateScrollbar(); $langOptions.get(0).updateScrollbar();
}, },
function () { function () {
$langOptions $langOptions
.stop(true, true) .stop(true, true)
.fadeOut(); .fadeOut();
} }
); );
}, },
onIndicatorClick = function (event) { onIndicatorClick = function (event) {
var $indicator = $(this), var $indicator = $(this),
$entry = $indicator.closest(".entry"), $entry = $indicator.closest(".entry"),
updateTreeScrollbar = $("#tree").get(0).updateScrollbar; updateTreeScrollbar = $("#tree").get(0).updateScrollbar;
if ($indicator.hasClass("unknown")) { if ($indicator.hasClass("unknown")) {
$.get(api(), { "action": "tree", "href": $entry.find("> a").attr("href") }, function (html) { $.get(api(), { "action": "tree", "href": $entry.find("> a").attr("href") }, function (html) {
var $content = $(html); var $content = $(html);
$indicator.removeClass("unknown"); $indicator.removeClass("unknown");
if ($content.find("> li").size() === 0) { if ($content.find("> li").size() === 0) {
$indicator.replaceWith($("<span class='blank' />")); $indicator.replaceWith($("<span class='blank' />"));
} else { } else {
$indicator.addClass("open"); $indicator.addClass("open");
$entry.find("> .content").replaceWith($content); $entry.find("> .content").replaceWith($content);
updateTreeScrollbar(); updateTreeScrollbar();
$content.find(".indicator:not(.initiated)") $content.find(".indicator:not(.initiated)")
.click(onIndicatorClick) .click(onIndicatorClick)
.addClass("initiated"); .addClass("initiated");
} }
}); });
} else if ($indicator.hasClass("open")) { } else if ($indicator.hasClass("open")) {
$indicator.removeClass("open"); $indicator.removeClass("open");
updateTreeScrollbar(true); updateTreeScrollbar(true);
$entry.find("> .content").slideUp(function () { $entry.find("> .content").slideUp(function () {
updateTreeScrollbar(); updateTreeScrollbar();
}); });
} else { } else {
$indicator.addClass("open"); $indicator.addClass("open");
updateTreeScrollbar(true); updateTreeScrollbar(true);
$entry.find("> .content").slideDown(function () { $entry.find("> .content").slideDown(function () {
updateTreeScrollbar(); updateTreeScrollbar();
}); });
} }
}, },
initIndicators = function () { initIndicators = function () {
$("#tree .entry.folder .indicator:not(.initiated)") $("#tree .entry.folder .indicator:not(.initiated)")
.click(onIndicatorClick) .click(onIndicatorClick)
.addClass("initiated"); .addClass("initiated");
}, },
getFileType = function (filename) { getFileType = function (filename) {
var dotidx = filename.lastIndexOf('.'), var dotidx = filename.lastIndexOf('.'),
ext = dotidx >= 0 ? filename.substr(dotidx) : filename; ext = dotidx >= 0 ? filename.substr(dotidx) : filename;
return extToFileType[ext.toLowerCase()] || "unknown"; return extToFileType[ext.toLowerCase()] || "unknown";
}, },
formatSizes = function () { formatSizes = function () {
$("#extended .entry .size").each(function () { $("#extended .entry .size").each(function () {
var $this = $(this), var $this = $(this),
bytes = $this.data("bytes"), bytes = $this.data("bytes"),
formattedSize = bytes >= 0 ? H5AI.util.formatSize(bytes) : ""; formattedSize = bytes >= 0 ? H5AI.util.formatSize(bytes) : "";
$this.text(formattedSize); $this.text(formattedSize);
}); });
}, },
setTotals = function () { setTotals = function () {
var $extended = $("#extended"); var $extended = $("#extended");
$(".folderTotal").text($extended.find(".entry.folder:not(.folder-parent)").length); $(".folderTotal").text($extended.find(".entry.folder:not(.folder-parent)").length);
$(".fileTotal").text($extended.find(".entry.file").length); $(".fileTotal").text($extended.find(".entry.file").length);
}, },
init = function () { init = function () {
initViews(); initViews();
viewmode(); viewmode();
initTopSpace(); initTopSpace();
initTree(); initTree();
linkHoverStates(); linkHoverStates();
initLangSelector(config.langs); initLangSelector(config.langs);
localize(config.langs, settings.lang, settings.useBrowserLang); localize(config.langs, settings.lang, settings.useBrowserLang);
formatSizes(); formatSizes();
setTotals(); setTotals();
initIndicators(); initIndicators();
}; };
return { return {
settings: settings, settings: settings,
api: api, api: api,
image: image, image: image,
icon: icon, icon: icon,
shiftTree: shiftTree, shiftTree: shiftTree,
linkHoverStates: linkHoverStates, linkHoverStates: linkHoverStates,
initIndicators: initIndicators, initIndicators: initIndicators,
formatDates: formatDates, formatDates: formatDates,
getFileType: getFileType, getFileType: getFileType,
init: init init: init
}; };
}()); }());
}(window, jQuery, H5AI, H5AI_CONFIG)); }(window, jQuery, H5AI, H5AI_CONFIG));

View File

@@ -1,127 +1,127 @@
(function (document, $, H5AI) { (function (document, $, H5AI) {
H5AI.extended = (function () { H5AI.extended = (function () {
var initBreadcrumb = function () { var initBreadcrumb = function () {
var $ul = $("body > nav ul"), var $ul = $("body > nav ul"),
pathname = "/", pathname = "/",
path = H5AI.connector.getPath(pathname), path = H5AI.connector.getPath(pathname),
pathnameParts = document.location.pathname.split("/"), pathnameParts = document.location.pathname.split("/"),
lastPart = "", lastPart = "",
title = document.domain; title = document.domain;
$ul.append(H5AI.html.updateCrumbHtml(path)); $ul.append(H5AI.html.updateCrumbHtml(path));
$.each(pathnameParts, function (idx, part) { $.each(pathnameParts, function (idx, part) {
if (part !== "") { if (part !== "") {
pathname += part + "/"; pathname += part + "/";
$ul.append(H5AI.html.updateCrumbHtml(H5AI.connector.getPath(pathname))); $ul.append(H5AI.html.updateCrumbHtml(H5AI.connector.getPath(pathname)));
lastPart = part + " - "; lastPart = part + " - ";
title += " > " + part; title += " > " + part;
} }
}); });
document.title = H5AI.util.checkedDecodeUri(lastPart + title); document.title = H5AI.util.checkedDecodeUri(lastPart + title);
}, },
initExtendedView = function () { initExtendedView = function () {
var $ul, $li; var $ul, $li;
$ul = $("<ul/>"); $ul = $("<ul/>");
$li = $("<li class='header' />") $li = $("<li class='header' />")
.appendTo($ul) .appendTo($ul)
.append($("<a class='icon'></a>")) .append($("<a class='icon'></a>"))
.append($("<a class='label' href='#'><span class='l10n-name'></span></a>")) .append($("<a class='label' href='#'><span class='l10n-name'></span></a>"))
.append($("<a class='date' href='#'><span class='l10n-lastModified'></span></a>")) .append($("<a class='date' href='#'><span class='l10n-lastModified'></span></a>"))
.append($("<a class='size' href='#'><span class='l10n-size'></span></a>")); .append($("<a class='size' href='#'><span class='l10n-size'></span></a>"));
// entries // entries
$("#table td").closest("tr").each(function () { $("#table td").closest("tr").each(function () {
var path = H5AI.connector.getPath(document.location.pathname, this); var path = H5AI.connector.getPath(document.location.pathname, this);
$ul.append(H5AI.html.updateExtendedHtml(path)); $ul.append(H5AI.html.updateExtendedHtml(path));
}); });
$("#extended").append($ul); $("#extended").append($ul);
// empty // empty
if ($ul.children(".entry:not(.folder-parent)").size() === 0) { if ($ul.children(".entry:not(.folder-parent)").size() === 0) {
$("#extended").append($("<div class='empty l10n-empty'>empty</div>")); $("#extended").append($("<div class='empty l10n-empty'>empty</div>"));
} }
}, },
customize = function () { customize = function () {
$.ajax({ $.ajax({
url: H5AI.core.settings.customHeader, url: H5AI.core.settings.customHeader,
dataType: "html", dataType: "html",
success: function (data) { success: function (data) {
$("#content > header").append($(data)).show(); $("#content > header").append($(data)).show();
} }
}); });
$.ajax({ $.ajax({
url: H5AI.core.settings.customFooter, url: H5AI.core.settings.customFooter,
dataType: "html", dataType: "html",
success: function (data) { success: function (data) {
$("#content > footer").prepend($(data)).show(); $("#content > footer").prepend($(data)).show();
} }
}); });
}, },
fetchPath = function (pathname, callback) { fetchPath = function (pathname, callback) {
H5AI.connector.fetchStatusAndContent(pathname, false, function (status, content) { H5AI.connector.fetchStatusAndContent(pathname, false, function (status, content) {
var path = H5AI.connector.getPath(pathname); var path = H5AI.connector.getPath(pathname);
path.status = status; path.status = status;
path.content = content; path.content = content;
callback(path); callback(path);
}); });
}, },
fetchTree = function (pathname, callback, childPath) { fetchTree = function (pathname, callback, childPath) {
fetchPath(pathname, function (path) { fetchPath(pathname, function (path) {
var parent = H5AI.util.splitPath(pathname).parent; var parent = H5AI.util.splitPath(pathname).parent;
path.treeOpen = true; path.treeOpen = true;
if (childPath) { if (childPath) {
path.content[childPath.absHref] = childPath; path.content[childPath.absHref] = childPath;
} }
if (parent === null) { if (parent === null) {
callback(path); callback(path);
} else { } else {
fetchTree(parent, callback, path); fetchTree(parent, callback, path);
} }
}); });
}, },
populateTree = function () { populateTree = function () {
fetchTree(document.location.pathname, function (path) { fetchTree(document.location.pathname, function (path) {
$("#tree") $("#tree")
.append(H5AI.html.updateTreeHtml(path)) .append(H5AI.html.updateTreeHtml(path))
.scrollpanel() .scrollpanel()
.show(); .show();
H5AI.core.shiftTree(false, true); H5AI.core.shiftTree(false, true);
H5AI.core.linkHoverStates(); H5AI.core.linkHoverStates();
setTimeout(function () { $("#tree").get(0).updateScrollbar(); }, 1); setTimeout(function () { $("#tree").get(0).updateScrollbar(); }, 1);
}); });
}, },
init = function () { init = function () {
initBreadcrumb(); initBreadcrumb();
initExtendedView(); initExtendedView();
customize(); customize();
H5AI.connector.updatePaths(); H5AI.connector.updatePaths();
if (H5AI.core.settings.showTree) { if (H5AI.core.settings.showTree) {
populateTree(); populateTree();
} }
}; };
return { return {
init: init init: init
}; };
}()); }());
}(document, jQuery, H5AI)); }(document, jQuery, H5AI));

View File

@@ -1,264 +1,264 @@
(function ($, H5AI) { (function ($, H5AI) {
H5AI.html = (function () { H5AI.html = (function () {
var thumbTypes = ["bmp", "gif", "ico", "image", "jpg", "png", "tiff"], var thumbTypes = ["bmp", "gif", "ico", "image", "jpg", "png", "tiff"],
onClick = function (path, context) { onClick = function (path, context) {
}, },
updateCrumbHtml = function (path) { updateCrumbHtml = function (path) {
var $html, $a; var $html, $a;
if (path.html.$crumb && path.html.$crumb.data("status") === path.status) { if (path.html.$crumb && path.html.$crumb.data("status") === path.status) {
return path.html.$crumb; return path.html.$crumb;
} }
$html = $("<li class='crumb'><a><img alt='>' /><span></span></a></li>") $html = $("<li class='crumb'><a><img alt='>' /><span></span></a></li>")
.addClass(path.isFolder ? "folder" : "file"); .addClass(path.isFolder ? "folder" : "file");
if (path.status) { if (path.status) {
$html.data("status", path.status); $html.data("status", path.status);
} }
$a = $html.find("a") $a = $html.find("a")
.attr("href", path.absHref) .attr("href", path.absHref)
.click(function() { onClick(path, "crumb"); }) .click(function() { onClick(path, "crumb"); })
.find("img").attr("src", H5AI.core.image("crumb")).end() .find("img").attr("src", H5AI.core.image("crumb")).end()
.find("span").text(path.label).end(); .find("span").text(path.label).end();
if (path.isDomain) { if (path.isDomain) {
$html.addClass("domain"); $html.addClass("domain");
$a.find("img").attr("src", H5AI.core.image("home")); $a.find("img").attr("src", H5AI.core.image("home"));
} }
if (path.isCurrentFolder) { if (path.isCurrentFolder) {
$html.addClass("current"); $html.addClass("current");
} }
if (!isNaN(path.status)) { if (!isNaN(path.status)) {
if (path.status === 200) { if (path.status === 200) {
$a.append($("<img class='hint' src='" + H5AI.core.image("page") + "' alt='not listable' />")); $a.append($("<img class='hint' src='" + H5AI.core.image("page") + "' alt='not listable' />"));
} else { } else {
$a.append($("<span class='hint'>(" + path.status + ")</span>")); $a.append($("<span class='hint'>(" + path.status + ")</span>"));
} }
} }
if (path.html.$crumb) { if (path.html.$crumb) {
path.html.$crumb.replaceWith($html); path.html.$crumb.replaceWith($html);
} }
path.html.$crumb = $html; path.html.$crumb = $html;
return $html; return $html;
}, },
updateExtendedHtml = function (path) { updateExtendedHtml = function (path) {
var $html, $a, $label, var $html, $a, $label,
formattedDate = path.date ? path.date.toString(H5AI.core.settings.dateFormat) : "", formattedDate = path.date ? path.date.toString(H5AI.core.settings.dateFormat) : "",
imgClass = "", imgClass = "",
icon16 = H5AI.core.icon(path.type), icon16 = H5AI.core.icon(path.type),
icon48 = H5AI.core.icon(path.type, true); icon48 = H5AI.core.icon(path.type, true);
if (path.html.$extended && path.html.$extended.data("status") === path.status) { if (path.html.$extended && path.html.$extended.data("status") === path.status) {
return path.html.$extended; return path.html.$extended;
} }
$html = $("<li class='entry' />") $html = $("<li class='entry' />")
.data("path", path) .data("path", path)
.addClass(path.isFolder ? "folder" : "file"); .addClass(path.isFolder ? "folder" : "file");
if (path.status) { if (path.status) {
$html.data("status", path.status); $html.data("status", path.status);
} }
if (H5AI.core.settings.showThumbs === true && $.inArray(path.type, thumbTypes) >= 0) { if (H5AI.core.settings.showThumbs === true && $.inArray(path.type, thumbTypes) >= 0) {
imgClass = "class='thumb'"; imgClass = "class='thumb'";
icon16 = H5AI.core.api() + "?action=thumb&href=" + path.absHref + "&width=16&height=16&mode=square"; icon16 = H5AI.core.api() + "?action=thumb&href=" + path.absHref + "&width=16&height=16&mode=square";
icon48 = H5AI.core.api() + "?action=thumb&href=" + path.absHref + "&width=96&height=46&mode=rational"; icon48 = H5AI.core.api() + "?action=thumb&href=" + path.absHref + "&width=96&height=46&mode=rational";
} }
$label = $("<span class='label'>" + path.label + "</span>"); $label = $("<span class='label'>" + path.label + "</span>");
$a = $("<a />") $a = $("<a />")
.attr("href", path.absHref) .attr("href", path.absHref)
.click(function() { onClick(path, "extended"); }) .click(function() { onClick(path, "extended"); })
.appendTo($html) .appendTo($html)
.append($("<span class='icon small'><img " + imgClass + " src='" + icon16 + "' alt='" + path.type + "' /></span>")) .append($("<span class='icon small'><img " + imgClass + " src='" + icon16 + "' alt='" + path.type + "' /></span>"))
.append($("<span class='icon big'><img " + imgClass + " src='" + icon48 + "' alt='" + path.type + "' /></span>")) .append($("<span class='icon big'><img " + imgClass + " src='" + icon48 + "' alt='" + path.type + "' /></span>"))
.append($label) .append($label)
.append($("<span class='date' data-time='" + path.time + "'></span>")) .append($("<span class='date' data-time='" + path.time + "'></span>"))
.append($("<span class='size' data-bytes='" + path.size + "'></span>")); .append($("<span class='size' data-bytes='" + path.size + "'></span>"));
$a.hover( $a.hover(
function () { function () {
if ($("#extended").hasClass("icons-view")) { if ($("#extended").hasClass("icons-view")) {
var $this = $(this); var $this = $(this);
$(".status.default").hide(); $(".status.default").hide();
$(".status.dynamic") $(".status.dynamic")
.empty() .empty()
.append($this.find(".label").clone()) .append($this.find(".label").clone())
.append($("<span class='sep'>·</span>")) .append($("<span class='sep'>·</span>"))
.append($this.find(".date").clone()) .append($this.find(".date").clone())
.show(); .show();
if (!$this.closest(".entry").hasClass("folder")) { if (!$this.closest(".entry").hasClass("folder")) {
$(".status.dynamic") $(".status.dynamic")
.append($("<span class='sep'>·</span>")) .append($("<span class='sep'>·</span>"))
.append($this.find(".size").clone()); .append($this.find(".size").clone());
} }
} }
}, },
function () { function () {
$(".status.default").show(); $(".status.default").show();
$(".status.dynamic").empty().hide(); $(".status.dynamic").empty().hide();
} }
); );
if (path.isParentFolder) { if (path.isParentFolder) {
if (!H5AI.core.settings.setParentFolderLabels) { if (!H5AI.core.settings.setParentFolderLabels) {
$label.addClass("l10n-parentDirectory"); $label.addClass("l10n-parentDirectory");
} }
$html.addClass("folder-parent"); $html.addClass("folder-parent");
} }
if (!isNaN(path.status)) { if (!isNaN(path.status)) {
if (path.status === 200) { if (path.status === 200) {
$html.addClass("page"); $html.addClass("page");
$a.find(".icon.small img").attr("src", H5AI.core.icon("folder-page")); $a.find(".icon.small img").attr("src", H5AI.core.icon("folder-page"));
$a.find(".icon.big img").attr("src", H5AI.core.icon("folder-page", true)); $a.find(".icon.big img").attr("src", H5AI.core.icon("folder-page", true));
} else { } else {
$html.addClass("error"); $html.addClass("error");
$label.append($("<span class='hint'> " + path.status + " </span>")); $label.append($("<span class='hint'> " + path.status + " </span>"));
} }
} }
if (path.html.$extended) { if (path.html.$extended) {
path.html.$extended.replaceWith($html); path.html.$extended.replaceWith($html);
H5AI.core.formatDates(); H5AI.core.formatDates();
} }
path.html.$extended = $html; path.html.$extended = $html;
return $html; return $html;
}, },
updateTreeHtml = function (path) { updateTreeHtml = function (path) {
var $html, $blank, $a, $indicator, $ul, idx; var $html, $blank, $a, $indicator, $ul, idx;
$html = $("<div class='entry' />") $html = $("<div class='entry' />")
.data("path", path) .data("path", path)
.addClass(path.isFolder ? "folder" : "file"); .addClass(path.isFolder ? "folder" : "file");
$blank = $("<span class='blank' />").appendTo($html); $blank = $("<span class='blank' />").appendTo($html);
$a = $("<a />") $a = $("<a />")
.attr("href", path.absHref) .attr("href", path.absHref)
.click(function() { onClick(path, "tree"); }) .click(function() { onClick(path, "tree"); })
.appendTo($html) .appendTo($html)
.append($("<span class='icon'><img src='" + H5AI.core.icon(path.type) + "' /></span>")) .append($("<span class='icon'><img src='" + H5AI.core.icon(path.type) + "' /></span>"))
.append($("<span class='label'>" + path.label + "</span>")); .append($("<span class='label'>" + path.label + "</span>"));
if (path.isFolder) { if (path.isFolder) {
// indicator // indicator
if (path.status === undefined || !path.isEmpty()) { if (path.status === undefined || !path.isEmpty()) {
$indicator = $("<span class='indicator initiated'><img src='" + H5AI.core.image("tree") + "' /></span>") $indicator = $("<span class='indicator initiated'><img src='" + H5AI.core.image("tree") + "' /></span>")
.click(function (event) { .click(function (event) {
var $entry = $indicator.closest(".entry"); // $html var $entry = $indicator.closest(".entry"); // $html
if ($indicator.hasClass("unknown")) { if ($indicator.hasClass("unknown")) {
H5AI.connector.fetchStatusAndContent(path.absHref, false, function (status, content) { H5AI.connector.fetchStatusAndContent(path.absHref, false, function (status, content) {
path.status = status; path.status = status;
path.content = content; path.content = content;
path.treeOpen = true; path.treeOpen = true;
$("#tree").get(0).updateScrollbar(true); $("#tree").get(0).updateScrollbar(true);
updateTreeHtml(path); updateTreeHtml(path);
$("#tree").get(0).updateScrollbar(); $("#tree").get(0).updateScrollbar();
}); });
} else if ($indicator.hasClass("open")) { } else if ($indicator.hasClass("open")) {
path.treeOpen = false; path.treeOpen = false;
$indicator.removeClass("open"); $indicator.removeClass("open");
$("#tree").get(0).updateScrollbar(true); $("#tree").get(0).updateScrollbar(true);
$entry.find("> ul.content").slideUp(function() { $entry.find("> ul.content").slideUp(function() {
$("#tree").get(0).updateScrollbar(); $("#tree").get(0).updateScrollbar();
}); });
} else { } else {
path.treeOpen = true; path.treeOpen = true;
$indicator.addClass("open"); $indicator.addClass("open");
$("#tree").get(0).updateScrollbar(true); $("#tree").get(0).updateScrollbar(true);
$entry.find("> ul.content").slideDown(function() { $entry.find("> ul.content").slideDown(function() {
$("#tree").get(0).updateScrollbar(); $("#tree").get(0).updateScrollbar();
}); });
} }
}); });
if (path.status === undefined) { if (path.status === undefined) {
$indicator.addClass("unknown"); $indicator.addClass("unknown");
} else if (path.treeOpen) { } else if (path.treeOpen) {
$indicator.addClass("open"); $indicator.addClass("open");
} }
$blank.replaceWith($indicator); $blank.replaceWith($indicator);
} }
// is path the domain? // is path the domain?
if (path.isDomain) { if (path.isDomain) {
$html.addClass("domain"); $html.addClass("domain");
$a.find(".icon img").attr("src", H5AI.core.icon("folder-home")); $a.find(".icon img").attr("src", H5AI.core.icon("folder-home"));
} }
// is path the current folder? // is path the current folder?
if (path.isCurrentFolder) { if (path.isCurrentFolder) {
$html.addClass("current"); $html.addClass("current");
$a.find(".icon img").attr("src", H5AI.core.icon("folder-open")); $a.find(".icon img").attr("src", H5AI.core.icon("folder-open"));
} }
// does it have subfolders? // does it have subfolders?
if (!path.isEmpty()) { if (!path.isEmpty()) {
$ul = $("<ul class='content' />").appendTo($html); $ul = $("<ul class='content' />").appendTo($html);
$.each(path.content, function (idx, entry) { $.each(path.content, function (idx, entry) {
$("<li />").append(updateTreeHtml(entry)).appendTo($ul); $("<li />").append(updateTreeHtml(entry)).appendTo($ul);
}); });
if (path.status === undefined || !path.treeOpen) { if (path.status === undefined || !path.treeOpen) {
$ul.hide(); $ul.hide();
} }
} }
// reflect folder status // reflect folder status
if (!isNaN(path.status)) { if (!isNaN(path.status)) {
if (path.status === 200) { if (path.status === 200) {
$a.find(".icon img").attr("src", H5AI.core.icon("folder-page")); $a.find(".icon img").attr("src", H5AI.core.icon("folder-page"));
$a.append($("<span class='hint'><img src='" + H5AI.core.image("page") + "' /></span>")); $a.append($("<span class='hint'><img src='" + H5AI.core.image("page") + "' /></span>"));
} else { } else {
$html.addClass("error"); $html.addClass("error");
$a.append($("<span class='hint'>" + path.status + "</span>")); $a.append($("<span class='hint'>" + path.status + "</span>"));
} }
} }
} }
if (path.html.$tree) { if (path.html.$tree) {
path.html.$tree.replaceWith($html); path.html.$tree.replaceWith($html);
} }
path.html.$tree = $html; path.html.$tree = $html;
return $html; return $html;
}, },
updateHtml = function (path) { updateHtml = function (path) {
updateCrumbHtml(path); updateCrumbHtml(path);
updateExtendedHtml(path); updateExtendedHtml(path);
updateTreeHtml(path); updateTreeHtml(path);
}; };
return { return {
updateCrumbHtml: updateCrumbHtml, updateCrumbHtml: updateCrumbHtml,
updateExtendedHtml: updateExtendedHtml, updateExtendedHtml: updateExtendedHtml,
updateTreeHtml: updateTreeHtml, updateTreeHtml: updateTreeHtml,
updateHtml: updateHtml updateHtml: updateHtml
}; };
}()); }());
}(jQuery, H5AI)); }(jQuery, H5AI));

View File

@@ -1,95 +1,95 @@
(function (document, $, H5AI) { (function (document, $, H5AI) {
H5AI.Path = function (folder, tableRow) { H5AI.Path = function (folder, tableRow) {
var path = {}, var path = {},
$tds, $a, date, size, splits; $tds, $a, date, size, splits;
// path.parentFolder: undefined // path.parentFolder: undefined
// path.label: undefined // path.label: undefined
// path.type: undefined // path.type: undefined
// path.href: undefined // path.href: undefined
// path.time: undefined // path.time: undefined
// path.size: undefined // path.size: undefined
// path.absHref: undefined // path.absHref: undefined
// path.isFolder: undefined // path.isFolder: undefined
// path.isParentFolder: undefined // path.isParentFolder: undefined
// path.isCurrentFolder: undefined // path.isCurrentFolder: undefined
// path.isDomain: undefined // path.isDomain: undefined
path.status = undefined; // undefined, "h5ai" or HTTP response code path.status = undefined; // undefined, "h5ai" or HTTP response code
path.content = undefined; // associative array path.absHref -> path path.content = undefined; // associative array path.absHref -> path
path.html = { path.html = {
$crumb: undefined, $crumb: undefined,
$extended: undefined, $extended: undefined,
$tree: undefined $tree: undefined
}; };
path.treeOpen = false; path.treeOpen = false;
if (!H5AI.util.pathEndsWithSlash(folder)) { if (!H5AI.util.pathEndsWithSlash(folder)) {
folder += "/"; folder += "/";
} }
if (tableRow) { if (tableRow) {
$tds = $(tableRow).find("td"); $tds = $(tableRow).find("td");
$a = $tds.eq(1).find("a"); $a = $tds.eq(1).find("a");
date = Date.parse($tds.eq(2).text()); date = Date.parse($tds.eq(2).text());
size = H5AI.util.parseSize($tds.eq(3).text()); size = H5AI.util.parseSize($tds.eq(3).text());
path.parentFolder = folder; path.parentFolder = folder;
path.label = $a.text(); path.label = $a.text();
path.type = $tds.eq(0).find("img").attr("alt") === "[DIR]" ? "folder" : H5AI.core.getFileType(path.label); path.type = $tds.eq(0).find("img").attr("alt") === "[DIR]" ? "folder" : H5AI.core.getFileType(path.label);
path.href = $a.attr("href"); path.href = $a.attr("href");
path.time = date ? date.getTime() : 0; path.time = date ? date.getTime() : 0;
path.size = size; path.size = size;
} else { } else {
splits = H5AI.util.splitPath(folder); splits = H5AI.util.splitPath(folder);
path.parentFolder = splits.parent || ""; path.parentFolder = splits.parent || "";
path.label = H5AI.util.checkedDecodeUri(splits.name); path.label = H5AI.util.checkedDecodeUri(splits.name);
if (path.label === "/") { if (path.label === "/") {
path.label = H5AI.util.checkedDecodeUri(document.domain); path.label = H5AI.util.checkedDecodeUri(document.domain);
} }
path.type = "folder"; path.type = "folder";
path.href = splits.name; path.href = splits.name;
path.time = 0; path.time = 0;
path.size = -1; path.size = -1;
} }
if (H5AI.util.pathEndsWithSlash(path.label)) { if (H5AI.util.pathEndsWithSlash(path.label)) {
path.label = path.label.slice(0, -1); path.label = path.label.slice(0, -1);
} }
path.isFolder = (path.type === "folder"); path.isFolder = (path.type === "folder");
path.isParentFolder = (path.label === "Parent Directory"); path.isParentFolder = (path.label === "Parent Directory");
if (path.isParentFolder) { if (path.isParentFolder) {
path.isFolder = true; path.isFolder = true;
path.type = "folder-parent"; path.type = "folder-parent";
} }
path.absHref = path.isParentFolder ? path.href : path.parentFolder + path.href; path.absHref = path.isParentFolder ? path.href : path.parentFolder + path.href;
path.isCurrentFolder = (path.absHref === document.location.pathname); path.isCurrentFolder = (path.absHref === document.location.pathname);
path.isDomain = (path.absHref === "/"); path.isDomain = (path.absHref === "/");
if (path.isParentFolder && H5AI.core.settings.setParentFolderLabels) { if (path.isParentFolder && H5AI.core.settings.setParentFolderLabels) {
if (path.isDomain) { if (path.isDomain) {
path.label = H5AI.util.checkedDecodeUri(document.domain); path.label = H5AI.util.checkedDecodeUri(document.domain);
} else { } else {
splits = H5AI.util.splitPath(path.parentFolder); splits = H5AI.util.splitPath(path.parentFolder);
path.label = H5AI.util.checkedDecodeUri(splits.parentname); path.label = H5AI.util.checkedDecodeUri(splits.parentname);
} }
} }
path.isEmpty = function () { path.isEmpty = function () {
return !path.content || $.isEmptyObject(path.content); return !path.content || $.isEmptyObject(path.content);
}; };
path.onClick = function (context) { path.onClick = function (context) {
H5AI.core.triggerPathClick(path, context); H5AI.core.triggerPathClick(path, context);
}; };
return path; return path;
}; };
}(document, jQuery, H5AI)); }(document, jQuery, H5AI));

View File

@@ -1,157 +1,157 @@
(function ($, H5AI) { (function ($, H5AI) {
H5AI.sort = (function () { H5AI.sort = (function () {
var type = function (entry) { var type = function (entry) {
var $entry = $(entry); var $entry = $(entry);
if ($entry.hasClass("folder-parent")) { if ($entry.hasClass("folder-parent")) {
return 0; return 0;
} else if ($entry.hasClass("folder")) { } else if ($entry.hasClass("folder")) {
return 1; return 1;
} }
return 2; return 2;
}, },
cmp = function (entry1, entry2, rev, getVal) { cmp = function (entry1, entry2, rev, getVal) {
var res, val1, val2; var res, val1, val2;
res = type(entry1) - type(entry2); res = type(entry1) - type(entry2);
if (res !== 0) { if (res !== 0) {
return res; return res;
} }
val1 = getVal(entry1); val1 = getVal(entry1);
val2 = getVal(entry2); val2 = getVal(entry2);
if (val1 < val2) { if (val1 < val2) {
return rev ? 1 : -1; return rev ? 1 : -1;
} else if (val1 > val2) { } else if (val1 > val2) {
return rev ? -1 : 1; return rev ? -1 : 1;
} }
return 0; return 0;
}, },
cmpName = function (entry1, entry2) { cmpName = function (entry1, entry2) {
return cmp(entry1, entry2, false, function (entry) { return cmp(entry1, entry2, false, function (entry) {
return $(entry).find(".label").text().toLowerCase(); return $(entry).find(".label").text().toLowerCase();
}); });
}, },
cmpTime = function (entry1, entry2) { cmpTime = function (entry1, entry2) {
return cmp(entry1, entry2, false, function (entry) { return cmp(entry1, entry2, false, function (entry) {
return $(entry).find(".date").data("time"); return $(entry).find(".date").data("time");
}); });
}, },
cmpSize = function (entry1, entry2) { cmpSize = function (entry1, entry2) {
return cmp(entry1, entry2, false, function (entry) { return cmp(entry1, entry2, false, function (entry) {
return $(entry).find(".size").data("bytes"); return $(entry).find(".size").data("bytes");
}); });
}, },
cmpNameRev = function (entry1, entry2) { cmpNameRev = function (entry1, entry2) {
return cmp(entry1, entry2, true, function (entry) { return cmp(entry1, entry2, true, function (entry) {
return $(entry).find(".label").text().toLowerCase(); return $(entry).find(".label").text().toLowerCase();
}); });
}, },
cmpTimeRev = function (entry1, entry2) { cmpTimeRev = function (entry1, entry2) {
return cmp(entry1, entry2, true, function (entry) { return cmp(entry1, entry2, true, function (entry) {
return $(entry).find(".date").data("time"); return $(entry).find(".date").data("time");
}); });
}, },
cmpSizeRev = function (entry1, entry2) { cmpSizeRev = function (entry1, entry2) {
return cmp(entry1, entry2, true, function (entry) { return cmp(entry1, entry2, true, function (entry) {
return $(entry).find(".size").data("bytes"); return $(entry).find(".size").data("bytes");
}); });
}, },
sort = function (fn) { sort = function (fn) {
$("#extended .entry").detach().sort(fn).appendTo($("#extended > ul")); $("#extended .entry").detach().sort(fn).appendTo($("#extended > ul"));
}, },
$all, orders, $all, orders,
sortBy = function (id) { sortBy = function (id) {
var order = orders[id]; var order = orders[id];
$all.removeClass("ascending").removeClass("descending"); $all.removeClass("ascending").removeClass("descending");
order.head.addClass(order.clas).attr("href", "#!/sort=" + id); order.head.addClass(order.clas).attr("href", "#!/sort=" + id);
sort(order.fn); sort(order.fn);
}, },
init = function () { init = function () {
var $ascending = $("<img src='" + H5AI.core.image("ascending") + "' class='sort ascending' alt='ascending' />"), var $ascending = $("<img src='" + H5AI.core.image("ascending") + "' class='sort ascending' alt='ascending' />"),
$descending = $("<img src='" + H5AI.core.image("descending") + "' class='sort descending' alt='descending' />"), $descending = $("<img src='" + H5AI.core.image("descending") + "' class='sort descending' alt='descending' />"),
initialOrder = /^.*#!.*\/sort=(.*?)(?:\/.*)?$/.exec(document.location), initialOrder = /^.*#!.*\/sort=(.*?)(?:\/.*)?$/.exec(document.location),
$header = $("#extended li.header"), $header = $("#extended li.header"),
$label = $header.find("a.label"), $label = $header.find("a.label"),
$date = $header.find("a.date"), $date = $header.find("a.date"),
$size = $header.find("a.size"); $size = $header.find("a.size");
$all = $header.find("a.label,a.date,a.size"); $all = $header.find("a.label,a.date,a.size");
orders = { orders = {
na: { na: {
head: $label, head: $label,
clas: "ascending", clas: "ascending",
fn: cmpName fn: cmpName
}, },
nd: { nd: {
head: $label, head: $label,
clas: "descending", clas: "descending",
fn: cmpNameRev fn: cmpNameRev
}, },
da: { da: {
head: $date, head: $date,
clas: "ascending", clas: "ascending",
fn: cmpTime fn: cmpTime
}, },
dd: { dd: {
head: $date, head: $date,
clas: "descending", clas: "descending",
fn: cmpTimeRev fn: cmpTimeRev
}, },
sa: { sa: {
head: $size, head: $size,
clas: "ascending", clas: "ascending",
fn: cmpSize fn: cmpSize
}, },
sd: { sd: {
head: $size, head: $size,
clas: "descending", clas: "descending",
fn: cmpSizeRev fn: cmpSizeRev
} }
}; };
sortBy(initialOrder ? initialOrder[1] : H5AI.core.settings.sortorder); sortBy(initialOrder ? initialOrder[1] : H5AI.core.settings.sortorder);
$label $label
.attr("href", "#!/sort=na") .attr("href", "#!/sort=na")
.append($ascending.clone()).append($descending.clone()) .append($ascending.clone()).append($descending.clone())
.click(function () { .click(function () {
sortBy("n" + ($label.hasClass("ascending") ? "d" : "a")); sortBy("n" + ($label.hasClass("ascending") ? "d" : "a"));
}); });
$date $date
.attr("href", "#!/sort=da") .attr("href", "#!/sort=da")
.prepend($ascending.clone()).prepend($descending.clone()) .prepend($ascending.clone()).prepend($descending.clone())
.click(function () { .click(function () {
sortBy("d" + ($date.hasClass("ascending") ? "d" : "a")); sortBy("d" + ($date.hasClass("ascending") ? "d" : "a"));
}); });
$size $size
.attr("href", "#!/sort=sa") .attr("href", "#!/sort=sa")
.prepend($ascending.clone()).prepend($descending.clone()) .prepend($ascending.clone()).prepend($descending.clone())
.click(function () { .click(function () {
sortBy("s" + ($size.hasClass("ascending") ? "d" : "a")); sortBy("s" + ($size.hasClass("ascending") ? "d" : "a"));
}); });
}; };
return { return {
init: init init: init
}; };
}()); }());
}(jQuery, H5AI)); }(jQuery, H5AI));

View File

@@ -1,115 +1,115 @@
(function ($, H5AI) { (function ($, H5AI) {
H5AI.util = (function () { H5AI.util = (function () {
var reSplitPath = /^\/([^\/]+\/?)$/, var reSplitPath = /^\/([^\/]+\/?)$/,
reSplitPath2 = /^(\/(?:.*\/)*?([^\/]+)\/)([^\/]+\/?)$/, reSplitPath2 = /^(\/(?:.*\/)*?([^\/]+)\/)([^\/]+\/?)$/,
splitPath = function (pathname) { splitPath = function (pathname) {
var match; var match;
if (pathname === "/") { if (pathname === "/") {
return { return {
parent: null, parent: null,
parentname: null, parentname: null,
name: "/" name: "/"
}; };
} }
match = reSplitPath2.exec(pathname); match = reSplitPath2.exec(pathname);
if (match) { if (match) {
return { return {
parent: match[1], parent: match[1],
parentname: match[2], parentname: match[2],
name: match[3] name: match[3]
}; };
} }
match = reSplitPath.exec(pathname); match = reSplitPath.exec(pathname);
if (match) { if (match) {
return { return {
parent: "/", parent: "/",
parentname: "/", parentname: "/",
name: match[1] name: match[1]
}; };
} }
}, },
rePathEndsWithSlash = /\/$/, rePathEndsWithSlash = /\/$/,
pathEndsWithSlash = function (pathname) { pathEndsWithSlash = function (pathname) {
return rePathEndsWithSlash.test(pathname); return rePathEndsWithSlash.test(pathname);
}, },
getAbsHref = function (folder, tableRow) { getAbsHref = function (folder, tableRow) {
var $a, isParentFolder, href; var $a, isParentFolder, href;
if (!pathEndsWithSlash(folder)) { if (!pathEndsWithSlash(folder)) {
folder += "/"; folder += "/";
} }
if (!tableRow) { if (!tableRow) {
return folder; return folder;
} }
$a = $(tableRow).find("td").eq(1).find("a"); $a = $(tableRow).find("td").eq(1).find("a");
isParentFolder = ($a.text() === "Parent Directory"); isParentFolder = ($a.text() === "Parent Directory");
href = $a.attr("href"); href = $a.attr("href");
return isParentFolder ? undefined : folder + href; return isParentFolder ? undefined : folder + href;
}, },
kilo = 1000.0, kilo = 1000.0,
reParseSize = /^\s*([\.\d]+)\s*([kmg]?)b?\s*$/i, reParseSize = /^\s*([\.\d]+)\s*([kmg]?)b?\s*$/i,
parseSize = function (str) { parseSize = function (str) {
var match = reParseSize.exec(str), var match = reParseSize.exec(str),
val, unit; val, unit;
if (!match) { if (!match) {
return -1; return -1;
} }
val = parseFloat(match[1]); val = parseFloat(match[1]);
unit = match[2].toLowerCase(); unit = match[2].toLowerCase();
if (unit === "k") { if (unit === "k") {
val *= kilo; val *= kilo;
} else if (unit === "m") { } else if (unit === "m") {
val *= kilo * kilo; val *= kilo * kilo;
} else if (unit === "g") { } else if (unit === "g") {
val *= kilo * kilo * kilo; val *= kilo * kilo * kilo;
} else if (unit === "t") { } else if (unit === "t") {
val *= kilo * kilo * kilo * kilo; val *= kilo * kilo * kilo * kilo;
} }
return val; return val;
}, },
sizeUnits = ["B", "KB", "MB", "GB", "TB"], sizeUnits = ["B", "KB", "MB", "GB", "TB"],
formatSize = function (size) { formatSize = function (size) {
var th = 1000.0, var th = 1000.0,
i = 0, i = 0,
maxI = sizeUnits.length - 1; maxI = sizeUnits.length - 1;
if (isNaN(size)) { if (isNaN(size)) {
return size; return size;
} }
while (size >= th && i < maxI) { while (size >= th && i < maxI) {
size /= kilo; size /= kilo;
i += 1; i += 1;
} }
return (i <= 1 ? Math.round(size) : size.toFixed(1)).toString() + " " + sizeUnits[i]; return (i <= 1 ? Math.round(size) : size.toFixed(1)).toString() + " " + sizeUnits[i];
}, },
checkedDecodeUri = function (uri) { checkedDecodeUri = function (uri) {
try { try {
return decodeURI(uri); return decodeURI(uri);
} catch (err) {} } catch (err) {}
return uri; return uri;
}; };
return { return {
splitPath: splitPath, splitPath: splitPath,
pathEndsWithSlash: pathEndsWithSlash, pathEndsWithSlash: pathEndsWithSlash,
getAbsHref: getAbsHref, getAbsHref: getAbsHref,
parseSize: parseSize, parseSize: parseSize,
formatSize: formatSize, formatSize: formatSize,
checkedDecodeUri: checkedDecodeUri checkedDecodeUri: checkedDecodeUri
}; };
}()); }());
}(jQuery, H5AI)); }(jQuery, H5AI));

View File

@@ -1,110 +1,110 @@
(function ($, H5AI) { (function ($, H5AI) {
H5AI.zippedDownload = (function () { H5AI.zippedDownload = (function () {
var x = 0, var x = 0,
y = 0, y = 0,
$document = $(document), $document = $(document),
$selectionRect = $("#selection-rect"), $selectionRect = $("#selection-rect"),
updateDownloadBtn = function () { updateDownloadBtn = function () {
var $selected = $("#extended a.selected"), var $selected = $("#extended a.selected"),
$downloadBtn = $("#download"), $downloadBtn = $("#download"),
query, href; query, href;
if ($selected.size() > 0) { if ($selected.size() > 0) {
$selected.each(function () { $selected.each(function () {
href = $(this).attr("href"); href = $(this).attr("href");
query = query ? query + ":" + href : href; query = query ? query + ":" + href : href;
}); });
query = H5AI.core.api() + "?action=zip&hrefs=" + query; query = H5AI.core.api() + "?action=zip&hrefs=" + query;
$downloadBtn.show().find("a").attr("href", query); $downloadBtn.show().find("a").attr("href", query);
} else { } else {
$downloadBtn.hide().find("a").attr("href", "#"); $downloadBtn.hide().find("a").attr("href", "#");
} }
}, },
selectionUpdate = function (event) { selectionUpdate = function (event) {
var l = Math.min(x, event.pageX), var l = Math.min(x, event.pageX),
t = Math.min(y, event.pageY), t = Math.min(y, event.pageY),
w = Math.abs(x - event.pageX), w = Math.abs(x - event.pageX),
h = Math.abs(y - event.pageY), h = Math.abs(y - event.pageY),
selRect; selRect;
event.preventDefault(); event.preventDefault();
$selectionRect.css({left: l, top: t, width: w, height: h}); $selectionRect.css({left: l, top: t, width: w, height: h});
selRect = $selectionRect.fracs("rect"); selRect = $selectionRect.fracs("rect");
$("#extended a").removeClass("selecting").each(function () { $("#extended a").removeClass("selecting").each(function () {
var $a = $(this), var $a = $(this),
rect = $a.fracs("rect"), rect = $a.fracs("rect"),
inter = selRect.intersection(rect); inter = selRect.intersection(rect);
if (inter && !$a.closest(".entry").hasClass("folder-parent")) { if (inter && !$a.closest(".entry").hasClass("folder-parent")) {
$a.addClass("selecting"); $a.addClass("selecting");
} }
}); });
}, },
selectionEnd = function (event) { selectionEnd = function (event) {
event.preventDefault(); event.preventDefault();
$document.off("mousemove", selectionUpdate); $document.off("mousemove", selectionUpdate);
$selectionRect.hide().css({left: 0, top: 0, width: 0, height: 0}); $selectionRect.hide().css({left: 0, top: 0, width: 0, height: 0});
$("#extended a.selecting.selected").removeClass("selecting").removeClass("selected"); $("#extended a.selecting.selected").removeClass("selecting").removeClass("selected");
$("#extended a.selecting").removeClass("selecting").addClass("selected"); $("#extended a.selecting").removeClass("selecting").addClass("selected");
updateDownloadBtn(); updateDownloadBtn();
}, },
selectionStart = function (event) { selectionStart = function (event) {
var view = $.fracs.viewport(); var view = $.fracs.viewport();
x = event.pageX; x = event.pageX;
y = event.pageY; y = event.pageY;
// only on left button and don't block the scrollbars // only on left button and don't block the scrollbars
if (event.button !== 0 || x >= view.right || y >= view.bottom) { if (event.button !== 0 || x >= view.right || y >= view.bottom) {
return; return;
} }
event.preventDefault(); event.preventDefault();
if (!event.ctrlKey) { if (!event.ctrlKey) {
$("#extended a").removeClass("selected"); $("#extended a").removeClass("selected");
updateDownloadBtn(); updateDownloadBtn();
} }
$selectionRect.show().css({left: x, top: y, width: 0, height: 0}); $selectionRect.show().css({left: x, top: y, width: 0, height: 0});
selectionUpdate(event); selectionUpdate(event);
$document $document
.on("mousemove", selectionUpdate) .on("mousemove", selectionUpdate)
.one("mouseup", selectionEnd); .one("mouseup", selectionEnd);
}, },
noSelection = function (event) { noSelection = function (event) {
event.stopPropagation(); event.stopPropagation();
return false; return false;
}, },
noSelectionUnlessCtrl = function (event) { noSelectionUnlessCtrl = function (event) {
if (!event.ctrlKey) { if (!event.ctrlKey) {
noSelection(event); noSelection(event);
} }
}, },
init = function () { init = function () {
if (H5AI.core.settings.zippedDownload) { if (H5AI.core.settings.zippedDownload) {
$("<li id='download'><a href='#'><img alt='download' /><span class='l10n-download'>download</span></a></li>") $("<li id='download'><a href='#'><img alt='download' /><span class='l10n-download'>download</span></a></li>")
.find("img").attr("src", H5AI.core.image("download")).end() .find("img").attr("src", H5AI.core.image("download")).end()
.appendTo($("#navbar")); .appendTo($("#navbar"));
$("body>nav,body>footer,#tree").on("mousedown", noSelection); $("body>nav,body>footer,#tree").on("mousedown", noSelection);
$("#extended").on("mousedown", "a", noSelectionUnlessCtrl); $("#extended").on("mousedown", "a", noSelectionUnlessCtrl);
$document.on("mousedown", selectionStart); $document.on("mousedown", selectionStart);
} }
}; };
return { return {
init: init init: init
}; };
}()); }());
}(jQuery, H5AI)); }(jQuery, H5AI));

View File

@@ -6,7 +6,7 @@
* Thanks to: Seamus Leahy for adding deltaX and deltaY * Thanks to: Seamus Leahy for adding deltaX and deltaY
* *
* Version: 3.0.5 * Version: 3.0.5
* *
* Requires: 1.2.2+ * Requires: 1.2.2+
*/ */
@@ -15,73 +15,70 @@
var types = ['DOMMouseScroll', 'mousewheel']; var types = ['DOMMouseScroll', 'mousewheel'];
if ($.event.fixHooks) { if ($.event.fixHooks) {
for ( var i=types.length; i; ) { for ( var i=types.length; i; ) {
$.event.fixHooks[ types[--i] ] = $.event.mouseHooks; $.event.fixHooks[ types[--i] ] = $.event.mouseHooks;
} }
} }
$.event.special.mousewheel = { $.event.special.mousewheel = {
setup: function() { setup: function() {
if ( this.addEventListener ) { if ( this.addEventListener ) {
for ( var i=types.length; i; ) { for ( var i=types.length; i; ) {
this.addEventListener( types[--i], handler, false ); this.addEventListener( types[--i], handler, false );
} }
} else { } else {
this.onmousewheel = handler; this.onmousewheel = handler;
} }
}, },
teardown: function() { teardown: function() {
if ( this.removeEventListener ) { if ( this.removeEventListener ) {
for ( var i=types.length; i; ) { for ( var i=types.length; i; ) {
this.removeEventListener( types[--i], handler, false ); this.removeEventListener( types[--i], handler, false );
} }
} else { } else {
this.onmousewheel = null; this.onmousewheel = null;
} }
} }
}; };
$.fn.extend({ $.fn.extend({
mousewheel: function(fn) { mousewheel: function(fn) {
return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
}, },
unmousewheel: function(fn) { unmousewheel: function(fn) {
return this.unbind("mousewheel", fn); return this.unbind("mousewheel", fn);
} }
}); });
function handler(event) { function handler(event) {
var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0; var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0;
event = $.event.fix(orgEvent); event = $.event.fix(orgEvent);
event.type = "mousewheel"; event.type = "mousewheel";
// Old school scrollwheel delta // Old school scrollwheel delta
if ( event.wheelDelta ) { delta = event.wheelDelta/120; } if ( event.wheelDelta ) { delta = event.wheelDelta/120; }
if ( event.detail ) { delta = -event.detail/3; } if ( event.detail ) { delta = -event.detail/3; }
// New school multidimensional scroll (touchpads) deltas // New school multidimensional scroll (touchpads) deltas
deltaY = delta; deltaY = delta;
// Gecko // Gecko
if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
deltaY = 0; deltaY = 0;
deltaX = -1*delta; deltaX = -1*delta;
} }
// Webkit // Webkit
if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; } if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; }
if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; } if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; }
// Add event and delta to the front of the arguments // Add event and delta to the front of the arguments
args.unshift(event, delta, deltaX, deltaY); args.unshift(event, delta, deltaX, deltaY);
return ($.event.dispatch || $.event.handle).apply(this, args); return ($.event.dispatch || $.event.handle).apply(this, args);
} }
})(jQuery); })(jQuery);

View File

@@ -2,156 +2,156 @@
* jQuery.scrollpanel * jQuery.scrollpanel
* author: Lars Jung * author: Lars Jung
* license: MIT * license: MIT
* *
* bad and ugly coded! * still quick and dirty!
*/ */
(function (window, $) { (function (window, $) {
"use strict"; "use strict";
var $window = $(window), var $window = $(window),
init = function (htmlElement) { init = function (htmlElement) {
var $element = $(htmlElement), var $element = $(htmlElement),
$scrollbar, $drag, $wrapper, $content, mouseOffsetY, updateId, $scrollbar, $drag, $wrapper, $content, mouseOffsetY, updateId,
update, scroll; update, scroll;
if (!$element.css("position") || $element.css("position") === "static") { if (!$element.css("position") || $element.css("position") === "static") {
$element.css("position", "relative"); $element.css("position", "relative");
} }
$scrollbar = $("<div class='scrollbar' />"); $scrollbar = $("<div class='scrollbar' />");
$drag = $("<div class='drag' />").appendTo($scrollbar); $drag = $("<div class='drag' />").appendTo($scrollbar);
$element $element
.wrapInner("<div class='wrapper'><div class='content' /></div>") .wrapInner("<div class='wrapper'><div class='content' /></div>")
.append($scrollbar); .append($scrollbar);
$wrapper = $element.find("> .wrapper"); $wrapper = $element.find("> .wrapper");
$content = $wrapper.find("> .content"); $content = $wrapper.find("> .content");
mouseOffsetY = 0; mouseOffsetY = 0;
update = function (repeat) { update = function (repeat) {
var visibleHeight, contentHeight, scrollTop, scrollTopFrac, visVertFrac; var visibleHeight, contentHeight, scrollTop, scrollTopFrac, visVertFrac;
if (updateId && !repeat) { if (updateId && !repeat) {
clearInterval(updateId); clearInterval(updateId);
updateId = undefined; updateId = undefined;
} else if (!updateId && repeat) { } else if (!updateId && repeat) {
updateId = setInterval(function() { update(true); }, 50); updateId = setInterval(function() { update(true); }, 50);
} }
$wrapper.css("height", $element.height()); $wrapper.css("height", $element.height());
visibleHeight = $element.height(); visibleHeight = $element.height();
contentHeight = $content.outerHeight(); contentHeight = $content.outerHeight();
scrollTop = $wrapper.scrollTop(); scrollTop = $wrapper.scrollTop();
scrollTopFrac = scrollTop / contentHeight; scrollTopFrac = scrollTop / contentHeight;
visVertFrac = Math.min(visibleHeight / contentHeight, 1); visVertFrac = Math.min(visibleHeight / contentHeight, 1);
if (visVertFrac < 1) { if (visVertFrac < 1) {
$scrollbar $scrollbar
.fadeIn(50) .fadeIn(50)
.css({ .css({
height: $element.innerHeight() + $scrollbar.height() - $scrollbar.outerHeight(true) height: $element.innerHeight() + $scrollbar.height() - $scrollbar.outerHeight(true)
}); });
$drag $drag
.css({ .css({
top: $scrollbar.height() * scrollTopFrac, top: $scrollbar.height() * scrollTopFrac,
height: $scrollbar.height() * visVertFrac height: $scrollbar.height() * visVertFrac
}); });
} else { } else {
$scrollbar.fadeOut(50); $scrollbar.fadeOut(50);
} }
}; };
scroll = function (event) { scroll = function (event) {
var clickFrac = (event.pageY - $scrollbar.offset().top - mouseOffsetY) / $scrollbar.height(); var clickFrac = (event.pageY - $scrollbar.offset().top - mouseOffsetY) / $scrollbar.height();
$wrapper.scrollTop($content.outerHeight() * clickFrac); $wrapper.scrollTop($content.outerHeight() * clickFrac);
update(); update();
event.preventDefault(); event.preventDefault();
}; };
$element $element
.mousewheel(function (event, delta) { .mousewheel(function (event, delta) {
$wrapper.scrollTop($wrapper.scrollTop() - 50 * delta);
update();
event.stopPropagation();
event.preventDefault();
})
.scroll(update);
$element.get(0).updateScrollbar = update;
$wrapper
.css({
"padding-right": $scrollbar.outerWidth(true),
height: $element.height(),
overflow: "hidden"
});
$scrollbar
.css({
position: "absolute",
top: 0,
right: 0,
overflow: "hidden",
cursor: "pointer"
})
.mousedown(function (event) {
mouseOffsetY = $drag.outerHeight() / 2; $wrapper.scrollTop($wrapper.scrollTop() - 50 * delta);
scroll(event); update();
$scrollbar.addClass("dragOn"); event.stopPropagation();
$window event.preventDefault();
.bind("mousemove", scroll) })
.one("mouseup", function (event) { .scroll(update);
$element.get(0).updateScrollbar = update;
$wrapper
.css({
"padding-right": $scrollbar.outerWidth(true),
height: $element.height(),
overflow: "hidden"
});
$scrollbar
.css({
position: "absolute",
top: 0,
right: 0,
overflow: "hidden",
cursor: "pointer"
})
.mousedown(function (event) {
$scrollbar.removeClass("dragOn"); mouseOffsetY = $drag.outerHeight() / 2;
$window.unbind("mousemove", scroll); scroll(event);
scroll(event); $scrollbar.addClass("dragOn");
event.stopPropagation(); $window
}); .bind("mousemove", scroll)
event.preventDefault(); .one("mouseup", function (event) {
})
.each(function () {
this.onselectstart = function () { $scrollbar.removeClass("dragOn");
$window.unbind("mousemove", scroll);
scroll(event);
event.stopPropagation();
});
event.preventDefault();
})
.each(function () {
return false; this.onselectstart = function () {
};
});
$drag
.css({
position: "absolute",
left: 0,
width: "100%"
})
.mousedown(function (event) {
mouseOffsetY = event.pageY - $drag.offset().top; return false;
scroll(event); };
$scrollbar.addClass("dragOn"); });
$window $drag
.bind("mousemove", scroll) .css({
.one("mouseup", function (event) { position: "absolute",
left: 0,
width: "100%"
})
.mousedown(function (event) {
$scrollbar.removeClass("dragOn"); mouseOffsetY = event.pageY - $drag.offset().top;
$window.unbind("mousemove", scroll); scroll(event);
scroll(event); $scrollbar.addClass("dragOn");
event.stopPropagation(); $window
}); .bind("mousemove", scroll)
event.stopPropagation(); .one("mouseup", function (event) {
});
update(); $scrollbar.removeClass("dragOn");
}; $window.unbind("mousemove", scroll);
scroll(event);
event.stopPropagation();
});
event.stopPropagation();
});
update();
};
$.fn.scrollpanel = function () { $.fn.scrollpanel = function () {
return this.each(function () { return this.each(function () {
init(this); init(this);
}); });
}; };
}(window, jQuery)); }(window, jQuery));

View File

@@ -3,27 +3,27 @@
/*global jQuery, amplify, H5AI_CONFIG */ /*global jQuery, amplify, H5AI_CONFIG */
(function ($) { (function ($) {
"use strict"; "use strict";
var H5AI = {}; var H5AI = {};
// @include "inc/Util.js" // @include "inc/Util.js"
// @include "inc/Core.js" // @include "inc/Core.js"
// @include "inc/Sort.js" // @include "inc/Sort.js"
// @include "inc/ZippedDownload.js" // @include "inc/ZippedDownload.js"
// @include "inc/Path.js" // @include "inc/Path.js"
// @include "inc/Connector.js" // @include "inc/Connector.js"
// @include "inc/Html.js" // @include "inc/Html.js"
// @include "inc/Extended.js" // @include "inc/Extended.js"
$(function () { $(function () {
H5AI.extended.init(); H5AI.extended.init();
H5AI.core.init(); H5AI.core.init();
H5AI.sort.init(); H5AI.sort.init();
H5AI.zippedDownload.init(); H5AI.zippedDownload.init();
}); });
}(jQuery)); }(jQuery));

View File

@@ -3,23 +3,23 @@
/*global jQuery, amplify, H5AI_CONFIG */ /*global jQuery, amplify, H5AI_CONFIG */
(function ($) { (function ($) {
"use strict"; "use strict";
var H5AI = {}; var H5AI = {};
// @include "inc/Util.js" // @include "inc/Util.js"
// @include "inc/Core.js" // @include "inc/Core.js"
// @include "inc/Sort.js" // @include "inc/Sort.js"
// @include "inc/ZippedDownload.js" // @include "inc/ZippedDownload.js"
$(function () { $(function () {
H5AI.core.init(); H5AI.core.init();
H5AI.sort.init(); H5AI.sort.init();
H5AI.zippedDownload.init(); H5AI.zippedDownload.init();
$("#tree").scrollpanel(); $("#tree").scrollpanel();
H5AI.core.shiftTree(false, true); H5AI.core.shiftTree(false, true);
}); });
}(jQuery)); }(jQuery));

View File

@@ -2,19 +2,19 @@
function fail($code, $msg, $cond = true) { function fail($code, $msg, $cond = true) {
if ($cond) { if ($cond) {
echo "$code: $msg"; echo "$code: $msg";
exit; exit;
} }
} }
function checkKeys($keys) { function checkKeys($keys) {
$values = array(); $values = array();
foreach ($keys as $key) { foreach ($keys as $key) {
fail(1, "parameter '$key' is missing", !array_key_exists($key, $_REQUEST)); fail(1, "parameter '$key' is missing", !array_key_exists($key, $_REQUEST));
$values[] = $_REQUEST[$key]; $values[] = $_REQUEST[$key];
} }
return $values; return $values;
} }
@@ -29,97 +29,97 @@ $options = $h5ai->getOptions();
if ($action === "httpcodes") { if ($action === "httpcodes") {
list($hrefs) = checkKeys(array("hrefs")); list($hrefs) = checkKeys(array("hrefs"));
function getHttpCodes($h5ai, $hrefs) { function getHttpCodes($h5ai, $hrefs) {
$codes = array(); $codes = array();
foreach ($hrefs as $href) { foreach ($hrefs as $href) {
$href = trim($href); $href = trim($href);
if (strlen($href) > 0) { if (strlen($href) > 0) {
$codes[$href] = $h5ai->getHttpCode($href); $codes[$href] = $h5ai->getHttpCode($href);
} }
} }
return $codes; return $codes;
} }
$hrefs = preg_split("/;/", $hrefs); $hrefs = preg_split("/;/", $hrefs);
$codes = getHttpCodes($h5ai, $hrefs); $codes = getHttpCodes($h5ai, $hrefs);
echo count($codes) === 0 ? "{}" : json_encode($codes); echo count($codes) === 0 ? "{}" : json_encode($codes);
} }
else if ($action === "thumb") { else if ($action === "thumb") {
fail(0, "thumbs are disabled", !$options["showThumbs"]); fail(0, "thumbs are disabled", !$options["showThumbs"]);
list($srcAbsHref, $width, $height, $mode) = checkKeys(array("href", "width", "height", "mode")); list($srcAbsHref, $width, $height, $mode) = checkKeys(array("href", "width", "height", "mode"));
require_once "inc/Thumbnail.php"; require_once "inc/Thumbnail.php";
require_once "inc/Image.php"; require_once "inc/Image.php";
$srcAbsPath = $h5ai->getDocRoot() . rawurldecode($srcAbsHref); $srcAbsPath = $h5ai->getDocRoot() . rawurldecode($srcAbsHref);
if (!Thumbnail::isUsable()) { if (!Thumbnail::isUsable()) {
Image::showImage($srcAbsPath); Image::showImage($srcAbsPath);
exit; exit;
} }
$thumbnail = new Thumbnail($h5ai, $srcAbsHref, $mode, $width, $height); $thumbnail = new Thumbnail($h5ai, $srcAbsHref, $mode, $width, $height);
$thumbnail->create(1); $thumbnail->create(1);
if (file_exists($thumbnail->getPath())) { if (file_exists($thumbnail->getPath())) {
Image::showImage($thumbnail->getPath()); Image::showImage($thumbnail->getPath());
} else { } else {
$image = new Image(); $image = new Image();
$image->setSource($srcAbsPath); $image->setSource($srcAbsPath);
$image->thumb($mode, $width, $height); $image->thumb($mode, $width, $height);
$image->showDest(); $image->showDest();
} }
} }
else if ($action === "tree") { else if ($action === "tree") {
list($href) = checkKeys(array("href")); list($href) = checkKeys(array("href"));
require_once "inc/Tree.php"; require_once "inc/Tree.php";
$absHref = trim($href); $absHref = trim($href);
$absPath = $h5ai->getAbsPath($absHref); $absPath = $h5ai->getAbsPath($absHref);
$tree = new TreeEntry($h5ai, $absPath, $absHref); $tree = new TreeEntry($h5ai, $absPath, $absHref);
$tree->loadContent(); $tree->loadContent();
echo $tree->contentToHtml(); echo $tree->contentToHtml();
} }
else if ($action === "zip") { else if ($action === "zip") {
fail(0, "zipped download is disabled", !$options["zippedDownload"]); fail(0, "zipped download is disabled", !$options["zippedDownload"]);
list($hrefs) = checkKeys(array("hrefs")); list($hrefs) = checkKeys(array("hrefs"));
require_once "inc/ZipIt.php"; require_once "inc/ZipIt.php";
$zipit = new ZipIt($h5ai); $zipit = new ZipIt($h5ai);
$hrefs = explode(":", trim($hrefs)); $hrefs = explode(":", trim($hrefs));
$zipFile = $zipit->zip($hrefs); $zipFile = $zipit->zip($hrefs);
if ($zipFile === false) { if ($zipFile === false) {
fail(2, "something went wrong while building the zip"); fail(2, "something went wrong while building the zip");
} }
header("Content-Disposition: attachment; filename=\"h5ai-selection.zip\""); header("Content-Disposition: attachment; filename=\"h5ai-selection.zip\"");
header("Content-Type: application/force-download"); header("Content-Type: application/force-download");
header("Content-Length: " . filesize($zipFile)); header("Content-Length: " . filesize($zipFile));
header("Connection: close"); header("Connection: close");
readfile($zipFile); readfile($zipFile);
} }
else { else {
fail(1, "unsupported 'action' specified"); fail(1, "unsupported 'action' specified");
} }

View File

@@ -7,87 +7,87 @@
############################################## ##############################################
class Cache { class Cache {
private $dir; private $dir;
function __construct($dir) { function __construct($dir) {
$this->dir = $dir; $this->dir = $dir;
} }
private function _name($key) { private function _name($key) {
return $this->dir . "/" . sha1($key); return $this->dir . "/" . sha1($key);
} }
public function get($key, $expiration = 3600) { public function get($key, $expiration = 3600) {
if (!is_dir($this->dir) || !is_writable($this->dir)) { if (!is_dir($this->dir) || !is_writable($this->dir)) {
return false; return false;
} }
$cache_path = $this->_name($key); $cache_path = $this->_name($key);
if (!@file_exists($cache_path)) { if (!@file_exists($cache_path)) {
return false; return false;
} }
if (filemtime($cache_path) < (time() - $expiration)) { if (filemtime($cache_path) < (time() - $expiration)) {
$this->clear($key); $this->clear($key);
return false; return false;
} }
if (!$fp = @fopen($cache_path, "rb")) { if (!$fp = @fopen($cache_path, "rb")) {
return false; return false;
} }
flock($fp, LOCK_SH); flock($fp, LOCK_SH);
$cache = ""; $cache = "";
if (filesize($cache_path) > 0) { if (filesize($cache_path) > 0) {
$cache = unserialize(fread($fp, filesize($cache_path))); $cache = unserialize(fread($fp, filesize($cache_path)));
} else { } else {
$cache = null; $cache = null;
} }
flock($fp, LOCK_UN); flock($fp, LOCK_UN);
fclose($fp); fclose($fp);
return $cache; return $cache;
} }
public function set($key, $data) { public function set($key, $data) {
if (!is_dir($this->dir) || !is_writable($this->dir)) { if (!is_dir($this->dir) || !is_writable($this->dir)) {
return false; return false;
} }
$cache_path = $this->_name($key); $cache_path = $this->_name($key);
if (! $fp = fopen($cache_path, "wb")) { if (! $fp = fopen($cache_path, "wb")) {
return false; return false;
} }
if (flock($fp, LOCK_EX)) { if (flock($fp, LOCK_EX)) {
fwrite($fp, serialize($data)); fwrite($fp, serialize($data));
flock($fp, LOCK_UN); flock($fp, LOCK_UN);
} else { } else {
return false; return false;
} }
fclose($fp); fclose($fp);
@chmod($cache_path, 0777); @chmod($cache_path, 0777);
return true; return true;
} }
public function clear($key) { public function clear($key) {
$cache_path = $this->_name($key); $cache_path = $this->_name($key);
if (file_exists($cache_path)) { if (file_exists($cache_path)) {
unlink($cache_path); unlink($cache_path);
return true; return true;
} }
return false; return false;
} }
} }
?> ?>

View File

@@ -1,52 +1,52 @@
<?php <?php
class Crumb { class Crumb {
private $h5ai, $parts; private $h5ai, $parts;
public function __construct($h5ai) { public function __construct($h5ai) {
$this->h5ai = $h5ai; $this->h5ai = $h5ai;
$this->parts = array(); $this->parts = array();
$href = $h5ai->getAbsHref(); $href = $h5ai->getAbsHref();
while ($href !== "/" && $href !== "//") { while ($href !== "/" && $href !== "//") {
$this->parts[] = $href; $this->parts[] = $href;
$href = dirname($href) . "/"; $href = dirname($href) . "/";
} }
$this->parts[] = "/"; $this->parts[] = "/";
$this->parts = array_reverse($this->parts); $this->parts = array_reverse($this->parts);
} }
public function toHtml() { public function toHtml() {
$html = ""; $html = "";
$idx = 0; $idx = 0;
foreach($this->parts as $href) { foreach($this->parts as $href) {
$idx++; $idx++;
$classes = "crumb folder" . ($idx === 1 ? " domain" : "") . ($idx === count($this->parts) ? " current" : ""); $classes = "crumb folder" . ($idx === 1 ? " domain" : "") . ($idx === count($this->parts) ? " current" : "");
$image = $this->h5ai->image($idx === 1 ? "home" : "crumb"); $image = $this->h5ai->image($idx === 1 ? "home" : "crumb");
$label = $this->h5ai->getLabel($href); $label = $this->h5ai->getLabel($href);
$hint = ""; $hint = "";
$code = $this->h5ai->getHttpCode($href); $code = $this->h5ai->getHttpCode($href);
$classes .= " checkedHttpCode"; $classes .= " checkedHttpCode";
if ($code !== "h5ai") { if ($code !== "h5ai") {
if ($code === 200) { if ($code === 200) {
$hint = "<img class='hint' src='" . $this->h5ai->image("page") . "' alt='page' />"; $hint = "<img class='hint' src='" . $this->h5ai->image("page") . "' alt='page' />";
} else { } else {
$hint = "<span class='hint'>(" . $code . ")</span>"; $hint = "<span class='hint'>(" . $code . ")</span>";
} }
} }
$html .= "<li class='$classes'>\n"; $html .= "<li class='$classes'>\n";
$html .= "\t<a href='$href'>\n"; $html .= "\t<a href='$href'>\n";
$html .= "\t\t<img src='$image' alt='>' /><span>" . $label . "</span>" . $hint . "\n"; $html .= "\t\t<img src='$image' alt='>' /><span>" . $label . "</span>" . $hint . "\n";
$html .= "\t</a>\n"; $html .= "\t</a>\n";
$html .= "</li>\n"; $html .= "</li>\n";
} }
return $html; return $html;
} }
} }
?> ?>

View File

@@ -1,30 +1,30 @@
<?php <?php
class Customize { class Customize {
private $customHeader, $customFooter; private $customHeader, $customFooter;
public function __construct($h5ai) { public function __construct($h5ai) {
$absPath = $h5ai->getAbsPath(); $absPath = $h5ai->getAbsPath();
$options = $h5ai->getOptions(); $options = $h5ai->getOptions();
$this->customHeader = $absPath . "/" . $options["customHeader"]; $this->customHeader = $absPath . "/" . $options["customHeader"];
$this->customFooter = $absPath . "/" . $options["customFooter"]; $this->customFooter = $absPath . "/" . $options["customFooter"];
} }
public function getHeader() { public function getHeader() {
return $this->getContent($this->customHeader, "header"); return $this->getContent($this->customHeader, "header");
} }
public function getFooter() { public function getFooter() {
return $this->getContent($this->customFooter, "footer"); return $this->getContent($this->customFooter, "footer");
} }
private function getContent($file, $tag) { private function getContent($file, $tag) {
return file_exists($file) ? ("<" . $tag . ">" . file_get_contents($file) . "</" . $tag . ">") : ""; return file_exists($file) ? ("<" . $tag . ">" . file_get_contents($file) . "</" . $tag . ">") : "";
} }
} }
?> ?>

View File

@@ -4,141 +4,141 @@ require_once "Thumbnail.php";
class Entry { class Entry {
private $h5ai, $label, $absPath, $absHref, $date, $isFolder, $type, $size, $thumbTypes; private $h5ai, $label, $absPath, $absHref, $date, $isFolder, $type, $size, $thumbTypes;
public function __construct($h5ai, $absPath, $absHref, $type = null, $label = null) { public function __construct($h5ai, $absPath, $absHref, $type = null, $label = null) {
$this->h5ai = $h5ai; $this->h5ai = $h5ai;
$this->label = $label !== null ? $label : $this->h5ai->getLabel($absHref); $this->label = $label !== null ? $label : $this->h5ai->getLabel($absHref);
$this->absPath = $this->h5ai->normalizePath($absPath, false); $this->absPath = $this->h5ai->normalizePath($absPath, false);
$this->isFolder = is_dir($this->absPath); $this->isFolder = is_dir($this->absPath);
$this->absHref = $this->h5ai->normalizePath($absHref, $this->isFolder); $this->absHref = $this->h5ai->normalizePath($absHref, $this->isFolder);
$this->date = filemtime($this->absPath); $this->date = filemtime($this->absPath);
if ($this->isFolder) { if ($this->isFolder) {
$this->type = $type !== null ? $type : "folder"; $this->type = $type !== null ? $type : "folder";
$this->size = ""; $this->size = "";
} else { } else {
$this->type = $type !== null ? $type : $this->h5ai->getType($this->absPath); $this->type = $type !== null ? $type : $this->h5ai->getType($this->absPath);
$this->size = filesize($this->absPath); $this->size = filesize($this->absPath);
} }
$this->thumbTypes = array("bmp", "gif", "ico", "image", "jpg", "png", "tiff"); $this->thumbTypes = array("bmp", "gif", "ico", "image", "jpg", "png", "tiff");
} }
public function isFolder() { public function isFolder() {
return $this->isFolder; return $this->isFolder;
} }
public function toHtml() { public function toHtml() {
$classes = "entry " . ($this->isFolder ? "folder " : "file ") . $this->type; $classes = "entry " . ($this->isFolder ? "folder " : "file ") . $this->type;
$imgClass = ""; $imgClass = "";
$img = $this->type; $img = $this->type;
$smallImg = $this->h5ai->icon($this->type); $smallImg = $this->h5ai->icon($this->type);
$bigImg = $this->h5ai->icon($this->type, true); $bigImg = $this->h5ai->icon($this->type, true);
$hint = ""; $hint = "";
if ($this->isFolder && $this->type !== "folder-parent") { if ($this->isFolder && $this->type !== "folder-parent") {
$code = $this->h5ai->getHttpCode($this->absHref); $code = $this->h5ai->getHttpCode($this->absHref);
$classes .= " checkedHttpCode"; $classes .= " checkedHttpCode";
if ($code !== "h5ai") { if ($code !== "h5ai") {
if ($code === 200) { if ($code === 200) {
$img = "folder-page"; $img = "folder-page";
$smallImg = $this->h5ai->icon("folder-page"); $smallImg = $this->h5ai->icon("folder-page");
$bigImg = $this->h5ai->icon("folder-page", true); $bigImg = $this->h5ai->icon("folder-page", true);
} else { } else {
$classes .= " error"; $classes .= " error";
$hint = "<span class='hint'> " . $code . " </span>"; $hint = "<span class='hint'> " . $code . " </span>";
} }
} }
} }
if ($this->h5ai->showThumbs() && in_array($this->type, $this->thumbTypes)) { if ($this->h5ai->showThumbs() && in_array($this->type, $this->thumbTypes)) {
$imgClass = " class='thumb' "; $imgClass = " class='thumb' ";
$thumbnail = new Thumbnail($this->h5ai, $this->absHref, "square", 16, 16); $thumbnail = new Thumbnail($this->h5ai, $this->absHref, "square", 16, 16);
$thumbnail->create(); $thumbnail->create();
$smallImg = file_exists($thumbnail->getPath()) ? $thumbnail->getHref() : $thumbnail->getLiveHref(); $smallImg = file_exists($thumbnail->getPath()) ? $thumbnail->getHref() : $thumbnail->getLiveHref();
$thumbnail = new Thumbnail($this->h5ai,$this->absHref, "rational", 96, 46); $thumbnail = new Thumbnail($this->h5ai,$this->absHref, "rational", 96, 46);
$thumbnail->create(); $thumbnail->create();
$bigImg = file_exists($thumbnail->getPath()) ? $thumbnail->getHref() : $thumbnail->getLiveHref(); $bigImg = file_exists($thumbnail->getPath()) ? $thumbnail->getHref() : $thumbnail->getLiveHref();
} }
$html = "\t<li class='" . $classes . "'>\n"; $html = "\t<li class='" . $classes . "'>\n";
$html .= "\t\t<a href='" . $this->absHref . "'>\n"; $html .= "\t\t<a href='" . $this->absHref . "'>\n";
$html .= "\t\t\t<span class='icon small'><img " . $imgClass . " src='" . $smallImg . "' alt='" . $img . "' /></span>\n"; $html .= "\t\t\t<span class='icon small'><img " . $imgClass . " src='" . $smallImg . "' alt='" . $img . "' /></span>\n";
$html .= "\t\t\t<span class='icon big'><img " . $imgClass . " src='" . $bigImg . "' alt='" . $img . "' /></span>\n"; $html .= "\t\t\t<span class='icon big'><img " . $imgClass . " src='" . $bigImg . "' alt='" . $img . "' /></span>\n";
$html .= "\t\t\t<span class='label'>" . $this->label . $hint . "</span>\n"; $html .= "\t\t\t<span class='label'>" . $this->label . $hint . "</span>\n";
$html .= "\t\t\t<span class='date' data-time='" . $this->date . "000'></span>\n"; $html .= "\t\t\t<span class='date' data-time='" . $this->date . "000'></span>\n";
$html .= "\t\t\t<span class='size' data-bytes='" . $this->size . "'>" . $this->size . "</span>\n"; $html .= "\t\t\t<span class='size' data-bytes='" . $this->size . "'>" . $this->size . "</span>\n";
$html .= "\t\t</a>\n"; $html .= "\t\t</a>\n";
$html .= "\t</li>\n"; $html .= "\t</li>\n";
return $html; return $html;
} }
} }
class Extended { class Extended {
private $h5ai, $parent, $content; private $h5ai, $parent, $content;
public function __construct($h5ai) { public function __construct($h5ai) {
$this->h5ai = $h5ai; $this->h5ai = $h5ai;
$this->parent = null; $this->parent = null;
$this->content = array(); $this->content = array();
$this->loadContent(); $this->loadContent();
} }
private function loadContent() { private function loadContent() {
if ($this->h5ai->getAbsHref() !== "/") { if ($this->h5ai->getAbsHref() !== "/") {
$options = $this->h5ai->getOptions(); $options = $this->h5ai->getOptions();
$parentPath = dirname($this->h5ai->getAbsPath()); $parentPath = dirname($this->h5ai->getAbsPath());
$parentHref = dirname($this->h5ai->getAbsHref()); $parentHref = dirname($this->h5ai->getAbsHref());
$label = $options["setParentFolderLabels"] === true ? $this->h5ai->getLabel($parentHref) : "<span class='l10n-parentDirectory'>Parent Directory</span>"; $label = $options["setParentFolderLabels"] === true ? $this->h5ai->getLabel($parentHref) : "<span class='l10n-parentDirectory'>Parent Directory</span>";
$this->parent = new Entry($this->h5ai, $parentPath, $parentHref, "folder-parent", $label); $this->parent = new Entry($this->h5ai, $parentPath, $parentHref, "folder-parent", $label);
} }
$this->content = array(); $this->content = array();
$files = $this->h5ai->readDir($this->h5ai->getAbsPath()); $files = $this->h5ai->readDir($this->h5ai->getAbsPath());
foreach ($files as $file) { foreach ($files as $file) {
$absPath = $this->h5ai->getAbsPath() . "/" . $file; $absPath = $this->h5ai->getAbsPath() . "/" . $file;
$absHref = $this->h5ai->getAbsHref() . rawurlencode($file); $absHref = $this->h5ai->getAbsHref() . rawurlencode($file);
$this->content[$absPath] = new Entry($this->h5ai, $absPath, $absHref); $this->content[$absPath] = new Entry($this->h5ai, $absPath, $absHref);
} }
} }
public function toHtml() { public function toHtml() {
$html = "<section id='extended' class='" . $this->h5ai->getView() . "-view clearfix'>\n"; $html = "<section id='extended' class='" . $this->h5ai->getView() . "-view clearfix'>\n";
$html .= "<ul>\n"; $html .= "<ul>\n";
$html .= $this->generateHeaders(); $html .= $this->generateHeaders();
if ($this->parent !== null) { if ($this->parent !== null) {
$html .= $this->parent->toHtml(); $html .= $this->parent->toHtml();
} }
foreach($this->content as $entry) { foreach($this->content as $entry) {
$html .= $entry->toHtml(); $html .= $entry->toHtml();
} }
$html .= "</ul>\n"; $html .= "</ul>\n";
if (count($this->content) === 0) { if (count($this->content) === 0) {
$html .= "<div class='empty l10n-empty'>empty</div>"; $html .= "<div class='empty l10n-empty'>empty</div>";
} }
$html .="</section>"; $html .="</section>";
return $html; return $html;
} }
public function generateHeaders() { public function generateHeaders() {
$html = "\t<li class='header'>\n"; $html = "\t<li class='header'>\n";
$html .= "\t\t<a class='icon'></a>\n"; $html .= "\t\t<a class='icon'></a>\n";
$html .= "\t\t<a class='label' href='#'><span class='l10n-name'>Name</span></a>\n"; $html .= "\t\t<a class='label' href='#'><span class='l10n-name'>Name</span></a>\n";
$html .= "\t\t<a class='date' href='#'><span class='l10n-lastModified'>Last modified</span></a>\n"; $html .= "\t\t<a class='date' href='#'><span class='l10n-lastModified'>Last modified</span></a>\n";
$html .= "\t\t<a class='size' href='#'><span class='l10n-size'>Size</span></a>\n"; $html .= "\t\t<a class='size' href='#'><span class='l10n-size'>Size</span></a>\n";
$html .= "\t</li>\n"; $html .= "\t</li>\n";
return $html; return $html;
} }
} }
?> ?>

View File

@@ -3,301 +3,301 @@
require_once "Cache.php"; require_once "Cache.php";
class H5ai { class H5ai {
private static $VIEWMODES = array("details", "icons"); private static $VIEWMODES = array("details", "icons");
private $docRoot, $h5aiRoot, $h5aiAbsHref, $domain, private $docRoot, $h5aiRoot, $h5aiAbsHref, $domain,
$config, $options, $types, $langs, $config, $options, $types, $langs,
$cache, $cache,
$absHref, $absPath, $absHref, $absPath,
$ignore, $ignoreRE, $ignore, $ignoreRE,
$view; $view;
public function __construct() { public function __construct() {
global $H5AI_CONFIG; global $H5AI_CONFIG;
$this->docRoot = $H5AI_CONFIG["DOCUMENT_ROOT"]; $this->docRoot = $H5AI_CONFIG["DOCUMENT_ROOT"];
$this->h5aiRoot = $H5AI_CONFIG["H5AI_ROOT"]; $this->h5aiRoot = $H5AI_CONFIG["H5AI_ROOT"];
$this->ignore = $H5AI_CONFIG["IGNORE"]; $this->ignore = $H5AI_CONFIG["IGNORE"];
$this->ignoreRE = $H5AI_CONFIG["IGNORE_PATTERNS"]; $this->ignoreRE = $H5AI_CONFIG["IGNORE_PATTERNS"];
$this->config = $this->loadConfig($this->h5aiRoot . "/config.js"); $this->config = $this->loadConfig($this->h5aiRoot . "/config.js");
$this->options = $this->config["options"]; $this->options = $this->config["options"];
$this->types = $this->config["types"]; $this->types = $this->config["types"];
$this->langs = $this->config["langs"]; $this->langs = $this->config["langs"];
$this->cache = new Cache($this->h5aiRoot . "/cache"); $this->cache = new Cache($this->h5aiRoot . "/cache");
$this->hrefRoot = $this->options["rootAbsHref"]; $this->hrefRoot = $this->options["rootAbsHref"];
$this->h5aiAbsHref = $this->options["h5aiAbsHref"]; $this->h5aiAbsHref = $this->options["h5aiAbsHref"];
$this->domain = getenv("HTTP_HOST"); $this->domain = getenv("HTTP_HOST");
$this->absHref = $this->normalizePath(preg_replace('/\\?.*/', '', getenv("REQUEST_URI")), true); $this->absHref = $this->normalizePath(preg_replace('/\\?.*/', '', getenv("REQUEST_URI")), true);
$this->absPath = $this->getAbsPath($this->absHref); $this->absPath = $this->getAbsPath($this->absHref);
$this->view = $this->options["viewmodes"][0]; $this->view = $this->options["viewmodes"][0];
if (!in_array($this->view, H5ai::$VIEWMODES)) { if (!in_array($this->view, H5ai::$VIEWMODES)) {
$this->view = H5ai::$VIEWMODES[0]; $this->view = H5ai::$VIEWMODES[0];
} }
} }
private function loadConfig($file) { private function loadConfig($file) {
$str = file_exists($file) ? file_get_contents($file) : ""; $str = file_exists($file) ? file_get_contents($file) : "";
// remove comments and change expression to pure json // remove comments and change expression to pure json
$str = preg_replace("/\/\*.*?\*\//s", "", $str); $str = preg_replace("/\/\*.*?\*\//s", "", $str);
$str = preg_replace("/^.*H5AI_CONFIG\s*=\s*/s", "", $str); $str = preg_replace("/^.*H5AI_CONFIG\s*=\s*/s", "", $str);
$str = preg_replace("/;.*/s", "", $str); $str = preg_replace("/;.*/s", "", $str);
$config = json_decode($str, true); $config = json_decode($str, true);
return $config; return $config;
} }
public function getDocRoot() { public function getDocRoot() {
return $this->docRoot; return $this->docRoot;
} }
public function getH5aiRoot() { public function getH5aiRoot() {
return $this->h5aiRoot; return $this->h5aiRoot;
} }
public function getHrefRoot() { public function getHrefRoot() {
return $this->hrefRoot; return $this->hrefRoot;
} }
public function getH5aiAbsHref() { public function getH5aiAbsHref() {
return $this->h5aiAbsHref; return $this->h5aiAbsHref;
} }
public function getDomain() { public function getDomain() {
return $this->domain; return $this->domain;
} }
public function getView() { public function getView() {
return $this->view; return $this->view;
} }
public function api() { public function api() {
return $this->h5aiAbsHref . "php/api.php"; return $this->h5aiAbsHref . "php/api.php";
} }
public function image($id) { public function image($id) {
return $this->h5aiAbsHref . "images/" . $id . ".png"; return $this->h5aiAbsHref . "images/" . $id . ".png";
} }
public function icon($id, $big = false) { public function icon($id, $big = false) {
return $this->h5aiAbsHref . "icons/" . ($big ? "48x48" : "16x16") . "/" . $id . ".png"; return $this->h5aiAbsHref . "icons/" . ($big ? "48x48" : "16x16") . "/" . $id . ".png";
} }
public function getOptions() { public function getOptions() {
return $this->options; return $this->options;
} }
public function getLangs() { public function getLangs() {
return $this->langs; return $this->langs;
} }
public function getAbsHref($absPath = null, $endWithSlash = true) { public function getAbsHref($absPath = null, $endWithSlash = true) {
if ($absPath === null) { if ($absPath === null) {
return $this->absHref; return $this->absHref;
} }
// //
$absPath=substr($absPath, strlen($this->docRoot)); $absPath=substr($absPath, strlen($this->docRoot));
$absHref = preg_replace("!^" . $this->docRoot . "!", "", $absPath); $absHref = preg_replace("!^" . $this->docRoot . "!", "", $absPath);
$parts = explode("/", $absHref); $parts = explode("/", $absHref);
$encodedParts = array(); $encodedParts = array();
foreach ($parts as $part) { foreach ($parts as $part) {
$encodedParts[] = rawurlencode($part); $encodedParts[] = rawurlencode($part);
} }
$endodedAbsHref = implode("/", $encodedParts); $endodedAbsHref = implode("/", $encodedParts);
// //
$endodedAbsHref = $this->hrefRoot . $endodedAbsHref; $endodedAbsHref = $this->hrefRoot . $endodedAbsHref;
return $this->normalizePath($endodedAbsHref, $endWithSlash); return $this->normalizePath($endodedAbsHref, $endWithSlash);
} }
public function getAbsPath($absHref = null) { public function getAbsPath($absHref = null) {
if ($absHref === null) { if ($absHref === null) {
return $this->absPath; return $this->absPath;
} }
// //
$absHref=substr($absHref, strlen($this->hrefRoot)); $absHref=substr($absHref, strlen($this->hrefRoot));
return $this->normalizePath($this->docRoot . "/" . rawurldecode($absHref), false); return $this->normalizePath($this->docRoot . "/" . rawurldecode($absHref), false);
} }
public function showThumbs() { public function showThumbs() {
return $this->options["showThumbs"] === true; return $this->options["showThumbs"] === true;
} }
public function getTitle() { public function getTitle() {
$title = $this->domain . rawurldecode($this->absHref); $title = $this->domain . rawurldecode($this->absHref);
$title = preg_replace("/\/$/", "", $title); $title = preg_replace("/\/$/", "", $title);
$title = preg_replace("/\//", " > ", $title); $title = preg_replace("/\//", " > ", $title);
if ($this->absHref !== "/") { if ($this->absHref !== "/") {
$title = basename($this->absPath) . " - " . $title; $title = basename($this->absPath) . " - " . $title;
} }
return $title; return $title;
} }
public function getType($absPath) { public function getType($absPath) {
foreach($this->types as $type => $exts) { foreach($this->types as $type => $exts) {
foreach($exts as $ext) { foreach($exts as $ext) {
if ($this->endsWith($absPath, $ext)) { if ($this->endsWith($absPath, $ext)) {
return $type; return $type;
} }
} }
} }
return "unknown"; return "unknown";
} }
public function ignoreThisFile($file) { public function ignoreThisFile($file) {
# always ignore # always ignore
if ($file === "." || $file === ".." || $this->startsWith($file, '.ht')) { if ($file === "." || $file === ".." || $this->startsWith($file, '.ht')) {
return true; return true;
} }
if (in_array($file, $this->ignore)) { if (in_array($file, $this->ignore)) {
return true; return true;
} }
foreach ($this->ignoreRE as $re) { foreach ($this->ignoreRE as $re) {
if (preg_match($re, $file)) { if (preg_match($re, $file)) {
return true; return true;
} }
} }
return false; return false;
} }
public function readDir($path) { public function readDir($path) {
$content = array(); $content = array();
if (is_dir($path)) { if (is_dir($path)) {
if ($dir = opendir($path)) { if ($dir = opendir($path)) {
while (($file = readdir($dir)) !== false) { while (($file = readdir($dir)) !== false) {
if (!$this->ignoreThisFile($file)) { if (!$this->ignoreThisFile($file)) {
$content[] = $file; $content[] = $file;
} }
} }
closedir($dir); closedir($dir);
} }
} }
return $content; return $content;
} }
public function getLabel($absHref) { public function getLabel($absHref) {
return $absHref === "/" ? $this->domain : rawurldecode(basename($absHref)); return $absHref === "/" ? $this->domain : rawurldecode(basename($absHref));
} }
public function normalizePath($path, $endWithSlash) { public function normalizePath($path, $endWithSlash) {
return ($path === "/") ? "/" : (preg_replace('#/$#', '', $path) . ($endWithSlash ? "/" : "")); return ($path === "/") ? "/" : (preg_replace('#/$#', '', $path) . ($endWithSlash ? "/" : ""));
} }
public function startsWith($sequence, $start) { public function startsWith($sequence, $start) {
return strcasecmp(substr($sequence, 0, strlen($start)), $start) === 0; return strcasecmp(substr($sequence, 0, strlen($start)), $start) === 0;
} }
public function endsWith($sequence, $end) { public function endsWith($sequence, $end) {
return strcasecmp(substr($sequence, -strlen($end)), $end) === 0; return strcasecmp(substr($sequence, -strlen($end)), $end) === 0;
} }
public function getHttpCode($absHref) { public function getHttpCode($absHref) {
return $this->cachedHttpCode($absHref); return $this->cachedHttpCode($absHref);
#return $this->fetchHttpCode($absHref); #return $this->fetchHttpCode($absHref);
#return $this->guessHttpCode($absHref); #return $this->guessHttpCode($absHref);
} }
public function cachedHttpCode($absHref) { public function cachedHttpCode($absHref) {
$cached = $this->cache->get($absHref); $cached = $this->cache->get($absHref);
if ($cached === false) { if ($cached === false) {
$folderStatus = $this->options["folderStatus"]; $folderStatus = $this->options["folderStatus"];
if (array_key_exists($absHref, $folderStatus)) { if (array_key_exists($absHref, $folderStatus)) {
$code = $folderStatus[$absHref]; $code = $folderStatus[$absHref];
} else { } else {
$code = $this->fetchHttpCode($absHref); $code = $this->fetchHttpCode($absHref);
} }
$cached = array("href" => $absHref, "code" => $code); $cached = array("href" => $absHref, "code" => $code);
$this->cache->set($absHref, $cached); $this->cache->set($absHref, $cached);
} }
return $cached["code"]; return $cached["code"];
} }
public function fetchHttpCode($absHref) { public function fetchHttpCode($absHref) {
$contentType = "Content-Type:"; $contentType = "Content-Type:";
$h5aiContentType = "Content-Type: text/html;h5ai="; $h5aiContentType = "Content-Type: text/html;h5ai=";
$host = getenv("HTTP_HOST"); $host = getenv("HTTP_HOST");
$port = getenv("SERVER_PORT"); $port = getenv("SERVER_PORT");
$msg = "HEAD $absHref HTTP/1.1\r\nHost: $host\r\nConnection: Close\r\n"; $msg = "HEAD $absHref HTTP/1.1\r\nHost: $host\r\nConnection: Close\r\n";
if (isset($_SERVER['PHP_AUTH_USER'])) { if (isset($_SERVER['PHP_AUTH_USER'])) {
$msg .= "Authorization: Basic " . base64_encode($_SERVER['PHP_AUTH_USER'] . ":" . $_SERVER['PHP_AUTH_PW']) . "\r\n"; $msg .= "Authorization: Basic " . base64_encode($_SERVER['PHP_AUTH_USER'] . ":" . $_SERVER['PHP_AUTH_PW']) . "\r\n";
} }
$msg .= "\r\n"; $msg .= "\r\n";
$errno = ""; $errno = "";
$errstr = ""; $errstr = "";
$socket = fsockopen($host, $port, $errno, $errstr, 30); $socket = fsockopen($host, $port, $errno, $errstr, 30);
if($socket === 0) { if($socket === 0) {
return null; return null;
} }
fwrite($socket, $msg); fwrite($socket, $msg);
$content = fgets($socket); $content = fgets($socket);
$code = intval(trim(substr($content, 9, 4))); $code = intval(trim(substr($content, 9, 4)));
if ($code === 200) { if ($code === 200) {
while (! $this->startsWith($content, $contentType)) { while (! $this->startsWith($content, $contentType)) {
$content = fgets($socket); $content = fgets($socket);
} }
if ($this->startsWith($content, $h5aiContentType)) { if ($this->startsWith($content, $h5aiContentType)) {
$code = "h5ai"; $code = "h5ai";
} }
} }
fclose($socket); fclose($socket);
return $code; return $code;
} }
public function guessHttpCode($absHref) { public function guessHttpCode($absHref) {
$indexFiles = array("index.html", "index.cgi", "index.pl", "index.php", "index.xhtml", "index.htm"); $indexFiles = array("index.html", "index.cgi", "index.pl", "index.php", "index.xhtml", "index.htm");
$absPath = $this->getAbsPath($absHref); $absPath = $this->getAbsPath($absHref);
$files = $this->readDir($absPath); $files = $this->readDir($absPath);
foreach ($files as $file) { foreach ($files as $file) {
if (in_array($file, $indexFiles)) { if (in_array($file, $indexFiles)) {
return 200; return 200;
} }
} }
return "h5ai"; return "h5ai";
} }
} }
?> ?>

View File

@@ -2,202 +2,202 @@
class Image { class Image {
private $sourceFile; private $sourceFile;
private $source; private $source;
private $width; private $width;
private $height; private $height;
private $type; private $type;
private $dest; private $dest;
public static function isUsable() { public static function isUsable() {
return GD_VERSION != "GD_VERSION"; return GD_VERSION != "GD_VERSION";
} }
public static function showImage($filename) { public static function showImage($filename) {
$image = file_get_contents($filename); $image = file_get_contents($filename);
header("content-type: image"); header("content-type: image");
echo $image; echo $image;
} }
public function __construct($filename = null) { public function __construct($filename = null) {
$this->sourceFile = null; $this->sourceFile = null;
$this->source = null; $this->source = null;
$this->width = null; $this->width = null;
$this->height = null; $this->height = null;
$this->type = null; $this->type = null;
$this->dest = null; $this->dest = null;
$this->setSource($filename); $this->setSource($filename);
} }
public function __destruct() { public function __destruct() {
$this->releaseSource(); $this->releaseSource();
$this->releaseDest(); $this->releaseDest();
} }
public function setSource($filename) { public function setSource($filename) {
$this->releaseSource(); $this->releaseSource();
$this->releaseDest(); $this->releaseDest();
if (is_null($filename)) { if (is_null($filename)) {
return; return;
} }
$this->sourceFile = $filename; $this->sourceFile = $filename;
list($this->width, $this->height, $this->type) = getimagesize($this->sourceFile); list($this->width, $this->height, $this->type) = getimagesize($this->sourceFile);
$this->source = imagecreatefromstring(file_get_contents($this->sourceFile)); $this->source = imagecreatefromstring(file_get_contents($this->sourceFile));
} }
public function showDest() { public function showDest() {
if (!is_null($this->dest)) { if (!is_null($this->dest)) {
header("Content-type: image/jpeg"); header("Content-type: image/jpeg");
imagejpeg($this->dest, null, 100); imagejpeg($this->dest, null, 100);
} }
} }
public function saveDest($filename) { public function saveDest($filename) {
if (!is_null($this->dest)) { if (!is_null($this->dest)) {
@imagejpeg($this->dest, $filename, 90); @imagejpeg($this->dest, $filename, 90);
@chmod($filename, 0775); @chmod($filename, 0775);
} }
} }
public function releaseDest() { public function releaseDest() {
if (!is_null($this->dest)) { if (!is_null($this->dest)) {
imagedestroy($this->dest); imagedestroy($this->dest);
$this->dest = null; $this->dest = null;
} }
} }
public function releaseSource() { public function releaseSource() {
if (!is_null($this->source)) { if (!is_null($this->source)) {
imagedestroy($this->source); imagedestroy($this->source);
$this->sourceFile = null; $this->sourceFile = null;
$this->source = null; $this->source = null;
$this->width = null; $this->width = null;
$this->height = null; $this->height = null;
$this->type = null; $this->type = null;
} }
} }
private function magic($destX, $destY, $srcX, $srcY, $destWidth, $destHeight, $srcWidth, $srcHeight, $canWidth = null, $canHeight = null, $color = null) { private function magic($destX, $destY, $srcX, $srcY, $destWidth, $destHeight, $srcWidth, $srcHeight, $canWidth = null, $canHeight = null, $color = null) {
if (!is_null($canWidth) && !is_null($canHeight)) { if (!is_null($canWidth) && !is_null($canHeight)) {
$this->dest = imagecreatetruecolor($canWidth, $canHeight); $this->dest = imagecreatetruecolor($canWidth, $canHeight);
} else { } else {
$this->dest = imagecreatetruecolor($destWidth, $destHeight); $this->dest = imagecreatetruecolor($destWidth, $destHeight);
} }
if (is_null($color)) { if (is_null($color)) {
$color = array(255, 255, 255); $color = array(255, 255, 255);
} }
$icol = imagecolorallocate($this->dest, $color[0], $color[1], $color[2]); $icol = imagecolorallocate($this->dest, $color[0], $color[1], $color[2]);
imagefill($this->dest, 0, 0, $icol); imagefill($this->dest, 0, 0, $icol);
imagecopyresampled($this->dest, $this->source, $destX, $destY, $srcX, $srcY, $destWidth, $destHeight, $srcWidth, $srcHeight); imagecopyresampled($this->dest, $this->source, $destX, $destY, $srcX, $srcY, $destWidth, $destHeight, $srcWidth, $srcHeight);
} }
public function thumb($mode, $width, $height = null, $color = null) { public function thumb($mode, $width, $height = null, $color = null) {
if ($height === null) { if ($height === null) {
$height = $width; $height = $width;
} }
if ($mode === "square") { if ($mode === "square") {
$this->squareThumb($width); $this->squareThumb($width);
} elseif ($mode === "rational") { } elseif ($mode === "rational") {
$this->rationalThumb($width, $height); $this->rationalThumb($width, $height);
} elseif ($mode === "center") { } elseif ($mode === "center") {
$this->centerThumb($width, $height, $color); $this->centerThumb($width, $height, $color);
} else { } else {
$this->freeThumb($width, $height); $this->freeThumb($width, $height);
} }
} }
public function squareThumb($width) { public function squareThumb($width) {
$a = min($this->width, $this->height); $a = min($this->width, $this->height);
$x = intval(($this->width - $a) / 2); $x = intval(($this->width - $a) / 2);
$y = intval(($this->height - $a) / 2); $y = intval(($this->height - $a) / 2);
$this->magic(0, 0, $x, $y, $width, $width, $a, $a); $this->magic(0, 0, $x, $y, $width, $width, $a, $a);
} }
public function rationalThumb($width, $height) { public function rationalThumb($width, $height) {
$r = 1.0 * $this->width / $this->height; $r = 1.0 * $this->width / $this->height;
$h = $height; $h = $height;
$w = $r * $h; $w = $r * $h;
if ($w > $width) { if ($w > $width) {
$w = $width; $w = $width;
$h = 1.0 / $r * $w; $h = 1.0 / $r * $w;
} }
$w = intval($w); $w = intval($w);
$h = intval($h); $h = intval($h);
$this->magic(0, 0, 0, 0, $w, $h, $this->width, $this->height); $this->magic(0, 0, 0, 0, $w, $h, $this->width, $this->height);
} }
public function centerThumb($width, $height, $color = null) { public function centerThumb($width, $height, $color = null) {
$r = 1.0 * $this->width / $this->height; $r = 1.0 * $this->width / $this->height;
$h = $height; $h = $height;
$w = $r * $h; $w = $r * $h;
if ($w > $width) { if ($w > $width) {
$w = $width; $w = $width;
$h = 1.0 / $r * $w; $h = 1.0 / $r * $w;
} }
$w = intval($w); $w = intval($w);
$h = intval($h); $h = intval($h);
$x = intval(($width - $w) / 2); $x = intval(($width - $w) / 2);
$y = intval(($height - $h) / 2); $y = intval(($height - $h) / 2);
$this->magic($x, $y, 0, 0, $w, $h, $this->width, $this->height, $width, $height, $color); $this->magic($x, $y, 0, 0, $w, $h, $this->width, $this->height, $width, $height, $color);
} }
public function freeThumb($width, $height) { public function freeThumb($width, $height) {
$w = intval($width); $w = intval($width);
$h = intval($height); $h = intval($height);
$this->magic(0, 0, 0, 0, $w, $h, $this->width, $this->height); $this->magic(0, 0, 0, 0, $w, $h, $this->width, $this->height);
} }
} }
?> ?>

View File

@@ -5,55 +5,55 @@ require_once "Image.php";
class Thumbnail { class Thumbnail {
private $srcAbsHref, $srcAbsPath, $width, $height, $name, $href, $path; private $srcAbsHref, $srcAbsPath, $width, $height, $name, $href, $path;
public static function isUsable() { public static function isUsable() {
return Image::isUsable(); return Image::isUsable();
} }
public function __construct($h5ai, $absHref, $mode, $width, $height) { public function __construct($h5ai, $absHref, $mode, $width, $height) {
$this->h5ai = $h5ai; $this->h5ai = $h5ai;
$this->srcAbsHref = $absHref; $this->srcAbsHref = $absHref;
$this->srcAbsPath = $this->h5ai->getDocRoot() . urldecode($absHref); $this->srcAbsPath = $this->h5ai->getDocRoot() . urldecode($absHref);
$this->width = $width; $this->width = $width;
$this->height = $height; $this->height = $height;
$this->mode = $mode; $this->mode = $mode;
$this->name = sha1("$this->srcAbsPath-$this->width-$this->height-$this->mode"); $this->name = sha1("$this->srcAbsPath-$this->width-$this->height-$this->mode");
$this->href = $this->h5ai->getH5aiAbsHref() . "/cache/thumb-" . $this->name . ".jpg"; $this->href = $this->h5ai->getH5aiAbsHref() . "/cache/thumb-" . $this->name . ".jpg";
$this->path = $this->h5ai->getDocRoot() . $this->href; $this->path = $this->h5ai->getDocRoot() . $this->href;
$this->liveHref = $this->h5ai->api() . "?action=thumb&href=" . $this->srcAbsHref . "&width=" . $this->width . "&height=" . $this->height . "&mode=" . $this->mode; $this->liveHref = $this->h5ai->api() . "?action=thumb&href=" . $this->srcAbsHref . "&width=" . $this->width . "&height=" . $this->height . "&mode=" . $this->mode;
} }
public function create($force = 0) { public function create($force = 0) {
if ( if (
$force === 2 $force === 2
|| ($force === 1 && !file_exists($this->path)) || ($force === 1 && !file_exists($this->path))
|| (file_exists($this->path) && filemtime($this->srcAbsPath) >= filemtime($this->path)) || (file_exists($this->path) && filemtime($this->srcAbsPath) >= filemtime($this->path))
) { ) {
$image = new Image(); $image = new Image();
$image->setSource($this->srcAbsPath); $image->setSource($this->srcAbsPath);
$image->thumb($this->mode, $this->width, $this->height); $image->thumb($this->mode, $this->width, $this->height);
$image->saveDest($this->path); $image->saveDest($this->path);
} }
} }
public function getHref() { public function getHref() {
return $this->href; return $this->href;
} }
public function getPath() { public function getPath() {
return $this->path; return $this->path;
} }
public function getLiveHref() { public function getLiveHref() {
return $this->liveHref; return $this->liveHref;
} }
} }
?> ?>

View File

@@ -1,146 +1,146 @@
<?php <?php
class TreeEntry { class TreeEntry {
private $h5ai, $label, $absPath, $absHref, $isFolder, $type, $content; private $h5ai, $label, $absPath, $absHref, $isFolder, $type, $content;
public function __construct($h5ai, $absPath, $absHref, $type = null) { public function __construct($h5ai, $absPath, $absHref, $type = null) {
$this->h5ai = $h5ai; $this->h5ai = $h5ai;
$this->label = $this->h5ai->getLabel($absHref); $this->label = $this->h5ai->getLabel($absHref);
$this->absPath = $this->h5ai->normalizePath($absPath, false); $this->absPath = $this->h5ai->normalizePath($absPath, false);
$this->isFolder = is_dir($this->absPath); $this->isFolder = is_dir($this->absPath);
$this->absHref = $this->h5ai->normalizePath($absHref, $this->isFolder); $this->absHref = $this->h5ai->normalizePath($absHref, $this->isFolder);
$this->type = $type !== null ? $type : ($this->isFolder ? "folder" : $this->h5ai->getType($this->absPath)); $this->type = $type !== null ? $type : ($this->isFolder ? "folder" : $this->h5ai->getType($this->absPath));
$this->content = null; $this->content = null;
} }
public function loadContent() { public function loadContent() {
$this->content = array(); $this->content = array();
if ($this->h5ai->getHttpCode($this->absHref) !== "h5ai") { if ($this->h5ai->getHttpCode($this->absHref) !== "h5ai") {
return; return;
} }
$files = $this->h5ai->readDir($this->absPath); $files = $this->h5ai->readDir($this->absPath);
foreach ($files as $file) { foreach ($files as $file) {
$tree = new TreeEntry($this->h5ai, $this->absPath . "/" . $file, $this->absHref . rawurlencode($file)); $tree = new TreeEntry($this->h5ai, $this->absPath . "/" . $file, $this->absHref . rawurlencode($file));
if ($tree->isFolder) { if ($tree->isFolder) {
$this->content[$tree->absPath] = $tree; $this->content[$tree->absPath] = $tree;
} }
} }
$this->sort(); $this->sort();
} }
public function cmpTrees($t1, $t2) { public function cmpTrees($t1, $t2) {
if ($t1->isFolder && !$t2->isFolder) { if ($t1->isFolder && !$t2->isFolder) {
return -1; return -1;
} }
if (!$t1->isFolder && $t2->isFolder) { if (!$t1->isFolder && $t2->isFolder) {
return 1; return 1;
} }
return strcasecmp($t1->absPath, $t2->absPath); return strcasecmp($t1->absPath, $t2->absPath);
} }
public function sort() { public function sort() {
if ($this->content !== null) { if ($this->content !== null) {
uasort($this->content, array($this, "cmpTrees")); uasort($this->content, array($this, "cmpTrees"));
} }
} }
public function toHtml() { public function toHtml() {
$classes = "entry " . $this->type . ($this->absHref === $this->h5ai->getAbsHref() ? " current" : ""); $classes = "entry " . $this->type . ($this->absHref === $this->h5ai->getAbsHref() ? " current" : "");
$icon = $this->type; $icon = $this->type;
if ($this->absHref === "/") { if ($this->absHref === "/") {
$icon = "folder-home"; $icon = "folder-home";
} }
$hint = ""; $hint = "";
$code = "h5ai"; $code = "h5ai";
if ($this->isFolder) { if ($this->isFolder) {
$code = $this->h5ai->getHttpCode($this->absHref); $code = $this->h5ai->getHttpCode($this->absHref);
$classes .= " checkedHttpCode"; $classes .= " checkedHttpCode";
if ($code !== "h5ai") { if ($code !== "h5ai") {
if ($code === 200) { if ($code === 200) {
$icon = "folder-page"; $icon = "folder-page";
$hint = "<span class='hint'><img src='" . $this->h5ai->image("page") . "' alt='page' /></span>"; $hint = "<span class='hint'><img src='" . $this->h5ai->image("page") . "' alt='page' /></span>";
} else { } else {
$classes .= " error"; $classes .= " error";
$hint = "<span class='hint'> " . $code . " </span>"; $hint = "<span class='hint'> " . $code . " </span>";
} }
} }
} }
$html = "<div class='" . $classes ."'>\n"; $html = "<div class='" . $classes ."'>\n";
if ($this->content !== null && count($this->content) === 0 || $code !== "h5ai") { if ($this->content !== null && count($this->content) === 0 || $code !== "h5ai") {
$html .= "<span class='blank'></span>\n"; $html .= "<span class='blank'></span>\n";
} else { } else {
$indicatorState = $this->content === null ? " unknown" : " open"; $indicatorState = $this->content === null ? " unknown" : " open";
$html .= "<span class='indicator" . $indicatorState . "'><img src='" . $this->h5ai->image("tree") . "' alt='>' /></span>\n"; $html .= "<span class='indicator" . $indicatorState . "'><img src='" . $this->h5ai->image("tree") . "' alt='>' /></span>\n";
} }
$html .= "<a href='" . $this->absHref . "'>\n"; $html .= "<a href='" . $this->absHref . "'>\n";
$html .= "<span class='icon'><img src='" . $this->h5ai->icon($icon) . "' alt='" . $icon . "' /></span>\n"; $html .= "<span class='icon'><img src='" . $this->h5ai->icon($icon) . "' alt='" . $icon . "' /></span>\n";
$html .= "<span class='label'>" . $this->label . "</span>" . $hint . "\n"; $html .= "<span class='label'>" . $this->label . "</span>" . $hint . "\n";
$html .= "</a>\n"; $html .= "</a>\n";
$html .= $this->contentToHtml(); $html .= $this->contentToHtml();
$html .= "</div>\n"; $html .= "</div>\n";
return $html; return $html;
} }
public function contentToHtml() { public function contentToHtml() {
$html = "<ul class='content'>\n"; $html = "<ul class='content'>\n";
if ($this->content !== null) { if ($this->content !== null) {
foreach($this->content as $tree) { foreach($this->content as $tree) {
$html .= "<li>" . $tree->toHtml() . "</li>"; $html .= "<li>" . $tree->toHtml() . "</li>";
} }
} }
$html .= "</ul>\n"; $html .= "</ul>\n";
return $html; return $html;
} }
public function getRoot() { public function getRoot() {
if ($this->absHref === "/") { if ($this->absHref === "/") {
return $this; return $this;
}; };
$tree = new TreeEntry($this->h5ai, dirname($this->absPath), dirname($this->absHref)); $tree = new TreeEntry($this->h5ai, dirname($this->absPath), dirname($this->absHref));
$tree->loadContent(); $tree->loadContent();
$tree->content[$this->absPath] = $this; $tree->content[$this->absPath] = $this;
return $tree->getRoot(); return $tree->getRoot();
} }
} }
class Tree { class Tree {
private $h5ai; private $h5ai;
public function __construct($h5ai) { public function __construct($h5ai) {
$this->h5ai = $h5ai; $this->h5ai = $h5ai;
} }
public function toHtml() { public function toHtml() {
$options = $this->h5ai->getOptions(); $options = $this->h5ai->getOptions();
if ($options["showTree"] === false) { if ($options["showTree"] === false) {
return ""; return "";
} }
$tree = new TreeEntry($this->h5ai, $this->h5ai->getAbsPath(), $this->h5ai->getAbsHref()); $tree = new TreeEntry($this->h5ai, $this->h5ai->getAbsPath(), $this->h5ai->getAbsHref());
$tree->loadContent(); $tree->loadContent();
$root = $tree->getRoot(); $root = $tree->getRoot();
return "<section id='tree'>\n" . $root->toHtml() . "</section>\n"; return "<section id='tree'>\n" . $root->toHtml() . "</section>\n";
} }
} }

View File

@@ -1,63 +1,63 @@
<?php <?php
class ZipIt { class ZipIt {
private $h5ai; private $h5ai;
public function __construct($h5ai) { public function __construct($h5ai) {
$this->h5ai = $h5ai; $this->h5ai = $h5ai;
} }
public function zip($hrefs) { public function zip($hrefs) {
$zipFile = tempnam("/tmp", "h5ai-download"); $zipFile = tempnam("/tmp", "h5ai-download");
$zip = new ZipArchive(); $zip = new ZipArchive();
if (!$zip->open($zipFile, ZIPARCHIVE::CREATE)) { if (!$zip->open($zipFile, ZIPARCHIVE::CREATE)) {
return false; return false;
} }
foreach ($hrefs as $href) { foreach ($hrefs as $href) {
$d = dirname($href); $d = dirname($href);
$n = basename($href); $n = basename($href);
if ($this->h5ai->getHttpCode($this->h5ai->getAbsHref($d)) === "h5ai" && !$this->h5ai->ignoreThisFile($n)) { if ($this->h5ai->getHttpCode($this->h5ai->getAbsHref($d)) === "h5ai" && !$this->h5ai->ignoreThisFile($n)) {
$localFile = $this->h5ai->getAbsPath($href); $localFile = $this->h5ai->getAbsPath($href);
$file = preg_replace("!^" . $this->h5ai->getDocRoot() . "!", "", $localFile); $file = preg_replace("!^" . $this->h5ai->getDocRoot() . "!", "", $localFile);
if (is_dir($localFile)) { if (is_dir($localFile)) {
$this->zipDir($zip, $localFile, $file); $this->zipDir($zip, $localFile, $file);
} else { } else {
$this->zipFile($zip, $localFile, $file); $this->zipFile($zip, $localFile, $file);
} }
} }
} }
$zip->close(); $zip->close();
return $zipFile; return $zipFile;
} }
private function zipFile($zip, $localFile, $file) { private function zipFile($zip, $localFile, $file) {
if (is_readable($localFile)) { if (is_readable($localFile)) {
$zip->addFile($localFile, $file); $zip->addFile($localFile, $file);
} }
} }
private function zipDir($zip, $localDir, $dir) { private function zipDir($zip, $localDir, $dir) {
if ($this->h5ai->getHttpCode($this->h5ai->getAbsHref($localDir)) === "h5ai") { if ($this->h5ai->getHttpCode($this->h5ai->getAbsHref($localDir)) === "h5ai") {
$zip->addEmptyDir($dir); $zip->addEmptyDir($dir);
$files = $this->h5ai->readDir($localDir); $files = $this->h5ai->readDir($localDir);
foreach ($files as $file) { foreach ($files as $file) {
$localFile = $localDir . "/" . $file; $localFile = $localDir . "/" . $file;
$file = $dir . "/" . $file; $file = $dir . "/" . $file;
if (is_dir($localFile)) { if (is_dir($localFile)) {
$this->zipDir($zip, $localFile, $file); $this->zipDir($zip, $localFile, $file);
} else { } else {
$this->zipFile($zip, $localFile, $file); $this->zipFile($zip, $localFile, $file);
} }
} }
} }
} }
} }
?> ?>

View File

@@ -1,40 +1,40 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<project name="wepp.macros" basedir="."> <project name="wepp.macros" basedir=".">
<macrodef name="wepp"> <macrodef name="wepp">
<attribute name="file" /> <attribute name="file" />
<attribute name="toFile" /> <attribute name="toFile" />
<attribute name="args" default="" /> <attribute name="args" default="" />
<sequential> <sequential>
<exec executable="${tool.wepp}"> <exec executable="${tool.wepp}">
<arg line="@{args}" /> <arg line="@{args}" />
<arg value="--in" /> <arg value="--in" />
<arg value="@{file}" /> <arg value="@{file}" />
<arg value="--out" /> <arg value="--out" />
<arg value="@{toFile}" /> <arg value="@{toFile}" />
</exec> </exec>
</sequential> </sequential>
</macrodef> </macrodef>
<macrodef name="wepp.dir"> <macrodef name="wepp.dir">
<attribute name="dir" /> <attribute name="dir" />
<attribute name="args" default="" /> <attribute name="args" default="" />
<sequential> <sequential>
<exec executable="${tool.wepp}"> <exec executable="${tool.wepp}">
<arg line="@{args}" /> <arg line="@{args}" />
<arg value="--inDir" /> <arg value="--inDir" />
<arg value="@{dir}" /> <arg value="@{dir}" />
<arg value="--outDir" /> <arg value="--outDir" />
<arg value="@{dir}" /> <arg value="@{dir}" />
</exec> </exec>
<delete dir="@{dir}/inc"> <delete dir="@{dir}/inc">
<fileset <fileset
dir="." dir="."
includes="@{dir}/**/*.less" includes="@{dir}/**/*.less"
excludes="@{dir}/inc/**,@{dir}/lib/**" excludes="@{dir}/inc/**,@{dir}/lib/**"
/> />
</delete> </delete>
</sequential> </sequential>
</macrodef> </macrodef>
</project> </project>