File manager - Edit - /home/newsbmcs.com/public_html/static/img/logo/autoindex.zip
Back
PK ���Z)�Z� @ @ autoindex_include.phpnu �[��� <?php namespace LiteSpeedAutoIndex; class UserSettings { public static $TIME_FORMAT = 'Y-m-d H:i'; /** * If file name is longer than this widtch, will cutoff and append with ... */ public static $NAME_WIDTH = 80; /** * * For JS version, if the file list has more than this limit, we will show the name filter */ public static $FILTER_SHOW = 6; /** * * @return string if you return empty string or null, will not check and include any Header */ public static function getHeaderName() { return 'HEADER'; } /** * * @return string if you return empty string or null, will not check and include any Readme */ public static function getReadmeName() { return 'README'; } public static function getExcludePatterns() { return ['.', '..', '.?*', '*~', '*#', 'HEADER*', 'README*', 'RCS', 'CVS', '*,v', '*,t', '*.lsz', ]; } private static $exclude_list; public static function shouldExclude($filename) { if (self::$exclude_list == null) { self::$exclude_list = self::getExcludePatterns(); if (!empty($_SERVER['LS_AI_INDEX_IGNORE'])) { self::$exclude_list = array_merge(explode(' ', $_SERVER['LS_AI_INDEX_IGNORE']), self::$exclude_list); } } reset(self::$exclude_list); foreach (self::$exclude_list as $ex) { if (fnmatch($ex, $filename)) return true; } return false; } } class IconMap { private $icons; private $definedSuffix; private static $instance; private function __construct() { $this->icons = [ 'DEFAULT' => ['file.svg', 'File'], 'UP' => ['corner-left-up.svg', 'Up'], 'DIR' => ['folder-fill.svg', 'Directory'], 'IMG' => ['image.svg', '[IMG]'], 'TXT' => ['file-text.svg', '[TXT]'], 'CMP' => ['file.svg', '[CMP]'], 'BIN' => ['file.svg', '[BIN]'], 'VID' => ['video.svg', '[VID]'], 'SND' => ['music.svg', '[SND]'], ]; $this->definedSuffix = []; $this->addMapping(['gif', 'png', 'jpg', 'jpeg', 'webp', 'tif', 'tiff', 'bmp', 'svg', 'raw'], 'IMG'); $this->addMapping(['txt', 'md5', 'c', 'cpp', 'cc', 'h', 'sh', 'html', 'htm', 'shtml', 'php', 'phtml', 'css', 'js'], 'TXT'); $this->addMapping(['gz', 'tgz', 'zip', 'Z', 'z'], 'CMP'); $this->addMapping(['bin', 'exe'], 'BIN'); $this->addMapping(['mpg', 'avi', 'mpeg', 'ram', 'wmv'], 'VID'); $this->addMapping(['mp3', 'mp2', 'ogg', 'wav', 'wma', 'aac', 'mp4', 'rm'], 'SND'); } private function addMapping($suffixArray, $iconTag) { if (!isset($this->icons[$iconTag])) { // should not happen, unrecognized tag $iconTag = 'DEFAULT'; } foreach ($suffixArray as $suffix) { $this->definedSuffix[$suffix] = $iconTag; } } private static function getMap() { if (self::$instance == null) { self::$instance = new self(); } return self::$instance; } public static function getFileIconTag($file) { $map = self::getMap(); $pos = strrpos($file, '.'); if ($pos !== false) { $suffix = substr($file, $pos + 1); if ($suffix !== false) { if (isset($map->definedSuffix[$suffix])) { return $map->definedSuffix[$suffix]; } } } return 'DEFAULT'; } public static function img($iconTag) { $me = self::getMap(); return '<img class="icon" src="/_autoindex/assets/icons/' . $me->icons[$iconTag][0] . '" alt="' . $me->icons[$iconTag][1] . '">'; } } // END of customization section class FileStat { protected $name; protected $size; protected $mtime; protected $isdir; protected $iconTag; protected $restricted = false; public function __construct($path, $filename) { $this->name = $filename; if ($path == '..') { $this->size = -2; $this->iconTag = 'UP'; $this->mtime = 0; return; } $s = @stat($path . $filename); if ($s == false) { $this->restricted = true; return; } $this->mtime = $s[9]; if (($s[2] & 040000) > 0) { $this->isdir = true; $this->size = -1; $this->iconTag = 'DIR'; } else { $this->isdir = false; $this->size = $s[7]; $this->iconTag = IconMap::getFileIconTag($filename); } } public function isRestricted() { // due to openbase_dir, file is outside of DOCROOT return $this->restricted; } public function isDir() { return $this->isdir; } public function getUrl($base) { $encoded = $base . rawurlencode($this->name); if ($this->isdir) { $encoded .= '/'; } return $encoded; } public function getIconTag() { return $this->iconTag; } public function sortName() { // case insensitive compare $name = htmlspecialchars(strtolower($this->name), ENT_QUOTES | ENT_SUBSTITUTE); return $this->isdir ? '*' . $name : $name; // to make directories list on top } public function dispName() { $name = $this->name; if (strlen($name) > UserSettings::$NAME_WIDTH) { $name = substr($name, 0, UserSettings::$NAME_WIDTH - 3) . '...'; } return htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE); } public function dispTime() { return ($this->mtime > 0) ? date(UserSettings::$TIME_FORMAT, $this->mtime) : ''; } public function sortTime() { if ($this->isdir) { // to make dir sorted together, deduct 50 years return ($this->mtime - 1576800000); } return $this->mtime; } public function dispSize() { if ($this->iconTag == 'UP') { // parent dir return ''; } if ($this->isdir) { return '-'; } return sprintf("%7ldk", ($this->size + 1023) / 1024); } public function sortSize() { return $this->size; } public static function cmpNA($a, $b) { return strcasecmp($a->name, $b->name); } public static function cmpND($a, $b) { return - self::cmpNA($a, $b); } public static function cmpSA($a, $b) { $ret = $a->size - $b->size; if ($ret == 0) { // if same size, compare by name ascending return self::cmpNA($a, $b); } return $ret; } public static function cmpSD($a, $b) { return - self::cmpSA($a, $b); } public static function cmpMA($a, $b) { return $a->mtime - $b->mtime; } public static function cmpMD($a, $b) { return - self::cmpMA($a, $b); } } class Directory { private $list; private $path; private $len; public function __construct($path) { $this->path = $path; $handle = opendir($path); if ($handle === false) { return; } clearstatcache(); $this->list = []; while (false !== ($file = readdir($handle))) { if (!UserSettings::shouldExclude($file)) { $fs = new FileStat($path, $file); if (!$fs->isRestricted()) { $this->list[] = $fs; } } } closedir($handle); $this->len = count($this->list); } public function cannotLoad() { return ($this->list === null); } public function getListCount() { return $this->len; } public function sortList($order) { usort($this->list, ['\\LiteSpeedAutoIndex\\FileStat', "cmp$order"]); } public function populateList(&$dirs, &$files) { $files = []; foreach ($this->list as $fileStat) { if ($fileStat->isDir()) { $dirs[] = $fileStat; } else { $files[] = $fileStat; } } } } class Index { protected $dir; protected $uri; protected $path; protected $isFancy; protected $sort; public function printPage() { $this->init(); $this->printHeader(); $this->printContent(); $this->printFooter(); } protected function init() { if (empty($_SERVER['LS_AI_PATH'])) { $this->exit403('[ERROR] Auto Index script can not be accessed directly!'); } $this->path = $_SERVER['LS_AI_PATH']; ini_set('open_basedir', $_SERVER['DOCUMENT_ROOT']); $this->dir = new Directory($this->path); if ($this->dir->cannotLoad()) { $this->exit403('<h1>403 Access Denied</h1>'); } $uri = $_SERVER['REQUEST_URI']; if (($pos = strpos($uri, '?')) !== false) { $uri = substr($_SERVER['REQUEST_URI'], 0, $pos); } $this->uri = $uri; if (isset($_SERVER['LS_AI_MIME_TYPE'])) { header('Content-Type: ' . $_SERVER['LS_AI_MIME_TYPE']); } $this->isFancy = empty($_SERVER['LS_FI_OFF']); // if not set Fancy Index Off, by default it's ON if ($this->isFancy) { $this->initSort(); } } protected function initSort() { $order = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; if ($order == '' || strlen($order) != 2 || !in_array($order, ['NA', 'ND', 'MA', 'MD', 'SA', 'SD'])) { $order = 'NA'; // set to default } $this->sort = []; $a = 'ascending'; $d = 'descending'; switch ($order) { case 'NA': $this->sort['name_aria'] = $a; // for indicator for current active sort order. $this->sort['N_link'] = 'ND'; // for current header click action link, reverse to current order break; case 'ND': $this->sort['name_aria'] = $d; break; case 'MA': $this->sort['mod_aria'] = $a; $this->sort['M_link'] = 'MD'; break; case 'MD': $this->sort['mod_aria'] = $d; break; case 'SA': $this->sort['size_aria'] = $a; $this->sort['S_link'] = 'SD'; break; case 'SD': $this->sort['size_aria'] = $d; break; } $this->dir->sortList($order); } protected function exit403($msg) { http_response_code(403); echo $msg; exit; } protected function getAssetLinks() { return '<link rel="stylesheet" href="/_autoindex/assets/css/autoindex.css" />'; } protected function getEndBodyScripts() { return ''; } protected function printHeader() { $disp_uri = htmlentities(urldecode($this->uri), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $title = 'Index of ' . $disp_uri; echo '<!DOCTYPE html><html><head><meta http-equiv="Content-type" content="text/html; charset=UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" />' . $this->getAssetLinks() . '<title>' . $title . '</title><style>@media (prefers-color-scheme:dark){body{background-color:#000!important}}</style></head>' . '<body><div class="content"><h1 style="color: #555;">' . $title . "</h1>\n"; $includeHeader = UserSettings::getHeaderName(); if ($includeHeader) { $this->printIncludes($this->path, $includeHeader); } } protected function printIncludes($path, $name) { $testNames = ["$name.html", "$name.htm", $name]; foreach ($testNames as $testname) { $filename = $path . $testname; if (file_exists($filename) && !is_link($filename)) { $content = file_get_contents($filename); if (!$content) { break; } $style = ($name == 'HEADER') ? 'header-text' : 'readme-text'; echo "<div class=\"{$style}\">\n" . htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE) . "</div>\n"; break; } } } protected function printFooter() { $includeReadme = UserSettings::getReadmeName(); if ($includeReadme) { $this->printIncludes($this->path, $includeReadme); } echo '<address>Proudly Served by LiteSpeed Web Server at ' . $_SERVER['SERVER_NAME'] . ' Port ' . $_SERVER['SERVER_PORT'] . '</address></div>' . $this->getEndBodyScripts() . "</body></html>\n"; } protected function printOneEntry($base, $fileStat) { $url = $fileStat->getUrl($base); $buf = '<tr><td><a href="' . $url . '">'; if ($this->isFancy) { $buf .= IconMap::img($fileStat->getIconTag()) . $fileStat->dispName() . '</a></td><td>' . $fileStat->dispTime() . '</td><td>' . $fileStat->dispSize() . '</td>'; } else { $buf .= $fileStat->dispName() . '</a></td>'; } $buf .= "</tr>\n"; echo $buf; } protected function printContent() { echo '<div id="table-list"><table id="table-content">'; if ($this->isFancy) { $this->printFancyTableHeader(); } else { $this->printTableHeader(); } $dirs = $files = []; $this->dir->populateList($dirs, $files); if ($this->uri != '/') { $fileStat = new FileStat('..', ''); $base = substr($this->uri, 0, strlen($this->uri) - 1); if (($off = strrpos($base, '/')) !== false) { $base = substr($base, 0, $off + 1); $this->printParentLine($base, $fileStat); } } foreach ($dirs as $fileStat) { $this->printOneEntry($this->uri, $fileStat); } foreach ($files as $fileStat) { $this->printOneEntry($this->uri, $fileStat); } echo "</table></div>\n"; } protected function ariaClass($type) { $name = $type . '_aria'; return isset($this->sort[$name]) ? ' aria-sort="' . $this->sort[$name] . '"' : ''; } protected function headerQs($type) { $name = $type . '_link'; return isset($this->sort[$name]) ? $this->sort[$name] : $type . 'A'; // default is ascending } protected function printFancyTableHeader() { $th = '<th class="colname"'; echo '<thead class="t-header"><tr>' . $th . $this->ariaClass('name') . '><a class="name" href="?' . $this->headerQs('N') . '">Name</a></th>' . $th . $this->ariaClass('mod') . '><a href="?' . $this->headerQs('M') . '">Last Modified</a></th>' . $th . $this->ariaClass('size') . '><a href="?' . $this->headerQs('S') . '">Size</a></th>' . "</tr></thead>\n"; } protected function printTableHeader() { echo '<thead class="t-header"><tr>' . '<th class="colname">Name</th>' . '<th class="colname">Last Modified</th>' . '<th class="colname">Size</th>' . "</tr></thead>\n"; } protected function printParentLine($base, $fileStat) { $url = $fileStat->getUrl($base); if ($this->isFancy) { $buf = '<tr><td><a href="' . $url . '">' . IconMap::img('UP') . 'Parent Directory' . '</a></td><td></td><td></td></tr>'; } else { $buf = '<tr><td><a href="' . $url . '">' . $fileStat->dispName() . '</a></td></tr>'; } echo $buf . "\n"; } } class IndexWithJS extends Index { protected function getAssetLinks() { return '<link rel="stylesheet" href="/_autoindex/assets/css/autoindex.css" />' . '<script src="/_autoindex/assets/js/tablesort.js"></script>' . '<script src="/_autoindex/assets/js/tablesort.number.js"></script>'; } protected function getEndBodyScripts() { if ($this->dir->getListCount() >= UserSettings::$FILTER_SHOW) { return <<<EJS <script> new Tablesort(document.getElementById("table-content")); var keywordInput = document.getElementById('filter-keyword'); document.addEventListener('keyup', filterTable); function filterTable(e) { if (e.target.id != 'filter-keyword') return; var cols = document.querySelectorAll('tbody td:first-child'); var keyword = keywordInput.value.toLowerCase(); for (i = 0; i < cols.length; i++) { var text = cols[i].textContent.toLowerCase(); if (text != 'parent directory') { cols[i].parentNode.style.display = text.indexOf(keyword) === -1 ? 'none' : 'table-row'; } } } </script> EJS; } else { return '<script>new Tablesort(document.getElementById("table-content"));</script>'; } } protected function printHeader() { parent::printHeader(); if ($this->dir->getListCount() >= UserSettings::$FILTER_SHOW) { echo '<div id="table-filter"><input type="text" name="keyword" id="filter-keyword" placeholder="Filter Name"></div>' . "\n"; } } protected function printFancyTableHeader() { $onclick = ' onclick="return false"'; $sortnum = ' data-sort-method="number"'; $th = '<th class="colname"'; echo '<thead class="t-header"><tr>' . $th . $this->ariaClass('name') . '><a class="name" href="?' . $this->headerQs('N') . '" ' . $onclick . '">Name</a></th>' . $th . $sortnum . $this->ariaClass('mod') . '><a href="?' . $this->headerQs('M') . '" ' . $onclick . '">Last Modified</a></th>' . $th . $sortnum . $this->ariaClass('size') . '><a href="?' . $this->headerQs('S') . '" ' . $onclick . '">Size</a></th>' . "</tr></thead>\n"; } protected function printOneEntry($base, $fileStat) { $url = $fileStat->getUrl($base); $buf = '<tr>'; if ($this->isFancy) { $buf .= '<td data-sort="' . $fileStat->sortName() . '"><a href="' . $url . '">' . IconMap::img($fileStat->getIconTag()) . $fileStat->dispName() . '</a></td><td data-sort="' . $fileStat->sortTime() . '">' . $fileStat->dispTime() . '</td><td data-sort="' . $fileStat->sortSize() . '">' . $fileStat->dispSize() . '</td>'; } else { $buf .= '<td><a href="' . $url . '">' . $fileStat->dispName() . '</a></td>'; } $buf .= "</tr>\n"; echo $buf; } protected function printParentLine($base, $fileStat) { $url = $fileStat->getUrl($base); if ($this->isFancy) { $buf = '<tr data-sort-method="none"><td><a href="' . $url . '">' . IconMap::img('UP') . 'Parent Directory' . '</a></td><td></td><td></td></tr>'; } else { $buf = '<tr><td><a href="' . $url . '">Parent Directory</a></td></tr>'; } echo $buf . "\n"; } } PK ���ZL�� � � default.phpnu �[��� <?php include __DIR__ . '/autoindex_include.php'; /* With JS sort, this is new default */ $page = new \LiteSpeedAutoIndex\IndexWithJS(); $page->printPage(); PK ���Z.Ҥ� � bwlimit.htmlnu �[��� <HTML><HEAD> <TITLE>509 Bandwidth Limit Exceeded</TITLE> </HEAD><BODY> <H1>Bandwidth Limit Exceeded</H1> The server is temporarily unable to service your request due to the site owner reaching his/her bandwidth limit. Please try again later. <HR> </BODY></HTML> PK ���Z��?�� � default_nojs.phpnu �[��� <?php include __DIR__ . '/autoindex_include.php'; /* Non-JS version, server side sort*/ $page = new \LiteSpeedAutoIndex\Index(); $page->printPage(); PK ���Z,��[ [ assets/icons/music.svgnu �[��� <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve"> <style type="text/css"> .st0{fill:none;stroke:#0047AB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;} </style> <path class="st0" d="M9,18V5l12-2v13"/> <circle class="st0" cx="6" cy="18" r="3"/> <circle class="st0" cx="18" cy="16" r="3"/> </svg> PK ���ZF�o� � assets/icons/image.svgnu �[��� <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve"> <style type="text/css"> .st0{fill:none;stroke:#0047AB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;} </style> <path class="st0" d="M5,3h14c1.1,0,2,0.9,2,2v14c0,1.1-0.9,2-2,2H5c-1.1,0-2-0.9-2-2V5C3,3.9,3.9,3,5,3z"/> <circle class="st0" cx="8.5" cy="8.5" r="1.5"/> <polyline class="st0" points="21,15 16,10 5,21 "/> </svg> PK ���Z~v�@ assets/icons/file-text.svgnu �[��� <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve"> <style type="text/css"> .st0{fill:none;stroke:#0047AB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;} </style> <path class="st0" d="M14,2H6C4.9,2,4,2.9,4,4v16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V8L14,2z"/> <polyline class="st0" points="14,2 14,8 20,8 "/> <line class="st0" x1="16" y1="13" x2="8" y2="13"/> <line class="st0" x1="16" y1="17" x2="8" y2="17"/> <polyline class="st0" points="10,9 9,9 8,9 "/> </svg> PK ���Z��ew w assets/icons/video.svgnu �[��� <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve"> <style type="text/css"> .st0{fill:none;stroke:#0047AB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;} </style> <polygon class="st0" points="23,7 16,12 23,17 "/> <path class="st0" d="M3,5h11c1.1,0,2,0.9,2,2v10c0,1.1-0.9,2-2,2H3c-1.1,0-2-0.9-2-2V7C1,5.9,1.9,5,3,5z"/> </svg> PK ���Z�X@ @ assets/icons/corner-left-up.svgnu �[��� <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve"> <style type="text/css"> .st0{fill:none;stroke:#0047AB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;} </style> <polyline class="st0" points="14,9 9,4 4,9 "/> <path class="st0" d="M20,20h-7c-2.2,0-4-1.8-4-4V4"/> </svg> PK ���Z���k k assets/icons/file.svgnu �[��� <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve"> <style type="text/css"> .st0{fill:none;stroke:#0047AB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;} </style> <path class="st0" d="M13,2H6C4.9,2,4,2.9,4,4v16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V9L13,2z"/> <polyline class="st0" points="13,2 13,9 20,9 "/> </svg> PK ���Z�qNO O assets/icons/folder-fill.svgnu �[��� <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve"> <style type="text/css"> .st0{fill:#0047AB;stroke:#0047AB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;} </style> <path class="st0" d="M22,19c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V5c0-1.1,0.9-2,2-2h5l2,3h9c1.1,0,2,0.9,2,2V19z"/> </svg> PK ���Z�B�� � assets/css/autoindex.cssnu �[��� html { background: #edeff0; } .content { max-width: 1000px; margin: 35px auto 35px auto; font-family: Lato, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; padding-left: 1em; padding-right: 1em; } h1 { margin-bottom: 32px; word-break: break-all; } @media only screen and (max-width: 640px) { h1 { font-size: 1.5em; } } .name { padding-left: 1.5em; } .colname:not(.no-sort) a { position: relative; display: inline-block; } .colname:not(.no-sort) a:after, .colname:not(.no-sort) a:before { content: ""; float: right; margin-top: 7px; border-color: #404040 transparent; border-style: solid; border-width: 0 4px 4px; visibility: visible; opacity: .4; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .colname:not(.no-sort) a:after { position: relative; margin-top: 11px; right: -8px; transform: rotate(-180deg); margin-left: 5px; } .colname:not(.no-sort) a:before { margin-top: 5px; } .colname[aria-sort=ascending]:not(.no-sort) a:before, .colname[aria-sort=descending]:not(.no-sort) a:after { opacity: .8; } .colname:not(.no-sort):not([aria-sort=descending]) a:hover:before, .colname:not(.no-sort):not([aria-sort]) a:hover:before { opacity: 1 } #table-list { overflow-x: auto; background: white; margin-top: 32px; margin-bottom: 32px; box-shadow: 0 0.55rem 1.25rem rgb(0 65 98 / 4%); -webkit-box-shadow: 0 0.55rem 1.25rem rgb(0 65 98 / 4%); box-shadow: 0 0.55rem 1.25rem rgb(0 65 98 / 4%); } table { width: 100%; margin: 0 auto; border-collapse: collapse; table-layout: fixed; font-size: 0.88em; padding-left: 10px; padding-right: 10px; } tr:hover:not(:nth-child(1)) { background-color: rgb(220 220 220); } .t-header th { font-size: 1em; height: 1.8em; } th, td { padding: 0.65em; text-align: left; } th:nth-child(1) { width: 18em; } th:nth-child(2) { width: 13em; } th:nth-child(3) { width: 6em; text-align: right; } th:nth-child(4) { width: 13em; } td:nth-child(1) { padding-left: 2em; } td:nth-child(2) { color: #666; } td:nth-child(3) { color: #666; text-align: right; } tbody tr:nth-child(odd) { background-color: #f8fafb; border-top: 1px solid #edeff0; border-bottom: 1px solid #edeff0; } a { color: #0047AB; text-decoration: none; } a:hover { color: #0096FF; text-decoration: underline; } td a { overflow: hidden; -o-text-overflow: ellipsis; text-overflow: ellipsis; white-space: nowrap; display: block; } td a:visited { color: #5a5a5a; } .icon { vertical-align: text-bottom; padding-right: 0.75em; height: 1.2em; -webkit-filter: grayscale(.8) brightness(2); filter: grayscale(.85) brightness(2.5); } address { color: rgb(100, 100, 100); font-size: 0.8em; font-style: normal; } .header-text { color: #4c4b4b; } .readme-text { padding-bottom: 32px; margin-bottom: 32px; color: #4c4b4b; font-size: 0.9em; border-bottom: 1px solid #3333331c; } #filter-keyword { padding: 0.5rem 0.85rem; font-size: .875rem; font-family: inherit; font-weight: 400; line-height: 1.5; border-radius: 0; color: #495057; background-color: #fff; background-clip: padding-box; border: 1px solid #dddddd; display: block; width: 12rem; max-width: 100%; transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; } #filter-keyword:focus { color: #495057; background-color: #fff; border-color: #afbfe1; outline: 0; box-shadow: 0 0 0 0.2rem rgb(141, 169, 216, 0.25) } PK ���Zn�t� � assets/js/tablesort.number.jsnu �[��� (function(){ var cleanNumber = function(i) { return i.replace(/[^\-?0-9.]/g, ''); }, compareNumber = function(a, b) { a = parseFloat(a); b = parseFloat(b); a = isNaN(a) ? 0 : a; b = isNaN(b) ? 0 : b; return a - b; }; Tablesort.extend('number', function(item) { return item.match(/^[-+]?[£\x24Û¢´€]?\d+\s*([,\.]\d{0,2})/) || // Prefixed currency item.match(/^[-+]?\d+\s*([,\.]\d{0,2})?[£\x24Û¢´€]/) || // Suffixed currency item.match(/^[-+]?(\d)*-?([,\.]){0,1}-?(\d)+([E,e][\-+][\d]+)?%?$/); // Number }, function(a, b) { a = cleanNumber(a); b = cleanNumber(b); return compareNumber(b, a); }); }()); PK ���Z*� assets/js/tablesort.jsnu �[��� ;(function() { function Tablesort(el, options) { if (!(this instanceof Tablesort)) return new Tablesort(el, options); if (!el || el.tagName !== 'TABLE') { throw new Error('Element must be a table'); } this.init(el, options || {}); } var sortOptions = []; var createEvent = function(name) { var evt; if (!window.CustomEvent || typeof window.CustomEvent !== 'function') { evt = document.createEvent('CustomEvent'); evt.initCustomEvent(name, false, false, undefined); } else { evt = new CustomEvent(name); } return evt; }; var getInnerText = function(el) { return el.getAttribute('data-sort') || el.textContent || el.innerText || ''; }; // Default sort method if no better sort method is found var caseInsensitiveSort = function(a, b) { a = a.trim().toLowerCase(); b = b.trim().toLowerCase(); if (a === b) return 0; if (a < b) return 1; return -1; }; var getCellByKey = function(cells, key) { return [].slice.call(cells).find(function(cell) { return cell.getAttribute('data-sort-column-key') === key; }); }; // Stable sort function // If two elements are equal under the original sort function, // then there relative order is reversed var stabilize = function(sort, antiStabilize) { return function(a, b) { var unstableResult = sort(a.td, b.td); if (unstableResult === 0) { if (antiStabilize) return b.index - a.index; return a.index - b.index; } return unstableResult; }; }; Tablesort.extend = function(name, pattern, sort) { if (typeof pattern !== 'function' || typeof sort !== 'function') { throw new Error('Pattern and sort must be a function'); } sortOptions.push({ name: name, pattern: pattern, sort: sort }); }; Tablesort.prototype = { init: function(el, options) { var that = this, firstRow, defaultSort, i, cell; that.table = el; that.thead = false; that.options = options; if (el.rows && el.rows.length > 0) { if (el.tHead && el.tHead.rows.length > 0) { for (i = 0; i < el.tHead.rows.length; i++) { if (el.tHead.rows[i].getAttribute('data-sort-method') === 'thead') { firstRow = el.tHead.rows[i]; break; } } if (!firstRow) { firstRow = el.tHead.rows[el.tHead.rows.length - 1]; } that.thead = true; } else { firstRow = el.rows[0]; } } if (!firstRow) return; var onClick = function() { if (that.current && that.current !== this) { that.current.removeAttribute('aria-sort'); } that.current = this; that.sortTable(this); }; // Assume first row is the header and attach a click handler to each. for (i = 0; i < firstRow.cells.length; i++) { cell = firstRow.cells[i]; cell.setAttribute('role','columnheader'); if (cell.getAttribute('data-sort-method') !== 'none') { cell.tabindex = 0; cell.addEventListener('click', onClick, false); if (cell.getAttribute('data-sort-default') !== null) { defaultSort = cell; } } } if (defaultSort) { that.current = defaultSort; that.sortTable(defaultSort); } }, sortTable: function(header, update) { var that = this, columnKey = header.getAttribute('data-sort-column-key'), column = header.cellIndex, sortFunction = caseInsensitiveSort, item = '', items = [], i = that.thead ? 0 : 1, sortMethod = header.getAttribute('data-sort-method'), sortOrder = header.getAttribute('aria-sort'); that.table.dispatchEvent(createEvent('beforeSort')); // If updating an existing sort, direction should remain unchanged. if (!update) { if (sortOrder === 'ascending') { sortOrder = 'descending'; } else if (sortOrder === 'descending') { sortOrder = 'ascending'; } else { sortOrder = that.options.descending ? 'descending' : 'ascending'; } header.setAttribute('aria-sort', sortOrder); } if (that.table.rows.length < 2) return; // If we force a sort method, it is not necessary to check rows if (!sortMethod) { var cell; while (items.length < 3 && i < that.table.tBodies[0].rows.length) { if(columnKey) { cell = getCellByKey(that.table.tBodies[0].rows[i].cells, columnKey); } else { cell = that.table.tBodies[0].rows[i].cells[column]; } // Treat missing cells as empty cells item = cell ? getInnerText(cell) : ""; item = item.trim(); if (item.length > 0) { items.push(item); } i++; } if (!items) return; } for (i = 0; i < sortOptions.length; i++) { item = sortOptions[i]; if (sortMethod) { if (item.name === sortMethod) { sortFunction = item.sort; break; } } else if (items.every(item.pattern)) { sortFunction = item.sort; break; } } that.col = column; for (i = 0; i < that.table.tBodies.length; i++) { var newRows = [], noSorts = {}, j, totalRows = 0, noSortsSoFar = 0; if (that.table.tBodies[i].rows.length < 2) continue; for (j = 0; j < that.table.tBodies[i].rows.length; j++) { var cell; item = that.table.tBodies[i].rows[j]; if (item.getAttribute('data-sort-method') === 'none') { // keep no-sorts in separate list to be able to insert // them back at their original position later noSorts[totalRows] = item; } else { if (columnKey) { cell = getCellByKey(item.cells, columnKey); } else { cell = item.cells[that.col]; } // Save the index for stable sorting newRows.push({ tr: item, td: cell ? getInnerText(cell) : '', index: totalRows }); } totalRows++; } // Before we append should we reverse the new array or not? // If we reverse, the sort needs to be `anti-stable` so that // the double negatives cancel out if (sortOrder === 'descending') { newRows.sort(stabilize(sortFunction, true)); } else { newRows.sort(stabilize(sortFunction, false)); newRows.reverse(); } // append rows that already exist rather than creating new ones for (j = 0; j < totalRows; j++) { if (noSorts[j]) { // We have a no-sort row for this position, insert it here. item = noSorts[j]; noSortsSoFar++; } else { item = newRows[j - noSortsSoFar].tr; } // appendChild(x) moves x if already present somewhere else in the DOM that.table.tBodies[i].appendChild(item); } } that.table.dispatchEvent(createEvent('afterSort')); }, refresh: function() { if (this.current !== undefined) { this.sortTable(this.current, true); } } }; if (typeof module !== 'undefined' && module.exports) { module.exports = Tablesort; } else { window.Tablesort = Tablesort; } })(); PK ���ZL�� � � default_withjs.phpnu �[��� <?php include __DIR__ . '/autoindex_include.php'; /* With JS sort, this is new default */ $page = new \LiteSpeedAutoIndex\IndexWithJS(); $page->printPage(); PK ���Z)�Z� @ @ autoindex_include.phpnu �[��� PK ���ZL�� � � R@ default.phpnu �[��� PK ���Z.Ҥ� � .A bwlimit.htmlnu �[��� PK ���Z��?�� � !Y default_nojs.phpnu �[��� PK ���Z,��[ [ �Y assets/icons/music.svgnu �[��� PK ���ZF�o� � �\ assets/icons/image.svgnu �[��� PK ���Z~v�@ �_ assets/icons/file-text.svgnu �[��� PK ���Z��ew w �b assets/icons/video.svgnu �[��� PK ���Z�X@ @ �e assets/icons/corner-left-up.svgnu �[��� PK ���Z���k k h assets/icons/file.svgnu �[��� PK ���Z�qNO O �j assets/icons/folder-fill.svgnu �[��� PK ���Z�B�� � im assets/css/autoindex.cssnu �[��� PK ���Zn�t� � �{ assets/js/tablesort.number.jsnu �[��� PK ���Z*� �~ assets/js/tablesort.jsnu �[��� PK ���ZL�� � � � default_withjs.phpnu �[��� PK ՝
| ver. 1.4 |
Github
|
.
| PHP 8.2.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings