Add page indexer
|
@ -0,0 +1 @@
|
|||
DirectoryIndex /_h5ai/public/index.php
|
|
@ -0,0 +1,165 @@
|
|||
## details here: https://github.com/h5bp/server-configs-apache
|
||||
|
||||
|
||||
|
||||
## SECURITY ###################################################################
|
||||
|
||||
DirectoryIndex disabled
|
||||
FileETag None
|
||||
ServerSignature Off
|
||||
|
||||
# Apache < 2.3
|
||||
<IfModule !mod_authz_core.c>
|
||||
Order allow,deny
|
||||
Deny from all
|
||||
Satisfy All
|
||||
</IfModule>
|
||||
|
||||
# Apache ≥ 2.3
|
||||
<IfModule mod_authz_core.c>
|
||||
Require all denied
|
||||
</IfModule>
|
||||
|
||||
<IfModule mod_headers.c>
|
||||
Header set X-Content-Type-Options "nosniff"
|
||||
Header unset ETag
|
||||
Header unset X-Powered-By
|
||||
</IfModule>
|
||||
|
||||
<IfModule mod_autoindex.c>
|
||||
Options -Indexes
|
||||
</IfModule>
|
||||
|
||||
|
||||
|
||||
## COMPAT #####################################################################
|
||||
|
||||
AddDefaultCharset utf-8
|
||||
|
||||
<IfModule mod_mime.c>
|
||||
AddCharset utf-8 .css .html .js .json .php .svg
|
||||
|
||||
AddType application/font-woff woff
|
||||
AddType application/font-woff2 woff2
|
||||
AddType application/json json
|
||||
AddType application/javascript js
|
||||
AddType application/vnd.ms-fontobject eot
|
||||
AddType application/x-font-ttf ttc ttf
|
||||
AddType image/jpeg jpeg jpg
|
||||
AddType image/png png
|
||||
AddType image/svg+xml svg svgz
|
||||
AddType image/x-icon ico
|
||||
AddType font/opentype otf
|
||||
AddType text/css css
|
||||
AddType text/html html
|
||||
</IfModule>
|
||||
|
||||
|
||||
|
||||
## SPEED ######################################################################
|
||||
|
||||
<IfModule mod_expires.c>
|
||||
ExpiresActive on
|
||||
ExpiresDefault "access plus 1 month"
|
||||
|
||||
ExpiresByType application/json "access plus 0 seconds"
|
||||
|
||||
ExpiresByType text/html "access plus 1 minute"
|
||||
|
||||
ExpiresByType image/x-icon "access plus 1 week"
|
||||
|
||||
ExpiresByType application/javascript "access plus 1 year"
|
||||
ExpiresByType image/jpeg "access plus 1 year"
|
||||
ExpiresByType image/png "access plus 1 year"
|
||||
ExpiresByType image/svg+xml "access plus 1 year"
|
||||
ExpiresByType text/css "access plus 1 year"
|
||||
</IfModule>
|
||||
|
||||
<IfModule mod_deflate.c>
|
||||
<IfModule mod_setenvif.c>
|
||||
<IfModule mod_headers.c>
|
||||
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
|
||||
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
|
||||
</IfModule>
|
||||
</IfModule>
|
||||
|
||||
# Apache ≥ 2.3
|
||||
<IfModule mod_authz_core.c>
|
||||
# mod_filter as module only available for Apache ≥ 2.3.7
|
||||
<IfModule mod_filter.c>
|
||||
AddOutputFilterByType DEFLATE "application/atom+xml" \
|
||||
"application/javascript" \
|
||||
"application/json" \
|
||||
"application/ld+json" \
|
||||
"application/manifest+json" \
|
||||
"application/rdf+xml" \
|
||||
"application/rss+xml" \
|
||||
"application/schema+json" \
|
||||
"application/vnd.geo+json" \
|
||||
"application/vnd.ms-fontobject" \
|
||||
"application/x-font-ttf" \
|
||||
"application/x-javascript" \
|
||||
"application/x-web-app-manifest+json" \
|
||||
"application/xhtml+xml" \
|
||||
"application/xml" \
|
||||
"font/eot" \
|
||||
"font/opentype" \
|
||||
"image/bmp" \
|
||||
"image/svg+xml" \
|
||||
"image/vnd.microsoft.icon" \
|
||||
"image/x-icon" \
|
||||
"text/cache-manifest" \
|
||||
"text/css" \
|
||||
"text/html" \
|
||||
"text/javascript" \
|
||||
"text/plain" \
|
||||
"text/vcard" \
|
||||
"text/vnd.rim.location.xloc" \
|
||||
"text/vtt" \
|
||||
"text/x-component" \
|
||||
"text/x-cross-domain-policy" \
|
||||
"text/xml"
|
||||
</IfModule>
|
||||
</IfModule>
|
||||
|
||||
# Apache < 2.3
|
||||
<IfModule !mod_authz_core.c>
|
||||
AddOutputFilterByType DEFLATE "application/atom+xml" \
|
||||
"application/javascript" \
|
||||
"application/json" \
|
||||
"application/ld+json" \
|
||||
"application/manifest+json" \
|
||||
"application/rdf+xml" \
|
||||
"application/rss+xml" \
|
||||
"application/schema+json" \
|
||||
"application/vnd.geo+json" \
|
||||
"application/vnd.ms-fontobject" \
|
||||
"application/x-font-ttf" \
|
||||
"application/x-javascript" \
|
||||
"application/x-web-app-manifest+json" \
|
||||
"application/xhtml+xml" \
|
||||
"application/xml" \
|
||||
"font/eot" \
|
||||
"font/opentype" \
|
||||
"image/bmp" \
|
||||
"image/svg+xml" \
|
||||
"image/vnd.microsoft.icon" \
|
||||
"image/x-icon" \
|
||||
"text/cache-manifest" \
|
||||
"text/css" \
|
||||
"text/html" \
|
||||
"text/javascript" \
|
||||
"text/plain" \
|
||||
"text/vcard" \
|
||||
"text/vnd.rim.location.xloc" \
|
||||
"text/vtt" \
|
||||
"text/x-component" \
|
||||
"text/x-cross-domain-policy" \
|
||||
"text/xml"
|
||||
</IfModule>
|
||||
|
||||
<IfModule mod_mime.c>
|
||||
AddEncoding gzip gz
|
||||
AddEncoding gzip svgz
|
||||
</IfModule>
|
||||
</IfModule>
|
|
@ -0,0 +1,598 @@
|
|||
# Changelog
|
||||
|
||||
|
||||
## v0.29.2 - *2019-03-22*
|
||||
|
||||
* update `babel-loader` to 7.1.1
|
||||
* update `eslint` to 5.15.3
|
||||
* update `ghu` to 0.13.0
|
||||
* update `jsdom` to 14.0.0
|
||||
* update `kjua` to 0.2.0
|
||||
* update `lolight` to 1.0.0
|
||||
* update `scar` to 1.2.0
|
||||
|
||||
|
||||
## v0.29.1 - *2019-01-20*
|
||||
|
||||
* replace `babel-preset-es2015` with `babel-preset-env`
|
||||
* update `eslint` to 5.14.1
|
||||
* update `ghu` to 0.12.0
|
||||
* update `jsdom` to 9.2.0
|
||||
* update `kjua` to 0.1.2
|
||||
* update `lolight` to 0.6.0
|
||||
* update `marked` to 0.6.1
|
||||
* update `normalize.css` to 8.0.1
|
||||
* update `scar` to 1.0.0
|
||||
|
||||
|
||||
## v0.29.0 - *2016-08-12*
|
||||
|
||||
* back to cleaner visual experience
|
||||
* add option to disable sidebar
|
||||
* add options to filter/search ignore case
|
||||
* replace PHP `getenv` calls with `$_SERVER` lookups
|
||||
* add `view.fallbackMode` option to generally serve only fallback mode
|
||||
* serve fallback mode for text browsers (`curl`, `links`, `lynx`, `w3m`)
|
||||
* change type `txt-svg` to `img-svg`, no thumbs but preview
|
||||
* fix a tree indentation glitch
|
||||
* fix shell command detection on Windows
|
||||
* fix Piwik anayltics
|
||||
* fix `.htaccess` auth issues
|
||||
* fix drag-select on scrollable content
|
||||
* fix download-all function
|
||||
* fix audio and video preview loading
|
||||
* fix thumbnail request issues
|
||||
* add `rust` type and icon
|
||||
* add `autoplay` option to audio and video preview
|
||||
* add `--dereference` to `shell-du` to follow sym links
|
||||
* remove *Install* section from `README.md`, causes too much trouble
|
||||
* remove peer5 support
|
||||
* update build process to use `node 6.0+`, no need for babel now
|
||||
* replace `jquery-qrcode` with [`kjua`](https://larsjung.de/kjua/)
|
||||
* replace `prism` with [`lolight`](https://larsjung.de/lolight/)
|
||||
* move deps to `package.json` (`normalize.css`, `kjua`, `lolight` and `marked`)
|
||||
* remove `jQuery`
|
||||
* remove `lodash`
|
||||
* remove [`modulejs`](https://larsjung.de/modulejs/) for now
|
||||
* reduce JS code by 60% (~250kb -> ~100kb)
|
||||
* update languages (`et`, `nl`, `pl`)
|
||||
|
||||
|
||||
## v0.28.0 - *2015-12-19*
|
||||
|
||||
* now require PHP 5.5.0+
|
||||
* change index path to `/_h5ai/public/index.php`
|
||||
* now only `/_h5ai/public/` needs to be web-accessible
|
||||
* add support for custom script and style additions
|
||||
* add options to set font families
|
||||
* add search
|
||||
* add ignorecase sorting option to tree
|
||||
* add wide links in tree view
|
||||
* add IE edge mode
|
||||
* add frontend tests
|
||||
* fix some styles in IE10
|
||||
* fix preview bottom bar for small screen widths
|
||||
* lots of code cleanup and refactorings
|
||||
* change API
|
||||
* update build process, now uses [`ghu`](https://larsjung.de/ghu/)
|
||||
* switch from jshint and jscs to [`eslint`](http://eslint.org/)
|
||||
* update `jQuery` to 2.1.4
|
||||
* update `lodash` to 3.9.3 (add debounce and trim)
|
||||
* update `marked` to 0.3.5
|
||||
* update `modulejs` to 1.13.0
|
||||
* update `prism` to 2015-12-19
|
||||
* update h5bp styles to 5.2.0
|
||||
* update `normalize.css` to 3.0.3
|
||||
* remove `Moment.js`
|
||||
|
||||
|
||||
## v0.27.0 - *2015-04-06*
|
||||
|
||||
* new layout
|
||||
* add editorconfig
|
||||
* drop support for IE9 (gets fallback)
|
||||
* update sidebar settings
|
||||
* add info sidebar
|
||||
* add opt-out for click'n'drag selection
|
||||
* add package name option for single selections
|
||||
* add initial support for Peer5
|
||||
* add option to down-sample images for preview
|
||||
* add option for natural sorting in tree sidebar
|
||||
* fix problems with files/folders named `0`
|
||||
* change font from `Ubuntu` to `Roboto` (smaller footprint, clearer for small sizes)
|
||||
* switch back to Google Fonts
|
||||
* improve PDF thumbnail quality
|
||||
* improve drag-select
|
||||
* improve image preview
|
||||
* prevent listing `_h5ai` folder and subfolders
|
||||
* update build process, now uses [`mkr`](https://larsjung.de/mkr/) and [`fQuery`](https://larsjung.de/fquery/)
|
||||
* update `jQuery` to 2.1.3
|
||||
* update `jQuery.qrcode` to 0.11.0
|
||||
* update `Lo-Dash` to 3.6.0
|
||||
* update `Modernizr` to 2.8.3
|
||||
* update `modulejs` to 1.4.0
|
||||
* update `Moment.js` to 2.9.0
|
||||
* update `Prism` to 2015-04-05
|
||||
* remove deprecated Google Analytics code
|
||||
* remove `jQuery.fracs`
|
||||
* remove `jQuery.scrollpanel`
|
||||
* remove `jQuery.mousewheel`
|
||||
* update languages (`af`, `es`, `ja`, `ko`, `ru`, `zh-cn`)
|
||||
|
||||
|
||||
## v0.26.1 - *2014-08-17*
|
||||
|
||||
* fix links
|
||||
|
||||
|
||||
## v0.26.0 - *2014-08-16*
|
||||
|
||||
* remove True Type fonts
|
||||
* outsource themes to [h5ai-themes](https://github.com/lrsjng/h5ai-themes)
|
||||
* add filesize fallback for large files and 32bit PHP
|
||||
* fix server detection
|
||||
* add config file tests to info page
|
||||
* remove JSON shim
|
||||
* add caching of command checks
|
||||
* update `jQuery.mousewheel` to 3.1.12
|
||||
* update `jQuery.qrcode` to 0.8.0
|
||||
* replace `markdown` with [`marked`](https://github.com/chjj/marked) 0.3.2
|
||||
* update `modulejs` to 0.4.5
|
||||
* update `Moment.js` to 2.8.1
|
||||
* replace `underscore` with [`Lo-Dash`](https://github.com/lodash/lodash) 2.4.1
|
||||
* replace `SyntaxHighlighter` with [`Prism`](http://prismjs.com) 2014-08-04
|
||||
|
||||
|
||||
## v0.25.2 - *2014-07-01*
|
||||
|
||||
* add optional info page protection
|
||||
* fix `short_open_tag` issues for PHP < 5.4.0
|
||||
* fix default folder download (`alwaysVisible` option)
|
||||
* minor fixes
|
||||
|
||||
|
||||
## v0.25.1 - *2014-06-25*
|
||||
|
||||
* fix broken paths for filenames containing '+' characters
|
||||
* fix Google Universal Analytics
|
||||
* fix file type check
|
||||
|
||||
|
||||
## v0.25.0 - *2014-06-22*
|
||||
|
||||
* add sidebar
|
||||
* add initial theme support
|
||||
* add icons from [Evolvere Icon Theme](http://franksouza183.deviantart.com/art/Evolvere-Icon-theme-440718295)
|
||||
* add PHP variant to calc folder sizes
|
||||
* add scroll position reset on location change (issue [#279](https://github.com/lrsjng/h5ai/issues/279))
|
||||
* add option to hide unreadable files
|
||||
* add option where to place folders (top, inplace, bottom)
|
||||
* add markdown support for custom header and footer files
|
||||
* add video and audio preview via HTML5 elements (no fallback, works best in Chrome)
|
||||
* add filter reset on location change
|
||||
* add option to make download button always visible
|
||||
* add Google UA support
|
||||
* extend selectable icon sizes (add 128px, 192px, 256px, 384px)
|
||||
* improve preview GUI
|
||||
* disable thumbs in `cache` folder
|
||||
* fix QR code URI origin (issue [#287](https://github.com/lrsjng/h5ai/issues/287))
|
||||
* replace PHP backtick operator with `exec`
|
||||
* remove server side file manipulation extensions `dropbox`, `delete` and `rename`
|
||||
* update `H5BP` to 4.3.0
|
||||
* update `jQuery` to 2.1.1
|
||||
* update `json2.js` to 2014-02-04
|
||||
* update `markdown-js` to 0.5.0
|
||||
* update `Modernizr` to 2.8.2
|
||||
* update `Moment.js` to 2.6.0
|
||||
* update `Underscore.js` to 1.6.0
|
||||
* update languages (`bg`, `ko`, `pt`, `sl`, `sv`, `zh-cn`)
|
||||
|
||||
|
||||
## v0.24.1 - *2014-04-09*
|
||||
|
||||
* security fixes! (issues [#268](https://github.com/lrsjng/h5ai/issues/268), [#269](https://github.com/lrsjng/h5ai/issues/269))
|
||||
* fix WinOS command detection
|
||||
* update languages (`fi`, `fr`, `hi`, `it`, `zh-tw`)
|
||||
|
||||
|
||||
## v0.24.0 - *2013-09-04*
|
||||
|
||||
* updates image and text preview
|
||||
* adds variable icon sizes
|
||||
* adds optional natural sort of items
|
||||
* adds optional checkboxes to select items
|
||||
* adds text preview modes: none, fixed, markdown
|
||||
* optionally hide folders in main view
|
||||
* makes use of EXIF thumbnails optional
|
||||
* fixes file deletion of multiple files
|
||||
* fixes `setParentFolderLabels = false`
|
||||
* fixes shell-arg and RegExp escape issues
|
||||
* cleans code
|
||||
* updates info page `/_h5ai`
|
||||
* adds `aiff` to `audio` types
|
||||
* adds `da` translation by Ronnie Milbo
|
||||
* updates to `pl` translation by Mark
|
||||
|
||||
|
||||
## v0.23.0 - *2013-07-21*
|
||||
|
||||
* removes `aai` mode!
|
||||
* drops support for IE7+8 (simple fallback, same as no javascript)
|
||||
* uses History API if available (way faster browsing)
|
||||
* faster thumbnail generation if EXIF thumbnails available
|
||||
* adds optional custom headers/footers that are propageted to all subfolders
|
||||
* optional hide parent folder links
|
||||
* some fixes on previews
|
||||
* speeds up packaged downloads
|
||||
* add line wrap and line highlighting (on hover) to text preview
|
||||
* new design (colors, images)
|
||||
* now uses scalable images for the interface
|
||||
* fixes filter (ignore parent folder, display of `no match`)
|
||||
* lots of small fixes
|
||||
* updates `H5BP` to 4.2.0
|
||||
* updates `jQuery` to 2.0.3
|
||||
* updates `jQuery.mousewheel` to 3.1.3
|
||||
* updates `Moment.js` to 2.1.0
|
||||
* updates `markdown-js` to 0.4.0-9c21acdf08
|
||||
* updates `json2.js` to 2013-05-26
|
||||
* adds `uk` translation by Viktor Matveenko
|
||||
* updates to `pl` translation by Mark
|
||||
|
||||
|
||||
## v0.22.1 - *2012-10-16*
|
||||
|
||||
* bug fix concerning API requests in PHP mode
|
||||
* minor changes in responsive styles
|
||||
|
||||
|
||||
## v0.22 - *2012-10-14*
|
||||
|
||||
* general changes h5ai directory layout and configuration
|
||||
* splits configuration file (`config.json`) into files `options.json`, `types.json` and `langs.json`
|
||||
* localization now in separate files
|
||||
* adds auto-refresh
|
||||
* adds drag'n'drop upload (PHP, experimental)
|
||||
* adds file deletion (PHP, experimental)
|
||||
* cleans and improves PHP code
|
||||
* PHP no longer respects htaccess restrictions (so be careful)
|
||||
* PHP ignore patterns might include paths now
|
||||
* improves separation between aai and php mode
|
||||
* improves performance in aai mode
|
||||
* adds optional binary prefixes for file sizes
|
||||
* improves filter: autofocus on keypress, clear on `ESC`
|
||||
* download packages now packaged relative to current folder
|
||||
* download package name changable
|
||||
* splits type `js` into `js` and `json`
|
||||
* prevents some errors with files > 2GB on 32bit OS
|
||||
* adds max subfolder size in tree view
|
||||
* adds ctrl-click file selection
|
||||
* adds Piwik analytics extension
|
||||
* temp download packages are now stored in the `cache`-folder and deleted as soon as possible
|
||||
* updates translations
|
||||
* adds `he` translation by [Tomer Cohen](https://github.com/tomer)
|
||||
* updates 3rd party libs
|
||||
|
||||
|
||||
## v0.21 - *2012-08-06*
|
||||
|
||||
* fixes misaligned image previews
|
||||
* adds no JavaScript fallback to PHP version
|
||||
* fixes duplicate tree entries and empty main views
|
||||
* adds Google Analytics support (async)
|
||||
* improves filter (now ignorecase, now only checks if chars in right order)
|
||||
* adds keyboard support to image preview (space, enter, backspace, left, right, up, down, f, esc)
|
||||
* adds text file preview and highlighting with [SyntaxHighlighter](http://alexgorbatchev.com/SyntaxHighlighter/) (same keys as img preview)
|
||||
* adds Markdown preview with [markdown-js](https://github.com/evilstreak/markdown-js)
|
||||
* adds new type `markdown`
|
||||
* changes language code `gr` to `el`
|
||||
* adds localization for filter placeholder
|
||||
* adds `hu` translation by [Rodolffo](https://github.com/Rodolffo)
|
||||
* updates to [jQuery.qrcode](https://larsjung.de/qrcode/) 0.2
|
||||
* updates to [jQuery.scrollpanel](https://larsjung.de/scrollpanel/) 0.1
|
||||
* updates to [modulejs](https://larsjung.de/modulejs/) 0.2
|
||||
* updates to [Moment.js](http://momentjs.com) 1.7.0
|
||||
* updates to [Underscore.js](http://underscorejs.org) 1.3.3
|
||||
|
||||
|
||||
## v0.20 - *2012-05-11*
|
||||
|
||||
* adds image preview
|
||||
* adds thumbnails for video and pdf
|
||||
* adds support for lighttpd, nginx and cherokee and maybe other webservers with PHP
|
||||
* adds folder size in PHP version via shell `du`
|
||||
* fixes some localization problems
|
||||
* updates info page at `/_h5ai/`
|
||||
* switches to JSHint
|
||||
|
||||
|
||||
## v0.19 - *2012-04-19*
|
||||
|
||||
* adds lots of config options
|
||||
* changes in `config.js` and `h5ai.htaccess`
|
||||
* fixes js problems in IE 7+8
|
||||
* hides broken tree view in IE < 9, adds a message to the footer
|
||||
* removes hash changes since they break logical browser history
|
||||
* fixes thumbnail size for portrait images in icon view
|
||||
* fixes problems with file type recognition
|
||||
* adds an info page at `/_h5ai/`
|
||||
* sort order is preserved while browsing
|
||||
* removes PHP error messages on thumbnail generation
|
||||
* fixes PHP some problems with packed download
|
||||
* adds support for tarred downloads
|
||||
* changes crumb image for folders with an index file
|
||||
* adds `index.php` to use h5ai in non-Apache environments
|
||||
* switches from [Datejs](http://www.datejs.com) to [Moment.js](http://momentjs.com)
|
||||
* adds [underscore.js](http://underscorejs.org)
|
||||
* fixes mousewheel problems, updates [jQuery.mousewheel](https://github.com/brandonaaron/jquery-mousewheel) to 3.0.6
|
||||
* updates `lv` translation
|
||||
* adds `ro` translation by [Jakob Cosoroabă](https://github.com/midday)
|
||||
* adds `ja` translation by [metasta](https://github.com/metasta)
|
||||
* adds `nb` translation by [Sindre Sorhus](https://github.com/sindresorhus)
|
||||
* adds `sr` translation by [vBm](https://github.com/vBm)
|
||||
* adds `gr` translation by [xhmikosr](https://github.com/xhmikosr)
|
||||
|
||||
|
||||
## v0.18 - *2012-02-24*
|
||||
|
||||
* adds optional QRCode display
|
||||
* adds optional filtering for displayed files and folders
|
||||
* updates design
|
||||
* improves zipped download
|
||||
* adds support for zipped download of htaccess restricted files
|
||||
* changes h5ai.htaccess
|
||||
* custom headers/footers are now optional and disabled by default
|
||||
* fixes problems with folder recognition in the JS version
|
||||
* fixes include problems in PHP version
|
||||
* fixes path problems on servers running on Windows in PHP version
|
||||
* fixes broken links in custom headers/footers while zipped download enabled
|
||||
* fixes problems with thumbnails for files with single or double quotes in filename
|
||||
* improves url hashes
|
||||
* updates year in `LICENSE.TXT`
|
||||
* updates es translation
|
||||
* adds `zh-tw` translation by [Yao Wei](https://github.com/medicalwei)
|
||||
* updates `zh-cn` translation
|
||||
|
||||
|
||||
## v0.17 - *2011-11-28*
|
||||
|
||||
* h5ai is now located in `_h5ai` to reduce collisions
|
||||
* switches from HTML5 Boilerplate reset to normalization
|
||||
* adds some style changes for small devices
|
||||
* configuration (options, types, translations) now via `config.js`
|
||||
* icons for JS version are now configured via `config.js`
|
||||
* sort order configuration changed
|
||||
* sorting is now done without page reload
|
||||
* adds `customHeader` and `customFooter` to `config.js`
|
||||
* supports restricted folders to some extent
|
||||
* some style changes on tree and language menu
|
||||
* fixes total file/folder count in status bar
|
||||
* adds support for use with userdir (requires some manual changes)
|
||||
|
||||
|
||||
## v0.16 - *2011-11-02*
|
||||
|
||||
* sorts translations in `options.js`
|
||||
* improves HTML head sections
|
||||
* refactors JavaScript and PHP a lot
|
||||
* improves/fixes file selection for zipped download
|
||||
* fixes scrollbar and header/footer link issues (didn't work when zipped download enabled)
|
||||
* adds support for ctrl-select
|
||||
* `dateFormat` in `options.js` changed, now affecting JS and PHP version
|
||||
* `dateFormat` is localizable by adding it to a translation in `options.js`
|
||||
* PHP version is now configurable via `php/config.php` (set custom doc root and other PHP related things)
|
||||
* image thumbs and zipped download is disabled by default now, but works fine if PHP is configured
|
||||
|
||||
|
||||
## v0.15.2 - *2011-09-18*
|
||||
|
||||
* adds `it` translation by [Salvo Gentile](https://github.com/SalvoGentile) and [Marco Patriarca](https://github.com/Fexys)
|
||||
* switches build process from scripp to wepp
|
||||
|
||||
|
||||
## v0.15.1 - *2011-09-06*
|
||||
|
||||
* fixes security issues with the zipped download feature
|
||||
* makes zipped download optional (but enabled by default)
|
||||
|
||||
|
||||
## v0.15 - *2011-09-04*
|
||||
|
||||
* adds zipped download for selected files
|
||||
* cleans and refactores
|
||||
|
||||
|
||||
## v0.14.1 - *2011-09-01*
|
||||
|
||||
* display meta information in bottom bar (icon view)
|
||||
* adds `zh-cn` translation by [Dongsheng Cai](https://github.com/dongsheng)
|
||||
* adds `pl` translation by Radosław Zając
|
||||
* adds `ru` translation by Богдан Илюхин
|
||||
|
||||
|
||||
## v0.14 - *2011-08-16*
|
||||
|
||||
* adds image thumbnails for PHP version
|
||||
* new option `slideTree` to turn off auto slide in
|
||||
|
||||
|
||||
## v0.13.2 - *2011-08-12*
|
||||
|
||||
* changes in `/h5ai/.htaccess` ... PHP configuration ...
|
||||
|
||||
|
||||
## v0.13.1 - *2011-08-12*
|
||||
|
||||
* fixes initial tree display
|
||||
* adds sort order option
|
||||
* adds/fixes some translations
|
||||
* adds `lv` translation by Sandis Veinbergs
|
||||
|
||||
|
||||
## v0.13 - *2011-08-06*
|
||||
|
||||
* adds PHP implementation! (should work with PHP 5.2+)
|
||||
* adds new options
|
||||
* changes layout of the bottom bar to display status information
|
||||
* adds language selector to the bottom bar
|
||||
* quotes keys in `options.js` to make it valid json
|
||||
* changes value of option `lang` from `undefined` to `null`
|
||||
* adds some new keys to `h5aiLangs`
|
||||
* adds browser caching rules for css and js
|
||||
* adds `pt` translation by [Jonnathan](https://github.com/jonnsl)
|
||||
* adds `bg` translation by George Andonov
|
||||
|
||||
|
||||
## v0.12.3 - *2011-07-30*
|
||||
|
||||
* adds `tr` translation by [Batuhan Icoz](https://github.com/batuhanicoz)
|
||||
|
||||
|
||||
## v0.12.2 - *2011-07-30*
|
||||
|
||||
* adds `es` translation by Jose David Calderon Serrano
|
||||
|
||||
|
||||
## v0.12.1 - *2011-07-29*
|
||||
|
||||
* fixes unchecked use of console.log
|
||||
|
||||
|
||||
## v0.12 - *2011-07-28*
|
||||
|
||||
* improves performance
|
||||
|
||||
|
||||
## v0.11 - *2011-07-27*
|
||||
|
||||
* changes license to MIT license, see `LICENSE.txt`
|
||||
|
||||
|
||||
## v0.10.2 - *2011-07-26*
|
||||
|
||||
* improves tree scrollbar
|
||||
|
||||
|
||||
## v0.10.1 - *2011-07-24*
|
||||
|
||||
* fixes problems with ' in links
|
||||
|
||||
|
||||
## v0.10 - *2011-07-24*
|
||||
|
||||
* fixes problems with XAMPP on Windows (see `dot.htaccess` comments for instructions)
|
||||
* fixes tree fade-in-fade-out effect for small displays ([issue #6](https://github.com/lrsjng/h5ai/issues/6))
|
||||
* adds custom scrollbar to tree ([issue #6](https://github.com/lrsjng/h5ai/issues/6))
|
||||
* fixes broken links caused by URI encoding/decoding ([issue #9](https://github.com/lrsjng/h5ai/issues/9))
|
||||
* adds "empty" to localization (hope Google Translate did a good job here)
|
||||
|
||||
|
||||
## v0.9 - *2011-07-18*
|
||||
|
||||
* links hover states between crumb, extended view and tree
|
||||
* fixes size of tree view (now there's a ugly scrollbar, hopefully will be fixed)
|
||||
* refactores js to improve performance and cleaned code
|
||||
* adds caching for folder status codes and content
|
||||
* adds `fr` translation by [Nicolas](https://github.com/Nicosmos)
|
||||
* adds `nl` translation by [Stefan de Konink](https://github.com/skinkie)
|
||||
* adds `sv` translation by Oscar Carlsson
|
||||
|
||||
|
||||
## v0.8 - *2011-07-08*
|
||||
|
||||
* removes slashes from folder labels
|
||||
* optionally rename parent folder entries to real folder names, see `options.js`
|
||||
* long breadcrumbs (multiple rows) no longer hide content
|
||||
* error folder icons are opaque now
|
||||
* refactores js a lot (again...)
|
||||
|
||||
|
||||
## v0.7 - *2011-07-07*
|
||||
|
||||
* removes shadows
|
||||
* smarter tree side bar
|
||||
|
||||
|
||||
## v0.6 - *2011-07-05*
|
||||
|
||||
* refactores js
|
||||
* adds localization, see `options.js`
|
||||
|
||||
|
||||
## v0.5.3 - *2011-07-04*
|
||||
|
||||
* refactores js
|
||||
* adds basic options support via `options.js`
|
||||
* adds comments to `options.js`
|
||||
* adds optional tree sidebar
|
||||
|
||||
|
||||
## v0.5.2 - *2011-07-02*
|
||||
|
||||
* details view adjusts to window width
|
||||
* links icon for *.gz and *.bz2
|
||||
|
||||
|
||||
## v0.5.1 - *2011-07-01*
|
||||
|
||||
* disables tree sidebar for now, since it had unwanted side effects
|
||||
|
||||
|
||||
## v0.5 - *2011-07-01*
|
||||
|
||||
* adds tree sidebar
|
||||
* some refactorings
|
||||
|
||||
|
||||
## v0.4 - *2011-06-27*
|
||||
|
||||
* adds better fallback, in case JavaScript is disabled
|
||||
* rewrites js, fixed middle-button click etc. problems
|
||||
* refactors css
|
||||
* sorts, adds and moves icons and images
|
||||
* updates dot.access
|
||||
|
||||
|
||||
## v0.3.2 - *2011-06-24*
|
||||
|
||||
* removes lib versions from file names
|
||||
* adds 'empty' indicator for icons view
|
||||
|
||||
|
||||
## v0.3.1 - *2011-06-24*
|
||||
|
||||
* refactores js
|
||||
* adds `folderClick` and `fileClick` callback hooks
|
||||
* fixes .emtpy style
|
||||
|
||||
|
||||
## v0.3 - *2011-06-23*
|
||||
|
||||
* includes build stuff, files previously found in the base directory are now located in folder `target`
|
||||
* styles and scripts are now minified
|
||||
* adds Modernizr 2.0.4 for future use
|
||||
* updates jQuery to version 1.6.1
|
||||
|
||||
|
||||
## v0.2.3 - *2011-06-17*
|
||||
|
||||
* more refactoring in main.js
|
||||
|
||||
|
||||
## v0.2.2 - *2011-06-16*
|
||||
|
||||
* refactores a lot, adds some comments
|
||||
* includes fixes from [NumEricR](https://github.com/NumEricR)
|
||||
* adds top/bottom message support, only basicly styled
|
||||
|
||||
|
||||
## v0.2.1 - *2011-06-16*
|
||||
|
||||
* fixes croped filenames
|
||||
* fixes missing .png extension in header
|
||||
* adds some color to the links
|
||||
* adds changelog
|
||||
|
||||
|
||||
## v0.2 - *2011-06-15*
|
||||
|
||||
* adds icon view
|
|
@ -0,0 +1,72 @@
|
|||
# h5ai
|
||||
|
||||
[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github]
|
||||
|
||||
A modern HTTP web server index for Apache httpd, lighttpd, nginx and Cherokee.
|
||||
|
||||
|
||||
## Important
|
||||
|
||||
* Do **not** install any files from the `src` folder, they need to be
|
||||
preprocessed to work correctly!
|
||||
* Find a preprocessed package and detailed install instructions on the
|
||||
[project page][web].
|
||||
* For bug reports and feature requests please use [issues][github-issues].
|
||||
|
||||
|
||||
## Build
|
||||
|
||||
There are installation ready packages for the latest [releases][release] and
|
||||
[dev builds][develop]. But to build **h5ai** yourself either `git clone` or
|
||||
download the repository. From within the root folder run the following
|
||||
commands to find a fresh zipball in folder `build` (tested on linux only,
|
||||
requires [`node 6.0+`][node] to be installed).
|
||||
|
||||
~~~sh
|
||||
> npm install
|
||||
> npm run build
|
||||
~~~
|
||||
|
||||
|
||||
## License
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2019 Lars Jung (https://larsjung.de)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
|
||||
## References
|
||||
|
||||
**h5ai** profits from other projects, all of them licensed under the MIT license
|
||||
too. Exceptions are some [Material Design icons][material-design-icons] (CC BY 4.0).
|
||||
|
||||
|
||||
[web]: https://larsjung.de/h5ai/
|
||||
[github]: https://github.com/lrsjng/h5ai
|
||||
[github-issues]: https://github.com/lrsjng/h5ai/issues
|
||||
[release]: https://release.larsjung.de/h5ai/
|
||||
[develop]: https://release.larsjung.de/h5ai/develop/
|
||||
[node]: https://nodejs.org
|
||||
[material-design-icons]: https://github.com/google/material-design-icons
|
||||
|
||||
[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square
|
||||
[web-img]: https://img.shields.io/badge/web-larsjung.de/h5ai-a0a060.svg?style=flat-square
|
||||
[github-img]: https://img.shields.io/badge/github-lrsjng/h5ai-a0a060.svg?style=flat-square
|
|
@ -0,0 +1,9 @@
|
|||
# Cache
|
||||
|
||||
Private cache.
|
||||
|
||||
This directory is used for server side caching. To use caching make this
|
||||
directory writable for your webserver.
|
||||
|
||||
There is no critical data in here. You can savely remove any content. This
|
||||
will clear the cache.
|
|
@ -0,0 +1 @@
|
|||
{"command":true,"which":true,"avconv":false,"convert":false,"du":true,"ffmpeg":false,"gm":false,"tar":true,"zip":false}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "afrikaans",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "besonderhede",
|
||||
"download": "aflaai",
|
||||
"empty": "leeg",
|
||||
"files": "lêers",
|
||||
"filter": "filter",
|
||||
"folders": "gidse",
|
||||
"grid": "rooster",
|
||||
"icons": "ikone",
|
||||
"lastModified": "Laas verander",
|
||||
"name": "Naam",
|
||||
"noMatch": "geen resultaat",
|
||||
"parentDirectory": "Hoër Vlak",
|
||||
"size": "Grootte"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "български",
|
||||
|
||||
"dateFormat": "DD-MM-YYYY HH:mm",
|
||||
"details": "детайли",
|
||||
"download": "изтегляне",
|
||||
"empty": "празна",
|
||||
"files": "файлове",
|
||||
"filter": "филтър",
|
||||
"folders": "директории",
|
||||
"grid": "мрежа",
|
||||
"icons": "икони",
|
||||
"lastModified": "Последна промяна",
|
||||
"name": "Име",
|
||||
"noMatch": "няма съвпадение",
|
||||
"parentDirectory": "Предходна директория",
|
||||
"size": "Размер"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "čeština",
|
||||
|
||||
"dateFormat": "DD.MM.YYYY HH:mm",
|
||||
"details": "Podrobnosti",
|
||||
"download": "Stáhnout",
|
||||
"empty": "Prázdná složka",
|
||||
"files": "souborů",
|
||||
"filter": "Filtr",
|
||||
"folders": "složek",
|
||||
"grid": "Seznam",
|
||||
"icons": "Velké ikony",
|
||||
"lastModified": "Datum změny",
|
||||
"name": "Název",
|
||||
"noMatch": "Žádná shoda",
|
||||
"parentDirectory": "Nadřazený adresář",
|
||||
"size": "Velikost"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "dansk",
|
||||
|
||||
"dateFormat": "DD-MM-YYYY HH:mm",
|
||||
"details": "detaljer",
|
||||
"download": "download",
|
||||
"empty": "tom",
|
||||
"files": "filer",
|
||||
"filter": "filter",
|
||||
"folders": "mapper",
|
||||
"grid": "grid",
|
||||
"icons": "ikoner",
|
||||
"lastModified": "Sidst ændret",
|
||||
"name": "Navn",
|
||||
"noMatch": "ingen match",
|
||||
"parentDirectory": "Overordnet mappe",
|
||||
"size": "Størrelse"
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"lang": "deutsch",
|
||||
|
||||
"dateFormat": "DD.MM.YYYY HH:mm",
|
||||
"details": "Details",
|
||||
"download": "Download",
|
||||
"empty": "leer",
|
||||
"files": "Dateien",
|
||||
"filter": "filtern",
|
||||
"folders": "Ordner",
|
||||
"grid": "Gitter",
|
||||
"icons": "Icons",
|
||||
"language": "Sprache",
|
||||
"lastModified": "Geändert",
|
||||
"name": "Name",
|
||||
"noMatch": "keine Treffer",
|
||||
"parentDirectory": "Übergeordnetes Verzeichnis",
|
||||
"search": "suchen",
|
||||
"size": "Größe",
|
||||
"tree": "Baum",
|
||||
"view": "Ansicht"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "ελληνικά",
|
||||
|
||||
"dateFormat": "DD/MM/YYYY HH:mm",
|
||||
"details": "λεπτομέρειες",
|
||||
"download": "μεταμόρφωση",
|
||||
"empty": "κενό",
|
||||
"files": "αρχεία",
|
||||
"filter": "φίλτρο",
|
||||
"folders": "φάκελοι",
|
||||
"grid": "πλέγμα",
|
||||
"icons": "εικονίδια",
|
||||
"lastModified": "Τελευταία τροποποίηση",
|
||||
"name": "Όνομα",
|
||||
"noMatch": "κανένα αποτέλεσμα",
|
||||
"parentDirectory": "Προηγούμενος Κατάλογος",
|
||||
"size": "Μέγεθος"
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
/* only here as a reference, these values are the hardcoded defaults */
|
||||
{
|
||||
"lang": "english",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "details",
|
||||
"download": "download",
|
||||
"empty": "empty",
|
||||
"files": "files",
|
||||
"filter": "filter",
|
||||
"folders": "folders",
|
||||
"grid": "grid",
|
||||
"icons": "icons",
|
||||
"language": "Language",
|
||||
"lastModified": "Last modified",
|
||||
"name": "Name",
|
||||
"noMatch": "no match",
|
||||
"parentDirectory": "Parent Directory",
|
||||
"search": "search",
|
||||
"size": "Size",
|
||||
"tree": "Tree",
|
||||
"view": "View"
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"lang": "español",
|
||||
|
||||
"dateFormat": "DD/MM/YYYY HH:mm",
|
||||
"details": "Detalles",
|
||||
"download": "Descargar",
|
||||
"empty": "vacío",
|
||||
"files": "Archivos",
|
||||
"filter": "Filtrar",
|
||||
"folders": "Directorios",
|
||||
"grid": "Cuadrícula",
|
||||
"icons": "Íconos",
|
||||
"language": "Idioma",
|
||||
"lastModified": "Última modificación",
|
||||
"name": "Nombre",
|
||||
"noMatch": "Sin coincidencias",
|
||||
"parentDirectory": "Directorio superior",
|
||||
"search": "buscar",
|
||||
"size": "Tamaño",
|
||||
"tree": "Arbol",
|
||||
"view": "Vista"
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"lang": "estonian",
|
||||
|
||||
"dateFormat": "DD-MM-YYYY HH.mm",
|
||||
"details": "täpsem info",
|
||||
"download": "laadi alla",
|
||||
"empty": "tühi",
|
||||
"files": "failid",
|
||||
"filter": "filter",
|
||||
"folders": "kataloogid",
|
||||
"grid": "võre",
|
||||
"icons": "ikoonid",
|
||||
"language": "Keel",
|
||||
"lastModified": "Viimati muudetud",
|
||||
"name": "Nimi",
|
||||
"noMatch": "ei leitud sobivat",
|
||||
"parentDirectory": "Emakataloog",
|
||||
"search": "otsi",
|
||||
"size": "Suurus",
|
||||
"tree": "Puu",
|
||||
"view": "Vaade"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "finnish",
|
||||
|
||||
"dateFormat": "DD.MM.YYYY HH:mm",
|
||||
"details": "tiedot",
|
||||
"download": "lataa",
|
||||
"empty": "tyhjä",
|
||||
"files": "tiedostoa",
|
||||
"filter": "suodata",
|
||||
"folders": "hakemistoa",
|
||||
"grid": "ruudukko",
|
||||
"icons": "ikonit",
|
||||
"lastModified": "Viimeksi muokattu",
|
||||
"name": "Nimi",
|
||||
"noMatch": "ei osumia",
|
||||
"parentDirectory": "Ylähakemisto",
|
||||
"size": "Koko"
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"lang": "français",
|
||||
|
||||
"dateFormat": "DD/MM/YYYY HH:mm",
|
||||
"details": "détails",
|
||||
"download": "télécharger",
|
||||
"empty": "vide",
|
||||
"files": "Fichiers",
|
||||
"filter": "filtrer",
|
||||
"folders": "Répertoires",
|
||||
"grid": "grille",
|
||||
"icons": "icônes",
|
||||
"language": "Langue",
|
||||
"lastModified": "Dernière modification",
|
||||
"name": "Nom",
|
||||
"noMatch": "rien trouvé",
|
||||
"parentDirectory": "Dossier parent",
|
||||
"search": "rechercher",
|
||||
"size": "Taille",
|
||||
"tree": "Arborescence",
|
||||
"view": "Disposition"
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"lang": "עברית",
|
||||
|
||||
"dateFormat": "DD.MM.YYYY HH:mm",
|
||||
"details": "פרטים",
|
||||
"download": "הורדה",
|
||||
"empty": "ריק",
|
||||
"files": "קבצים",
|
||||
"filter": "סינון",
|
||||
"folders": "תיקיות",
|
||||
"icons": "צלמיות",
|
||||
"lastModified": "שינוי אחרון",
|
||||
"name": "שם",
|
||||
"noMatch": "אין תוצאות",
|
||||
"parentDirectory": "תיקיית הורה",
|
||||
"size": "גודל"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "हिंदी",
|
||||
|
||||
"dateFormat": "DD.MM.YYYY HH:mm",
|
||||
"details": "विस्तार",
|
||||
"download": "डाउनलोड",
|
||||
"empty": "खाली",
|
||||
"files": "फ़ाइलें",
|
||||
"filter": "फ़िल्टर",
|
||||
"folders": "फोल्डर",
|
||||
"grid": "ग्रिड",
|
||||
"icons": "आइकॉन",
|
||||
"lastModified": "पिछला परिवर्तन",
|
||||
"name": "नाम",
|
||||
"noMatch": "कोई समानता नहीं",
|
||||
"parentDirectory": "मूल डायरेक्टरी",
|
||||
"size": "माप"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "hrvatski",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "detalji",
|
||||
"download": "preuzmi",
|
||||
"empty": "prazno",
|
||||
"files": "datoteka",
|
||||
"filter": "filter",
|
||||
"folders": "direktorij(a)",
|
||||
"grid": "mreža",
|
||||
"icons": "ikone",
|
||||
"lastModified": "Posljednja izmjena",
|
||||
"name": "Naziv",
|
||||
"noMatch": "nema rezultata",
|
||||
"parentDirectory": "Natrag",
|
||||
"size": "Veličina"
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"lang": "magyar",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "részletek",
|
||||
"download": "letöltés",
|
||||
"empty": "üres",
|
||||
"files": "fájlok",
|
||||
"folders": "mappák",
|
||||
"icons": "ikonok",
|
||||
"lastModified": "Utoljára módosítva",
|
||||
"name": "Név",
|
||||
"noMatch": "nincs találat",
|
||||
"parentDirectory": "Szülő könyvtár",
|
||||
"size": "Méret"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "italiano",
|
||||
|
||||
"dateFormat": "DD-MM-YYYY HH:mm",
|
||||
"details": "dettagli",
|
||||
"download": "download",
|
||||
"empty": "vuota",
|
||||
"files": "file",
|
||||
"filter": "filtra",
|
||||
"folders": "cartelle",
|
||||
"grid": "griglia",
|
||||
"icons": "icone",
|
||||
"lastModified": "Ultima modifica",
|
||||
"name": "Nome",
|
||||
"noMatch": "nessun risultato",
|
||||
"parentDirectory": "Cartella Superiore",
|
||||
"size": "Dimensione"
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"lang": "日本語",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "詳細",
|
||||
"download": "ダウンロード",
|
||||
"empty": "(空)",
|
||||
"files": "ファイル",
|
||||
"filter": "フィルター",
|
||||
"folders": "フォルダー",
|
||||
"grid": "グリッド",
|
||||
"icons": "アイコン",
|
||||
"language": "言語",
|
||||
"lastModified": "最終変更日時",
|
||||
"name": "名前",
|
||||
"noMatch": "一致する項目が見つかりません",
|
||||
"parentDirectory": "親ディレクトリへ",
|
||||
"size": "サイズ",
|
||||
"view": "ビュー"
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"lang": "한국어",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "자세히",
|
||||
"download": "다운로드",
|
||||
"empty": "빈 폴더",
|
||||
"files": "파일",
|
||||
"filter": "필터",
|
||||
"folders": "폴더",
|
||||
"grid": "그리드",
|
||||
"icons": "아이콘",
|
||||
"language": "언어",
|
||||
"lastModified": "최근 수정일",
|
||||
"name": "파일명",
|
||||
"noMatch": "해당파일이 없습니다.",
|
||||
"parentDirectory": "상위폴더",
|
||||
"search": "검색",
|
||||
"size": "크기",
|
||||
"tree": "트리",
|
||||
"view": "보기"
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"lang": "latviešu",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "detaļas",
|
||||
"download": "lejupielādēt",
|
||||
"empty": "tukšs",
|
||||
"files": "faili",
|
||||
"filter": "filtrēt",
|
||||
"folders": "mapes",
|
||||
"grid": "režģis",
|
||||
"icons": "ikonas",
|
||||
"language": "Valoda",
|
||||
"lastModified": "Pēdējoreiz modificēts",
|
||||
"name": "Nosaukums",
|
||||
"noMatch": "nav sakritības",
|
||||
"parentDirectory": "Vecākdirektorijs",
|
||||
"search": "meklēt",
|
||||
"size": "Izmērs",
|
||||
"tree": "Koks",
|
||||
"view": "Skats"
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"lang": "norwegian",
|
||||
|
||||
"details": "detaljer",
|
||||
"download": "last ned",
|
||||
"empty": "tom",
|
||||
"files": "filer",
|
||||
"folders": "mapper",
|
||||
"icons": "ikoner",
|
||||
"lastModified": "Sist endret",
|
||||
"name": "Navn",
|
||||
"noMatch": "ingen treff",
|
||||
"parentDirectory": "Overordnet mappe",
|
||||
"size": "Størrelse"
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"lang": "nederlands",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "details",
|
||||
"download": "download",
|
||||
"empty": "leeg",
|
||||
"files": "bestanden",
|
||||
"filter": "filter",
|
||||
"folders": "mappen",
|
||||
"grid": "grid",
|
||||
"icons": "iconen",
|
||||
"language": "Taal",
|
||||
"lastModified": "Laatste wijziging",
|
||||
"name": "Naam",
|
||||
"noMatch": "geen overeenkomst",
|
||||
"parentDirectory": "Bovenliggende map",
|
||||
"search": "zoeken",
|
||||
"size": "Grootte",
|
||||
"tree": "Boom",
|
||||
"view": "Bekijk"
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"lang": "polski",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "szczegóły",
|
||||
"download": "pobierz",
|
||||
"empty": "pusty",
|
||||
"files": "plików",
|
||||
"filter": "filtr",
|
||||
"folders": "folderów",
|
||||
"grid": "kafelki",
|
||||
"icons": "ikony",
|
||||
"language": "Język",
|
||||
"lastModified": "Ostatnia modyfikacja",
|
||||
"name": "Nazwa",
|
||||
"noMatch": "nie znaleziono",
|
||||
"parentDirectory": "Katalog nadrzędny",
|
||||
"search": "szukaj",
|
||||
"size": "Rozmiar",
|
||||
"tree": "Drzewo",
|
||||
"view": "Układ"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "português",
|
||||
|
||||
"dateFormat": "DD-MM-YYYY HH:mm",
|
||||
"details": "detalhes",
|
||||
"download": "descarregar",
|
||||
"empty": "vazio",
|
||||
"files": "arquivos",
|
||||
"filter": "filtro",
|
||||
"folders": "pastas",
|
||||
"grid": "grelha",
|
||||
"icons": "ícones",
|
||||
"lastModified": "última modificação",
|
||||
"name": "Nome",
|
||||
"noMatch": "sem resultados",
|
||||
"parentDirectory": "diretório acima",
|
||||
"size": "Tamanho"
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"lang": "română",
|
||||
|
||||
"details": "detalii",
|
||||
"download": "descarcă",
|
||||
"empty": "gol",
|
||||
"files": "fişiere",
|
||||
"folders": "dosar",
|
||||
"icons": "pictograme",
|
||||
"lastModified": "ultima modificare",
|
||||
"name": "nume",
|
||||
"noMatch": "0 rezultate",
|
||||
"parentDirectory": "dosar părinte",
|
||||
"size": "mărime"
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"lang": "русский",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "Детали",
|
||||
"download": "Скачать",
|
||||
"empty": "Пусто",
|
||||
"files": "Файлы",
|
||||
"filter": "Фильтр",
|
||||
"folders": "Папки",
|
||||
"grid": "Сетка",
|
||||
"icons": "Иконки",
|
||||
"language": "Язык",
|
||||
"lastModified": "Последние изменения",
|
||||
"name": "Имя",
|
||||
"noMatch": "Нет совпадений",
|
||||
"parentDirectory": "Главная директория",
|
||||
"size": "Размер",
|
||||
"view": "Вид"
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"lang": "slovenčina",
|
||||
|
||||
"details": "podrobnosti",
|
||||
"empty": "prázdny",
|
||||
"files": "súborov",
|
||||
"folders": "priečinkov",
|
||||
"icons": "ikony",
|
||||
"lastModified": "Upravené",
|
||||
"name": "Názov",
|
||||
"parentDirectory": "Nadriadený priečinok",
|
||||
"size": "Velkosť"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "slovenščina",
|
||||
|
||||
"dateFormat": "DD. MM. YYYY HH:mm",
|
||||
"details": "podrobnosti",
|
||||
"download": "prenesi",
|
||||
"empty": "prazno",
|
||||
"files": "datoteke",
|
||||
"filter": "filter",
|
||||
"folders": "mape",
|
||||
"grid": "mreža",
|
||||
"icons": "ikone",
|
||||
"lastModified": "Zadnja sprememba",
|
||||
"name": "Ime",
|
||||
"noMatch": "ni zadetkov",
|
||||
"parentDirectory": "Nadrejena mapa",
|
||||
"size": "Velikost"
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"lang": "srpski",
|
||||
|
||||
"details": "detalji",
|
||||
"download": "download",
|
||||
"empty": "prazno",
|
||||
"files": "fajlovi",
|
||||
"folders": "direktorijum",
|
||||
"icons": "ikone",
|
||||
"lastModified": "Poslednja modifikacija",
|
||||
"name": "Ime",
|
||||
"noMatch": "bez poklapanja",
|
||||
"parentDirectory": "Roditeljski direktorijum",
|
||||
"size": "Veličina"
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"lang": "svenska",
|
||||
|
||||
"details": "detaljerad",
|
||||
"download": "ladda ner",
|
||||
"empty": "tom",
|
||||
"files": "filer",
|
||||
"folders": "kataloger",
|
||||
"grid": "rutnät",
|
||||
"icons": "ikoner",
|
||||
"lastModified": "Senast ändrad",
|
||||
"name": "Filnamn",
|
||||
"noMatch": "ingen matchning",
|
||||
"parentDirectory": "Till överordnad mapp",
|
||||
"size": "Filstorlek"
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"lang": "türkçe",
|
||||
|
||||
"details": "detaylar",
|
||||
"download": "indir",
|
||||
"empty": "boş",
|
||||
"files": "dosyalar",
|
||||
"folders": "klasörler",
|
||||
"icons": "ikonlar",
|
||||
"lastModified": "Son Düzenleme",
|
||||
"name": "İsim",
|
||||
"parentDirectory": "Üst Dizin",
|
||||
"size": "Boyut"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"lang": "українська",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "Деталі",
|
||||
"download": "Завантажити",
|
||||
"empty": "Порожньо",
|
||||
"files": "Файли(ів)",
|
||||
"filter": "Фільтр",
|
||||
"folders": "Тек(и)",
|
||||
"grid": "Гратка",
|
||||
"icons": "Піктограми",
|
||||
"lastModified": "Останні зміни",
|
||||
"name": "Ім'я",
|
||||
"noMatch": "Немає співпадінь",
|
||||
"parentDirectory": "Головна тека",
|
||||
"size": "Розмір"
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"lang": "简体中文",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "详情",
|
||||
"download": "下载",
|
||||
"empty": "空文件夹",
|
||||
"files": "文件",
|
||||
"filter": "过滤",
|
||||
"folders": "文件夹",
|
||||
"grid": "网格",
|
||||
"icons": "图标",
|
||||
"language": "语言",
|
||||
"lastModified": "修改时间",
|
||||
"name": "文件名",
|
||||
"noMatch": "无匹配项",
|
||||
"parentDirectory": "父文件夹",
|
||||
"search": "搜索",
|
||||
"size": "大小",
|
||||
"tree": "树形目录",
|
||||
"view": "视图",
|
||||
"info": "信息"
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"lang": "正體中文",
|
||||
|
||||
"dateFormat": "YYYY-MM-DD HH:mm",
|
||||
"details": "詳細資料",
|
||||
"download": "下載",
|
||||
"empty": "空資料夾",
|
||||
"files": "檔案",
|
||||
"filter": "過濾",
|
||||
"folders": "資料夾",
|
||||
"grid": "網格",
|
||||
"icons": "圖示",
|
||||
"language": "語言",
|
||||
"lastModified": "上次修改",
|
||||
"name": "檔名",
|
||||
"noMatch": "沒有符合的檔案",
|
||||
"parentDirectory": "上層目錄",
|
||||
"search": "搜尋",
|
||||
"size": "大小",
|
||||
"tree": "樹形目錄",
|
||||
"view": "檢視",
|
||||
"info": "資訊"
|
||||
}
|
|
@ -0,0 +1,392 @@
|
|||
/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
|
||||
{
|
||||
/*
|
||||
Password hash.
|
||||
|
||||
SHA512 hash of the info page password, the preset password is the empty string.
|
||||
Online hash generator: http://md5hashing.net/hashing/sha512
|
||||
*/
|
||||
"passhash": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Resources.
|
||||
|
||||
Additional script and style tags added to all pages. Paths not beginning
|
||||
with "http://", "https://" or "/" will be looked up relative to
|
||||
"_h5ai/public/ext/" (no check for existence).
|
||||
|
||||
- scripts: array of strings
|
||||
- styles: array of strings
|
||||
*/
|
||||
"resources": {
|
||||
"scripts": [],
|
||||
"styles": [
|
||||
"//fonts.googleapis.com/css?family=Ubuntu:300,400,700%7CUbuntu+Mono:400,700"
|
||||
]
|
||||
},
|
||||
|
||||
|
||||
|
||||
/*
|
||||
General view options.
|
||||
|
||||
- binaryPrefix: boolean, set to true uses 1024B=1KiB when formatting file sizes (see http://en.wikipedia.org/wiki/Binary_prefix)
|
||||
- disableSidebar: boolean, hides sidebar and toggle button
|
||||
- fallbackMode: boolean, serve fallback mode
|
||||
- fastBrowsing: boolean, use History API if available (no need to reload the whole page)
|
||||
- fonts: array of strings, fonts to use in regular context
|
||||
- fontsMono: array of strings, fonts to use in monopspaced context
|
||||
- hidden: array of strings, don't list items matching these regular expressions
|
||||
- hideFolders: boolean, hide all folders in the main view
|
||||
- hideIf403: boolean, hide files and folders that are not readable by the server
|
||||
- hideParentFolder: boolean, hide parent folder links in the main view
|
||||
- maxIconSize: number, max size for icons in the main view
|
||||
- modes: array of strings, subset of ["details", "grid", "icons"]
|
||||
the first value indicates the default view mode. If only one value
|
||||
is given the view mode is fixed and the selector buttons are hidden.
|
||||
The user selected view mode is also stored local in modern browsers
|
||||
so that it will be persistent.
|
||||
- modeToggle: boolean, show a view mode toggle in the toolbar, or "next"
|
||||
- setParentFolderLabels: boolean, set parent folder labels to real folder names
|
||||
- sizes: array of numbers
|
||||
the first value indicates the default view size. If only one value
|
||||
is given the view size is fixed and the selector buttons are hidden.
|
||||
The user selected view size is also stored local in modern browsers
|
||||
so that it will be persistent.
|
||||
- theme: string, name of one of the folders in "_h5ai/images/themes", defaults to "default"
|
||||
- unmanaged: array of strings, don't manage folders containing one of those files
|
||||
- unmanagedInNewWindow: boolean, open unmanaged links in new window/tab
|
||||
*/
|
||||
"view": {
|
||||
"binaryPrefix": false,
|
||||
"disableSidebar": false,
|
||||
"fallbackMode": false,
|
||||
"fastBrowsing": true,
|
||||
"fonts": ["Ubuntu", "Roboto", "Helvetica", "Arial", "sans-serif"],
|
||||
"fontsMono": ["Ubuntu Mono", "Monaco", "Lucida Sans Typewriter", "monospace"],
|
||||
"hidden": ["^\\.", "^_h5ai"],
|
||||
"hideFolders": false,
|
||||
"hideIf403": true,
|
||||
"hideParentFolder": false,
|
||||
"maxIconSize": 40,
|
||||
"modes": ["details", "grid", "icons"],
|
||||
"modeToggle": false,
|
||||
"setParentFolderLabels": true,
|
||||
"sizes": [20, 40, 60, 80, 100, 140, 180, 220, 260, 300],
|
||||
"theme": "comity",
|
||||
"unmanaged": ["index.html", "index.htm", "index.php"],
|
||||
"unmanagedInNewWindow": false
|
||||
},
|
||||
|
||||
|
||||
|
||||
/*** Extensions (in alphabetical order) ***/
|
||||
|
||||
/*
|
||||
Watch and update current folder content.
|
||||
|
||||
- interval: number, update interval in milliseconds, at least 1000
|
||||
*/
|
||||
"autorefresh": {
|
||||
"enabled": false,
|
||||
"interval": 5000
|
||||
},
|
||||
|
||||
/*
|
||||
Show a clickable breadcrumb.
|
||||
*/
|
||||
"crumb": {
|
||||
"enabled": true
|
||||
},
|
||||
|
||||
/*
|
||||
Allow customized header and footer files.
|
||||
First checks for files "_h5ai.header.html" and "_h5ai.footer.html" in the current directory.
|
||||
If not successful it checks all parent directories (starting in the current directory) for
|
||||
files "_h5ai.headers.html" and "_h5ai.footers.html".
|
||||
Note the different filenames: "header" (only current) - "headers" (current and sub directories)!
|
||||
The file's content will be placed inside a <div/> tag above/below the main content.
|
||||
If a file's extension is ".md" instead of ".html" its content will be interpreted as markdown.
|
||||
*/
|
||||
"custom": {
|
||||
"enabled": true
|
||||
},
|
||||
|
||||
/*
|
||||
Enable packaged download of selected entries.
|
||||
To select files the "select"-extension needs to be enabled.
|
||||
|
||||
- type: string, "php-tar", "shell-tar" or "shell-zip"
|
||||
- packageName: string, basename of the download package, null for current filename or foldername
|
||||
- alwaysVisible: boolean, always show download button (defaults to download the current folder)
|
||||
*/
|
||||
"download": {
|
||||
"enabled": true,
|
||||
"type": "php-tar",
|
||||
"packageName": null,
|
||||
"alwaysVisible": false
|
||||
},
|
||||
|
||||
/*
|
||||
Allow filtering the displayed files and folders in current folder.
|
||||
Checks for substrings.
|
||||
|
||||
If advanced is enabled it checks entries for right order of characters,
|
||||
i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated
|
||||
sequences get OR-ed. Searches will be treated as JavaScript regular
|
||||
expressions if you prefix them with "re:".
|
||||
|
||||
- advanced: boolean, use advanced pattern parsing
|
||||
- debounceTime: number, debounce wait time in milliseconds
|
||||
- ignorecase: boolean, ignore case
|
||||
*/
|
||||
"filter": {
|
||||
"enabled": false,
|
||||
"advanced": true,
|
||||
"debounceTime": 100,
|
||||
"ignorecase": true
|
||||
},
|
||||
|
||||
/*
|
||||
Calc the size of folders.
|
||||
This operation is real slow. The calculated sizes differ slightly for both
|
||||
calculation types since "php" only adds the file size, while "shell-du"
|
||||
also adds the sizes for the actual folder files.
|
||||
|
||||
- type: string, "php" (sloooow) or "shell-du" (sloow)
|
||||
*/
|
||||
"foldersize": {
|
||||
"enabled": true,
|
||||
"type": "php"
|
||||
},
|
||||
|
||||
/*
|
||||
Adds Google Universial Analytics asynchronous tracking code.
|
||||
see: https://developers.google.com/analytics/devguides/collection/analyticsjs/
|
||||
|
||||
- id: string, account ID
|
||||
*/
|
||||
"google-analytics-ua": {
|
||||
"enabled": false,
|
||||
"id": "UA-000000-0"
|
||||
},
|
||||
|
||||
/*
|
||||
Enable a generic info side bar.
|
||||
|
||||
- show: boolean, initial visible to first time users
|
||||
- qrcode: boolean, show a QR-Code
|
||||
- qrColor: string, QR-Code fill color
|
||||
*/
|
||||
"info": {
|
||||
"enabled": true,
|
||||
"show": false,
|
||||
"qrcode": true,
|
||||
"qrFill": "#999",
|
||||
"qrBack": "#fff"
|
||||
},
|
||||
|
||||
/*
|
||||
Localization, for example "en", "de" etc. - see "_h5ai/conf/l10n" folder for
|
||||
possible values. Adjust it to your needs. If lang is not found
|
||||
it defaults to "en".
|
||||
|
||||
- lang: string, default language
|
||||
- useBroserLang: boolean, try to use browser language
|
||||
*/
|
||||
"l10n": {
|
||||
"enabled": true,
|
||||
"lang": "en",
|
||||
"useBrowserLang": true
|
||||
},
|
||||
|
||||
/*
|
||||
Adds Piwik tracker javascript code.
|
||||
|
||||
- baseURL: string, do not include the protocol, e.g. "mydomain.tld/piwik"
|
||||
- idSite: number
|
||||
*/
|
||||
"piwik-analytics": {
|
||||
"enabled": false,
|
||||
"baseURL": "some/url",
|
||||
"idSite": 1
|
||||
},
|
||||
|
||||
/*
|
||||
Play a audio preview on click.
|
||||
|
||||
- autoplay: start playing as soon as ready
|
||||
- types: array of strings
|
||||
*/
|
||||
"preview-aud": {
|
||||
"enabled": true,
|
||||
"autoplay": true,
|
||||
"types": ["aud"]
|
||||
},
|
||||
|
||||
/*
|
||||
Show an image preview on click.
|
||||
|
||||
- types: array of strings
|
||||
- size: number, sample size, or false for original size
|
||||
*/
|
||||
"preview-img": {
|
||||
"enabled": true,
|
||||
"size": false,
|
||||
"types": ["img", "img-bmp", "img-gif", "img-ico", "img-jpg", "img-png", "img-raw", "img-svg"]
|
||||
},
|
||||
|
||||
/*
|
||||
Show text file preview on click.
|
||||
|
||||
Available styles are:
|
||||
0: floating text
|
||||
1: fixed width text
|
||||
2: markdown
|
||||
3: syntax highlighting
|
||||
|
||||
- styles: dict string to int, maps types to styles
|
||||
*/
|
||||
"preview-txt": {
|
||||
"enabled": true,
|
||||
"styles": {
|
||||
"txt": 1,
|
||||
"txt-authors": 1,
|
||||
"txt-c": 3,
|
||||
"txt-cpp": 3,
|
||||
"txt-css": 3,
|
||||
"txt-diff": 1,
|
||||
"txt-go": 3,
|
||||
"txt-h": 3,
|
||||
"txt-hpp": 3,
|
||||
"txt-install": 1,
|
||||
"txt-js": 3,
|
||||
"txt-json": 3,
|
||||
"txt-less": 3,
|
||||
"txt-license": 1,
|
||||
"txt-log": 1,
|
||||
"txt-makefile": 1,
|
||||
"txt-md": 2,
|
||||
"txt-py": 3,
|
||||
"txt-rb": 3,
|
||||
"txt-readme": 1,
|
||||
"txt-rtf": 1,
|
||||
"txt-rust": 3,
|
||||
"txt-script": 3,
|
||||
"txt-xml": 1
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
Play a video preview on click.
|
||||
|
||||
- autoplay: start playing as soon as ready
|
||||
- types: array of strings
|
||||
*/
|
||||
"preview-vid": {
|
||||
"enabled": true,
|
||||
"autoplay": true,
|
||||
"types": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"]
|
||||
},
|
||||
|
||||
/*
|
||||
Allow searching files and folders in and below current folder.
|
||||
Checks for substrings.
|
||||
|
||||
If advanced is enabled it checks entries for right order of characters,
|
||||
i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated
|
||||
sequences get OR-ed. Searches will be treated as JavaScript regular
|
||||
expressions if you prefix them with "re:".
|
||||
|
||||
- advanced: boolean, use advanced pattern parsing
|
||||
- debounceTime: number, debounce wait time in milliseconds
|
||||
- ignorecase: boolean, ignore case
|
||||
*/
|
||||
"search": {
|
||||
"enabled": false,
|
||||
"advanced": true,
|
||||
"debounceTime": 300,
|
||||
"ignorecase": true
|
||||
},
|
||||
|
||||
/*
|
||||
Make entries selectable.
|
||||
At the moment only needed for packaged download.
|
||||
|
||||
- clickndrag: boolean, allow first mouse button + drag selection
|
||||
- checkboxes: boolean, show a checkbox on mouse over item
|
||||
*/
|
||||
"select": {
|
||||
"enabled": true,
|
||||
"clickndrag": true,
|
||||
"checkboxes": true
|
||||
},
|
||||
|
||||
/*
|
||||
Default sort order.
|
||||
"column" and "reverse" are locally stored.
|
||||
|
||||
- column: number, 0 for "Name", 1 for "Date", 2 for "Size"
|
||||
- reverse: boolean, false for ascending, true for descending
|
||||
- ignorecase: boolean, compare ignorecase
|
||||
- natural: boolean, use natural sort order
|
||||
- folders: number, where to place folders, 0 for "top", 1 for "in place", 2 for "bottom"
|
||||
*/
|
||||
"sort": {
|
||||
"enabled": true,
|
||||
"column": 0,
|
||||
"reverse": false,
|
||||
"ignorecase": true,
|
||||
"natural": true,
|
||||
"folders": 0
|
||||
},
|
||||
|
||||
/*
|
||||
Show thumbnails for image files. Needs the "/_h5ai/cache" folder to be
|
||||
writable for the web Server.
|
||||
|
||||
- img: array of strings
|
||||
- mov: array of strings
|
||||
- doc: array of strings
|
||||
- delay: number, delay in milliseconds after "dom-ready" before thumb-requesting starts
|
||||
- size: number, size in pixel of the generated thumbnails
|
||||
- exif: boolean, use included EXIF thumbs if possible
|
||||
- chunksize: int, number of thumbs per request
|
||||
*/
|
||||
"thumbnails": {
|
||||
"enabled": true,
|
||||
"img": ["img-bmp", "img-gif", "img-ico", "img-jpg", "img-png"],
|
||||
"mov": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"],
|
||||
"doc": ["x-pdf", "x-ps"],
|
||||
"delay": 1,
|
||||
"size": 240,
|
||||
"exif": false,
|
||||
"chunksize": 20
|
||||
},
|
||||
|
||||
/*
|
||||
Replace window title with current breadcrumb.
|
||||
*/
|
||||
"title": {
|
||||
"enabled": true
|
||||
},
|
||||
|
||||
/*
|
||||
Show a folder tree.
|
||||
Note that this might affect performance significantly.
|
||||
|
||||
- show: boolean, initial visible to first time users
|
||||
- maxSubfolders: number, max number of subfolders to show in tree
|
||||
- naturalSort: boolean, use natural sort order for folders
|
||||
- ignorecase: boolean, sort ignorecase
|
||||
*/
|
||||
"tree": {
|
||||
"enabled": true,
|
||||
"show": true,
|
||||
"maxSubfolders": 50,
|
||||
"naturalSort": true,
|
||||
"ignorecase": true
|
||||
}
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
|
||||
{
|
||||
"ar": ["*.tar.bz2", "*.crx"],
|
||||
"ar-apk": ["*.apk"],
|
||||
"ar-deb": ["*.deb"],
|
||||
"ar-gz": ["*.gz", "*.tar.gz", "*.tgz"],
|
||||
"ar-rar": ["*.rar"],
|
||||
"ar-rpm": ["*.rpm"],
|
||||
"ar-tar": ["*.tar"],
|
||||
"ar-zip": ["*.7z", "*.bz2", "*.jar", "*.lzma", "*.war", "*.z", "*.Z", "*.zip"],
|
||||
"aud": ["*.aif", "*.aiff", "*.flac", "*.m4a", "*.mid", "*.mp3", "*.mpa", "*.ra", "*.ogg", "*.wav", "*.wma"],
|
||||
"aud-pls": ["*.m3u", "*.m3u8", "*.pls"],
|
||||
"bin": ["*.class", "*.o", "*.so"],
|
||||
"bin-exe": ["*.bat", "*.cmd", "*.exe"],
|
||||
"img": ["*.xpm"],
|
||||
"img-bmp": ["*.bmp"],
|
||||
"img-gif": ["*.gif"],
|
||||
"img-ico": ["*.ico"],
|
||||
"img-jpg": ["*.jpg", "*.jpeg"],
|
||||
"img-png": ["*.png"],
|
||||
"img-raw": ["*.cr2", "*.nef"],
|
||||
"img-svg": ["*.svg"],
|
||||
"img-tiff": ["*.tiff"],
|
||||
"txt": ["*.text", "*.txt"],
|
||||
"txt-build": ["*.pom", "build.xml", "pom.xml"],
|
||||
"txt-c": ["*.c"],
|
||||
"txt-cpp": ["*.cpp"],
|
||||
"txt-css": ["*.css"],
|
||||
"txt-diff": ["*.diff", "*.patch"],
|
||||
"txt-go": ["*.go"],
|
||||
"txt-h": ["*.h"],
|
||||
"txt-html": ["*.htm", "*.html", "*.shtml", "*.xhtml"],
|
||||
"txt-hpp": ["*.hpp"],
|
||||
"txt-java": ["*.java"],
|
||||
"txt-scala": ["*.scala"],
|
||||
"txt-js": ["*.js"],
|
||||
"txt-json": ["*.json"],
|
||||
"txt-less": ["*.less"],
|
||||
"txt-log": ["*.log", "changelog*"],
|
||||
"txt-md": ["*.markdown", "*.md"],
|
||||
"txt-php": ["*.php"],
|
||||
"txt-py": ["*.py"],
|
||||
"txt-rb": ["*.rb"],
|
||||
"txt-rss": ["*.rss"],
|
||||
"txt-rtf": ["*.rtf"],
|
||||
"txt-rust": ["*.rs", "*.rlib"],
|
||||
"txt-script": ["*.conf", "*.bsh", "*.csh", "*.ini", "*.ksh", "*.sh", "*.shar", "*.tcl", "*.zsh"],
|
||||
"txt-source": [],
|
||||
"txt-tex": ["*.tex"],
|
||||
"txt-vcal": ["*.vcal"],
|
||||
"txt-xml": ["*.xml"],
|
||||
"vid": [],
|
||||
"vid-avi": ["*.avi"],
|
||||
"vid-flv": ["*.flv"],
|
||||
"vid-mkv": ["*.mkv"],
|
||||
"vid-mov": ["*.mov"],
|
||||
"vid-mp4": ["*.mp4", "*.m4v"],
|
||||
"vid-mpg": ["*.mpg"],
|
||||
"vid-rm": ["*.rm"],
|
||||
"vid-swf": ["*.swf"],
|
||||
"vid-ts": ["*.ts"],
|
||||
"vid-vob": ["*.vob"],
|
||||
"vid-webm": ["*.webm"],
|
||||
"vid-wmv": ["*.wmv"],
|
||||
"x": [],
|
||||
"x-bak": ["*.bak", "*~"],
|
||||
"x-calc": ["*.ods", "*.ots", "*.xlr", "*.xls", "*.xlsx"],
|
||||
"x-disc": ["*.cue", "*.iso"],
|
||||
"x-doc": ["*.doc", "*.docx", "*.odm", "*.odt", "*.ott"],
|
||||
"x-draw": ["*.drw"],
|
||||
"x-eps": ["*.eps"],
|
||||
"x-pdf": ["*.pdf"],
|
||||
"x-pres": ["*.odp", "*.otp", "*.pps", "*.ppt", "*.pptx"],
|
||||
"x-ps": ["*.ps"],
|
||||
"x-psd": ["*.psd"]
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
class Bootstrap {
|
||||
private static $autopaths = ['core', 'ext'];
|
||||
|
||||
public static function run() {
|
||||
spl_autoload_register(['Bootstrap', 'autoload']);
|
||||
putenv('LANG=en_US.UTF-8');
|
||||
setlocale(LC_CTYPE, 'en_US.UTF-8');
|
||||
date_default_timezone_set(@date_default_timezone_get());
|
||||
session_start();
|
||||
|
||||
$session = new Session($_SESSION);
|
||||
$request = new Request($_REQUEST, file_get_contents('php://input'));
|
||||
$setup = new Setup($request->query_boolean('refresh', false));
|
||||
$context = new Context($session, $request, $setup);
|
||||
|
||||
if ($context->is_api_request()) {
|
||||
(new Api($context))->apply();
|
||||
} elseif ($context->is_info_request()) {
|
||||
$public_href = $setup->get('PUBLIC_HREF');
|
||||
$x_head_tags = $context->get_x_head_html();
|
||||
$fallback_mode = false;
|
||||
require __DIR__ . '/pages/info.php';
|
||||
} else {
|
||||
$public_href = $setup->get('PUBLIC_HREF');
|
||||
$x_head_tags = $context->get_x_head_html();
|
||||
$fallback_mode = $context->is_fallback_mode();
|
||||
$fallback_html = (new Fallback($context))->get_html();
|
||||
require __DIR__ . '/pages/index.php';
|
||||
}
|
||||
}
|
||||
|
||||
public static function autoload($class_name) {
|
||||
$filename = 'class-' . strtolower($class_name) . '.php';
|
||||
|
||||
foreach (Bootstrap::$autopaths as $path) {
|
||||
$file = __DIR__ . '/' . $path . '/' . $filename;
|
||||
if (file_exists($file)) {
|
||||
require_once $file;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
<?php
|
||||
|
||||
class Api {
|
||||
private $context;
|
||||
private $request;
|
||||
private $setup;
|
||||
|
||||
public function __construct($context) {
|
||||
$this->context = $context;
|
||||
$this->request = $context->get_request();
|
||||
$this->setup = $context->get_setup();
|
||||
}
|
||||
|
||||
public function apply() {
|
||||
$action = $this->request->query('action');
|
||||
$supported = ['download', 'get', 'login', 'logout'];
|
||||
Util::json_fail(Util::ERR_UNSUPPORTED, 'unsupported action', !in_array($action, $supported));
|
||||
|
||||
$methodname = 'on_' . $action;
|
||||
$this->$methodname();
|
||||
}
|
||||
|
||||
private function on_download() {
|
||||
Util::json_fail(Util::ERR_DISABLED, 'download disabled', !$this->context->query_option('download.enabled', false));
|
||||
|
||||
$as = $this->request->query('as');
|
||||
$type = $this->request->query('type');
|
||||
$base_href = $this->request->query('baseHref');
|
||||
$hrefs = $this->request->query('hrefs', '');
|
||||
|
||||
$archive = new Archive($this->context);
|
||||
|
||||
set_time_limit(0);
|
||||
header('Content-Type: application/octet-stream');
|
||||
header('Content-Disposition: attachment; filename="' . $as . '"');
|
||||
header('Connection: close');
|
||||
$ok = $archive->output($type, $base_href, $hrefs);
|
||||
|
||||
Util::json_fail(Util::ERR_FAILED, 'packaging failed', !$ok);
|
||||
exit;
|
||||
}
|
||||
|
||||
private function on_get() {
|
||||
$response = [];
|
||||
|
||||
foreach (['langs', 'options', 'types'] as $name) {
|
||||
if ($this->request->query_boolean($name, false)) {
|
||||
$methodname = 'get_' . $name;
|
||||
$response[$name] = $this->context->$methodname();
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->request->query_boolean('setup', false)) {
|
||||
$response['setup'] = $this->setup->to_jsono($this->context->is_admin());
|
||||
}
|
||||
|
||||
if ($this->request->query_boolean('theme', false)) {
|
||||
$theme = new Theme($this->context);
|
||||
$response['theme'] = $theme->get_icons();
|
||||
}
|
||||
|
||||
if ($this->request->query('items', false)) {
|
||||
$href = $this->request->query('items.href');
|
||||
$what = $this->request->query_numeric('items.what');
|
||||
$response['items'] = $this->context->get_items($href, $what);
|
||||
}
|
||||
|
||||
if ($this->request->query('custom', false)) {
|
||||
Util::json_fail(Util::ERR_DISABLED, 'custom disabled', !$this->context->query_option('custom.enabled', false));
|
||||
$href = $this->request->query('custom');
|
||||
$custom = new Custom($this->context);
|
||||
$response['custom'] = $custom->get_customizations($href);
|
||||
}
|
||||
|
||||
if ($this->request->query('l10n', false)) {
|
||||
Util::json_fail(Util::ERR_DISABLED, 'l10n disabled', !$this->context->query_option('l10n.enabled', false));
|
||||
$iso_codes = $this->request->query_array('l10n');
|
||||
$iso_codes = array_filter($iso_codes);
|
||||
$response['l10n'] = $this->context->get_l10n($iso_codes);
|
||||
}
|
||||
|
||||
if ($this->request->query('search', false)) {
|
||||
Util::json_fail(Util::ERR_DISABLED, 'search disabled', !$this->context->query_option('search.enabled', false));
|
||||
$href = $this->request->query('search.href');
|
||||
$pattern = $this->request->query('search.pattern');
|
||||
$ignorecase = $this->request->query_boolean('search.ignorecase', false);
|
||||
$search = new Search($this->context);
|
||||
$response['search'] = $search->get_items($href, $pattern, $ignorecase);
|
||||
}
|
||||
|
||||
if ($this->request->query('thumbs', false)) {
|
||||
Util::json_fail(Util::ERR_DISABLED, 'thumbnails disabled', !$this->context->query_option('thumbnails.enabled', false));
|
||||
Util::json_fail(Util::ERR_UNSUPPORTED, 'thumbnails not supported', !$this->setup->get('HAS_PHP_JPEG'));
|
||||
$thumbs = $this->request->query_array('thumbs');
|
||||
$response['thumbs'] = $this->context->get_thumbs($thumbs);
|
||||
}
|
||||
|
||||
Util::json_exit($response);
|
||||
}
|
||||
|
||||
private function on_login() {
|
||||
$pass = $this->request->query('pass');
|
||||
Util::json_exit(['asAdmin' => $this->context->login_admin($pass)]);
|
||||
}
|
||||
|
||||
private function on_logout() {
|
||||
Util::json_exit(['asAdmin' => $this->context->logout_admin()]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,294 @@
|
|||
<?php
|
||||
|
||||
class Context {
|
||||
private static $DEFAULT_PASSHASH = 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e';
|
||||
private static $AS_ADMIN_SESSION_KEY = 'AS_ADMIN';
|
||||
|
||||
private $session;
|
||||
private $request;
|
||||
private $setup;
|
||||
private $options;
|
||||
private $passhash;
|
||||
|
||||
public function __construct($session, $request, $setup) {
|
||||
$this->session = $session;
|
||||
$this->request = $request;
|
||||
$this->setup = $setup;
|
||||
|
||||
$this->options = Json::load($this->setup->get('CONF_PATH') . '/options.json');
|
||||
|
||||
$this->passhash = $this->query_option('passhash', '');
|
||||
$this->options['hasCustomPasshash'] = strcasecmp($this->passhash, Context::$DEFAULT_PASSHASH) !== 0;
|
||||
unset($this->options['passhash']);
|
||||
}
|
||||
|
||||
public function get_session() {
|
||||
return $this->session;
|
||||
}
|
||||
|
||||
public function get_request() {
|
||||
return $this->request;
|
||||
}
|
||||
|
||||
public function get_setup() {
|
||||
return $this->setup;
|
||||
}
|
||||
|
||||
public function get_options() {
|
||||
return $this->options;
|
||||
}
|
||||
|
||||
public function query_option($keypath = '', $default = null) {
|
||||
return Util::array_query($this->options, $keypath, $default);
|
||||
}
|
||||
|
||||
public function get_types() {
|
||||
return Json::load($this->setup->get('CONF_PATH') . '/types.json');
|
||||
}
|
||||
|
||||
public function login_admin($pass) {
|
||||
$this->session->set(Context::$AS_ADMIN_SESSION_KEY, strcasecmp(hash('sha512', $pass), $this->passhash) === 0);
|
||||
return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
|
||||
}
|
||||
|
||||
public function logout_admin() {
|
||||
$this->session->set(Context::$AS_ADMIN_SESSION_KEY, false);
|
||||
return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
|
||||
}
|
||||
|
||||
public function is_admin() {
|
||||
return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
|
||||
}
|
||||
|
||||
public function is_api_request() {
|
||||
return strtolower($this->setup->get('REQUEST_METHOD')) === 'post';
|
||||
}
|
||||
|
||||
public function is_info_request() {
|
||||
return Util::starts_with($this->setup->get('REQUEST_HREF') . '/', $this->setup->get('PUBLIC_HREF'));
|
||||
}
|
||||
|
||||
public function is_text_browser() {
|
||||
return preg_match('/curl|links|lynx|w3m/i', $this->setup->get('HTTP_USER_AGENT')) === 1;
|
||||
}
|
||||
|
||||
public function is_fallback_mode() {
|
||||
return $this->query_option('view.fallbackMode', false) || $this->is_text_browser();
|
||||
}
|
||||
|
||||
public function to_href($path, $trailing_slash = true) {
|
||||
$rel_path = substr($path, strlen($this->setup->get('ROOT_PATH')));
|
||||
$parts = explode('/', $rel_path);
|
||||
$encoded_parts = [];
|
||||
foreach ($parts as $part) {
|
||||
if ($part != '') {
|
||||
$encoded_parts[] = rawurlencode($part);
|
||||
}
|
||||
}
|
||||
|
||||
return Util::normalize_path($this->setup->get('ROOT_HREF') . implode('/', $encoded_parts), $trailing_slash);
|
||||
}
|
||||
|
||||
public function to_path($href) {
|
||||
$rel_href = substr($href, strlen($this->setup->get('ROOT_HREF')));
|
||||
return Util::normalize_path($this->setup->get('ROOT_PATH') . '/' . rawurldecode($rel_href));
|
||||
}
|
||||
|
||||
public function is_hidden($name) {
|
||||
// always hide
|
||||
if ($name === '.' || $name === '..') {
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach ($this->query_option('view.hidden', []) as $re) {
|
||||
$re = Util::wrap_pattern($re);
|
||||
if (preg_match($re, $name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function read_dir($path) {
|
||||
$names = [];
|
||||
if (is_dir($path)) {
|
||||
foreach (scandir($path) as $name) {
|
||||
if (
|
||||
$this->is_hidden($name)
|
||||
|| $this->is_hidden($this->to_href($path) . $name)
|
||||
|| (!is_readable($path . '/' . $name) && $this->query_option('view.hideIf403', false))
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
$names[] = $name;
|
||||
}
|
||||
}
|
||||
return $names;
|
||||
}
|
||||
|
||||
public function is_managed_href($href) {
|
||||
return $this->is_managed_path($this->to_path($href));
|
||||
}
|
||||
|
||||
public function is_managed_path($path) {
|
||||
if (!is_dir($path) || strpos($path, '../') !== false || strpos($path, '/..') !== false || $path === '..') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strpos($path, $this->setup->get('PUBLIC_PATH')) === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strpos($path, $this->setup->get('PRIVATE_PATH')) === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($this->query_option('view.unmanaged', []) as $name) {
|
||||
if (file_exists($path . '/' . $name)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
while ($path !== $this->setup->get('ROOT_PATH')) {
|
||||
if (@is_dir($path . '/_h5ai/private/conf')) {
|
||||
return false;
|
||||
}
|
||||
$parent_path = Util::normalize_path(dirname($path));
|
||||
if ($parent_path === $path) {
|
||||
return false;
|
||||
}
|
||||
$path = $parent_path;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function get_current_path() {
|
||||
$current_href = Util::normalize_path($this->setup->get('REQUEST_HREF'), true);
|
||||
$current_path = $this->to_path($current_href);
|
||||
|
||||
if (!is_dir($current_path)) {
|
||||
$current_path = Util::normalize_path(dirname($current_path), false);
|
||||
}
|
||||
|
||||
return $current_path;
|
||||
}
|
||||
|
||||
public function get_items($href, $what) {
|
||||
if (!$this->is_managed_href($href)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$cache = [];
|
||||
$folder = Item::get($this, $this->to_path($href), $cache);
|
||||
|
||||
// add content of subfolders
|
||||
if ($what >= 2 && $folder !== null) {
|
||||
foreach ($folder->get_content($cache) as $item) {
|
||||
$item->get_content($cache);
|
||||
}
|
||||
$folder = $folder->get_parent($cache);
|
||||
}
|
||||
|
||||
// add content of this folder and all parent folders
|
||||
while ($what >= 1 && $folder !== null) {
|
||||
$folder->get_content($cache);
|
||||
$folder = $folder->get_parent($cache);
|
||||
}
|
||||
|
||||
uasort($cache, ['Item', 'cmp']);
|
||||
$result = [];
|
||||
foreach ($cache as $p => $item) {
|
||||
$result[] = $item->to_json_object();
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function get_langs() {
|
||||
$langs = [];
|
||||
$l10n_path = $this->setup->get('CONF_PATH') . '/l10n';
|
||||
if (is_dir($l10n_path)) {
|
||||
if ($dir = opendir($l10n_path)) {
|
||||
while (($file = readdir($dir)) !== false) {
|
||||
if (Util::ends_with($file, '.json')) {
|
||||
$translations = Json::load($l10n_path . '/' . $file);
|
||||
$langs[basename($file, '.json')] = $translations['lang'];
|
||||
}
|
||||
}
|
||||
closedir($dir);
|
||||
}
|
||||
}
|
||||
ksort($langs);
|
||||
return $langs;
|
||||
}
|
||||
|
||||
public function get_l10n($iso_codes) {
|
||||
$results = [];
|
||||
|
||||
foreach ($iso_codes as $iso_code) {
|
||||
$file = $this->setup->get('CONF_PATH') . '/l10n/' . $iso_code . '.json';
|
||||
$results[$iso_code] = Json::load($file);
|
||||
$results[$iso_code]['isoCode'] = $iso_code;
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
public function get_thumbs($requests) {
|
||||
$hrefs = [];
|
||||
|
||||
foreach ($requests as $req) {
|
||||
$thumb = new Thumb($this);
|
||||
$hrefs[] = $thumb->thumb($req['type'], $req['href'], $req['width'], $req['height']);
|
||||
}
|
||||
|
||||
return $hrefs;
|
||||
}
|
||||
|
||||
private function prefix_x_head_href($href) {
|
||||
if (preg_match('@^(https?://|/)@i', $href)) {
|
||||
return $href;
|
||||
}
|
||||
|
||||
return $this->setup->get('PUBLIC_HREF') . 'ext/' . $href;
|
||||
}
|
||||
|
||||
private function get_fonts_html() {
|
||||
$fonts = $this->query_option('view.fonts', []);
|
||||
$fonts_mono = $this->query_option('view.fontsMono', []);
|
||||
|
||||
$html = '<style class="x-head">';
|
||||
|
||||
if (sizeof($fonts) > 0) {
|
||||
$html .= '#root,input,select{font-family:"' . implode('","', $fonts) . '"!important}';
|
||||
}
|
||||
|
||||
if (sizeof($fonts_mono) > 0) {
|
||||
$html .= 'pre,code{font-family:"' . implode('","', $fonts_mono) . '"!important}';
|
||||
}
|
||||
|
||||
$html .= '</style>';
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
public function get_x_head_html() {
|
||||
$scripts = $this->query_option('resources.scripts', []);
|
||||
$styles = $this->query_option('resources.styles', []);
|
||||
|
||||
$html = '';
|
||||
|
||||
foreach ($styles as $href) {
|
||||
$html .= '<link rel="stylesheet" href="' . $this->prefix_x_head_href($href) . '" class="x-head">';
|
||||
}
|
||||
|
||||
foreach ($scripts as $href) {
|
||||
$html .= '<script src="' . $this->prefix_x_head_href($href) . '" class="x-head"></script>';
|
||||
}
|
||||
|
||||
$html .= $this->get_fonts_html();
|
||||
|
||||
return $html;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
|
||||
class Fallback {
|
||||
private $context;
|
||||
|
||||
public function __construct($context) {
|
||||
$this->context = $context;
|
||||
}
|
||||
|
||||
public function get_html($path = null) {
|
||||
if (!$path) {
|
||||
$path = $this->context->get_current_path();
|
||||
}
|
||||
$fallback_images_href = $this->context->get_setup()->get('PUBLIC_HREF') . 'images/fallback/';
|
||||
|
||||
$cache = [];
|
||||
$folder = Item::get($this->context, $path, $cache);
|
||||
$items = $folder->get_content($cache);
|
||||
uasort($items, ['Item', 'cmp']);
|
||||
|
||||
$html = '<table>';
|
||||
|
||||
$html .= '<tr>';
|
||||
$html .= '<th class="fb-i"></th>';
|
||||
$html .= '<th class="fb-n"><span>Name</span></th>';
|
||||
$html .= '<th class="fb-d"><span>Last modified</span></th>';
|
||||
$html .= '<th class="fb-s"><span>Size</span></th>';
|
||||
$html .= '</tr>';
|
||||
|
||||
if ($folder->get_parent($cache)) {
|
||||
$html .= '<tr>';
|
||||
$html .= '<td class="fb-i"><img src="' . $fallback_images_href . 'folder-parent.png" alt="folder-parent"/></td>';
|
||||
$html .= '<td class="fb-n"><a href="..">Parent Directory</a></td>';
|
||||
$html .= '<td class="fb-d"></td>';
|
||||
$html .= '<td class="fb-s"></td>';
|
||||
$html .= '</tr>';
|
||||
}
|
||||
|
||||
foreach ($items as $item) {
|
||||
$type = $item->is_folder ? 'folder' : 'file';
|
||||
|
||||
$html .= '<tr>';
|
||||
$html .= '<td class="fb-i"><img src="' . $fallback_images_href . $type . '.png" alt="' . $type . '"/></td>';
|
||||
$html .= '<td class="fb-n"><a href="' . $item->href . '">' . basename($item->path) . '</a></td>';
|
||||
$html .= '<td class="fb-d">' . date('Y-m-d H:i', $item->date) . '</td>';
|
||||
$html .= '<td class="fb-s">' . ($item->size !== null ? intval($item->size / 1000) . ' KB' : '' ) . '</td>';
|
||||
$html .= '</tr>';
|
||||
}
|
||||
|
||||
$html .= '</table>';
|
||||
|
||||
return $html;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
<?php
|
||||
|
||||
class Filesize {
|
||||
private static $cache = [];
|
||||
|
||||
public static function getSize($path, $withFoldersize, $withDu) {
|
||||
$fs = new Filesize();
|
||||
return $fs->size($path, $withFoldersize, $withDu);
|
||||
}
|
||||
|
||||
public static function getCachedSize($path, $withFoldersize, $withDu) {
|
||||
if (array_key_exists($path, Filesize::$cache)) {
|
||||
return Filesize::$cache[$path];
|
||||
}
|
||||
|
||||
$size = Filesize::getSize($path, $withFoldersize, $withDu);
|
||||
|
||||
Filesize::$cache[$path] = $size;
|
||||
return $size;
|
||||
}
|
||||
|
||||
|
||||
private function __construct() {}
|
||||
|
||||
private function read_dir($path) {
|
||||
$paths = [];
|
||||
if (is_dir($path)) {
|
||||
foreach (scandir($path) as $name) {
|
||||
if ($name !== '.' && $name !== '..') {
|
||||
$paths[] = $path . '/' . $name;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $paths;
|
||||
}
|
||||
|
||||
private function php_filesize($path, $recursive = false) {
|
||||
// if (PHP_INT_SIZE < 8) {
|
||||
// }
|
||||
$size = @filesize($path);
|
||||
|
||||
if (!is_dir($path) || !$recursive) {
|
||||
return $size;
|
||||
}
|
||||
|
||||
foreach ($this->read_dir($path) as $p) {
|
||||
$size += $this->php_filesize($p, true);
|
||||
}
|
||||
return $size;
|
||||
}
|
||||
|
||||
|
||||
private function exec($cmdv) {
|
||||
$cmd = implode(' ', array_map('escapeshellarg', $cmdv));
|
||||
$lines = [];
|
||||
$rc = null;
|
||||
exec($cmd, $lines, $rc);
|
||||
return $lines;
|
||||
}
|
||||
|
||||
private function exec_du_all($paths) {
|
||||
$cmdv = array_merge(['du', '-sbL'], $paths);
|
||||
$lines = $this->exec($cmdv);
|
||||
|
||||
$sizes = [];
|
||||
foreach ($lines as $line) {
|
||||
$parts = preg_split('/[\s]+/', $line, 2);
|
||||
$size = intval($parts[0], 10);
|
||||
$path = $parts[1];
|
||||
$sizes[$path] = $size;
|
||||
}
|
||||
return $sizes;
|
||||
}
|
||||
|
||||
private function exec_du($path) {
|
||||
$sizes = $this->exec_du_all([$path]);
|
||||
return $sizes[$path];
|
||||
}
|
||||
|
||||
|
||||
private function size($path, $withFoldersize = false, $withDu = false) {
|
||||
if (is_file($path)) {
|
||||
return $this->php_filesize($path);
|
||||
}
|
||||
|
||||
if (is_dir($path) && $withFoldersize) {
|
||||
if ($withDu) {
|
||||
return $this->exec_du($path);
|
||||
}
|
||||
|
||||
return $this->php_filesize($path, true);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
<?php
|
||||
|
||||
class Item {
|
||||
public static function cmp($item1, $item2) {
|
||||
if ($item1->is_folder && !$item2->is_folder) {
|
||||
return -1;
|
||||
}
|
||||
if (!$item1->is_folder && $item2->is_folder) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return strcasecmp($item1->path, $item2->path);
|
||||
}
|
||||
|
||||
public static function get($context, $path, &$cache) {
|
||||
if (!Util::starts_with($path, $context->get_setup()->get('ROOT_PATH'))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (is_array($cache) && array_key_exists($path, $cache)) {
|
||||
return $cache[$path];
|
||||
}
|
||||
|
||||
$item = new Item($context, $path);
|
||||
|
||||
if (is_array($cache)) {
|
||||
$cache[$path] = $item;
|
||||
}
|
||||
return $item;
|
||||
}
|
||||
|
||||
public $context;
|
||||
public $path;
|
||||
public $href;
|
||||
public $date;
|
||||
public $size;
|
||||
public $is_folder;
|
||||
public $is_content_fetched;
|
||||
|
||||
private function __construct($context, $path) {
|
||||
$this->context = $context;
|
||||
|
||||
$this->path = Util::normalize_path($path, false);
|
||||
$this->is_folder = is_dir($this->path);
|
||||
$this->href = $context->to_href($this->path, $this->is_folder);
|
||||
$this->date = @filemtime($this->path);
|
||||
$this->size = Util::filesize($context, $this->path);
|
||||
$this->is_content_fetched = false;
|
||||
}
|
||||
|
||||
public function to_json_object() {
|
||||
$obj = [
|
||||
'href' => $this->href,
|
||||
'time' => $this->date * 1000, // seconds (PHP) to milliseconds (JavaScript)
|
||||
'size' => $this->size
|
||||
];
|
||||
|
||||
if ($this->is_folder) {
|
||||
$obj['managed'] = $this->context->is_managed_href($this->href);
|
||||
$obj['fetched'] = $this->is_content_fetched;
|
||||
}
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
public function get_parent(&$cache) {
|
||||
$parent_path = Util::normalize_path(dirname($this->path), false);
|
||||
if ($parent_path !== $this->path && Util::starts_with($parent_path, $this->context->get_setup()->get('ROOT_PATH'))) {
|
||||
return Item::get($this->context, $parent_path, $cache);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function get_content(&$cache) {
|
||||
$items = [];
|
||||
|
||||
if (!$this->context->is_managed_href($this->href)) {
|
||||
return $items;
|
||||
}
|
||||
|
||||
$files = $this->context->read_dir($this->path);
|
||||
foreach ($files as $file) {
|
||||
$item = Item::get($this->context, $this->path . '/' . $file, $cache);
|
||||
$items[$item->path] = $item;
|
||||
}
|
||||
|
||||
$this->is_content_fetched = true;
|
||||
|
||||
return $items;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
|
||||
class Json {
|
||||
const SINGLE = 1;
|
||||
const MULTI = 2;
|
||||
|
||||
public static function load($path) {
|
||||
if (!is_readable($path)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$json = file_get_contents($path);
|
||||
return Json::decode($json);
|
||||
}
|
||||
|
||||
public static function save($path, $obj) {
|
||||
$json = json_encode($obj);
|
||||
return file_put_contents($path, $json) !== false;
|
||||
}
|
||||
|
||||
private static function decode($json) {
|
||||
$json = Json::strip($json);
|
||||
return json_decode($json, true);
|
||||
}
|
||||
|
||||
private static function strip($commented_json) {
|
||||
$insideString = false;
|
||||
$insideComment = false;
|
||||
$json = '';
|
||||
|
||||
for ($i = 0, $len = strlen($commented_json); $i < $len; $i += 1) {
|
||||
$char = $commented_json[$i];
|
||||
$charchar = $char . @$commented_json[$i + 1];
|
||||
$prevChar = @$commented_json[$i - 1];
|
||||
|
||||
if (!$insideComment && $char === '"' && $prevChar !== "\\") {
|
||||
$insideString = !$insideString;
|
||||
}
|
||||
|
||||
if ($insideString) {
|
||||
$json .= $char;
|
||||
} elseif (!$insideComment && $charchar === '//') {
|
||||
$insideComment = Json::SINGLE;
|
||||
$i += 1;
|
||||
} elseif (!$insideComment && $charchar === '/*') {
|
||||
$insideComment = Json::MULTI;
|
||||
$i += 1;
|
||||
} elseif (!$insideComment) {
|
||||
$json .= $char;
|
||||
} elseif ($insideComment === Json::SINGLE && $charchar === "\r\n") {
|
||||
$insideComment = false;
|
||||
$json .= $charchar;
|
||||
$i += 1;
|
||||
} elseif ($insideComment === Json::SINGLE && $char === "\n") {
|
||||
$insideComment = false;
|
||||
$json .= $char;
|
||||
} elseif ($insideComment === Json::MULTI && $charchar === '*/') {
|
||||
$insideComment = false;
|
||||
$i += 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $json;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
class Logger {
|
||||
private static $start;
|
||||
private static $prev;
|
||||
|
||||
private static function time() {
|
||||
return microtime(true) * 1000; // sec * 1000 = ms
|
||||
}
|
||||
|
||||
public static function init() {
|
||||
self::$start = self::time();
|
||||
self::$prev = self::$start;
|
||||
register_shutdown_function(function () { Logger::log('shutdown'); });
|
||||
Logger::log('--------------------------------');
|
||||
}
|
||||
|
||||
public static function log($message=null, $obj=null) {
|
||||
$now = self::time();
|
||||
$message = number_format($now - self::$start, 3) . ' ' . number_format($now - self::$prev, 3) . ' ' . $message;
|
||||
|
||||
@error_log($message . ' ' . var_export($obj, true));
|
||||
|
||||
self::$prev = $now;
|
||||
}
|
||||
}
|
||||
|
||||
Logger::init();
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
class Request {
|
||||
private $params;
|
||||
|
||||
public function __construct($params, $body) {
|
||||
$data = json_decode($body, true);
|
||||
$this->params = $data !== null ? $data : $params;
|
||||
}
|
||||
|
||||
public function query($keypath = '', $default = Util::NO_DEFAULT) {
|
||||
$value = Util::array_query($this->params, $keypath, Util::NO_DEFAULT);
|
||||
|
||||
if ($value === Util::NO_DEFAULT) {
|
||||
Util::json_fail(Util::ERR_MISSING_PARAM, 'parameter \'' . $keypath . '\' is missing', $default === Util::NO_DEFAULT);
|
||||
return $default;
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
public function query_boolean($keypath = '', $default = Util::NO_DEFAULT) {
|
||||
$value = $this->query($keypath, $default);
|
||||
return filter_var($value, FILTER_VALIDATE_BOOLEAN);
|
||||
}
|
||||
|
||||
public function query_numeric($keypath = '', $default = Util::NO_DEFAULT) {
|
||||
$value = $this->query($keypath, $default);
|
||||
Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is not numeric', !is_numeric($value));
|
||||
return intval($value, 10);
|
||||
}
|
||||
|
||||
public function query_array($keypath = '', $default = Util::NO_DEFAULT) {
|
||||
$value = $this->query($keypath, $default);
|
||||
Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is no array', !is_array($value));
|
||||
return $value;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
class Session {
|
||||
private static $KEY_PREFIX = '__H5AI__';
|
||||
private $store;
|
||||
|
||||
public function __construct(&$store) {
|
||||
$this->store = &$store;
|
||||
}
|
||||
|
||||
public function set($key, $value) {
|
||||
$key = Session::$KEY_PREFIX . $key;
|
||||
$this->store[$key] = $value;
|
||||
}
|
||||
|
||||
public function get($key, $default = null) {
|
||||
$key = Session::$KEY_PREFIX . $key;
|
||||
return array_key_exists($key, $this->store) ? $this->store[$key] : $default;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,185 @@
|
|||
<?php
|
||||
|
||||
class Setup {
|
||||
private $store;
|
||||
private $refresh;
|
||||
|
||||
public function __construct($refresh = false) {
|
||||
$this->store = [];
|
||||
$this->refresh = $refresh;
|
||||
|
||||
$this->add_globals_and_envs();
|
||||
$this->add_php_checks();
|
||||
$this->add_app_metadata();
|
||||
$this->add_server_metadata_and_check();
|
||||
$this->add_paths();
|
||||
$this->add_sys_cmd_checks();
|
||||
}
|
||||
|
||||
private function set($key, $value) {
|
||||
if (array_key_exists($key, $this->store)) {
|
||||
Logger::log('setup key already taken', [
|
||||
'key' => $key,
|
||||
'value' => $value,
|
||||
'found' => $this->store[$key]
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
if (!is_string($value) && !is_bool($value)) {
|
||||
Logger::log('setup value neither string nor boolean', [
|
||||
'key' => $key,
|
||||
'value' => $value
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$this->store[$key] = $value;
|
||||
}
|
||||
|
||||
public function get($key) {
|
||||
if (!array_key_exists($key, $this->store)) {
|
||||
Logger::log('setup key not found', ['key' => $key]);
|
||||
exit;
|
||||
}
|
||||
|
||||
return $this->store[$key];
|
||||
}
|
||||
|
||||
private function add_globals_and_envs() {
|
||||
$this->set('PHP_VERSION', PHP_VERSION);
|
||||
$this->set('MIN_PHP_VERSION', MIN_PHP_VERSION);
|
||||
$this->set('PHP_ARCH', (PHP_INT_SIZE * 8) . '-bit');
|
||||
|
||||
$this->set('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']);
|
||||
$this->set('REQUEST_HREF', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
|
||||
$this->set('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
|
||||
$this->set('SERVER_SOFTWARE', $_SERVER['SERVER_SOFTWARE']);
|
||||
$this->set('HTTP_USER_AGENT', $_SERVER['HTTP_USER_AGENT']);
|
||||
}
|
||||
|
||||
private function add_php_checks() {
|
||||
$this->set('HAS_PHP_EXIF', function_exists('exif_thumbnail'));
|
||||
|
||||
$has_php_jpeg = false;
|
||||
if (function_exists('gd_info')) {
|
||||
$infos = gd_info();
|
||||
$has_php_jpeg = array_key_exists('JPEG Support', $infos) && $infos['JPEG Support'];
|
||||
}
|
||||
$this->set('HAS_PHP_JPEG', $has_php_jpeg);
|
||||
}
|
||||
|
||||
private function add_app_metadata() {
|
||||
$this->set('NAME', 'h5ai');
|
||||
$this->set('VERSION', H5AI_VERSION);
|
||||
$this->set('FILE_PREFIX', '_h5ai');
|
||||
}
|
||||
|
||||
private function add_server_metadata_and_check() {
|
||||
$server_software = $this->get('SERVER_SOFTWARE');
|
||||
$server_name = null;
|
||||
$server_version = null;
|
||||
|
||||
if ($server_software && preg_match('#^(.*?)(?:/(.*?))?(?: |$)#', strtolower($server_software), $matches)) {
|
||||
$server_name = $matches[1];
|
||||
$server_version = count($matches) > 2 ? $matches[2] : '';
|
||||
}
|
||||
|
||||
$this->set('SERVER_NAME', $server_name);
|
||||
$this->set('SERVER_VERSION', $server_version);
|
||||
$this->set('HAS_SERVER', in_array($server_name, ['apache', 'lighttpd', 'nginx', 'cherokee']));
|
||||
}
|
||||
|
||||
private function add_paths() {
|
||||
$script_name = $this->get('SCRIPT_NAME');
|
||||
if ($this->get('SERVER_NAME') === 'lighttpd') {
|
||||
$script_name = preg_replace('#^.*?//#', '/', $script_name);
|
||||
}
|
||||
|
||||
$this->set('H5AI_HREF', Util::normalize_path(dirname(dirname($script_name)), true));
|
||||
$this->set('H5AI_PATH', Util::normalize_path(dirname(dirname(dirname(dirname(__FILE__)))), false));
|
||||
|
||||
$this->set('ROOT_HREF', Util::normalize_path(dirname($this->get('H5AI_HREF')), true));
|
||||
$this->set('ROOT_PATH', Util::normalize_path(dirname($this->get('H5AI_PATH')), false));
|
||||
|
||||
$this->set('PUBLIC_HREF', Util::normalize_path($this->get('H5AI_HREF') . '/public/', true));
|
||||
$this->set('PUBLIC_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/public/', false));
|
||||
|
||||
$this->set('INDEX_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/index.php', false));
|
||||
$this->set('CACHE_PUB_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/cache', true));
|
||||
$this->set('CACHE_PUB_PATH', Util::normalize_path($this->get('PUBLIC_PATH') . '/cache', false));
|
||||
$this->set('HAS_WRITABLE_CACHE_PUB', @is_writable($this->get('CACHE_PUB_PATH')));
|
||||
|
||||
$this->set('PRIVATE_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/private', false));
|
||||
$this->set('CONF_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/conf', false));
|
||||
$this->set('CACHE_PRV_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/cache', false));
|
||||
$this->set('HAS_WRITABLE_CACHE_PRV', @is_writable($this->get('CACHE_PRV_PATH')));
|
||||
}
|
||||
|
||||
private function add_sys_cmd_checks() {
|
||||
$cmds_cache_path = Util::normalize_path($this->get('CACHE_PRV_PATH') . '/cmds.json', false);
|
||||
|
||||
$cmds = Json::load($cmds_cache_path);
|
||||
if (sizeof($cmds) === 0 || $this->refresh) {
|
||||
$cmds['command'] = Util::exec_0('command -v command');
|
||||
$cmds['which'] = Util::exec_0('which which') || Util::exec_0('which which.exe');
|
||||
|
||||
$cmd = false;
|
||||
if ($cmds['command']) {
|
||||
$cmd = 'command -v';
|
||||
} elseif ($cmds['which']) {
|
||||
$cmd = 'which';
|
||||
}
|
||||
|
||||
foreach (['avconv', 'convert', 'du', 'ffmpeg', 'gm', 'tar', 'zip'] as $c) {
|
||||
$cmds[$c] = ($cmd !== false) && (Util::exec_0($cmd . ' ' . $c) || Util::exec_0($cmd . ' ' . $c . '.exe'));
|
||||
}
|
||||
|
||||
Json::save($cmds_cache_path, $cmds);
|
||||
}
|
||||
foreach ($cmds as $c => $has) {
|
||||
$this->set('HAS_CMD_' . strtoupper($c), $has);
|
||||
}
|
||||
}
|
||||
|
||||
public function to_jsono($as_admin = false) {
|
||||
$keys = [
|
||||
'PUBLIC_HREF',
|
||||
'ROOT_HREF'
|
||||
];
|
||||
|
||||
if ($as_admin) {
|
||||
$keys = array_merge($keys, [
|
||||
'VERSION',
|
||||
|
||||
'PHP_VERSION',
|
||||
'MIN_PHP_VERSION',
|
||||
'PHP_ARCH',
|
||||
'HAS_PHP_EXIF',
|
||||
'HAS_PHP_JPEG',
|
||||
|
||||
'SERVER_NAME',
|
||||
'SERVER_VERSION',
|
||||
'HAS_SERVER',
|
||||
|
||||
'INDEX_HREF',
|
||||
|
||||
'HAS_WRITABLE_CACHE_PUB',
|
||||
'HAS_WRITABLE_CACHE_PRV',
|
||||
|
||||
'HAS_CMD_AVCONV',
|
||||
'HAS_CMD_CONVERT',
|
||||
'HAS_CMD_DU',
|
||||
'HAS_CMD_FFMPEG',
|
||||
'HAS_CMD_GM',
|
||||
'HAS_CMD_TAR',
|
||||
'HAS_CMD_ZIP'
|
||||
]);
|
||||
}
|
||||
|
||||
$jsono = ['AS_ADMIN' => $as_admin];
|
||||
foreach ($keys as $key) {
|
||||
$jsono[$key] = $this->get($key);
|
||||
}
|
||||
return $jsono;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
class Theme {
|
||||
private static $EXTENSIONS = ['svg', 'png', 'jpg'];
|
||||
private $context;
|
||||
|
||||
public function __construct($context) {
|
||||
$this->context = $context;
|
||||
}
|
||||
|
||||
public function get_icons() {
|
||||
$public_path = $this->context->get_setup()->get('PUBLIC_PATH');
|
||||
$theme = $this->context->query_option('view.theme', '-NONE-');
|
||||
$theme_path = $public_path . '/images/themes/' . $theme;
|
||||
|
||||
$icons = [];
|
||||
|
||||
if (is_dir($theme_path)) {
|
||||
if ($dir = opendir($theme_path)) {
|
||||
while (($name = readdir($dir)) !== false) {
|
||||
$path_parts = pathinfo($name);
|
||||
if (in_array(@$path_parts['extension'], Theme::$EXTENSIONS)) {
|
||||
$icons[$path_parts['filename']] = $theme . '/' . $name;
|
||||
}
|
||||
}
|
||||
closedir($dir);
|
||||
}
|
||||
}
|
||||
|
||||
return $icons;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
|
||||
class Util {
|
||||
const ERR_MISSING_PARAM = 'ERR_MISSING_PARAM';
|
||||
const ERR_ILLIGAL_PARAM = 'ERR_ILLIGAL_PARAM';
|
||||
const ERR_FAILED = 'ERR_FAILED';
|
||||
const ERR_DISABLED = 'ERR_DISABLED';
|
||||
const ERR_UNSUPPORTED = 'ERR_UNSUPPORTED';
|
||||
const NO_DEFAULT = 'NO_*@+#?!_DEFAULT';
|
||||
const RE_DELIMITER = '@';
|
||||
|
||||
public static function normalize_path($path, $trailing_slash = false) {
|
||||
$path = preg_replace('#[\\\\/]+#', '/', $path);
|
||||
return preg_match('#^(\w:)?/$#', $path) ? $path : (rtrim($path, '/') . ($trailing_slash ? '/' : ''));
|
||||
}
|
||||
|
||||
public static function json_exit($obj = []) {
|
||||
header('Content-type: application/json;charset=utf-8');
|
||||
echo json_encode($obj);
|
||||
exit;
|
||||
}
|
||||
|
||||
public static function json_fail($err, $msg = '', $cond = true) {
|
||||
if ($cond) {
|
||||
Util::json_exit(['err' => $err, 'msg' => $msg]);
|
||||
}
|
||||
}
|
||||
|
||||
public static function array_query($array, $keypath = '', $default = Util::NO_DEFAULT) {
|
||||
$value = $array;
|
||||
|
||||
$keys = array_filter(explode('.', $keypath));
|
||||
foreach ($keys as $key) {
|
||||
if (!is_array($value) || !array_key_exists($key, $value)) {
|
||||
return $default;
|
||||
}
|
||||
$value = $value[$key];
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
public static function starts_with($sequence, $head) {
|
||||
return substr($sequence, 0, strlen($head)) === $head;
|
||||
}
|
||||
|
||||
public static function ends_with($sequence, $tail) {
|
||||
$len = strlen($tail);
|
||||
return $len === 0 ? true : substr($sequence, -$len) === $tail;
|
||||
}
|
||||
|
||||
public static function wrap_pattern($pattern) {
|
||||
return Util::RE_DELIMITER . str_replace(Util::RE_DELIMITER, '\\' . Util::RE_DELIMITER, $pattern) . Util::RE_DELIMITER;
|
||||
}
|
||||
|
||||
public static function passthru_cmd($cmd) {
|
||||
$rc = null;
|
||||
passthru($cmd, $rc);
|
||||
return $rc;
|
||||
}
|
||||
|
||||
public static function exec_cmdv($cmdv) {
|
||||
if (!is_array($cmdv)) {
|
||||
$cmdv = func_get_args();
|
||||
}
|
||||
$cmd = implode(' ', array_map('escapeshellarg', $cmdv));
|
||||
|
||||
$lines = [];
|
||||
$rc = null;
|
||||
exec($cmd, $lines, $rc);
|
||||
return implode("\n", $lines);
|
||||
}
|
||||
|
||||
public static function exec_0($cmd) {
|
||||
$lines = [];
|
||||
$rc = null;
|
||||
try {
|
||||
@exec($cmd, $lines, $rc);
|
||||
return $rc === 0;
|
||||
} catch (Exception $e) {}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function filesize($context, $path) {
|
||||
$withFoldersize = $context->query_option('foldersize.enabled', false);
|
||||
$withDu = $context->get_setup()->get('HAS_CMD_DU') && $context->query_option('foldersize.type', null) === 'shell-du';
|
||||
return Filesize::getCachedSize($path, $withFoldersize, $withDu);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,183 @@
|
|||
<?php
|
||||
|
||||
class Archive {
|
||||
const NULL_BYTE = "\0";
|
||||
|
||||
private static $SEGMENT_SIZE = 16777216; // 1024 * 1024 * 16 = 16MiB
|
||||
private static $TAR_PASSTHRU_CMD = 'cd [ROOTDIR] && tar --no-recursion -c -- [DIRS] [FILES]';
|
||||
private static $ZIP_PASSTHRU_CMD = 'cd [ROOTDIR] && zip - -- [FILES]';
|
||||
|
||||
private $context;
|
||||
private $base_path;
|
||||
private $dirs;
|
||||
private $files;
|
||||
|
||||
public function __construct($context) {
|
||||
$this->context = $context;
|
||||
}
|
||||
|
||||
public function output($type, $base_href, $hrefs) {
|
||||
$this->base_path = $this->context->to_path($base_href);
|
||||
if (!$this->context->is_managed_path($this->base_path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->dirs = [];
|
||||
$this->files = [];
|
||||
|
||||
$this->add_hrefs($hrefs);
|
||||
|
||||
if (count($this->dirs) === 0 && count($this->files) === 0) {
|
||||
if ($type === 'php-tar') {
|
||||
$this->add_dir($this->base_path, '/');
|
||||
} else {
|
||||
$this->add_dir($this->base_path, '.');
|
||||
}
|
||||
}
|
||||
|
||||
if ($type === 'php-tar') {
|
||||
return $this->php_tar($this->dirs, $this->files);
|
||||
} elseif ($type === 'shell-tar') {
|
||||
return $this->shell_cmd(Archive::$TAR_PASSTHRU_CMD);
|
||||
} elseif ($type === 'shell-zip') {
|
||||
return $this->shell_cmd(Archive::$ZIP_PASSTHRU_CMD);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private function shell_cmd($cmd) {
|
||||
$cmd = str_replace('[ROOTDIR]', escapeshellarg($this->base_path), $cmd);
|
||||
$cmd = str_replace('[DIRS]', count($this->dirs) ? implode(' ', array_map('escapeshellarg', $this->dirs)) : '', $cmd);
|
||||
$cmd = str_replace('[FILES]', count($this->files) ? implode(' ', array_map('escapeshellarg', $this->files)) : '', $cmd);
|
||||
try {
|
||||
Util::passthru_cmd($cmd);
|
||||
} catch (Exeption $err) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private function php_tar($dirs, $files) {
|
||||
$filesizes = [];
|
||||
$total_size = 512 * count($dirs);
|
||||
foreach (array_keys($files) as $real_file) {
|
||||
$size = filesize($real_file);
|
||||
|
||||
$filesizes[$real_file] = $size;
|
||||
$total_size += 512 + $size;
|
||||
if ($size % 512 != 0) {
|
||||
$total_size += 512 - ($size % 512);
|
||||
}
|
||||
}
|
||||
|
||||
header('Content-Length: ' . $total_size);
|
||||
|
||||
foreach ($dirs as $real_dir => $archived_dir) {
|
||||
echo $this->php_tar_header($archived_dir, 0, @filemtime($real_dir . DIRECTORY_SEPARATOR . '.'), 5);
|
||||
}
|
||||
|
||||
foreach ($files as $real_file => $archived_file) {
|
||||
$size = $filesizes[$real_file];
|
||||
|
||||
echo $this->php_tar_header($archived_file, $size, @filemtime($real_file), 0);
|
||||
$this->print_file($real_file);
|
||||
|
||||
if ($size % 512 != 0) {
|
||||
echo str_repeat(Archive::NULL_BYTE, 512 - ($size % 512));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function php_tar_header($filename, $size, $mtime, $type) {
|
||||
$name = substr(basename($filename), -99);
|
||||
$prefix = substr(Util::normalize_path(dirname($filename)), -154);
|
||||
if ($prefix === '.') {
|
||||
$prefix = '';
|
||||
}
|
||||
|
||||
$header =
|
||||
str_pad($name, 100, Archive::NULL_BYTE) // filename [100]
|
||||
. '0000755' . Archive::NULL_BYTE // file mode [8]
|
||||
. '0000000' . Archive::NULL_BYTE // uid [8]
|
||||
. '0000000' . Archive::NULL_BYTE // gid [8]
|
||||
. str_pad(decoct($size), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE // file size [12]
|
||||
. str_pad(decoct($mtime), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE // file modification time [12]
|
||||
. ' ' // checksum [8]
|
||||
. str_pad($type, 1) // file type [1]
|
||||
. str_repeat(Archive::NULL_BYTE, 100) // linkname [100]
|
||||
. 'ustar' . Archive::NULL_BYTE // magic [6]
|
||||
. '00' // version [2]
|
||||
. str_repeat(Archive::NULL_BYTE, 80) // uname, gname, defmajor, devminor [32 + 32 + 8 + 8]
|
||||
. str_pad($prefix, 155, Archive::NULL_BYTE) // filename [155]
|
||||
. str_repeat(Archive::NULL_BYTE, 12); // fill [12]
|
||||
assert(strlen($header) === 512);
|
||||
|
||||
// checksum
|
||||
$checksum = array_sum(array_map('ord', str_split($header)));
|
||||
$checksum = str_pad(decoct($checksum), 6, '0', STR_PAD_LEFT) . Archive::NULL_BYTE . ' ';
|
||||
$header = substr_replace($header, $checksum, 148, 8);
|
||||
|
||||
return $header;
|
||||
}
|
||||
|
||||
private function print_file($file) {
|
||||
// Send file content in segments to not hit PHP's memory limit (default: 128M)
|
||||
if ($fd = fopen($file, 'rb')) {
|
||||
while (!feof($fd)) {
|
||||
print fread($fd, Archive::$SEGMENT_SIZE);
|
||||
@ob_flush();
|
||||
@flush();
|
||||
}
|
||||
fclose($fd);
|
||||
}
|
||||
}
|
||||
|
||||
private function add_hrefs($hrefs) {
|
||||
foreach ($hrefs as $href) {
|
||||
if (trim($href) === '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$d = Util::normalize_path(dirname($href), true);
|
||||
$n = basename($href);
|
||||
|
||||
if ($this->context->is_managed_href($d) && !$this->context->is_hidden($n)) {
|
||||
|
||||
$real_file = $this->context->to_path($href);
|
||||
$archived_file = preg_replace('!^' . preg_quote(Util::normalize_path($this->base_path, true)) . '!', '', $real_file);
|
||||
|
||||
if (is_dir($real_file)) {
|
||||
$this->add_dir($real_file, $archived_file);
|
||||
} else {
|
||||
$this->add_file($real_file, $archived_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function add_file($real_file, $archived_file) {
|
||||
if (is_readable($real_file)) {
|
||||
$this->files[$real_file] = $archived_file;
|
||||
}
|
||||
}
|
||||
|
||||
private function add_dir($real_dir, $archived_dir) {
|
||||
if ($this->context->is_managed_path($real_dir)) {
|
||||
$this->dirs[$real_dir] = $archived_dir;
|
||||
|
||||
$files = $this->context->read_dir($real_dir);
|
||||
foreach ($files as $file) {
|
||||
$real_file = $real_dir . '/' . $file;
|
||||
$archived_file = $archived_dir . '/' . $file;
|
||||
|
||||
if (is_dir($real_file)) {
|
||||
$this->add_dir($real_file, $archived_file);
|
||||
} else {
|
||||
$this->add_file($real_file, $archived_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
|
||||
class Custom {
|
||||
private static $EXTENSIONS = ['html', 'md'];
|
||||
private $context;
|
||||
|
||||
public function __construct($context) {
|
||||
$this->context = $context;
|
||||
}
|
||||
|
||||
private function read_custom_file($path, $name, &$content, &$type) {
|
||||
$file_prefix = $this->context->get_setup()->get('FILE_PREFIX');
|
||||
|
||||
foreach (Custom::$EXTENSIONS as $ext) {
|
||||
$file = $path . '/' . $file_prefix . '.' . $name . '.' . $ext;
|
||||
if (is_readable($file)) {
|
||||
$content = file_get_contents($file);
|
||||
$type = $ext;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function get_customizations($href) {
|
||||
if (!$this->context->query_option('custom.enabled', false)) {
|
||||
return [
|
||||
'header' => ['content' => null, 'type' => null],
|
||||
'footer' => ['content' => null, 'type' => null]
|
||||
];
|
||||
}
|
||||
|
||||
$root_path = $this->context->get_setup()->get('FILE_PREFIX');
|
||||
$path = $this->context->to_path($href);
|
||||
|
||||
$header = null;
|
||||
$header_type = null;
|
||||
$footer = null;
|
||||
$footer_type = null;
|
||||
|
||||
$this->read_custom_file($path, 'header', $header, $header_type);
|
||||
$this->read_custom_file($path, 'footer', $footer, $footer_type);
|
||||
|
||||
while ($header === null || $footer === null) {
|
||||
if ($header === null) {
|
||||
$this->read_custom_file($path, 'headers', $header, $header_type);
|
||||
}
|
||||
if ($footer === null) {
|
||||
$this->read_custom_file($path, 'footers', $footer, $footer_type);
|
||||
}
|
||||
if ($path === $root_path) {
|
||||
break;
|
||||
}
|
||||
$parent_path = Util::normalize_path(dirname($path));
|
||||
if ($parent_path === $path) {
|
||||
break;
|
||||
}
|
||||
$path = $parent_path;
|
||||
}
|
||||
|
||||
return [
|
||||
'header' => ['content' => $header, 'type' => $header_type],
|
||||
'footer' => ['content' => $footer, 'type' => $footer_type]
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
class Search {
|
||||
private $context;
|
||||
|
||||
public function __construct($context) {
|
||||
$this->context = $context;
|
||||
}
|
||||
|
||||
public function get_paths($root, $pattern = null, $ignorecase = false) {
|
||||
$paths = [];
|
||||
if ($pattern && $this->context->is_managed_path($root)) {
|
||||
$re = Util::wrap_pattern($pattern);
|
||||
if ($ignorecase) {
|
||||
$re .= 'i';
|
||||
}
|
||||
$names = $this->context->read_dir($root);
|
||||
foreach ($names as $name) {
|
||||
$path = $root . '/' . $name;
|
||||
if (preg_match($re, @basename($path))) {
|
||||
$paths[] = $path;
|
||||
}
|
||||
if (@is_dir($path)) {
|
||||
$paths = array_merge($paths, $this->get_paths($path, $pattern, $ignorecase));
|
||||
}
|
||||
}
|
||||
}
|
||||
return $paths;
|
||||
}
|
||||
|
||||
public function get_items($href, $pattern = null, $ignorecase = false) {
|
||||
$cache = [];
|
||||
$root = $this->context->to_path($href);
|
||||
$paths = $this->get_paths($root, $pattern, $ignorecase);
|
||||
$items = array_map(function ($path) {
|
||||
return Item::get($this->context, $path, $cache)->to_json_object();
|
||||
}, $paths);
|
||||
return $items;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,253 @@
|
|||
<?php
|
||||
|
||||
class Thumb {
|
||||
private static $FFMPEG_CMDV = ['ffmpeg', '-ss', '0:00:10', '-i', '[SRC]', '-an', '-vframes', '1', '[DEST]'];
|
||||
private static $AVCONV_CMDV = ['avconv', '-ss', '0:00:10', '-i', '[SRC]', '-an', '-vframes', '1', '[DEST]'];
|
||||
private static $CONVERT_CMDV = ['convert', '-density', '200', '-quality', '100', '-strip', '[SRC][0]', '[DEST]'];
|
||||
private static $GM_CONVERT_CMDV = ['gm', 'convert', '-density', '200', '-quality', '100', '[SRC][0]', '[DEST]'];
|
||||
private static $THUMB_CACHE = 'thumbs';
|
||||
|
||||
private $context;
|
||||
private $setup;
|
||||
private $thumbs_path;
|
||||
private $thumbs_href;
|
||||
|
||||
public function __construct($context) {
|
||||
$this->context = $context;
|
||||
$this->setup = $context->get_setup();
|
||||
$this->thumbs_path = $this->setup->get('CACHE_PUB_PATH') . '/' . Thumb::$THUMB_CACHE;
|
||||
$this->thumbs_href = $this->setup->get('CACHE_PUB_HREF') . Thumb::$THUMB_CACHE;
|
||||
|
||||
if (!is_dir($this->thumbs_path)) {
|
||||
@mkdir($this->thumbs_path, 0755, true);
|
||||
}
|
||||
}
|
||||
|
||||
public function thumb($type, $source_href, $width, $height) {
|
||||
$source_path = $this->context->to_path($source_href);
|
||||
if (!file_exists($source_path) || Util::starts_with($source_path, $this->setup->get('CACHE_PUB_PATH'))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$capture_path = $source_path;
|
||||
if ($type === 'img') {
|
||||
$capture_path = $source_path;
|
||||
} elseif ($type === 'mov') {
|
||||
if ($this->setup->get('HAS_CMD_AVCONV')) {
|
||||
$capture_path = $this->capture(Thumb::$AVCONV_CMDV, $source_path);
|
||||
} elseif ($this->setup->get('HAS_CMD_FFMPEG')) {
|
||||
$capture_path = $this->capture(Thumb::$FFMPEG_CMDV, $source_path);
|
||||
}
|
||||
} elseif ($type === 'doc') {
|
||||
if ($this->setup->get('HAS_CMD_CONVERT')) {
|
||||
$capture_path = $this->capture(Thumb::$CONVERT_CMDV, $source_path);
|
||||
} elseif ($this->setup->get('HAS_CMD_GM')) {
|
||||
$capture_path = $this->capture(Thumb::$GM_CONVERT_CMDV, $source_path);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->thumb_href($capture_path, $width, $height);
|
||||
}
|
||||
|
||||
private function thumb_href($source_path, $width, $height) {
|
||||
if (!file_exists($source_path)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$name = 'thumb-' . sha1($source_path) . '-' . $width . 'x' . $height . '.jpg';
|
||||
$thumb_path = $this->thumbs_path . '/' . $name;
|
||||
$thumb_href = $this->thumbs_href . '/' . $name;
|
||||
|
||||
if (!file_exists($thumb_path) || filemtime($source_path) >= filemtime($thumb_path)) {
|
||||
$image = new Image();
|
||||
|
||||
$et = false;
|
||||
if ($this->setup->get('HAS_PHP_EXIF') && $this->context->query_option('thumbnails.exif', false) === true && $height != 0) {
|
||||
$et = @exif_thumbnail($source_path);
|
||||
}
|
||||
if($et !== false) {
|
||||
file_put_contents($thumb_path, $et);
|
||||
$image->set_source($thumb_path);
|
||||
$image->normalize_exif_orientation($source_path);
|
||||
} else {
|
||||
$image->set_source($source_path);
|
||||
}
|
||||
|
||||
$image->thumb($width, $height);
|
||||
$image->save_dest_jpeg($thumb_path, 80);
|
||||
}
|
||||
|
||||
return file_exists($thumb_path) ? $thumb_href : null;
|
||||
}
|
||||
|
||||
private function capture($cmdv, $source_path) {
|
||||
if (!file_exists($source_path)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$capture_path = $this->thumbs_path . '/capture-' . sha1($source_path) . '.jpg';
|
||||
|
||||
if (!file_exists($capture_path) || filemtime($source_path) >= filemtime($capture_path)) {
|
||||
foreach ($cmdv as &$arg) {
|
||||
$arg = str_replace('[SRC]', $source_path, $arg);
|
||||
$arg = str_replace('[DEST]', $capture_path, $arg);
|
||||
}
|
||||
|
||||
Util::exec_cmdv($cmdv);
|
||||
}
|
||||
|
||||
return file_exists($capture_path) ? $capture_path : null;
|
||||
}
|
||||
}
|
||||
|
||||
class Image {
|
||||
private $source_file;
|
||||
private $source;
|
||||
private $width;
|
||||
private $height;
|
||||
private $type;
|
||||
private $dest;
|
||||
|
||||
public function __construct($filename = null) {
|
||||
$this->source_file = null;
|
||||
$this->source = null;
|
||||
$this->width = null;
|
||||
$this->height = null;
|
||||
$this->type = null;
|
||||
|
||||
$this->dest = null;
|
||||
|
||||
$this->set_source($filename);
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
$this->release_source();
|
||||
$this->release_dest();
|
||||
}
|
||||
|
||||
public function set_source($filename) {
|
||||
$this->release_source();
|
||||
$this->release_dest();
|
||||
|
||||
if (is_null($filename)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->source_file = $filename;
|
||||
|
||||
list($this->width, $this->height, $this->type) = @getimagesize($this->source_file);
|
||||
|
||||
if (!$this->width || !$this->height) {
|
||||
$this->source_file = null;
|
||||
$this->width = null;
|
||||
$this->height = null;
|
||||
$this->type = null;
|
||||
return;
|
||||
}
|
||||
|
||||
$this->source = imagecreatefromstring(file_get_contents($this->source_file));
|
||||
}
|
||||
|
||||
public function save_dest_jpeg($filename, $quality = 80) {
|
||||
if (!is_null($this->dest)) {
|
||||
@imagejpeg($this->dest, $filename, $quality);
|
||||
@chmod($filename, 0775);
|
||||
}
|
||||
}
|
||||
|
||||
public function release_dest() {
|
||||
if (!is_null($this->dest)) {
|
||||
@imagedestroy($this->dest);
|
||||
$this->dest = null;
|
||||
}
|
||||
}
|
||||
|
||||
public function release_source() {
|
||||
if (!is_null($this->source)) {
|
||||
@imagedestroy($this->source);
|
||||
$this->source_file = null;
|
||||
$this->source = null;
|
||||
$this->width = null;
|
||||
$this->height = null;
|
||||
$this->type = null;
|
||||
}
|
||||
}
|
||||
|
||||
public function thumb($width, $height) {
|
||||
if (is_null($this->source)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$src_r = 1.0 * $this->width / $this->height;
|
||||
|
||||
if ($height == 0) {
|
||||
if ($src_r >= 1) {
|
||||
$height = 1.0 * $width / $src_r;
|
||||
} else {
|
||||
$height = $width;
|
||||
$width = 1.0 * $height * $src_r;
|
||||
}
|
||||
if ($width > $this->width) {
|
||||
$width = $this->width;
|
||||
$height = $this->height;
|
||||
}
|
||||
}
|
||||
|
||||
$ratio = 1.0 * $width / $height;
|
||||
|
||||
if ($src_r <= $ratio) {
|
||||
$src_w = $this->width;
|
||||
$src_h = $src_w / $ratio;
|
||||
$src_x = 0;
|
||||
} else {
|
||||
$src_h = $this->height;
|
||||
$src_w = $src_h * $ratio;
|
||||
$src_x = 0.5 * ($this->width - $src_w);
|
||||
}
|
||||
|
||||
$width = intval($width);
|
||||
$height = intval($height);
|
||||
$src_x = intval($src_x);
|
||||
$src_w = intval($src_w);
|
||||
$src_h = intval($src_h);
|
||||
|
||||
$this->dest = imagecreatetruecolor($width, $height);
|
||||
$icol = imagecolorallocate($this->dest, 255, 255, 255);
|
||||
imagefill($this->dest, 0, 0, $icol);
|
||||
imagecopyresampled($this->dest, $this->source, 0, 0, $src_x, 0, $width, $height, $src_w, $src_h);
|
||||
}
|
||||
|
||||
public function rotate($angle) {
|
||||
if (is_null($this->source) || ($angle !== 90 && $angle !== 180 && $angle !== 270)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->source = imagerotate($this->source, $angle, 0);
|
||||
if ( $angle === 90 || $angle === 270 ) {
|
||||
list($this->width, $this->height) = [$this->height, $this->width];
|
||||
}
|
||||
}
|
||||
|
||||
public function normalize_exif_orientation($exif_source_file = null) {
|
||||
if (is_null($this->source) || !function_exists('exif_read_data')) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($exif_source_file === null) {
|
||||
$exif_source_file = $this->source_file;
|
||||
}
|
||||
|
||||
$exif = exif_read_data($exif_source_file);
|
||||
switch (@$exif['Orientation']) {
|
||||
case 3:
|
||||
$this->rotate(180);
|
||||
break;
|
||||
case 6:
|
||||
$this->rotate(270);
|
||||
break;
|
||||
case 8:
|
||||
$this->rotate(90);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
<?php header('Content-type: text/html;charset=utf-8'); ?><!DOCTYPE html><html class="no-js" lang="en"><head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><title>index - powered by h5ai v0.29.2 (https://larsjung.de/h5ai/)</title><meta name="description" content="index - powered by h5ai v0.29.2 (https://larsjung.de/h5ai/)"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="shortcut icon" href="<?= $public_href; ?>images/favicon/favicon-16-32.ico"><link rel="apple-touch-icon-precomposed" type="image/png" href="<?= $public_href; ?>images/favicon/favicon-152.png"><link rel="stylesheet" href="<?= $public_href; ?>css/styles.css"><?php if (!$fallback_mode) { ?><script src="<?= $public_href; ?>js/scripts.js" data-module="index"></script><?php } ?>
|
||||
<?= $x_head_tags; ?></head><body class="index" id="root"><div id="fallback-hints"><?php if (!$fallback_mode) { ?><span class="noJsMsg">Works best with JavaScript enabled!</span><span class="noBrowserMsg">Works best in <a href="http://browsehappy.com">modern browsers</a>!</span><?php } ?><span class="backlink"><a href="https://larsjung.de/h5ai/" title="h5ai v0.29.2 - Modern HTTP web server index.">powered by h5ai</a></span></div><div id="fallback"><?= $fallback_html; ?></div></body></html><!-- h5ai v0.29.2 - https://larsjung.de/h5ai/ -->
|
|
@ -0,0 +1,2 @@
|
|||
<?php header('Content-type: text/html;charset=utf-8'); ?><!DOCTYPE html><html class="no-js" lang="en"><head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><title>h5ai info page - v0.29.2</title><meta name="description" content="h5ai info page - v0.29.2"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="shortcut icon" href="<?= $public_href; ?>images/favicon/favicon-16-32.ico"><link rel="apple-touch-icon-precomposed" type="image/png" href="<?= $public_href; ?>images/favicon/favicon-152.png"><link rel="stylesheet" href="<?= $public_href; ?>css/styles.css"><?php if (!$fallback_mode) { ?><script src="<?= $public_href; ?>js/scripts.js" data-module="info"></script><?php } ?>
|
||||
<?= $x_head_tags; ?></head><body class="info" id="root"><div id="fallback-hints"><?php if (!$fallback_mode) { ?><span class="noJsMsg">Works best with JavaScript enabled!</span><span class="noBrowserMsg">Works best in <a href="http://browsehappy.com">modern browsers</a>!</span><?php } ?><span class="backlink"><a href="https://larsjung.de/h5ai/" title="h5ai v0.29.2 - Modern HTTP web server index.">powered by h5ai</a></span></div><div id="content"><h1 id="header"><a href="https://larsjung.de/h5ai/">h5ai</a></h1></div></body></html><!-- h5ai v0.29.2 - https://larsjung.de/h5ai/ -->
|
|
@ -0,0 +1,13 @@
|
|||
## make this folder accessible
|
||||
|
||||
# Apache < 2.3
|
||||
<IfModule !mod_authz_core.c>
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
Satisfy All
|
||||
</IfModule>
|
||||
|
||||
# Apache ≥ 2.3
|
||||
<IfModule mod_authz_core.c>
|
||||
Require all granted
|
||||
</IfModule>
|
|
@ -0,0 +1,9 @@
|
|||
# Cache
|
||||
|
||||
Public cache.
|
||||
|
||||
This directory is used for server side caching. To use caching make this
|
||||
directory writable for your webserver.
|
||||
|
||||
There is no critical data in here. You can savely remove any content. This
|
||||
will clear the cache.
|
|
@ -0,0 +1,4 @@
|
|||
# Extensions
|
||||
|
||||
This directory is used for additional script and style files. You have to add
|
||||
them manualy to the `resources` section in `_h5ai/private/conf/options.json`.
|
After Width: | Height: | Size: 118 B |
After Width: | Height: | Size: 108 B |
After Width: | Height: | Size: 99 B |
After Width: | Height: | Size: 219 B |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 96 B |
After Width: | Height: | Size: 120 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="#555" d="M 1,2 1,14 15,14 15,4 9,4 7,2 z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 148 B |
|
@ -0,0 +1,9 @@
|
|||
# Themes
|
||||
|
||||
This directory will contain any themes you add. At the moment there are only
|
||||
icon themes supported. The folder structure is: `<theme-name>/<type>.<ext>`,
|
||||
with `<ext>` one of `svg`, `png` or `jpg`.
|
||||
|
||||
To select a theme use the option `view > theme` in file `conf/options.json`.
|
||||
|
||||
You will find the previously included icon themes [here](https://github.com/lrsjng/h5ai-themes).
|
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#a4c639" d="M14.5 3.2C14.4 3.2 14.2 3.3 14.1 3.5L13.3 5C12.3 4.4 11.2 4 10 4 8.8 4 7.7 4.3 6.8 4.9L5.9 3.5C5.8 3.3 5.6 3.2 5.5 3.3 5.4 3.3 5.4 3.2 5.3 3.3L5.2 3.3C5 3.5 4.9 3.8 5.1 4L6 5.6C4.8 6.7 4 8.2 4 10L16 10C16 8.3 15.3 6.7 14.1 5.6L15 4C15.1 3.8 15 3.5 14.8 3.3L14.7 3.3C14.7 3.2 14.6 3.2 14.5 3.2zM7.3 7C7.8 7 8.2 7.4 8.2 7.9 8.2 8.4 7.8 8.8 7.3 8.8 6.8 8.8 6.4 8.4 6.4 7.9 6.4 7.4 6.8 7 7.3 7zM12.7 7C13.2 7 13.6 7.4 13.6 7.9 13.6 8.4 13.2 8.8 12.7 8.8 12.2 8.8 11.8 8.4 11.8 7.9 11.8 7.4 12.2 7 12.7 7zM4 10.5L4 16 16 16 16 10.5 4 10.5z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 656 B |
|
@ -0,0 +1,16 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="-60 -75 20 20">
|
||||
<g fill="#d70751" transform="matrix(0.06427071,0,0,0.06427071,-52.892053,-68.534728)">
|
||||
<path d="m 64.525,62.053 c -4.125,0.058 0.78,2.125 6.165,2.954 1.488,-1.161 2.838,-2.336 4.04,-3.479 -3.354,0.821 -6.765,0.838 -10.205,0.525"/>
|
||||
<path d="m 86.665,56.533 c 2.457,-3.389 4.246,-7.102 4.878,-10.939 -0.551,2.736 -2.035,5.099 -3.435,7.592 -7.711,4.854 -0.726,-2.883 -0.004,-5.824 -8.29,10.436 -1.138,6.257 -1.439,9.171"/>
|
||||
<path d="m 94.839,35.268 c 0.497,-7.428 -1.462,-5.08 -2.121,-2.245 0.766,0.4 1.377,5.237 2.121,2.245"/>
|
||||
<path d="m 48.883,-66.264 c 2.201,0.395 4.757,0.698 4.398,1.224 2.407,-0.528 2.954,-1.015 -4.398,-1.224"/>
|
||||
<path d="m 53.281,-65.04 -1.556,0.32 1.448,-0.127 0.108,-0.193"/>
|
||||
<path d="m 121.93,38.085 c 0.247,6.671 -1.95,9.907 -3.932,15.637 l -3.564,1.781 c -2.919,5.666 0.282,3.598 -1.807,8.105 -4.556,4.049 -13.823,12.67 -16.789,13.457 -2.163,-0.047 1.469,-2.554 1.943,-3.537 -6.097,4.188 -4.894,6.285 -14.217,8.83 L 83.291,81.751 C 60.29,92.569 28.344,71.129 28.765,41.875 28.519,43.732 28.067,43.268 27.557,44.019 26.371,28.967 34.509,13.849 48.232,7.676 61.659,1.03 77.395,3.758 87.012,12.72 81.73,5.8 71.217,-1.534 58.757,-0.848 46.549,-0.655 35.132,7.102 31.321,15.521 c -6.253,3.938 -6.979,15.177 -9.704,17.233 -3.665,26.943 6.896,38.583 24.762,52.275 2.812,1.896 0.792,2.184 1.173,3.627 C 41.616,85.877 36.18,81.68 31.711,76.542 c 2.372,3.473 4.931,6.847 8.239,9.499 -5.596,-1.897 -13.074,-13.563 -15.256,-14.038 9.647,17.274 39.142,30.295 54.587,23.836 -7.146,0.263 -16.226,0.146 -24.256,-2.822 -3.371,-1.734 -7.958,-5.331 -7.14,-6.003 21.079,7.875 42.854,5.965 61.09,-8.655 4.641,-3.614 9.709,-9.761 11.173,-9.846 -2.206,3.317 0.377,1.596 -1.318,4.523 4.625,-7.456 -2.008,-3.035 4.779,-12.877 l 2.507,3.453 c -0.931,-6.188 7.687,-13.704 6.813,-23.492 1.975,-2.994 2.206,3.22 0.107,10.107 2.912,-7.64 0.767,-8.867 1.516,-15.171 0.81,2.118 1.867,4.37 2.412,6.606 -1.895,-7.382 1.948,-12.433 2.898,-16.724 -0.937,-0.415 -2.928,3.264 -3.383,-5.457 0.065,-3.788 1.054,-1.985 1.435,-2.917 -0.744,-0.427 -2.694,-3.33 -3.88,-8.9 0.86,-1.308 2.3,3.393 3.47,3.586 -0.753,-4.429 -2.049,-7.805 -2.103,-11.202 -3.421,-7.149 -1.211,0.953 -3.985,-3.069 -3.641,-11.357 3.021,-2.637 3.47,-7.796 5.52,7.995 8.667,20.387 10.11,25.519 -1.103,-6.258 -2.883,-12.32 -5.058,-18.185 1.677,0.705 -2.699,-12.875 2.18,-3.882 -5.21,-19.172 -22.302,-37.087 -38.025,-45.493 1.924,1.76 4.354,3.971 3.481,4.317 -7.819,-4.656 -6.444,-5.018 -7.565,-6.985 -6.369,-2.591 -6.788,0.208 -11.007,0.004 -12.005,-6.368 -14.318,-5.69 -25.368,-9.681 l 0.502,2.349 c -7.953,-2.649 -9.265,1.005 -17.862,0.009 -0.523,-0.409 2.753,-1.479 5.452,-1.871 -7.69,1.015 -7.329,-1.515 -14.854,0.279 1.855,-1.301 3.815,-2.162 5.793,-3.269 -6.271,0.381 -14.971,3.649 -12.286,0.677 -10.235,4.569 -28.403,10.976 -38.597,20.535 l -0.321,-2.142 c -4.672,5.608 -20.371,16.748 -21.622,24.011 l -1.249,0.291 c -2.431,4.116 -4.004,8.781 -5.932,13.016 -3.18,5.417 -4.661,2.085 -4.208,2.934 -6.253,12.679 -9.359,23.332 -12.043,32.069 1.912,2.858 0.046,17.206 0.769,28.688 -3.141,56.709 39.8,111.77 86.737,124.48 6.88,2.459 17.11,2.364 25.813,2.618 -10.268,-2.937 -11.595,-1.556 -21.595,-5.044 -7.215,-3.398 -8.797,-7.277 -13.907,-11.711 l 2.022,3.573 c -10.021,-3.547 -5.829,-4.39 -13.982,-6.972 l 2.16,-2.82 C 11.175,156.251 5.82,151.022 4.355,148.126 l -3.553,0.14 c -4.27,-5.269 -6.545,-9.063 -6.379,-12.005 l -1.148,2.047 c -1.301,-2.235 -15.709,-19.759 -8.234,-15.679 -1.389,-1.271 -3.235,-2.067 -5.237,-5.703 l 1.522,-1.739 c -3.597,-4.627 -6.621,-10.562 -6.391,-12.536 1.919,2.592 3.25,3.075 4.568,3.52 -9.083,-22.539 -9.593,-1.242 -16.474,-22.942 l 1.456,-0.116 c -1.116,-1.682 -1.793,-3.506 -2.69,-5.298 l 0.633,-6.313 C -44.113,63.94 -39.401,39.351 -38.459,25.865 -37.804,20.38 -33,14.543 -29.345,5.388 l -2.227,-0.384 c 4.256,-7.423 24.301,-29.814 33.583,-28.662 4.499,-5.649 -0.892,-0.02 -1.772,-1.443 9.878,-10.223 12.984,-7.222 19.65,-9.061 7.19,-4.268 -6.17,1.664 -2.761,-1.628 12.427,-3.174 8.808,-7.216 25.021,-8.828 1.71,0.973 -3.969,1.503 -5.395,2.766 10.354,-5.066 32.769,-3.914 47.326,2.811 16.895,7.896 35.873,31.232 36.622,53.189 l 0.852,0.229 c -0.431,8.729 1.336,18.822 -1.727,28.094 l 2.1,-4.385"/>
|
||||
<path d="m 19.5,67.715 -0.578,2.893 c 2.71,3.683 4.861,7.673 8.323,10.552 -2.49,-4.863 -4.341,-6.872 -7.745,-13.445"/>
|
||||
<path d="m 25.909,67.464 c -1.435,-1.587 -2.284,-3.497 -3.235,-5.4 0.909,3.345 2.771,6.219 4.504,9.143 l -1.269,-3.743"/>
|
||||
<path d="m 139.32,42.814 -0.605,1.52 c -1.111,7.892 -3.511,15.701 -7.189,22.941 4.06,-7.639 6.69,-15.995 7.79,-24.461"/>
|
||||
<path d="m 49.698,-68.243 c 2.789,-1.022 6.855,-0.56 9.814,-1.233 -3.855,0.324 -7.693,0.517 -11.484,1.005 l 1.67,0.228"/>
|
||||
<path d="m -48.219,-16.176 c 0.642,5.951 -4.477,8.26 1.134,4.337 3.007,-6.773 -1.175,-1.87 -1.134,-4.337"/>
|
||||
<path d="m -54.812,11.362 c 1.292,-3.967 1.526,-6.349 2.02,-8.645 -3.571,4.566 -1.643,5.539 -2.02,8.645"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
|
@ -0,0 +1,11 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 13.913043 15.22257">
|
||||
<g fill="#000" transform="matrix(0.01974442,0,0,0.01974442,0.59799609,3.692127)">
|
||||
<path d="m 242.1304,26.136154 c 12.57375,-1.931991 25.25548,-3.344345 37.9671,-4.013656 2.25826,-0.538041 4.59412,-0.428086 6.90119,-0.510544 18.03637,-0.575318 36.09759,-0.549286 54.12636,0.262939 32.54014,2.301468 64.91549,7.707276 96.30586,16.718582 l -0.13292,0.17627 c -4.60202,6.223907 -9.21752,12.438019 -13.73035,18.725891 -1.35219,0.249481 -2.53581,-0.605759 -3.74014,-1.036484 -23.8157,-9.827469 -49.16701,-15.53215 -74.68315,-18.619186 -41.97006,-4.297928 -84.93817,-0.844666 -125.2014,12.070068 -29.64401,9.587738 -58.27112,24.371842 -80.37665,46.666519 -15.66559,16.020307 -27.69327,36.744737 -29.32584,59.451997 -1.51913,10.82149 1.07187,21.62427 3.36382,32.12558 L 14.185699,205.68005 C 13.945419,188.13843 18.523071,170.78329 25.80806,154.91394 40.297989,124.01501 65.424713,99.327652 93.421997,80.42572 112.35318,67.714981 132.81692,57.345383 154.07152,49.122925 182.38751,38.052567 212.05559,30.488739 242.1304,26.136154 z"/>
|
||||
<path d="m 301.70334,148.63515 c 1.94578,-3.16858 5.37183,-5.69597 9.26865,-5.22687 4.4046,0.11267 7.79878,3.75244 8.71124,7.87158 l 310.75082,55.27789 -1.03752,5.20607 -310.68332,-54.48095 c -2.47844,4.31216 -8.22775,6.5392 -12.74457,3.9928 -3.13145,-1.36889 -4.19975,-4.71973 -5.61303,-7.53113 l -19.12972,-3.06511 0.87691,-5.38129 19.60054,3.33701 z"/>
|
||||
<path d="m 13.649231,221.30466 c 18.262405,-0.12262 36.52626,-0.0226 54.789398,-0.051 0.01808,0.6767 0.05426,2.03008 0.07234,2.70677 13.269959,-2.88977 26.908417,-4.11874 40.480651,-3.36956 9.88256,0.90474 18.95615,5.13992 27.79413,9.3441 -9.96293,6.16172 -20.10092,12.09585 -29.82344,18.61522 -10.834169,-8.36657 -25.559114,-8.37398 -38.193818,-4.71335 -0.157685,1.35187 -0.305954,2.70839 -0.319413,4.07715 0.0064,31.4396 0.01517,62.87977 -0.0037,94.32 -18.255799,-0.006 -36.511368,0.0168 -54.767029,-0.0115 -0.0388,-40.30612 0.01926,-80.61204 -0.02911,-120.91781 z"/>
|
||||
<path d="m 155.75305,221.30997 c 16.07997,-0.13549 32.16204,-0.0238 48.2433,-0.0572 23.83194,-0.13529 48.05416,2.93651 70.20328,12.1031 13.75632,5.82483 27.06233,14.43199 35.03758,27.39059 6.05672,10.0663 8.17432,22.99054 3.41974,34.00478 -5.58125,13.21376 -17.53407,22.37564 -29.70006,29.22304 -22.30197,11.93273 -47.08825,18.27707 -72.31572,19.34199 l -0.0437,24.93099 -54.85077,7.52423 0.006,-154.46153 z"/>
|
||||
<path d="m 350.73776,221.33231 c 62.75727,-0.19167 125.51848,-0.0234 188.27761,-0.0843 18.36058,0.076 37.02661,0.1922 54.8872,4.94194 5.14029,1.69319 11.99558,3.70666 13.34763,9.68171 0.13403,35.45186 0.05,70.91191 0.0409,106.36713 -18.26615,-0.004 -36.53138,-0.0113 -54.79609,0.004 -0.004,-35.17893 -0.0756,-70.3591 0.0357,-105.53679 -3.31824,-2.87891 -8.04874,-2.75609 -12.16869,-3.25885 -11.26521,-0.29326 -22.53945,-0.084 -33.80654,-0.11576 0.002,36.30307 0.0406,72.60642 -0.0191,108.90969 -18.292,-0.0171 -36.58319,0.005 -54.87403,-0.0112 -0.0542,-29.07907 -0.008,-58.15799 -0.0231,-87.23671 -0.14635,-6.3542 0.31845,-12.73225 -0.27677,-19.06588 -5.14636,-2.16309 -10.78398,-2.58689 -16.30214,-2.61335 -9.79776,-0.0158 -19.5944,0.007 -29.39029,-0.01 -0.048,36.31536 0.0591,72.63149 -0.0537,108.94673 -17.22348,-0.022 -34.44665,-0.0339 -51.66902,0.007 l -3.31752,-0.0131 c 0.28336,-40.07539 0.0678,-80.83315 0.108,-120.91222 z"/>
|
||||
<path fill="#d72123" d="m 423.56764,57.495636 c 4.51283,-6.287872 9.12833,-12.501984 13.73035,-18.725891 42.14722,12.344238 82.84823,31.836792 116.09491,60.881943 13.59442,12.173292 25.88991,25.944912 35.33316,41.613512 11.1826,18.43936 18.26884,39.55612 19.02705,61.19006 -33.0565,-5.77759 -66.1038,-11.60446 -99.1558,-17.40172 4.06793,-12.93818 4.10266,-27.0249 1.31704,-40.22806 -5.16264,-22.81849 -19.7915,-42.41004 -37.43728,-57.282084 C 457.76711,75.165924 440.98531,65.246307 423.20515,57.986771 l 0.36249,-0.491135 z"/>
|
||||
<path fill="#fff" d="m 210.67975,234.60013 c 14.04689,1.40957 26.7447,9.34711 36.33964,19.39103 8.27451,8.70258 14.12349,20.84611 12.10276,33.07682 -2.20877,12.25284 -10.73442,22.20633 -20.32152,29.61572 -8.32672,6.11266 -17.74312,11.38919 -28.12337,12.77234 -0.0358,-31.61874 -0.0407,-63.2376 0.002,-94.85591 z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,13 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<g transform="matrix(0.04742975,0,0,0.04742975,2.9426429,-1.9210171)">
|
||||
<path fill="#1572b6" d="M 27.142,386.29 0.071,82.67 l 297.45,0 -27.096,303.571 -121.811,33.77 L 27.142,386.29 z m 0,0"/>
|
||||
<path fill="#33a9dc" d="m 148.798,394.199 98.427,-27.288 23.157,-259.415 -121.584,0 0,286.703 z m 0,0"/>
|
||||
<g transform="translate(55,142)">
|
||||
<path fill="#ffffff" d="m 93.797,75.496 49.275,0 3.403,-38.132 -52.678,0 0,-37.239 0.129,0 93.246,0 -0.893,9.991 -9.152,102.616 -83.33,0 0,-37.236 z m 0,0"/>
|
||||
<path fill="#ebebeb" d="m 94.02,172.204 -0.163,0.046 -41.472,-11.199 -2.652,-29.698 -20.151,0 -17.228,0 5.216,58.467 76.278,21.176 0.172,-0.048 0,-38.744 z m 0,0"/>
|
||||
<path fill="#ffffff" d="m 139.907,111.156 -4.484,49.87 -41.532,11.21 0,38.742 76.339,-21.158 0.56,-6.29 6.478,-72.374 -37.361,0 z m 0,0"/>
|
||||
<path fill="#ebebeb" d="m 93.926,0.125 0,23.128 0,14.019 0,0.092 -89.828,0 -0.119,0 -0.747,-8.37 -1.697,-18.878 -0.89,-9.991 93.281,0 z m 0,0"/>
|
||||
<path fill="#ebebeb" d="m 93.797,75.5 0,23.129 0,14.017 0,0.092 -40.828,0 -0.119,0 -0.746,-8.369 -1.698,-18.878 -0.89,-9.991 44.281,0 z m 0,0"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
|
@ -0,0 +1,29 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#f6d2a2" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 10.634,-238.979 c 0.764,15.751 16.499,8.463 23.626,3.539 6.765,-4.675 8.743,-0.789 9.337,-10.015 0.389,-6.064 1.088,-12.128 0.744,-18.216 -10.23,-0.927 -21.357,1.509 -29.744,7.602 -4.32,3.139 -12.42,13.158 -3.963,17.09" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#c6b198" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 10.634,-238.979 c 2.29,-0.852 4.717,-1.457 6.271,-3.528" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#6ad7e5" fill-rule="evenodd" stroke="#000" stroke-width="3" d="M46.997-426.619c-60.297-16.956-15.461-93.664 32.959-62.113l-32.959 62.113zM314.895-494.488c47.727-33.523 90.856 42.111 35.388 61.141l-35.388-61.141z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#f6d2a2" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 325.161,-45.128999 c 12.123,7.501 34.282,30.182 16.096,41.1799995 -17.474,15.9990005 -27.254,-17.5609995 -42.591,-22.2109995 6.605,-8.97 14.977,-17.149 26.495,-18.969 z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="none" stroke="#000" stroke-width="3" d="m 341.257,-3.9499995 c -2.696,-5.361 -3.601,-11.6179995 -8.102,-15.9389995" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#f6d2a2" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 108.579,-19.496999 c -14.229,2.202 -22.238,15.0389995 -34.1,21.5579995 -11.178,6.665 -15.454,-2.13399996 -16.461,-3.92 -1.752,-0.799 -1.605,0.744 -4.309,-1.979 -10.362,-16.3539995 10.797,-28.3079995 21.815,-36.4319995 15.346,-3.102 24.963,10.202 33.055,20.773 z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="none" stroke="#000" stroke-width="3" d="m 58.019,-1.8599995 c 0.542,-6.233 5.484,-10.4069995 7.838,-15.6769995" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill-rule="evenodd" d="M49.513-447.805c-7.955-4.208-13.791-9.923-8.925-19.124 4.505-8.518 12.874-7.593 20.83-3.385l-11.905 22.509zM337.716-455.805c7.955-4.208 13.791-9.923 8.925-19.124-4.505-8.518-12.874-7.593-20.83-3.385l11.905 22.509z" clip-rule="evenodd" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#f6d2a2" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 392.475,-240.979 c -0.764,15.751 -16.499,8.463 -23.626,3.539 -6.765,-4.675 -8.743,-0.789 -9.337,-10.015 -0.389,-6.064 -1.088,-12.128 -0.744,-18.216 10.23,-0.927 21.357,1.509 29.744,7.602 4.319,3.139 12.42,13.158 3.963,17.09" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#c6b198" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 392.475,-240.979 c -2.29,-0.852 -4.717,-1.457 -6.271,-3.528" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#6ad7e5" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 195.512,13.124 c 60.365,0 116.953,8.633 146.452,66.629 26.478,65.006 17.062,135.104 21.1,203.806 3.468,58.992 11.157,127.145 -16.21,181.812 -28.79,57.514 -100.73,71.982 -160,69.863 C 140.299,533.568 84.06,518.38 57.785,475.845 26.959,425.945 41.553,351.747 43.792,296.223 46.444,230.452 25.977,164.481 47.584,100.122 69.999,33.359 130.451,18.271 195.512,13.124" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 1.636)"/>
|
||||
<path fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="2.908" d="m 206.169,-445.312 c 10.838,63.003 113.822,46.345 99.03,-17.197 -13.264,-56.98 -102.632,-41.208 -99.03,17.197" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="2.821" d="m 83.103,-435.122 c 14.047,54.85 101.864,40.807 98.554,-14.213 -3.966,-65.895 -111.984,-53.18 -98.554,14.213" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<path fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 218.594,-369.71 c 0.046,8.191 1.861,17.387 0.312,26.101 -2.091,3.952 -6.193,4.37 -9.729,5.967 -4.89,-0.767 -9.002,-3.978 -10.963,-8.552 -1.255,-9.946 0.468,-19.576 0.785,-29.526 l 19.595,6.01 z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<g fill-rule="evenodd" transform="matrix(.03 0 0 .03 3.959 1.636)" clip-rule="evenodd">
|
||||
<ellipse cx="107.324" cy="95.404" ry="16.062" rx="14.829"/>
|
||||
<ellipse cx="114.069" cy="99.029" fill="#fff" ry="4.082" rx="3.496"/>
|
||||
</g>
|
||||
<g fill-rule="evenodd" transform="matrix(.03 0 0 .03 3.959 1.636)" clip-rule="evenodd">
|
||||
<ellipse cx="231.571" cy="91.404" ry="16.062" rx="14.582"/>
|
||||
<ellipse cx="238.204" cy="95.029" fill="#fff" ry="4.082" rx="3.438"/>
|
||||
</g>
|
||||
<path fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 176.217,-370.602 c -6.47,15.68 3.608,47.035 21.163,23.908 -1.255,-9.946 0.468,-19.576 0.785,-29.526 l -21.948,5.618 z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
|
||||
<g fill-rule="evenodd" clip-rule="evenodd">
|
||||
<path fill="#f6d2a2" stroke="#231f20" stroke-width="3" d="m 178.431,138.673 c -12.059,1.028 -21.916,15.366 -15.646,26.709 8.303,15.024 26.836,-1.329 38.379,0.203 13.285,0.272 24.17,14.047 34.84,2.49 11.867,-12.854 -5.109,-25.373 -18.377,-30.97 l -39.196,1.568 z" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 1.636)"/>
|
||||
<path d="m 176.913,138.045 c -0.893,-20.891 38.938,-23.503 43.642,-6.016 4.692,17.446 -41.681,21.498 -43.642,6.016 -1.565,-12.363 0,0 0,0 z" transform="matrix(.03 0 0 .03 3.959 1.636)"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.8 KiB |
|
@ -0,0 +1,10 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<g transform="matrix(0.03889348,0,0,0.03889348,0.04326912,-1.9134619)">
|
||||
<polygon fill="#e44d26" points="437.367,100.62 404.321,470.819 255.778,512 107.644,470.877 74.633,100.62"/>
|
||||
<polygon fill="#f16529" points="256,130.894 256,480.523 376.03,447.246 404.27,130.894"/>
|
||||
<polygon fill="#ebebeb" points="143.219,188.488 154.38,313.627 256,313.627 256,268.217 195.91,268.217 191.76,221.716 256,221.716 256,176.305 255.843,176.305 142.132,176.305"/>
|
||||
<polygon fill="#ebebeb" points="256,386.153 255.801,386.206 205.227,372.55 201.994,336.333 177.419,336.333 156.409,336.333 162.771,407.634 255.791,433.457 256,433.399"/>
|
||||
<polygon fill="#ffffff" points="255.843,433.435 348.937,407.634 349.62,399.962 360.291,280.411 361.399,268.217 349.162,268.217 255.843,268.217 255.843,313.627 311.761,313.627 306.49,372.521 255.843,386.191"/>
|
||||
<polygon fill="#ffffff" points="366.442,211.509 368.511,188.488 369.597,176.305 255.843,176.305 255.843,204.509 255.843,221.605 255.843,221.716 365.385,221.716 365.385,221.716 365.531,221.716"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#fbc02d" stroke="#fbc02d" stroke-width="1" d="M 14.1875 4.6875 C 13.09018 4.6875104 12.199333 4.9405471 11.5625 5.46875 C 10.925664 5.9871904 10.624999 6.7055265 10.625 7.625 C 10.624999 8.0651846 10.696787 8.4682415 10.84375 8.78125 C 11.000508 9.0942712 11.192562 9.3375261 11.4375 9.5625 C 11.692232 9.7874849 11.989182 9.9997477 12.3125 10.15625 C 12.645612 10.302981 12.991037 10.435342 13.34375 10.5625 C 13.696455 10.679886 14.006917 10.810341 14.28125 10.9375 C 14.555575 11.054885 14.782593 11.165778 14.96875 11.3125 C 15.164694 11.449448 15.308271 11.605183 15.40625 11.78125 C 15.514016 11.957323 15.562494 12.16171 15.5625 12.40625 C 15.562494 12.817085 15.428715 13.150022 15.125 13.375 C 14.821273 13.599981 14.322474 13.718751 13.65625 13.71875 C 13.019412 13.718751 12.481931 13.646727 12.03125 13.5 C 11.580565 13.353276 11.23328 13.209228 10.96875 13.0625 L 10.40625 14.5625 C 10.52382 14.630973 10.679049 14.724461 10.875 14.8125 C 11.070949 14.890754 11.297967 14.952993 11.5625 15.03125 C 11.836828 15.109504 12.157087 15.169839 12.5 15.21875 C 12.852707 15.277443 13.234955 15.3125 13.65625 15.3125 C 14.910321 15.3125 15.853361 15.061368 16.5 14.5625 C 17.156424 14.053851 17.499993 13.325734 17.5 12.40625 C 17.499993 11.92695 17.418407 11.551332 17.28125 11.21875 C 17.144079 10.876394 16.952025 10.557047 16.6875 10.3125 C 16.432759 10.058181 16.132095 9.8635762 15.75 9.6875 C 15.377691 9.5016528 14.948821 9.3010768 14.46875 9.125 C 14.194416 9.0271889 13.922635 8.9201051 13.6875 8.8125 C 13.462155 8.7049074 13.270101 8.5959189 13.09375 8.46875 C 12.92719 8.3415943 12.785469 8.2190145 12.6875 8.0625 C 12.599319 7.896218 12.562497 7.693737 12.5625 7.46875 C 12.562497 7.0970525 12.694418 6.7991744 12.96875 6.59375 C 13.252873 6.3883426 13.656575 6.2812588 14.15625 6.28125 C 14.577537 6.2812588 14.983096 6.3396915 15.375 6.4375 C 15.776691 6.5353258 16.13563 6.6891556 16.46875 6.875 L 17.03125 5.375 C 16.747117 5.2087206 16.374665 5.0432042 15.875 4.90625 C 15.385121 4.7595342 14.82433 4.6875104 14.1875 4.6875 z M 6.9375 4.9375 L 6.9375 11.625 C 6.9374954 12.387977 6.8153722 12.936987 6.53125 13.25 C 6.2471196 13.563017 5.7832845 13.718751 5.15625 13.71875 C 4.7839439 13.718751 4.4250043 13.646727 4.0625 13.5 C 3.7097899 13.343494 3.4011857 13.166291 3.15625 13 L 2.5 14.46875 C 2.7547338 14.674167 3.1234709 14.876648 3.59375 15.0625 C 4.0738243 15.238567 4.6346149 15.3125 5.28125 15.3125 C 5.9768667 15.3125 6.5493124 15.217103 7 15.03125 C 7.460476 14.845398 7.829213 14.604047 8.09375 14.28125 C 8.3680731 13.958455 8.5484718 13.555398 8.65625 13.125 C 8.7640159 12.694607 8.8124936 12.248871 8.8125 11.75 L 8.8125 4.9375 L 6.9375 4.9375 z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
|
@ -0,0 +1,8 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<g fill="#5c6bc0" transform="matrix(0.02460339,0,0,0.02460339,1.0508613,-2.0358995)">
|
||||
<path d="m 635.0385,526.8108 c 35.909,12.563 53.856,34.088 53.856,64.543 0,20.046 -7.443,35.957 -22.296,47.725 -14.838,11.776 -36.005,19.084 -63.557,19.084 -27.552,0 -53.037,-7.983 -76.51,-21.088 0.254,-6.95 2.091,-14.575 5.463,-22.852 3.372,-8.277 7.363,-14.853 11.936,-19.656 21.573,11.211 40.346,16.826 56.281,16.826 7.531,0 13.358,-1.264 17.414,-3.809 4.063,-2.536 6.083,-5.94 6.083,-10.217 0,-8.039 -6.226,-14.051 -18.638,-18.058 l -22.296,-8.421 c -33.73,-12.293 -50.596,-32.323 -50.596,-60.146 0,-20.316 7.085,-36.418 21.255,-48.33 14.17,-11.895 33.269,-22.137 57.283,-22.137 11.88,0 24.96,1.67 39.272,5.01 14.297,3.348 26.042,11.594 35.218,16.125 0.541,7.49 -0.962,15.712 -4.452,24.665 -3.515,8.961 -7.824,15.306 -12.969,19.052 -22.685,-10.162 -41.562,-15.243 -56.686,-15.243 -5.415,0 -9.494,1.201 -12.357,3.618 -2.831,2.41 -4.223,5.478 -4.223,9.224 0,6.417 5.121,11.49 15.386,15.235 l 25.133,8.85 z"/>
|
||||
<path d="m 455.6835,526.8108 c 35.909,12.563 53.848,34.088 53.848,64.543 0,20.046 -7.443,35.957 -22.272,47.725 -14.853,11.776 -36.028,19.084 -63.572,19.084 -27.528,0 -53.045,-7.983 -76.51,-21.088 0.254,-6.95 2.091,-14.575 5.47,-22.852 3.372,-8.277 7.347,-14.853 11.936,-19.656 21.597,11.211 40.362,16.826 56.289,16.826 7.538,0 13.366,-1.264 17.406,-3.809 4.048,-2.536 6.083,-5.94 6.083,-10.217 0,-8.039 -6.226,-14.051 -18.638,-18.058 l -22.281,-8.421 c -33.738,-12.293 -50.611,-32.323 -50.611,-60.146 0,-20.316 7.085,-36.418 21.27,-48.33 14.162,-11.895 33.253,-22.137 57.267,-22.137 11.872,0 24.984,1.67 39.265,5.01 14.313,3.348 26.042,11.594 35.225,16.125 0.541,7.49 -0.962,15.712 -4.452,24.665 -3.507,8.961 -7.824,15.306 -12.961,19.052 -22.694,-10.162 -41.571,-15.243 -56.702,-15.243 -5.407,0 -9.502,1.201 -12.349,3.618 -2.823,2.41 -4.23,5.478 -4.23,9.224 0,6.417 5.128,11.49 15.394,15.235 l 25.125,8.85 z"/>
|
||||
<path d="m 324.8885,529.6408 c 0,-12.293 -1.956,-23.656 -5.868,-34.089 -3.904,-10.432 -9.51,-19.378 -16.794,-26.868 -7.292,-7.49 -16.126,-13.367 -26.511,-17.645 -10.401,-4.27 -22.074,-10.711 -35.027,-10.711 -15.387,0 -28.816,6.966 -40.282,12.317 -11.466,5.344 -20.913,12.691 -28.332,22.05 -7.435,9.366 -12.969,20.388 -16.611,33.086 -3.642,12.699 -5.463,26.534 -5.463,41.499 0,15.49 1.479,29.818 4.453,42.914 2.966,13.08 8.03,24.435 15.18,34.073 7.156,9.621 16.467,17.104 27.941,22.439 11.474,5.344 25.715,9.447 42.716,9.447 31.305,0 57.752,-9.065 79.348,-24.292 -2.139,-15.49 -7.657,-27.807 -16.523,-36.896 -11.029,4.142 -20.786,7.108 -29.246,8.93 -8.468,1.798 -15.935,2.704 -22.383,2.704 -12.906,0 -22.193,-3.284 -27.83,-9.915 -5.631,-6.608 -8.72,-14.424 -9.267,-26.296 h 105.265 c 3.477,-11.243 5.234,-26.438 5.234,-42.747 z m -110.9,2.776 c 0.802,-13.645 3.292,-28.244 7.435,-34.255 4.151,-6.019 10.504,-9.025 19.083,-9.025 8.835,0 15.466,3.197 19.879,9.614 4.422,6.417 6.631,19.346 6.631,29.237 l 0.008,4.429 h -53.036 l 0,0 z"/>
|
||||
<path d="m 129.3525,604.6078 h -10.933 c -11.887,0 -16.364,-6.25 -16.364,-18.805 V 355.05779 c 0,-13.875 -4.007,-23.616 -9.137,-29.229 -5.129,-5.598 -14.034,-5.542 -26.717,-5.542 h -24.69 l -2.91,-0.056 v 0.238 l -0.024,34.343 V 596.9678 c 0,19.258 4.326,33.349 12.022,42.318 7.705,8.953 20.722,13.422 39.074,13.422 12.691,0 27.131,-1.336 43.32,-4.016 0.811,-2.704 1.217,-8.492 1.217,-17.374 0,-8.906 -1.621,-17.788 -4.858,-26.71 z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#ad1457" d="M12.078 10h2.3V6.007h2.32V10H19l-3.46 3.993zM1 13.993V6.007h2.32l2.355 2.917L8.03 6.007h2.32v7.986H8.03V9.398l-2.355 2.887L3.32 9.398v4.595z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 260 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#6c7eb7" fill-rule="evenodd" d="M 8.625 5.65625 L 7.25 12.6875 L 8.90625 12.6875 L 9.6875 8.78125 L 11 8.78125 C 11.609 8.78125 11.587 9.03375 11.5 9.46875 L 10.90625 12.6875 L 12.65625 12.6875 L 13.25 9.125 C 13.424 8.255 12.892 7.55575 11.5 7.46875 L 9.9375 7.46875 L 10.28125 5.65625 L 8.625 5.65625 z M 2.34375 7.46875 L 0.9375 14.53125 L 2.59375 14.53125 L 2.9375 12.6875 L 4.5 12.6875 C 5.979 12.7745 7.65625 11.55675 7.65625 9.46875 C 7.65625 8.25075 6.9545 7.55575 5.5625 7.46875 L 2.34375 7.46875 z M 13.84375 7.46875 L 12.4375 14.5 L 14.09375 14.5 L 14.4375 12.6875 L 16 12.6875 C 17.47899 12.7745 19.125 11.556754 19.125 9.46875 C 19.125 8.2507462 18.454491 7.55575 17.0625 7.46875 L 13.84375 7.46875 z M 15.21875 8.75 L 16.34375 8.75 C 16.952746 8.75 17.40625 9.0092466 17.40625 9.53125 C 17.31925 11.010253 16.626745 11.288 15.84375 11.375 L 14.78125 11.375 L 15.21875 8.75 z M 3.71875 8.78125 L 4.875 8.78125 C 5.484 8.78125 5.90625 9.0405 5.90625 9.5625 C 5.81925 11.0415 5.12675 11.31925 4.34375 11.40625 L 3.28125 11.40625 L 3.71875 8.78125 z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1,8 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<g transform="translate(-473.36088,-341.57095)">
|
||||
<g transform="matrix(0.14489978,0,0,0.14489978,468.84945,333.83641)">
|
||||
<path fill="#387eb8" d="M 99.75,67.46875 C 71.718268,67.468752 73.46875,79.625 73.46875,79.625 L 73.5,92.21875 l 26.75,0 0,3.78125 -37.375,0 c 0,0 -17.9375,-2.034276 -17.9375,26.25 -2e-6,28.28427 15.65625,27.28125 15.65625,27.28125 l 9.34375,0 0,-13.125 c 0,0 -0.503652,-15.65625 15.40625,-15.65625 15.9099,0 26.53125,0 26.53125,0 0,0 14.90625,0.24096 14.90625,-14.40625 0,-14.647206 0,-24.21875 0,-24.21875 0,-2e-6 2.26318,-14.65625 -27.03125,-14.65625 z M 85,75.9375 c 2.661429,-2e-6 4.8125,2.151071 4.8125,4.8125 2e-6,2.661429 -2.151071,4.8125 -4.8125,4.8125 -2.661429,2e-6 -4.8125,-2.151071 -4.8125,-4.8125 -2e-6,-2.661429 2.151071,-4.8125 4.8125,-4.8125 z"/>
|
||||
<path fill="#ffe052" d="m 100.5461,177.31485 c 28.03174,0 26.28125,-12.15625 26.28125,-12.15625 l -0.0312,-12.59375 -26.75,0 0,-3.78125 37.375,0 c 0,0 17.9375,2.03427 17.9375,-26.25001 10e-6,-28.284267 -15.65625,-27.281247 -15.65625,-27.281247 l -9.34375,0 0,13.124997 c 0,0 0.50366,15.65625 -15.40625,15.65625 -15.909902,0 -26.531252,0 -26.531252,0 0,0 -14.90625,-0.24096 -14.90625,14.40626 0,14.6472 0,24.21875 0,24.21875 0,0 -2.26318,14.65625 27.031252,14.65625 z m 14.75,-8.46875 c -2.66143,0 -4.8125,-2.15107 -4.8125,-4.8125 0,-2.66143 2.15107,-4.8125 4.8125,-4.8125 2.66143,0 4.8125,2.15107 4.8125,4.8125 1e-5,2.66143 -2.15107,4.8125 -4.8125,4.8125 z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#e53935" d="M 10.707376,3.0220971 12.625,4.28125 11.5,7.90625 7.4375,11.6875 3.90625,12.46875 3.1875,10.46875 3,14.15625 c 0.07668,2.758421 2.05851,2.788289 2.90625,2.8125 L 5.875,17 16.96875,16.90625 17.0625,5.8125 C 17.122609,4.2480709 15.364825,3.0014165 14.375,3 z M 5.8700983,5.9390704 C 3.7805688,8.0101404 3.256183,9.918237 4.289943,10.960517 5.3229925,12.003507 7.2816787,11.165285 9.3712087,9.09421 11.460739,7.0231401 12.097651,5.0845033 11.06453,4.0415133 9.4255397,2.6480655 6.9773962,4.7208064 5.8700983,5.9390704 z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 636 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#795548" d="M18 9.9 17.3 9.5c0 0 0-0.1 0-0.1L17.9 8.8C17.9 8.8 18 8.6 18 8.5 18 8.4 17.9 8.4 17.9 8.4L17.1 8.1c0 0 0-0.1 0-0.1l0.4-0.7c0 0 0-0.1 0-0.3 0-0.1-0.1-0.1-0.1-0.1L16.5 6.7c0 0 0-0.1-0.1-0.1l0.3-0.7c0-0.1 0-0.1 0-0.3 0 0-0.1-0.1-0.1-0.1l-0.8 0c0 0-0.1-0.1-0.1-0.1L15.7 4.6c0-0.1 0-0.1 0-0.3 0 0-0.1-0.1-0.3 0l-0.8 0.1c0 0-0.1-0.1-0.1-0.1l0-0.8c0-0.1 0-0.1-0.1-0.1 0 0-0.1 0-0.3 0l-0.7 0.3c0 0-0.1 0-0.1-0.1L13.1 2.7c0-0.1 0-0.1-0.1-0.1-0.1 0-0.1 0-0.3 0l-0.7 0.4c0 0-0.1 0-0.1 0L11.6 2.3c0-0.1-0.1-0.1-0.1-0.1-0.1 0-0.1 0-0.3 0.1l-0.5 0.5c0 0-0.1 0-0.1 0L10.1 2.1C10.1 2 10 2 10 2 9.9 2 9.9 2 9.9 2.1l-0.4 0.7c0 0-0.1 0-0.1 0L8.8 2.3c0 0-0.1-0.1-0.3-0.1-0.1 0-0.1 0.1-0.1 0.1L8.1 2.9c0 0-0.1 0-0.1 0L7.3 2.5c0 0-0.1 0-0.3 0-0.1 0-0.1 0.1-0.1 0.1L6.7 3.5c0 0-0.1 0-0.1 0.1L5.9 3.4c-0.1 0-0.1 0-0.3 0 0 0-0.1 0.1-0.1 0.1l0 0.8c0 0-0.1 0.1-0.1 0.1L4.6 4.3c-0.1 0-0.1 0-0.3 0 0 0-0.1 0.1 0 0.3l0.1 0.8c0 0-0.1 0.1-0.1 0.1l-0.8 0c-0.1 0-0.1 0-0.1 0.1 0 0 0 0.1 0 0.3l0.3 0.7c0 0 0 0.1-0.1 0.1L2.7 6.9c-0.1 0-0.1 0-0.1 0.1 0 0.1 0 0.1 0 0.3l0.4 0.7c0 0 0 0.1 0 0.1L2.3 8.4c-0.1 0-0.1 0.1-0.1 0.1 0 0.1 0 0.1 0.1 0.3l0.5 0.5c0 0 0 0.1 0 0.1L2.1 9.9C2 9.9 2 10 2 10c0 0.1 0 0.1 0.1 0.1l0.7 0.4c0 0 0 0.1 0 0.1l-0.5 0.5c0 0-0.1 0.1-0.1 0.3 0 0.1 0.1 0.1 0.1 0.1l0.7 0.3c0 0 0 0.1 0 0.1l-0.4 0.7c0 0 0 0.1 0 0.3 0 0.1 0.1 0.1 0.1 0.1l0.8 0.1c0 0 0 0.1 0.1 0.1l-0.3 0.7c0 0.1 0 0.1 0 0.3 0 0 0.1 0.1 0.1 0.1l0.8 0c0 0 0.1 0.1 0.1 0.1l-0.1 0.8c0 0.1 0 0.1 0 0.3 0 0 0.1 0.1 0.3 0l0.8-0.1c0 0 0.1 0.1 0.1 0.1l0 0.8c0 0.1 0 0.1 0.1 0.1 0 0 0.1 0 0.3 0l0.7-0.3c0 0 0.1 0 0.1 0.1l0.1 0.8c0 0.1 0 0.1 0.1 0.1 0.1 0 0.1 0 0.3 0l0.7-0.4c0 0 0.1 0 0.1 0l0.3 0.7c0 0.1 0.1 0.1 0.1 0.1 0.1 0 0.1 0 0.3-0.1l0.5-0.5c0 0 0.1 0 0.1 0l0.4 0.7C9.9 17.9 10 18 10 18c0.1 0 0.1 0 0.1-0.1l0.4-0.7c0 0 0.1 0 0.1 0l0.5 0.5c0 0 0.1 0.1 0.3 0.1 0.1 0 0.1-0.1 0.1-0.1l0.3-0.7c0 0 0.1 0 0.1 0l0.7 0.4c0 0 0.1 0 0.3 0 0.1 0 0.1-0.1 0.1-0.1l0.1-0.8c0 0 0.1 0 0.1-0.1l0.7 0.3c0.1 0 0.1 0 0.3 0 0 0 0.1-0.1 0.1-0.1l0-0.8c0 0 0.1-0.1 0.1-0.1l0.8 0.1c0.1 0 0.1 0 0.3 0 0 0 0.1-0.1 0-0.3l-0.1-0.8c0 0 0.1-0.1 0.1-0.1l0.8 0c0.1 0 0.1 0 0.1-0.1 0 0 0-0.1 0-0.3l-0.3-0.7c0 0 0-0.1 0.1-0.1l0.8-0.1c0.1 0 0.1 0 0.1-0.1 0-0.1 0-0.1 0-0.3l-0.4-0.7c0 0 0-0.1 0-0.1l0.7-0.3c0.1 0 0.1-0.1 0.1-0.1 0-0.1 0-0.1-0.1-0.3l-0.5-0.5c0 0 0-0.1 0-0.1l0.7-0.4C18 10.1 18 10 18 10 18 9.9 18 9.9 17.9 9.9zm-4.5 5.6c-0.3 0-0.4-0.3-0.4-0.5 0-0.3 0.3-0.4 0.5-0.4 0.3 0 0.4 0.3 0.4 0.5 0 0.3-0.3 0.4-0.5 0.4zm-0.3-1.5c-0.3 0-0.4 0.1-0.5 0.3l-0.3 1.1C11.8 15.6 10.9 15.8 10 15.8c-0.8 0-1.8-0.1-2.4-0.5L7.3 14.2c0-0.3-0.3-0.4-0.5-0.3L5.8 14.2C5.7 13.9 5.5 13.7 5.4 13.5l4.7 0c0 0 0.1 0 0.1 0l0-1.6c0 0 0 0-0.1 0l-1.4 0 0-1.1 1.5 0c0.1 0 0.7 0 0.9 0.8 0 0.3 0.1 0.9 0.3 1.2 0.1 0.3 0.4 0.8 0.8 0.8l2.4 0c0 0 0 0 0.1 0-0.1 0.3-0.4 0.4-0.5 0.7l-1.1-0.4zm-6.6 1.5c-0.3 0-0.5-0.1-0.5-0.4 0-0.3 0.1-0.5 0.4-0.5 0.3 0 0.5 0.1 0.5 0.4 0 0.3-0.1 0.5-0.4 0.5zM4.8 8.1c0.1 0.3 0 0.5-0.3 0.7-0.3 0.1-0.5 0-0.7-0.3-0.1-0.3 0-0.5 0.3-0.7 0.3-0.1 0.5 0 0.7 0.3zM4.3 9.5 5.4 9.1C5.7 8.9 5.7 8.6 5.7 8.5l-0.3-0.5 0.8 0 0 3.8-1.6 0C4.4 11.2 4.3 10.7 4.3 10.1c0-0.3 0-0.4 0-0.7zm4.5-0.4 0-1.1 2 0c0.1 0 0.7 0.1 0.7 0.5 0 0.4-0.4 0.5-0.8 0.5l-1.8 0zM16 10c0 0.1 0 0.3 0 0.4l-0.5 0c0 0-0.1 0-0.1 0.1l0 0.3c0 0.7-0.4 0.8-0.7 0.8-0.3 0-0.7-0.1-0.7-0.3-0.1-0.9-0.5-1.2-0.9-1.6 0.5-0.4 1.2-0.9 1.2-1.6 0-0.8-0.5-1.4-0.9-1.5C12.7 6.2 12.2 6.2 12 6.2l-6.2 0C6.6 5.3 7.8 4.6 9.1 4.3l0.7 0.8c0.1 0.1 0.4 0.1 0.7 0l0.8-0.8c1.8 0.3 3.1 1.4 3.9 2.8l-0.5 1.2c-0.1 0.3 0 0.4 0.3 0.5l1.1 0.5c0 0.1 0 0.4 0 0.5zM9.7 3.6c0.1-0.1 0.5-0.1 0.7 0 0.1 0.1 0.1 0.5 0 0.7-0.1 0.1-0.5 0.1-0.7 0-0.1-0.1-0.1-0.5 0-0.7zm5.6 4.5C15.4 7.8 15.7 7.7 16 7.8 16.2 8 16.4 8.2 16.2 8.5 16.1 8.8 15.8 8.9 15.6 8.8 15.3 8.6 15.2 8.4 15.3 8.1z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#1976d2" d="M 8.59375 3 L 8 5.09375 L 6.84375 5.8125 L 4.625 5.34375 L 3.21875 7.65625 L 4.84375 9.3125 L 4.84375 10.6875 L 3.21875 12.34375 L 4.625 14.65625 L 6.84375 14.1875 L 8 14.90625 L 8.59375 17 L 11.40625 17 L 12.09375 14.90625 L 13.15625 14.1875 L 15.375 14.65625 L 16.78125 12.34375 L 15.25 10.6875 L 15.25 9.3125 L 16.78125 7.65625 L 15.375 5.34375 L 13.15625 5.8125 L 12.09375 5.09375 L 11.40625 3 L 8.59375 3 z M 10 7.5 C 11.380712 7.5 12.5 8.6192881 12.5 10 C 12.5 11.380712 11.380712 12.5 10 12.5 C 8.6192881 12.5 7.5 11.380712 7.5 10 C 7.5 8.6192881 8.6192881 7.5 10 7.5 z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 696 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#e33" d="M 7.1837924,11.307953 C 7.6707878,10.353408 8.2243075,9.2777656 8.6673693,8.1977207 l 0,0 0.1750865,-0.4261233 C 8.2638361,5.5694562 7.9167872,3.8015945 8.2268175,2.65879 l 0,0 C 8.3103144,2.3606956 8.6554508,2.1799563 9.0244582,2.1799563 l 0,0 0.2246724,0.0031 0.041496,0 c 0.5051971,-0.00754 0.7430344,0.6351036 0.7700294,0.8848773 l 0,0 c 0.04457,0.4160895 -0.1480415,1.1202107 -0.1480415,1.1202107 l 0,0 c 0,-0.2842813 0.011293,-0.7436667 -0.1681885,-1.1402846 l 0,0 C 9.5354439,2.5891118 9.3358716,2.3148707 9.1570283,2.2715686 l 0,0 C 9.0667026,2.3318431 8.9787995,2.4566961 8.9486794,2.69706 l 0,0 c -0.062153,0.337009 -0.080934,0.7625005 -0.080934,0.9815213 l 0,0 c 0,0.7750507 0.1524795,1.7973568 0.4524699,2.8516732 l 0,0 C 9.376732,6.3670176 9.4262491,6.2102008 9.4658631,6.0633393 l 0,0 C 9.5273333,5.831768 9.9183329,4.2967327 9.9183329,4.2967327 l 0,0 c 0,0 -0.098522,2.0433649 -0.2359592,2.6615218 l 0,0 c -0.029539,0.130453 -0.062152,0.2598125 -0.095963,0.3922291 l 0,0 c 0.4945263,1.3812802 1.2909033,2.613824 2.2410503,3.5012084 l 0,0 c 0.374662,0.350187 0.847839,0.632591 1.295924,0.889897 l 0,0 c 0.977747,-0.140017 1.878312,-0.205837 2.629514,-0.197674 l 0,0 c 0.996584,0.01322 1.728324,0.160674 2.024539,0.452468 l 0,0 c 0.144967,0.141893 0.203958,0.313158 0.222161,0.505196 l 0,0 c 0.0046,0.07457 -0.03192,0.250406 -0.04265,0.294341 l 0,0 c 0.01063,-0.0533 0.01063,-0.315665 -0.789481,-0.571091 l 0,0 c -0.630087,-0.201452 -1.809285,-0.195167 -3.224454,-0.04454 l 0,0 c 1.636707,0.800785 3.231353,1.198664 3.736549,0.960177 l 0,0 c 0.123621,-0.06024 0.273628,-0.265462 0.273628,-0.265462 l 0,0 c 0,0 -0.08911,0.404778 -0.153163,0.505805 l 0,0 c -0.08162,0.109794 -0.241612,0.229069 -0.393496,0.26923 l 0,0 c -0.79828,0.212748 -2.875529,-0.279901 -4.686694,-1.314763 l 0,0 C 10.696554,12.63337 8.4743315,13.183748 6.69329,13.768015 l 0,0 c -1.7505467,3.067553 -3.0665588,4.476442 -4.1371905,3.940501 l 0,0 -0.3934914,-0.197673 C 2.0026124,17.419141 1.9780925,17.196419 2.0150773,17.015058 l 0,0 C 2.139895,16.40444 2.9055885,15.484427 4.443769,14.566287 l 0,0 c 0.1656275,-0.100408 0.9030766,-0.490141 0.9030766,-0.490141 l 0,0 c 0,0 -0.5459891,0.528424 -0.6740006,0.631965 l 0,0 c -1.2275229,1.005988 -2.1337362,2.2718 -2.1111425,2.762564 l 0,0 0.00437,0.04265 c 1.0430672,-0.148719 2.6069697,-2.271187 4.6177021,-6.205417 m 0.6369822,0.326336 C 7.4850166,12.266842 7.156801,12.852992 6.8536863,13.391448 l 0,0 C 8.5299255,12.689213 10.33419,12.239865 12.051848,11.920429 l 0,0 c -0.23094,-0.159484 -0.454977,-0.328215 -0.665855,-0.506443 l 0,0 C 10.440248,10.613209 9.7191732,9.6141206 9.196409,8.562942 l 0,0 C 8.8650521,9.4559636 8.4709445,10.40486 7.8207804,11.634266"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M3 3v14h14V6l-3-3zm2 2h4v3h2V5h2l2 2v8H5z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 158 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M6 4l9 6-9 6z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 130 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M 8.59375 3 L 8 5.09375 L 6.84375 5.8125 L 4.625 5.34375 L 3.21875 7.65625 L 4.84375 9.3125 L 4.84375 10.6875 L 3.21875 12.34375 L 4.625 14.65625 L 6.84375 14.1875 L 8 14.90625 L 8.59375 17 L 11.40625 17 L 12.09375 14.90625 L 13.15625 14.1875 L 15.375 14.65625 L 16.78125 12.34375 L 15.25 10.6875 L 15.25 9.3125 L 16.78125 7.65625 L 15.375 5.34375 L 13.15625 5.8125 L 12.09375 5.09375 L 11.40625 3 L 8.59375 3 z M 10 7.5 C 11.380712 7.5 12.5 8.6192881 12.5 10 C 12.5 11.380712 11.380712 12.5 10 12.5 C 8.6192881 12.5 7.5 11.380712 7.5 10 C 7.5 8.6192881 8.6192881 7.5 10 7.5 z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 693 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M3 2v16h14V6l-4-4zm2 2h7l3 3v9H5z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 150 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M2 3v14h16V5h-8L8 3H2zm14 4v8H8l8-8z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 153 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M9 4l-6 6 6 6 1.4-1.4L6.8 11H16V9H6.8l3.6-3.6z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 163 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M2 3v14h16V5h-8L8 3z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 137 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M8 8l3 4.712L13 11l4 5H3zm8-2a2 2 0 1 1-4 0 2 2 0 1 1 4 0z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 175 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M4 3v2h12V3zm0 4v2h8V7zm0 4v2h12v-2zm0 4v2h6v-2z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 165 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M6 4l9 6-9 6z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 130 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="#555" d="M3 2v16h14V6l-4-4zm2 2h7l3 3v9H5z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 150 B |
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
|
||||
<path d="M20 11h-12.17l5.59-5.59-1.42-1.41-8 8 8 8 1.41-1.41-5.58-5.59h12.17v-2z" fill="#555"/>
|
||||
</svg>
|
After Width: | Height: | Size: 241 B |