├── resources ├── themes │ └── bootstrap │ │ ├── default_header.php │ │ ├── img │ │ └── folder.png │ │ ├── fonts │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ │ ├── default_footer.php │ │ ├── css │ │ ├── prism.css │ │ ├── style.css │ │ └── font-awesome.min.css │ │ ├── index.php │ │ └── js │ │ ├── bootstrap.min.js │ │ └── prism.js ├── config.php ├── fileTypes.php └── DirectoryLister.php ├── Compared.png ├── README.html ├── LICENSE ├── index.php └── README.md /resources/themes/bootstrap/default_header.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Compared.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToyoDAdoubi/DirectoryLister/HEAD/Compared.png -------------------------------------------------------------------------------- /resources/themes/bootstrap/img/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToyoDAdoubi/DirectoryLister/HEAD/resources/themes/bootstrap/img/folder.png -------------------------------------------------------------------------------- /resources/themes/bootstrap/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToyoDAdoubi/DirectoryLister/HEAD/resources/themes/bootstrap/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /resources/themes/bootstrap/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToyoDAdoubi/DirectoryLister/HEAD/resources/themes/bootstrap/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /resources/themes/bootstrap/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToyoDAdoubi/DirectoryLister/HEAD/resources/themes/bootstrap/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /resources/themes/bootstrap/default_footer.php: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /README.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

一个逗比魔改的Directory Lister

4 |

我是演示简介功能的,乌拉乌拉~

5 |

标题示例

6 |

本页面是Github的README页面给我的思路,于是我就改了改,加上这个功能了。使用起来很简单,按正常的HTML+CSS方式编写这个文件,然后放到要说明介绍的文件夹中即可。

7 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Toyo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | zipDirectory($_GET['zip']); 15 | 16 | } else { 17 | 18 | // Initialize the directory array 19 | if (isset($_GET['dir'])) { 20 | $dirArray = $lister->listDirectory($_GET['dir']); 21 | } else { 22 | $dirArray = $lister->listDirectory('.'); 23 | } 24 | 25 | // Define theme path 26 | if (!defined('THEMEPATH')) { 27 | define('THEMEPATH', $lister->getThemePath()); 28 | } 29 | 30 | // Set path to theme index 31 | $themeIndex = $lister->getThemePath(true) . '/index.php'; 32 | 33 | // Initialize the theme 34 | if (file_exists($themeIndex)) { 35 | include($themeIndex); 36 | } else { 37 | die('ERROR: Failed to initialize theme'); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /resources/config.php: -------------------------------------------------------------------------------- 1 | true, 7 | 'list_folders_first' => true, 8 | 'list_sort_order' => 'natcasesort', 9 | 'theme_name' => 'bootstrap', 10 | 'external_links_new_window' => true, 11 | 12 | // 隐藏文件 13 | 'hidden_files' => array( 14 | '.ht*', 15 | '*/.ht*', 16 | 'resources', 17 | 'resources/*', 18 | 'ErrorFiles', 19 | 'ErrorFiles/*', 20 | 'analytics.inc', 21 | '*.php', 22 | '*.html', 23 | '.well-known', 24 | '.well-known/*', 25 | '*/README.html', 26 | 'README.html', 27 | 'robots.txt' 28 | ), 29 | 30 | // Files that, if present in a directory, make the directory 31 | // a direct link rather than a browse link. 32 | 'index_files' => array( 33 | 'index.htm', 34 | 'index.html', 35 | 'index.php' 36 | ), 37 | 38 | // 自定义排序顺序 39 | 'reverse_sort' => array( 40 | // 'path/to/folder' 41 | ), 42 | 43 | // 允许以zip文件格式下载目录 44 | 'zip_dirs' => false, 45 | 46 | // Stream zip file content directly to the client, 47 | // without any temporary file 48 | 'zip_stream' => true, 49 | 50 | 'zip_compression_level' => 0, 51 | 52 | // 禁用特定目录的zip下载 53 | 'zip_disable' => array( 54 | // 'path/to/folder' 55 | ), 56 | 57 | ); 58 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 一个逗比魔改的Directory Lister~ 2 | 3 | 4 | ![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg) 5 | 6 | 7 | ### 魔改特点: 8 | 9 | 我之所以使用Directory Lister,就是因为这个程序非常的简洁,符合我心中对 目录列表程序的定义,在使用期间,根据我个人喜好和审美做了一些改变。 10 | - 界面式样魔改 11 | - 支持中文目录和文件名 12 | - 支持显示各文件夹内的简介说明 13 | - 默认调用的各种CDN文件本地化 14 | - 等等 ... 15 | 16 | ### 更新记录 17 | 18 | - 2018/09/27,修复 当网页内容高度接近于窗口高度时,底部 footer 与网页内容重叠的问题。 19 | - 2018/08/20,更新 不需要再手动配置域名后缀了,新版本会自动检测。 20 | - 2018/08/20,更新 网站式样 - 素色简洁风(参见下图)。 21 | - 2018/07/18,修复 当程序位置网站子目录下时,CSS JS 路径错误的问题。 22 | - 2018/03/26,修复 当前文件夹下无 README.html 文件时,PHP会提示警告的问题。 23 | 24 | ![新旧式样手机效果对比](https://github.com/ToyoDAdoubiBackup/DirectoryLister/raw/master/Compared.png) 25 | 26 | ### 演示示例: 27 | 28 | 逗比云 https://softs.wtf (需挂代理) 29 | 30 | ### 下载安装: 31 | 32 | 下载后,解压并上传到已经搭建好 PHP环境 的服务器中,然后就可以上传文件和创建文件夹了! 33 | 34 | - Github打包:https://github.com/ToyoDAdoubiBackup/DirectoryLister/archive/master.zip 35 | 36 | - 逗比云打包:[https://softs.run/Website/Directory Lister魔改版(by-Toyo) v2.6.1.zip](https://softs.run/Website/Directory%20Lister%E9%AD%94%E6%94%B9%E7%89%88%28by-Toyo%29%20v2.6.1.zip) 37 | 38 | #### 文件结构 39 | 假设你的虚拟主机是 `/home/wwwroot/xxx.xx` 40 | ``` bash 41 | /home/wwwroot/xxx.xx/ 42 | ├─ resources/ 43 | │ ├ themes/ 44 | │ │ └ bootstrap/ 45 | │ │ ├ css/ 46 | │ │ ├ fonts/ 47 | │ │ ├ img/ 48 | │ │ ├ js/ 49 | │ │ ├ default_footer.php # 底部公共文件 # 50 | │ │ ├ default_header.php # 顶部公共文件(可以放网站流量统计代码) # 51 | │ │ └ index.php # 网页主文件,其中可以修改顶部公告栏内容 # 52 | │ │ 53 | │ ├ DirectoryLister.php 54 | │ ├ config.php 55 | │ └ fileTypes.php 56 | │ 57 | ├ README.html # 该文件夹页面内的 说明简介文件 # 58 | ├ index.php 59 | │ 60 | ├─ 其他文件夹/ 61 | │ ├ 其他文件.txt 62 | │ └ README.html # 该文件夹页面内的 说明简介文件 # 63 | │ 64 | └ 其他文件.txt 65 | ``` 66 | ### 注意事项: 67 | 68 | #### 不显示文件和目录 69 | 70 | 如果安装 lnmp一键包上传Directory Lister后,Directory Lister不显示文件和目录,那么可能是 PHP函数` scandir `被禁用了,取消禁用即可。 71 | ``` bash 72 | sed -i 's/,scandir//g' /usr/local/php/etc/php.ini 73 | # 取消scandir函数禁用 74 | /etc/init.d/php-fpm restart 75 | # 重启 PHP生效 76 | ``` 77 | #### 程序放在网站子目录不显示 README.html 的解决方法 78 | 79 | 因为程序有个判断 `README.html` 路径的代码,而如果是正常使用域名或IP(即使加上),都是可以自适应的。 80 | 81 | 但是如果把程序放在子目录下,就会无法获取正确 `README.html` 路径,需要你手动修改下程序里的一句代码。 82 | 83 | 假设你将程序放在了子目录 `zimulu` 中(也就是 `http://xxx.xx/zimulu` 才能访问到程序网页)。 84 | 85 | 首先打开该文件: `/resources/themes/bootstrap/index.php` 86 | 87 | 找到第5行的: `$suffix_array = explode('.', $_SERVER['HTTP_HOST']);` 88 | 89 | 将其修改为: `$suffix_array = explode('.', $_SERVER['HTTP_HOST']."/zimulu");` 90 | 91 | #### 简介功能说明 92 | 93 | 我也不知道该给这个功能起什么名字,好捉急偶。 94 | 95 | 可以在每个文件夹下面放一个 `README.html` 文件,这个文件里写着 简介说明内容即可,格式参考自带的示例文件。 96 | 97 | 为了避免中文乱码,把 `README.html` 文件用 UTF-8无BOM编码 保存! 98 | 99 | #### 文件修改说明 100 | 101 | 修改网站中头部导航标题,去这个文件里搜索 `DOUBI Soft` 然后全部替换为自己要改的。 102 | `/resources/DirectoryLister.php ` 103 | 104 | 修改网站标签栏的标题,去这个文件里把开头 `` 标签中的` DOUBI Soft `替换为自己要改的。 105 | `/resources/themes/bootstrap/index.php ` 106 | 107 | 修改网站顶部公告栏内容,去这个文件里搜索 `顶部公告栏`。 108 | `/resources/themes/bootstrap/index.php ` 109 | 110 | 网站头部公共文件: 111 | `/resources/themes/bootstrap/default_header.php ` 112 | 113 | 网站底部公共文件: 114 | `/resources/themes/bootstrap/default_footer.php ` 115 | 116 | 如果想要插入流量统计代码,那只需要把代码写到 `default_header.php` 文件内即可。 117 | 118 | --- 119 | 120 | 我的博客 逗比根据地(需挂代理):https://doub.io/dbrj-3/ 121 | 122 | 本程序基于 Directory Lister原版魔改:http://www.directorylister.com/ 123 | -------------------------------------------------------------------------------- /resources/fileTypes.php: -------------------------------------------------------------------------------- 1 | <?php 2 | 3 | return array( 4 | 5 | // Archives 6 | '7z' => 'fa-file-archive-o', 7 | 'bz' => 'fa-file-archive-o', 8 | 'gz' => 'fa-file-archive-o', 9 | 'rar' => 'fa-file-archive-o', 10 | 'tar' => 'fa-file-archive-o', 11 | 'zip' => 'fa-file-archive-o', 12 | 13 | // Audio 14 | 'aac' => 'fa-music', 15 | 'flac' => 'fa-music', 16 | 'mid' => 'fa-music', 17 | 'midi' => 'fa-music', 18 | 'mp3' => 'fa-music', 19 | 'ogg' => 'fa-music', 20 | 'wma' => 'fa-music', 21 | 'wav' => 'fa-music', 22 | 23 | // Code 24 | 'c' => 'fa-code', 25 | 'class' => 'fa-code', 26 | 'cpp' => 'fa-code', 27 | 'css' => 'fa-code', 28 | 'erb' => 'fa-code', 29 | 'htm' => 'fa-code', 30 | 'html' => 'fa-code', 31 | 'java' => 'fa-code', 32 | 'js' => 'fa-code', 33 | 'php' => 'fa-code', 34 | 'pl' => 'fa-code', 35 | 'py' => 'fa-code', 36 | 'rb' => 'fa-code', 37 | 'xhtml' => 'fa-code', 38 | 'xml' => 'fa-code', 39 | 40 | // Databases 41 | 'accdb' => 'fa-hdd-o', 42 | 'db' => 'fa-hdd-o', 43 | 'dbf' => 'fa-hdd-o', 44 | 'mdb' => 'fa-hdd-o', 45 | 'pdb' => 'fa-hdd-o', 46 | 'sql' => 'fa-hdd-o', 47 | 48 | // Documents 49 | 'csv' => 'fa-file-text', 50 | 'doc' => 'fa-file-text', 51 | 'docx' => 'fa-file-text', 52 | 'odt' => 'fa-file-text', 53 | 'pdf' => 'fa-file-text', 54 | 'xls' => 'fa-file-text', 55 | 'xlsx' => 'fa-file-text', 56 | 57 | // Executables 58 | 'app' => 'fa-list-alt', 59 | 'bat' => 'fa-list-alt', 60 | 'com' => 'fa-list-alt', 61 | 'exe' => 'fa-list-alt', 62 | 'jar' => 'fa-list-alt', 63 | 'msi' => 'fa-list-alt', 64 | 'vb' => 'fa-list-alt', 65 | 'apk' => 'fa fa-android', 66 | 67 | // Fonts 68 | 'eot' => 'fa-font', 69 | 'otf' => 'fa-font', 70 | 'ttf' => 'fa-font', 71 | 'woff' => 'fa-font', 72 | 73 | // Game Files 74 | 'gam' => 'fa-gamepad', 75 | 'nes' => 'fa-gamepad', 76 | 'rom' => 'fa-gamepad', 77 | 'sav' => 'fa-floppy-o', 78 | 79 | // Images 80 | 'bmp' => 'fa-picture-o', 81 | 'gif' => 'fa-picture-o', 82 | 'jpg' => 'fa-picture-o', 83 | 'jpeg' => 'fa-picture-o', 84 | 'png' => 'fa-picture-o', 85 | 'psd' => 'fa-picture-o', 86 | 'tga' => 'fa-picture-o', 87 | 'tif' => 'fa-picture-o', 88 | 89 | // Package Files 90 | 'box' => 'fa-archive', 91 | 'deb' => 'fa-archive', 92 | 'rpm' => 'fa-archive', 93 | 94 | // Scripts 95 | 'bat' => 'fa-code', 96 | 'cmd' => 'fa-terminal', 97 | 'sh' => 'fa-code', 98 | 99 | // Text 100 | 'cfg' => 'fa-file-text', 101 | 'ini' => 'fa-file-text', 102 | 'log' => 'fa-file-text', 103 | 'md' => 'fa-file-text', 104 | 'rtf' => 'fa-file-text', 105 | 'txt' => 'fa-file-text', 106 | 107 | // Vector Images 108 | 'ai' => 'fa-picture-o', 109 | 'drw' => 'fa-picture-o', 110 | 'eps' => 'fa-picture-o', 111 | 'ps' => 'fa-picture-o', 112 | 'svg' => 'fa-picture-o', 113 | 114 | // Video 115 | 'avi' => 'fa-youtube-play', 116 | 'flv' => 'fa-youtube-play', 117 | 'mkv' => 'fa-youtube-play', 118 | 'mov' => 'fa-youtube-play', 119 | 'mp4' => 'fa-youtube-play', 120 | 'mpg' => 'fa-youtube-play', 121 | 'ogv' => 'fa-youtube-play', 122 | 'webm' => 'fa-youtube-play', 123 | 'wmv' => 'fa-youtube-play', 124 | 'swf' => 'fa-youtube-play', 125 | 126 | // Other 127 | 'bak' => 'fa-floppy', 128 | 'msg' => 'fa-envelope', 129 | 130 | // Blank 131 | 'blank' => 'fa-file' 132 | 133 | ); 134 | -------------------------------------------------------------------------------- /resources/themes/bootstrap/css/prism.css: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+bash+css-extras+git+http+json+nginx+php+php-extras+vim&plugins=line-numbers */ 2 | /** 3 | * prism.js default theme for JavaScript, CSS and HTML 4 | * Based on dabblet (http://dabblet.com) 5 | * @author Lea Verou 6 | */ 7 | 8 | code[class*="language-"], 9 | pre[class*="language-"] { 10 | color: #4c4c4c; 11 | background: none; 12 | text-shadow: 0 1px white; 13 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 14 | text-align: left; 15 | white-space: pre; 16 | word-spacing: normal; 17 | word-break: normal; 18 | word-wrap: normal; 19 | line-height: 1.5; 20 | 21 | -moz-tab-size: 4; 22 | -o-tab-size: 4; 23 | tab-size: 4; 24 | 25 | -webkit-hyphens: none; 26 | -moz-hyphens: none; 27 | -ms-hyphens: none; 28 | hyphens: none; 29 | font-size: 14px; 30 | } 31 | 32 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, 33 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { 34 | text-shadow: none; 35 | background: #b3d4fc; 36 | } 37 | 38 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection, 39 | code[class*="language-"]::selection, code[class*="language-"] ::selection { 40 | text-shadow: none; 41 | background: #b3d4fc; 42 | } 43 | 44 | @media print { 45 | code[class*="language-"], 46 | pre[class*="language-"] { 47 | text-shadow: none; 48 | } 49 | } 50 | 51 | /* Code blocks */ 52 | pre[class*="language-"] { 53 | padding: 1em; 54 | margin: .5em 0; 55 | overflow: auto; 56 | } 57 | 58 | :not(pre) > code[class*="language-"], 59 | pre[class*="language-"] { 60 | background: #f7f5f5; 61 | } 62 | 63 | /* Inline code */ 64 | :not(pre) > code[class*="language-"] { 65 | padding: .1em; 66 | border-radius: .3em; 67 | white-space: normal; 68 | } 69 | 70 | .token.comment, 71 | .token.prolog, 72 | .token.doctype, 73 | .token.cdata { 74 | color: slategray; 75 | } 76 | 77 | .token.punctuation { 78 | color: #999; 79 | } 80 | 81 | .namespace { 82 | opacity: .7; 83 | } 84 | 85 | .token.property, 86 | .token.tag, 87 | .token.boolean, 88 | .token.number, 89 | .token.constant, 90 | .token.symbol, 91 | .token.deleted { 92 | color: #905; 93 | } 94 | 95 | .token.selector, 96 | .token.attr-name, 97 | .token.string, 98 | .token.char, 99 | .token.builtin, 100 | .token.inserted { 101 | color: #690; 102 | } 103 | 104 | .token.operator, 105 | .token.entity, 106 | .token.url, 107 | .language-css .token.string, 108 | .style .token.string { 109 | color: #a67f59; 110 | background: hsla(0, 0%, 100%, .5); 111 | } 112 | 113 | .token.atrule, 114 | .token.attr-value, 115 | .token.keyword { 116 | color: #07a; 117 | } 118 | 119 | .token.function { 120 | color: #DD4A68; 121 | } 122 | 123 | .token.regex, 124 | .token.important, 125 | .token.variable { 126 | color: #e90; 127 | } 128 | 129 | .token.important, 130 | .token.bold { 131 | font-weight: bold; 132 | } 133 | .token.italic { 134 | font-style: italic; 135 | } 136 | 137 | .token.entity { 138 | cursor: help; 139 | } 140 | 141 | pre.line-numbers { 142 | position: relative; 143 | padding-left: 3.8em; 144 | counter-reset: linenumber; 145 | } 146 | 147 | pre.line-numbers > code { 148 | position: relative; 149 | } 150 | 151 | .line-numbers .line-numbers-rows { 152 | position: absolute; 153 | pointer-events: none; 154 | top: 0; 155 | font-size: 100%; 156 | left: -3.8em; 157 | width: 3em; /* works for line-numbers below 1000 lines */ 158 | letter-spacing: -1px; 159 | border-right: 1px solid #999; 160 | 161 | -webkit-user-select: none; 162 | -moz-user-select: none; 163 | -ms-user-select: none; 164 | user-select: none; 165 | 166 | } 167 | 168 | .line-numbers-rows > span { 169 | pointer-events: none; 170 | display: block; 171 | counter-increment: linenumber; 172 | } 173 | 174 | .line-numbers-rows > span:before { 175 | content: counter(linenumber); 176 | color: #999; 177 | display: block; 178 | padding-right: 0.8em; 179 | text-align: right; 180 | } 181 | -------------------------------------------------------------------------------- /resources/themes/bootstrap/index.php: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <?php 3 | header("Content-type: text/html; charset=utf-8"); 4 | $md_path_all = $lister->getListedPath(); 5 | $suffix_array = explode('.', $_SERVER['HTTP_HOST']); 6 | $suffix = end($suffix_array); 7 | $md_path = explode($suffix, $md_path_all); 8 | if($md_path[1] != ""){ 9 | $md_path_last = substr($md_path[1], -1);; 10 | if($md_path_last != "/"){ 11 | $md_file = ".".$md_path[1]."/README.html"; 12 | }else{ 13 | $md_file = ".".$md_path[1]."README.html"; 14 | } 15 | } 16 | if(file_exists($md_file)){ 17 | $md_text = file_get_contents($md_file); 18 | }else{ 19 | $md_text = ""; 20 | } 21 | ?> 22 | <html> 23 | <head> 24 | <title>DOUBI Soft <?php echo $md_path_all; ?> 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 54 | 61 |
62 |
63 | getThemePath(true) . "/default_header.php"); ?> 64 | getSystemMessages()): ?> 65 | getSystemMessages() as $message): ?> 66 |
67 | 68 | × 69 |
70 | 71 | 72 |
73 |
74 |
文件
75 |
大小
76 | 77 |
78 |
79 | 107 |
108 | 109 | 114 | 115 |
116 | 117 | getThemePath(true) . "/default_footer.php"); ?> 118 | 196 | 197 | 198 | -------------------------------------------------------------------------------- /resources/themes/bootstrap/css/style.css: -------------------------------------------------------------------------------- 1 | /* ---------------------------------------------------------------------------------------------- */ 2 | /* -----| GENERAL |------------------------------------------------------------------------------ */ 3 | /* ---------------------------------------------------------------------------------------------- */ 4 | * { 5 | margin: 0; 6 | } 7 | html, body { 8 | height: 100%; 9 | } 10 | body { 11 | padding: 70px 0 0; 12 | background-color: #fff; 13 | } 14 | 15 | body.breadcrumb-fixed { 16 | padding-top: 56px; 17 | } 18 | 19 | .container { 20 | max-width: 960px; 21 | min-height: 100%; 22 | /* equal to footer height */ 23 | margin-bottom: -100px; 24 | } 25 | footer.container { 26 | margin-bottom: 0; 27 | min-height: 0; 28 | } 29 | .container:after { 30 | content: ""; 31 | display: block; 32 | } 33 | 34 | /* -------------------------------------------------------------------------- */ 35 | /* -----| HEADER |----------------------------------------------------------- */ 36 | /* -------------------------------------------------------------------------- */ 37 | 38 | #page-navbar .navbar-text { 39 | display: block; 40 | float: left; 41 | font-family:"Microsoft YaHei","微软雅黑","黑体","宋体",sans-serif; 42 | max-width: 80%; 43 | overflow: hidden; 44 | text-overflow: ellipsis; 45 | white-space: nowrap; 46 | font-weight: 600; 47 | } 48 | 49 | 50 | /* ---------------------------------------------------------------------------------------------- */ 51 | /* -----| DIRECTORY LISTER |--------------------------------------------------------------------- */ 52 | /* ---------------------------------------------------------------------------------------------- */ 53 | 54 | #directory-list-header { 55 | font-family:"Microsoft YaHei","微软雅黑","黑体","宋体",sans-serif; 56 | font-weight: bold; 57 | padding: 10px 15px; 58 | } 59 | 60 | #directory-listing { 61 | font-family:"Microsoft YaHei","微软雅黑","黑体","宋体",sans-serif; 62 | } 63 | 64 | #directory-listing li { 65 | position: relative; 66 | } 67 | 68 | .file-name { 69 | overflow: hidden; 70 | text-overflow: ellipsis; 71 | white-space: nowrap; 72 | } 73 | 74 | .file-name i { 75 | color: #555; 76 | } 77 | 78 | .file-info-button, 79 | .web-link-button { 80 | display: inline-block; 81 | cursor: pointer; 82 | margin-left: 100%; 83 | padding: 6px 10px !important; 84 | position: absolute !important; 85 | top: 4px; 86 | } 87 | 88 | .web-link-button i, 89 | .file-info-button i { 90 | color: #999; 91 | } 92 | 93 | 94 | /* ---------------------------------------------------------------------------------------------- */ 95 | /* -----| FOOTER |------------------------------------------------------------------------------- */ 96 | /* ---------------------------------------------------------------------------------------------- */ 97 | 98 | .footer { 99 | padding: 20px 0 20px 15px; 100 | color: #717171; 101 | } 102 | 103 | /* ---------------------------------------------------------------------------------------------- */ 104 | /* -----| CHECKSUM MODAL |----------------------------------------------------------------------- */ 105 | /* ---------------------------------------------------------------------------------------------- */ 106 | 107 | #file-info { 108 | margin: 0; 109 | } 110 | 111 | #file-info .table-title { 112 | font-weight: bold; 113 | text-align: right; 114 | } 115 | 116 | #file-info .md5-hash, 117 | #file-info .sha1-hash { 118 | font-family:"Microsoft YaHei","微软雅黑","黑体","宋体",sans-serif; 119 | } 120 | 121 | 122 | /* -------------------------------------------------------------------------- */ 123 | /* -----| RESPONSIVE |------------------------------------------------------- */ 124 | /* -------------------------------------------------------------------------- */ 125 | 126 | @media (max-width: 767px) { 127 | 128 | .navbar-nav { 129 | float: left; 130 | margin: 0; 131 | padding-bottom: 0; 132 | padding-top: 0; 133 | } 134 | 135 | .navbar-nav > li { 136 | float: left; 137 | } 138 | 139 | .navbar-nav > li > a { 140 | padding-bottom: 15px; 141 | padding-top: 15px; 142 | } 143 | 144 | .navbar-right { 145 | float: right !important; 146 | } 147 | 148 | #page-navbar .navbar-text { 149 | margin-left: 15px; 150 | margin-right: 15px; 151 | max-width: 75%; 152 | } 153 | 154 | .file-info-button { 155 | display: none !important; 156 | } 157 | 158 | } 159 | .path-top { 160 | padding-top: 5px; 161 | padding-bottom: 1px; 162 | } 163 | .path-announcement2 { 164 | overflow: hidden; 165 | text-overflow: ellipsis; 166 | white-space: nowrap; 167 | } 168 | .path-announcement { 169 | margin-top: 58px; 170 | background-color: #fafbfc; 171 | border-bottom: 1px solid #e1e4e8; 172 | } 173 | .path-announcement p { 174 | color: #444444; 175 | line-height: 3; 176 | margin-left: 15px; 177 | } 178 | .path-announcement a { 179 | color: #777; 180 | border-bottom: solid 1px #999; 181 | } 182 | .path-announcement a:focus,.path-announcement a:hover { 183 | color: #337ab7; 184 | border-bottom: solid 1px #555; 185 | } 186 | .path-announcement i { 187 | margin-right: 10px; 188 | } 189 | .path-announcement i,.path-announcement p { 190 | display: inline; 191 | } 192 | .page-content { 193 | margin-top: 50px; 194 | } 195 | .readme-background { 196 | margin-bottom: 140px; 197 | margin-top: 120px 198 | } 199 | /* 200 | .readme-background:hover { 201 | background-position:-66px 0; 202 | } 203 | */ 204 | .readme { 205 | background-color: #fefefe; 206 | padding: 20px; 207 | border: 1px solid #ececec; 208 | } 209 | .readme hr { 210 | border-top: 1px solid #dedede; 211 | margin-top: 10px; 212 | } 213 | .readme h1 { 214 | font-size: 26px; 215 | padding-bottom: 20px; 216 | border-bottom: solid 1px #dadada; 217 | } 218 | .readme h2 { 219 | font-size: 22px; 220 | padding-bottom: 10px; 221 | border-bottom: solid 1px #dadada; 222 | } 223 | .readme h3 { 224 | font-size: 18px; 225 | margin-top: 20px; 226 | padding-bottom: 5px; 227 | border-bottom: solid 1px #dadada; 228 | } 229 | .readme h4 { 230 | font-size: 16px; 231 | font-weight: bold; 232 | padding-bottom: 15px; 233 | text-indent: 0; 234 | } 235 | .readme ul { 236 | font-size:14px; 237 | line-height: 2; 238 | } 239 | .readme blockquote { 240 | border-left: 5px solid #ccc; 241 | background-color: #f1f1f1; 242 | color: #222; 243 | font-size: 15px; 244 | text-indent: 33px; 245 | transition: 0.3s; 246 | } 247 | .readme blockquote:hover { 248 | border-left: 5px solid #159e83; 249 | background-color: #eee; 250 | transition: 0.3s; 251 | } 252 | .readme blockquote::before{ 253 | position: absolute; 254 | font-family: FontAwesome; 255 | font-size: 16px; 256 | font-style: normal; 257 | font-weight: normal; 258 | line-height: 0; 259 | -webkit-font-smoothing: antialiased; 260 | color: #666; 261 | text-indent: 0; 262 | margin-top: 10px; 263 | margin-left: -39px; 264 | content: "\f10d"; 265 | transition: 0.3s; 266 | } 267 | .readme blockquote:hover::before{ 268 | color: #222; 269 | transition: 0.3s; 270 | } 271 | .readme ul li { 272 | list-style: none; 273 | } 274 | .readme ul li::before{ 275 | position: absolute; 276 | font-family: FontAwesome; 277 | font-size: 16px; 278 | font-style: normal; 279 | font-weight: normal; 280 | line-height: 0.5; 281 | -webkit-font-smoothing: antialiased; 282 | color: #222; 283 | text-indent: 0; 284 | margin-top: 10px; 285 | margin-left: -39px; 286 | padding-left: 20px; 287 | content: "\f105"; 288 | transition: 0.3s; 289 | } 290 | .readme ul li:hover::before{ 291 | padding-left: 26px; 292 | transition: 0.3s; 293 | content: "\f101"; 294 | } 295 | /* 296 | color: #159e83; 297 | \f0da 298 | \f105 299 | \f101 300 | */ 301 | .readme table { 302 | border-top: solid 1px #ddd; 303 | border-left: solid 1px #ddd; 304 | margin-bottom: 16px; 305 | text-indent: 0; 306 | } 307 | .readme table th { 308 | background-color: #1abc9c; 309 | color: #fff; 310 | text-align: center; 311 | } 312 | .readme table td,.readme table th { 313 | border-bottom: solid 1px #ddd; 314 | border-right: solid 1px #ddd; 315 | padding: 5px 10px; 316 | } 317 | .readme table tr { 318 | background-color: #fff; 319 | transition: 0.3s; 320 | } 321 | .readme table tr:hover { 322 | background-color: #f9f9f9; 323 | transition: 0.3s; 324 | } 325 | .readme img { 326 | max-width:100%; 327 | height:auto; 328 | } 329 | tbody tr:nth-child(odd) { 330 | background-color: #f9f9f9; 331 | } 332 | .announcement { 333 | color: #777; 334 | border-bottom: solid 3px #d0d0d0; 335 | background-color: #f8f8f8; 336 | padding: 10px 10px; 337 | text-align: center; 338 | transition: 0.3s; 339 | } 340 | .announcement:hover { 341 | border-bottom: solid 3px #159e83; 342 | transition: 0.3s; 343 | } -------------------------------------------------------------------------------- /resources/themes/bootstrap/css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} -------------------------------------------------------------------------------- /resources/DirectoryLister.php: -------------------------------------------------------------------------------- 1 | _appDir = __DIR__; 43 | 44 | // 构建应用程序URL 45 | $this->_appURL = $this->_getAppUrl(); 46 | 47 | // 加载配置文件 48 | $configFile = $this->_appDir . '/config.php'; 49 | 50 | // 将配置数组设置为全局变量 51 | if (file_exists($configFile)) { 52 | $this->_config = require_once($configFile); 53 | } else { 54 | die('ERROR: Missing application config file at ' . $configFile); 55 | } 56 | 57 | // 将文件类型数组设置为全局变量 58 | $this->_fileTypes = require_once($this->_appDir . '/fileTypes.php'); 59 | 60 | // 设置主题名称 61 | $this->_themeName = $this->_config['theme_name']; 62 | 63 | } 64 | 65 | /** 66 | * If it is allowed to zip whole directories 67 | * 68 | * @param string $directory Relative path of directory to list 69 | * @return true or false 70 | * @access public 71 | */ 72 | public function isZipEnabled() { 73 | foreach ($this->_config['zip_disable'] as $disabledPath) { 74 | if (fnmatch($disabledPath, $this->_directory)) { 75 | return false; 76 | } 77 | } 78 | return $this->_config['zip_dirs']; 79 | } 80 | 81 | /** 82 | * Creates zipfile of directory 83 | * 84 | * @param string $directory Relative path of directory to list 85 | * @access public 86 | */ 87 | public function zipDirectory($directory) { 88 | 89 | if ($this->_config['zip_dirs']) { 90 | 91 | // Cleanup directory path 92 | $directory = $this->setDirectoryPath($directory); 93 | 94 | if ($directory != '.' && $this->_isHidden($directory)) { 95 | echo "Access denied."; 96 | } 97 | 98 | $filename_no_ext = basename($directory); 99 | 100 | if ($directory == '.') { 101 | $filename_no_ext = 'DOUBI Soft'; 102 | } 103 | 104 | // We deliver a zip file 105 | header('Content-Type: archive/zip'); 106 | 107 | // 浏览器的文件名保存zip文件 108 | header("Content-Disposition: attachment; filename=\"$filename_no_ext.zip\""); 109 | 110 | //change directory so the zip file doesnt have a tree structure in it. 111 | chdir($directory); 112 | 113 | // TODO: Probably we have to parse exclude list more carefully 114 | $exclude_list = implode(' ', array_merge($this->_config['hidden_files'], array('index.php'))); 115 | $exclude_list = str_replace("*", "\*", $exclude_list); 116 | 117 | if ($this->_config['zip_stream']) { 118 | 119 | // zip the stuff (dir and all in there) into the streamed zip file 120 | $stream = popen('/usr/bin/zip -' . $this->_config['zip_compression_level'] . ' -r -q - * -x ' . $exclude_list, 'r'); 121 | 122 | if ($stream) { 123 | fpassthru($stream); 124 | fclose($stream); 125 | } 126 | 127 | } else { 128 | 129 | // get a tmp name for the .zip 130 | $tmp_zip = tempnam('tmp', 'tempzip') . '.zip'; 131 | 132 | // zip the stuff (dir and all in there) into the tmp_zip file 133 | exec('zip -' . $this->_config['zip_compression_level'] . ' -r ' . $tmp_zip . ' * -x ' . $exclude_list); 134 | 135 | // calc the length of the zip. it is needed for the progress bar of the browser 136 | $filesize = filesize($tmp_zip); 137 | header("Content-Length: $filesize"); 138 | 139 | // deliver the zip file 140 | $fp = fopen($tmp_zip, 'r'); 141 | echo fpassthru($fp); 142 | 143 | // clean up the tmp zip file 144 | unlink($tmp_zip); 145 | 146 | } 147 | } 148 | 149 | } 150 | 151 | 152 | /** 153 | * Creates the directory listing and returns the formatted XHTML 154 | * 155 | * @param string $directory Relative path of directory to list 156 | * @return array Array of directory being listed 157 | * @access public 158 | */ 159 | public function listDirectory($directory) { 160 | 161 | // Set directory 162 | $directory = $this->setDirectoryPath($directory); 163 | 164 | // Set directory variable if left blank 165 | if ($directory === null) { 166 | $directory = $this->_directory; 167 | } 168 | 169 | // Get the directory array 170 | $directoryArray = $this->_readDirectory($directory); 171 | 172 | // Return the array 173 | return $directoryArray; 174 | } 175 | 176 | 177 | /** 178 | * Parses and returns an array of breadcrumbs 179 | * 180 | * @param string $directory Path to be breadcrumbified 181 | * @return array Array of breadcrumbs 182 | * @access public 183 | */ 184 | public function listBreadcrumbs($directory = null) { 185 | 186 | // Set directory variable if left blank 187 | if ($directory === null) { 188 | $directory = $this->_directory; 189 | } 190 | 191 | // Explode the path into an array 192 | $dirArray = explode('/', $directory); 193 | 194 | // 静态设置主页路径 195 | $breadcrumbsArray[] = array( 196 | 'link' => $this->_appURL, 197 | 'text' => 'DOUBI Soft' 198 | ); 199 | 200 | // Generate breadcrumbs 201 | foreach ($dirArray as $key => $dir) { 202 | 203 | if ($dir != '.') { 204 | 205 | $dirPath = null; 206 | 207 | // 构建目录路径 208 | for ($i = 0; $i <= $key; $i++) { 209 | $dirPath = $dirPath . $dirArray[$i] . '/'; 210 | } 211 | 212 | // 删除尾部斜杠 213 | if(substr($dirPath, -1) == '/') { 214 | $dirPath = substr($dirPath, 0, -1); 215 | } 216 | 217 | // 组合基本路径和dir路径 218 | $link = $this->_appURL . '?dir=' . rawurlencode($dirPath); 219 | 220 | $breadcrumbsArray[] = array( 221 | 'link' => $link, 222 | 'text' => $dir 223 | ); 224 | 225 | } 226 | 227 | } 228 | 229 | // 返回breadcrumb数组 230 | return $breadcrumbsArray; 231 | } 232 | 233 | 234 | /** 235 | * Determines if a directory contains an index file 236 | * 237 | * @param string $dirPath Path to directory to be checked for an index 238 | * @return boolean Returns true if directory contains a valid index file, false if not 239 | * @access public 240 | */ 241 | public function containsIndex($dirPath) { 242 | 243 | // 检查目录是否包含索引文件 244 | foreach ($this->_config['index_files'] as $indexFile) { 245 | 246 | if (file_exists($dirPath . '/' . $indexFile)) { 247 | 248 | return true; 249 | 250 | } 251 | 252 | } 253 | 254 | return false; 255 | 256 | } 257 | 258 | 259 | /** 260 | * Get path of the listed directory 261 | * 262 | * @return string Path of the listed directory 263 | * @access public 264 | */ 265 | public function getListedPath() { 266 | 267 | // Build the path 268 | if ($this->_directory == '.') { 269 | $path = $this->_appURL; 270 | } else { 271 | $path = $this->_appURL . $this->_directory; 272 | } 273 | 274 | // Return the path 275 | return $path; 276 | } 277 | 278 | 279 | /** 280 | * Returns the theme name. 281 | * 282 | * @return string Theme name 283 | * @access public 284 | */ 285 | public function getThemeName() { 286 | // Return the theme name 287 | return $this->_config['theme_name']; 288 | } 289 | 290 | 291 | /** 292 | * Returns open links in another window 293 | * 294 | * @return boolean Returns true if in config is enabled open links in another window, false if not 295 | * @access public 296 | */ 297 | public function externalLinksNewWindow() { 298 | return $this->_config['external_links_new_window']; 299 | } 300 | 301 | 302 | /** 303 | * Returns the path to the chosen theme directory 304 | * 305 | * @param bool $absolute Whether or not the path returned is absolute (default = false). 306 | * @return string Path to theme 307 | * @access public 308 | */ 309 | public function getThemePath($absolute = false) { 310 | if ($absolute) { 311 | // Set the theme path 312 | $themePath = $this->_appDir . '/themes/' . $this->_themeName; 313 | } else { 314 | // Get relative path to application dir 315 | $realtivePath = $this->_getRelativePath(getcwd(), $this->_appDir); 316 | 317 | // Set the theme path 318 | $themePath = $realtivePath . '/themes/' . $this->_themeName; 319 | } 320 | 321 | return $themePath; 322 | } 323 | 324 | 325 | /** 326 | * Get an array of error messages or false when empty 327 | * 328 | * @return array|bool Array of error messages or false 329 | * @access public 330 | */ 331 | public function getSystemMessages() { 332 | if (isset($this->_systemMessage) && is_array($this->_systemMessage)) { 333 | return $this->_systemMessage; 334 | } else { 335 | return false; 336 | } 337 | } 338 | 339 | 340 | /** 341 | * Returns string of file size in human-readable format 342 | * 343 | * @param string $filePath Path to file 344 | * @return string Human-readable file size 345 | * @access public 346 | */ 347 | function getFileSize($filePath) { 348 | 349 | // 获取文件大小 350 | $bytes = filesize($filePath); 351 | 352 | // 文件大小后缀数组 353 | $sizes = array('B', 'KB', 'MB', 'GB', 'TB', 'PB'); 354 | 355 | // 计算文件大小后缀系数 356 | $factor = floor((strlen($bytes) - 1) / 3); 357 | 358 | // 计算文件大小 359 | $fileSize = sprintf('%.2f', $bytes / pow(1024, $factor)) . $sizes[$factor]; 360 | 361 | return $fileSize; 362 | 363 | } 364 | 365 | /** 366 | * Set directory path variable 367 | * 368 | * @param string $path Path to directory 369 | * @return string Sanitizd path to directory 370 | * @access public 371 | */ 372 | public function setDirectoryPath($path = null) { 373 | 374 | // Set the directory global variable 375 | $this->_directory = $this->_setDirectoryPath($path); 376 | 377 | return $this->_directory; 378 | 379 | } 380 | 381 | /** 382 | * Get directory path variable 383 | * 384 | * @return string Sanitizd path to directory 385 | * @access public 386 | */ 387 | public function getDirectoryPath() { 388 | return $this->_directory; 389 | } 390 | 391 | 392 | /** 393 | * Add a message to the system message array 394 | * 395 | * @param string $type The type of message (ie - error, success, notice, etc.) 396 | * @param string $message The message to be displayed to the user 397 | * @return bool true on success 398 | * @access public 399 | */ 400 | public function setSystemMessage($type, $text) { 401 | 402 | // Create empty message array if it doesn't already exist 403 | if (isset($this->_systemMessage) && !is_array($this->_systemMessage)) { 404 | $this->_systemMessage = array(); 405 | } 406 | 407 | // Set the error message 408 | $this->_systemMessage[] = array( 409 | 'type' => $type, 410 | 'text' => $text 411 | ); 412 | 413 | return true; 414 | } 415 | 416 | 417 | /** 418 | * Validates and returns the directory path 419 | * 420 | * @param string $dir Directory path 421 | * @return string Directory path to be listed 422 | * @access protected 423 | */ 424 | protected function _setDirectoryPath($dir) { 425 | 426 | // Check for an empty variable 427 | if (empty($dir) || $dir == '.') { 428 | return '.'; 429 | } 430 | 431 | // Eliminate double slashes 432 | while (strpos($dir, '//')) { 433 | $dir = str_replace('//', '/', $dir); 434 | } 435 | 436 | // Remove trailing slash if present 437 | if(substr($dir, -1, 1) == '/') { 438 | $dir = substr($dir, 0, -1); 439 | } 440 | 441 | // Verify file path exists and is a directory 442 | if (!file_exists($dir) || !is_dir($dir)) { 443 | // Set the error message 444 | $this->setSystemMessage('danger', 'ERROR: 文件路径不存在'); 445 | 446 | // Return the web root 447 | return '.'; 448 | } 449 | 450 | // Prevent access to hidden files 451 | if ($this->_isHidden($dir)) { 452 | // Set the error message 453 | $this->setSystemMessage('danger', 'ERROR: 拒绝访问'); 454 | 455 | // Set the directory to web root 456 | return '.'; 457 | } 458 | 459 | // Prevent access to parent folders 460 | if (strpos($dir, '<') !== false || strpos($dir, '>') !== false 461 | || strpos($dir, '..') !== false || strpos($dir, '/') === 0) { 462 | // Set the error message 463 | $this->setSystemMessage('danger', 'ERROR: 检测到无效的路径字符串'); 464 | 465 | // Set the directory to web root 466 | return '.'; 467 | } else { 468 | // Should stop all URL wrappers (Thanks to Hexatex) 469 | $directoryPath = $dir; 470 | } 471 | 472 | // Return 473 | return $directoryPath; 474 | } 475 | 476 | 477 | /** 478 | * Loop through directory and return array with file info, including 479 | * file path, size, modification time, icon and sort order. 480 | * 481 | * @param string $directory Directory path 482 | * @param string $sort Sort method (default = natcase) 483 | * @return array Array of the directory contents 484 | * @access protected 485 | */ 486 | protected function _readDirectory($directory, $sort = 'natcase') { 487 | 488 | // Initialize array 489 | $directoryArray = array(); 490 | 491 | // Get directory contents 492 | $files = scandir($directory); 493 | 494 | // Read files/folders from the directory 495 | foreach ($files as $file) { 496 | 497 | if ($file != '.') { 498 | 499 | // Get files relative path 500 | $relativePath = $directory . '/' . $file; 501 | 502 | if (substr($relativePath, 0, 2) == './') { 503 | $relativePath = substr($relativePath, 2); 504 | } 505 | 506 | // Don't check parent dir if we're in the root dir 507 | if ($this->_directory == '.' && $file == '..'){ 508 | 509 | continue; 510 | 511 | } else { 512 | 513 | // Get files absolute path 514 | $realPath = realpath($relativePath); 515 | 516 | // Determine file type by extension 517 | if (is_dir($realPath)) { 518 | $iconClass = 'fa-folder'; 519 | $sort = 1; 520 | } else { 521 | // Get file extension 522 | $fileExt = strtolower(pathinfo($realPath, PATHINFO_EXTENSION)); 523 | 524 | if (isset($this->_fileTypes[$fileExt])) { 525 | $iconClass = $this->_fileTypes[$fileExt]; 526 | } else { 527 | $iconClass = $this->_fileTypes['blank']; 528 | } 529 | 530 | $sort = 2; 531 | } 532 | 533 | } 534 | 535 | if ($file == '..') { 536 | 537 | if ($this->_directory != '.') { 538 | // Get parent directory path 539 | $pathArray = explode('/', $relativePath); 540 | unset($pathArray[count($pathArray)-1]); 541 | unset($pathArray[count($pathArray)-1]); 542 | $directoryPath = implode('/', $pathArray); 543 | 544 | if (!empty($directoryPath)) { 545 | $directoryPath = '?dir=' . rawurlencode($directoryPath); 546 | } 547 | 548 | // Add file info to the array 549 | $directoryArray['..'] = array( 550 | 'file_path' => $this->_appURL . $directoryPath, 551 | 'url_path' => $this->_appURL . $directoryPath, 552 | 'file_size' => '-', 553 | 'mod_time' => date('Y-m-d H:i:s', filemtime($realPath)), 554 | 'icon_class' => 'fa-level-up', 555 | 'sort' => 0 556 | ); 557 | } 558 | 559 | } elseif (!$this->_isHidden($relativePath)) { 560 | 561 | // Add all non-hidden files to the array 562 | if ($this->_directory != '.' || $file != 'index.php') { 563 | 564 | // Build the file path 565 | $urlPath = implode('/', array_map('rawurlencode', explode('/', $relativePath))); 566 | 567 | if (is_dir($relativePath)) { 568 | $urlPath = '?dir=' . $urlPath; 569 | } else { 570 | $urlPath = $urlPath; 571 | } 572 | 573 | // Add the info to the main array by larry 574 | preg_match('/\/([^\/]*)$/', $relativePath, $matches); 575 | $pathname = isset($matches[1]) ? $matches[1] : $relativePath; 576 | //$directoryArray[pathinfo($relativePath, PATHINFO_BASENAME)] = array( 577 | $directoryArray[$pathname] = array( 578 | 'file_path' => $relativePath, 579 | 'url_path' => $urlPath, 580 | 'file_size' => is_dir($realPath) ? '-' : $this->getFileSize($realPath), 581 | 'mod_time' => date('Y-m-d H:i:s', filemtime($realPath)), 582 | 'icon_class' => $iconClass, 583 | 'sort' => $sort 584 | ); 585 | } 586 | 587 | } 588 | } 589 | 590 | } 591 | 592 | // Sort the array 593 | $reverseSort = in_array($this->_directory, $this->_config['reverse_sort']); 594 | $sortedArray = $this->_arraySort($directoryArray, $this->_config['list_sort_order'], $reverseSort); 595 | 596 | // Return the array 597 | return $sortedArray; 598 | 599 | } 600 | 601 | 602 | /** 603 | * Sorts an array by the provided sort method. 604 | * 605 | * @param array $array Array to be sorted 606 | * @param string $sortMethod Sorting method (acceptable inputs: natsort, natcasesort, etc.) 607 | * @param boolen $reverse Reverse the sorted array order if true (default = false) 608 | * @return array 609 | * @access protected 610 | */ 611 | protected function _arraySort($array, $sortMethod, $reverse = false) { 612 | // Create empty arrays 613 | $sortedArray = array(); 614 | $finalArray = array(); 615 | 616 | // Create new array of just the keys and sort it 617 | $keys = array_keys($array); 618 | 619 | switch ($sortMethod) { 620 | case 'asort': 621 | asort($keys); 622 | break; 623 | case 'arsort': 624 | arsort($keys); 625 | break; 626 | case 'ksort': 627 | ksort($keys); 628 | break; 629 | case 'krsort': 630 | krsort($keys); 631 | break; 632 | case 'natcasesort': 633 | natcasesort($keys); 634 | break; 635 | case 'natsort': 636 | natsort($keys); 637 | break; 638 | case 'shuffle': 639 | shuffle($keys); 640 | break; 641 | } 642 | 643 | // Loop through the sorted values and move over the data 644 | if ($this->_config['list_folders_first']) { 645 | 646 | foreach ($keys as $key) { 647 | if ($array[$key]['sort'] == 0) { 648 | $sortedArray['0'][$key] = $array[$key]; 649 | } 650 | } 651 | 652 | foreach ($keys as $key) { 653 | if ($array[$key]['sort'] == 1) { 654 | $sortedArray[1][$key] = $array[$key]; 655 | } 656 | } 657 | 658 | foreach ($keys as $key) { 659 | if ($array[$key]['sort'] == 2) { 660 | $sortedArray[2][$key] = $array[$key]; 661 | } 662 | } 663 | 664 | if ($reverse) { 665 | $sortedArray[1] = array_reverse($sortedArray[1]); 666 | $sortedArray[2] = array_reverse($sortedArray[2]); 667 | } 668 | 669 | } else { 670 | 671 | foreach ($keys as $key) { 672 | if ($array[$key]['sort'] == 0) { 673 | $sortedArray[0][$key] = $array[$key]; 674 | } 675 | } 676 | 677 | foreach ($keys as $key) { 678 | if ($array[$key]['sort'] > 0) { 679 | $sortedArray[1][$key] = $array[$key]; 680 | } 681 | } 682 | 683 | if ($reverse) { 684 | $sortedArray[1] = array_reverse($sortedArray[1]); 685 | } 686 | 687 | } 688 | 689 | // Merge the arrays 690 | foreach ($sortedArray as $array) { 691 | if (empty($array)) continue; 692 | foreach ($array as $key => $value) { 693 | $finalArray[$key] = $value; 694 | } 695 | } 696 | 697 | // Return sorted array 698 | return $finalArray; 699 | 700 | } 701 | 702 | 703 | /** 704 | * Determines if a file is specified as hidden 705 | * 706 | * @param string $filePath Path to file to be checked if hidden 707 | * @return boolean Returns true if file is in hidden array, false if not 708 | * @access protected 709 | */ 710 | protected function _isHidden($filePath) { 711 | 712 | // Add dot files to hidden files array 713 | if ($this->_config['hide_dot_files']) { 714 | 715 | $this->_config['hidden_files'] = array_merge( 716 | $this->_config['hidden_files'], 717 | array('.*', '*/.*') 718 | ); 719 | 720 | } 721 | 722 | // Compare path array to all hidden file paths 723 | foreach ($this->_config['hidden_files'] as $hiddenPath) { 724 | 725 | if (fnmatch($hiddenPath, $filePath)) { 726 | 727 | return true; 728 | 729 | } 730 | 731 | } 732 | 733 | return false; 734 | 735 | } 736 | 737 | 738 | /** 739 | * Builds the root application URL from server variables. 740 | * 741 | * @return string The application URL 742 | * @access protected 743 | */ 744 | protected function _getAppUrl() { 745 | 746 | // Get the server protocol 747 | if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') { 748 | $protocol = 'https://'; 749 | } else { 750 | $protocol = 'http://'; 751 | } 752 | 753 | // Get the server hostname 754 | $host = $_SERVER['HTTP_HOST']; 755 | 756 | // Get the URL path 757 | $pathParts = pathinfo($_SERVER['PHP_SELF']); 758 | $path = $pathParts['dirname']; 759 | 760 | // Remove backslash from path (Windows fix) 761 | if (substr($path, -1) == '\\') { 762 | $path = substr($path, 0, -1); 763 | } 764 | 765 | // Ensure the path ends with a forward slash 766 | if (substr($path, -1) != '/') { 767 | $path = $path . '/'; 768 | } 769 | 770 | // Build the application URL 771 | $appUrl = $protocol . $host . $path; 772 | 773 | // Return the URL 774 | return $appUrl; 775 | } 776 | 777 | 778 | /** 779 | * Compares two paths and returns the relative path from one to the other 780 | * 781 | * @param string $fromPath Starting path 782 | * @param string $toPath Ending path 783 | * @return string $relativePath Relative path from $fromPath to $toPath 784 | * @access protected 785 | */ 786 | protected function _getRelativePath($fromPath, $toPath) { 787 | 788 | // Define the OS specific directory separator 789 | if (!defined('DS')) define('DS', DIRECTORY_SEPARATOR); 790 | 791 | // Remove double slashes from path strings 792 | $fromPath = str_replace(DS . DS, DS, $fromPath); 793 | $toPath = str_replace(DS . DS, DS, $toPath); 794 | 795 | // Explode working dir and cache dir into arrays 796 | $fromPathArray = explode(DS, $fromPath); 797 | $toPathArray = explode(DS, $toPath); 798 | 799 | // Remove last fromPath array element if it's empty 800 | $x = count($fromPathArray) - 1; 801 | 802 | if(!trim($fromPathArray[$x])) { 803 | array_pop($fromPathArray); 804 | } 805 | 806 | // Remove last toPath array element if it's empty 807 | $x = count($toPathArray) - 1; 808 | 809 | if(!trim($toPathArray[$x])) { 810 | array_pop($toPathArray); 811 | } 812 | 813 | // Get largest array count 814 | $arrayMax = max(count($fromPathArray), count($toPathArray)); 815 | 816 | // Set some default variables 817 | $diffArray = array(); 818 | $samePath = true; 819 | $key = 1; 820 | 821 | // Generate array of the path differences 822 | while ($key <= $arrayMax) { 823 | 824 | // Get to path variable 825 | $toPath = isset($toPathArray[$key]) ? $toPathArray[$key] : null; 826 | 827 | // Get from path variable 828 | $fromPath = isset($fromPathArray[$key]) ? $fromPathArray[$key] : null; 829 | 830 | if ($toPath !== $fromPath || $samePath !== true) { 831 | 832 | // Prepend '..' for every level up that must be traversed 833 | if (isset($fromPathArray[$key])) { 834 | array_unshift($diffArray, '..'); 835 | } 836 | 837 | // Append directory name for every directory that must be traversed 838 | if (isset($toPathArray[$key])) { 839 | $diffArray[] = $toPathArray[$key]; 840 | } 841 | 842 | // Directory paths have diverged 843 | $samePath = false; 844 | } 845 | 846 | // Increment key 847 | $key++; 848 | } 849 | 850 | // Set the relative thumbnail directory path 851 | $relativePath = implode('/', $diffArray); 852 | 853 | // Return the relative path 854 | return $relativePath; 855 | 856 | } 857 | 858 | } 859 | -------------------------------------------------------------------------------- /resources/themes/bootstrap/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.4 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-mp.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); -------------------------------------------------------------------------------- /resources/themes/bootstrap/js/prism.js: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+bash+css-extras+git+http+json+nginx+php+php-extras+vim&plugins=line-numbers */ 2 | var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(\w+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(!(v instanceof a)){u.lastIndex=0;var b=u.exec(v),k=1;if(!b&&h&&m!=r.length-1){if(u.lastIndex=y,b=u.exec(e),!b)break;for(var w=b.index+(c?b[1].length:0),_=b.index+b[0].length,P=m,A=y,j=r.length;j>P&&_>A;++P)A+=r[P].length,w>=A&&(++m,y=A);if(r[m]instanceof a||r[P-1].greedy)continue;k=P-m,v=e.slice(y,A),b.index-=y}if(b){c&&(f=b[1].length);var w=b.index+f,b=b[0].slice(f),_=w+b.length,x=v.slice(0,w),O=v.slice(_),S=[m,k];x&&S.push(x);var N=new a(i,g?n.tokenize(b,g):b,d,b,h);S.push(N),O&&S.push(O),Array.prototype.splice.apply(r,S)}}}}}return r},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length,this.greedy=!!r};if(a.stringify=function(e,t,r){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join("");var l={type:e.type,content:a.stringify(e.content,t,r),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:r};if("comment"==l.type&&(l.attributes.spellcheck="true"),e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+""},!_self.document)return _self.addEventListener?(_self.addEventListener("message",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,l=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return r&&(n.filename=r.src,!document.addEventListener||n.manual||r.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); 3 | Prism.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; 4 | Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:{pattern:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\w\W]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)); 5 | Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:{pattern:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; 6 | Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*\*?|\/|~|\^|%|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\\\|\\?[^\\])*?`/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\w\W]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript"}}),Prism.languages.js=Prism.languages.javascript; 7 | !function(e){var t={variable:[{pattern:/\$?\(\([\w\W]+?\)\)/,inside:{variable:[{pattern:/(^\$\(\([\w\W]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b-?(?:0x[\dA-Fa-f]+|\d*\.?\d+(?:[Ee]-?\d+)?)\b/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\([^)]+\)|`[^`]+`/,inside:{variable:/^\$\(|^`|\)$|`$/}},/\$(?:[a-z0-9_#\?\*!@]+|\{[^}]+\})/i]};e.languages.bash={shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"},comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\s*)(?:"|')?(\w+?)(?:"|')?\s*\r?\n(?:[\s\S])*?\r?\n\2/g,lookbehind:!0,greedy:!0,inside:t},{pattern:/(["'])(?:\\\\|\\?[^\\])*?\1/g,greedy:!0,inside:t}],variable:t.variable,"function":{pattern:/(^|\s|;|\||&)(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|npm|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|\s|;|\||&)/,lookbehind:!0},keyword:{pattern:/(^|\s|;|\||&)(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|\s|;|\||&)/,lookbehind:!0},"boolean":{pattern:/(^|\s|;|\||&)(?:true|false)(?=$|\s|;|\||&)/,lookbehind:!0},operator:/&&?|\|\|?|==?|!=?|<<>|<=?|>=?|=~/,punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];]/};var a=t.variable[1].inside;a["function"]=e.languages.bash["function"],a.keyword=e.languages.bash.keyword,a.boolean=e.languages.bash.boolean,a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation}(Prism); 8 | Prism.languages.css.selector={pattern:/[^\{\}\s][^\{\}]*(?=\s*\{)/,inside:{"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+(?:\(.*\))?/,"class":/\.[-:\.\w]+/,id:/#[-:\.\w]+/,attribute:/\[[^\]]+\]/}},Prism.languages.insertBefore("css","function",{hexcode:/#[\da-f]{3,6}/i,entity:/\\[\da-f]{1,8}/i,number:/[\d%\.]+/}); 9 | Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(\\?.)*?\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s(--|-)\w+/m}},coord:/^@@.*@@$/m,commit_sha1:/^commit \w{40}$/m}; 10 | Prism.languages.http={"request-line":{pattern:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b\shttps?:\/\/\S+\sHTTP\/[0-9.]+/m,inside:{property:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b/,"attr-name":/:\w+/}},"response-status":{pattern:/^HTTP\/1.[01] [0-9]+.*/m,inside:{property:{pattern:/(^HTTP\/1.[01] )[0-9]+.*/i,lookbehind:!0}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var httpLanguages={"application/json":Prism.languages.javascript,"application/xml":Prism.languages.markup,"text/xml":Prism.languages.markup,"text/html":Prism.languages.markup};for(var contentType in httpLanguages)if(httpLanguages[contentType]){var options={};options[contentType]={pattern:new RegExp("(content-type:\\s*"+contentType+"[\\w\\W]*?)(?:\\r?\\n|\\r){2}[\\w\\W]*","i"),lookbehind:!0,inside:{rest:httpLanguages[contentType]}},Prism.languages.insertBefore("http","header-name",options)}; 11 | Prism.languages.json={property:/"(?:\\.|[^\\"])*"(?=\s*:)/gi,string:/"(?!:)(?:\\.|[^\\"])*"(?!:)/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee][+-]?\d+)?)\b/g,punctuation:/[{}[\]);,]/g,operator:/:/g,"boolean":/\b(true|false)\b/gi,"null":/\bnull\b/gi},Prism.languages.jsonp=Prism.languages.json; 12 | Prism.languages.nginx=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},keyword:/\b(?:CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|accept_mutex|accept_mutex_delay|access_log|add_after_body|add_before_body|add_header|addition_types|aio|alias|allow|ancient_browser|ancient_browser_value|auth|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|autoindex|autoindex_exact_size|autoindex_localtime|break|charset|charset_map|charset_types|chunked_transfer_encoding|client_body_buffer_size|client_body_in_file_only|client_body_in_single_buffer|client_body_temp_path|client_body_timeout|client_header_buffer_size|client_header_timeout|client_max_body_size|connection_pool_size|create_full_put_path|daemon|dav_access|dav_methods|debug_connection|debug_points|default_type|deny|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_cache|fastcgi_cache_bypass|fastcgi_cache_key|fastcgi_cache_lock|fastcgi_cache_lock_timeout|fastcgi_cache_methods|fastcgi_cache_min_uses|fastcgi_cache_path|fastcgi_cache_purge|fastcgi_cache_use_stale|fastcgi_cache_valid|fastcgi_connect_timeout|fastcgi_hide_header|fastcgi_ignore_client_abort|fastcgi_ignore_headers|fastcgi_index|fastcgi_intercept_errors|fastcgi_keep_conn|fastcgi_max_temp_file_size|fastcgi_next_upstream|fastcgi_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|fastcgi_send_timeout|fastcgi_split_path_info|fastcgi_store|fastcgi_store_access|fastcgi_temp_file_write_size|fastcgi_temp_path|flv|geo|geoip_city|geoip_country|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|msie_padding|msie_refresh|multi_accept|open_file_cache|open_file_cache_errors|open_file_cache_min_uses|open_file_cache_valid|open_log_file_cache|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|proxy_busy_buffers_size|proxy_cache|proxy_cache_bypass|proxy_cache_key|proxy_cache_lock|proxy_cache_lock_timeout|proxy_cache_methods|proxy_cache_min_uses|proxy_cache_path|proxy_cache_use_stale|proxy_cache_valid|proxy_connect_timeout|proxy_cookie_domain|proxy_cookie_path|proxy_headers_hash_bucket_size|proxy_headers_hash_max_size|proxy_hide_header|proxy_http_version|proxy_ignore_client_abort|proxy_ignore_headers|proxy_intercept_errors|proxy_max_temp_file_size|proxy_method|proxy_next_upstream|proxy_no_cache|proxy_pass|proxy_pass_error_message|proxy_pass_header|proxy_pass_request_body|proxy_pass_request_headers|proxy_read_timeout|proxy_redirect|proxy_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|sub_filter_once|sub_filter_types|tcp_nodelay|tcp_nopush|timeout|timer_resolution|try_files|types|types_hash_bucket_size|types_hash_max_size|underscores_in_headers|uninitialized_variable_warn|upstream|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\b/i}),Prism.languages.insertBefore("nginx","keyword",{variable:/\$[a-z_]+/i}); 13 | Prism.languages.php=Prism.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),Prism.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),Prism.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),Prism.languages.markup&&(Prism.hooks.add("before-highlight",function(e){"php"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(a){return e.tokenStack.push(a),"{{{PHP"+e.tokenStack.length+"}}}"}))}),Prism.hooks.add("before-insert",function(e){"php"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),Prism.hooks.add("after-highlight",function(e){if("php"===e.language){for(var a,n=0;a=e.tokenStack[n];n++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(n+1)+"}}}",Prism.highlight(a,e.grammar,"php").replace(/\$/g,"$$$$"));e.element.innerHTML=e.highlightedCode}}),Prism.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),Prism.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:Prism.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})); 14 | Prism.languages.insertBefore("php","variable",{"this":/\$this\b/,global:/\$(?:_(?:SERVER|GET|POST|FILES|REQUEST|SESSION|ENV|COOKIE)|GLOBALS|HTTP_RAW_POST_DATA|argc|argv|php_errormsg|http_response_header)/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/(static|self|parent)/,punctuation:/(::|\\)/}}}); 15 | Prism.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,"function":/\w+(?=\()/,keyword:/\b(?:ab|abbreviate|abc|abclear|abo|aboveleft|al|all|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|ar|args|argu|argument|as|ascii|bad|badd|ba|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bN|bNext|bo|botright|bp|bprevious|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|br|brewind|bro|browse|bufdo|b|buffer|buffers|bun|bunload|bw|bwipeout|ca|cabbrev|cabc|cabclear|caddb|caddbuffer|cad|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cgetb|cgetbuffer|cgete|cgetexpr|cg|cgetfile|c|change|changes|chd|chdir|che|checkpath|checkt|checktime|cla|clast|cl|clist|clo|close|cmapc|cmapclear|cnew|cnewer|cn|cnext|cN|cNext|cnf|cnfile|cNfcNfile|cnorea|cnoreabbrev|col|colder|colo|colorscheme|comc|comclear|comp|compiler|conf|confirm|con|continue|cope|copen|co|copy|cpf|cpfile|cp|cprevious|cq|cquit|cr|crewind|cuna|cunabbrev|cu|cunmap|cw|cwindow|debugg|debuggreedy|delc|delcommand|d|delete|delf|delfunction|delm|delmarks|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|di|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|earlier|echoe|echoerr|echom|echomsg|echon|e|edit|el|else|elsei|elseif|em|emenu|endfo|endfor|endf|endfunction|endfun|en|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fina|finally|fin|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|folddoc|folddoclosed|foldd|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|ha|hardcopy|h|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iuna|iunabbrev|iu|iunmap|j|join|ju|jumps|k|keepalt|keepj|keepjumps|kee|keepmarks|laddb|laddbuffer|lad|laddexpr|laddf|laddfile|lan|language|la|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|let|left|lefta|leftabove|lex|lexpr|lf|lfile|lfir|lfirst|lgetb|lgetbuffer|lgete|lgetexpr|lg|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|l|list|ll|lla|llast|lli|llist|lmak|lmake|lm|lmap|lmapc|lmapclear|lnew|lnewer|lne|lnext|lN|lNext|lnf|lnfile|lNf|lNfile|ln|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lpf|lpfile|lp|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|mak|make|ma|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkvie|mkview|mkv|mkvimrc|mod|mode|m|move|mzf|mzfile|mz|mzscheme|nbkey|new|n|next|N|Next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|omapc|omapclear|on|only|o|open|opt|options|ou|ounmap|pc|pclose|ped|pedit|pe|perl|perld|perldo|po|pop|popu|popu|popup|pp|ppop|pre|preserve|prev|previous|p|print|P|Print|profd|profdel|prof|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptN|ptNext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|pyf|pyfile|py|python|qa|qall|q|quit|quita|quitall|r|read|rec|recover|redi|redir|red|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|rub|ruby|rubyd|rubydo|rubyf|rubyfile|ru|runtime|rv|rviminfo|sal|sall|san|sandbox|sa|sargument|sav|saveas|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbN|sbNext|sbp|sbprevious|sbr|sbrewind|sb|sbuffer|scripte|scriptencoding|scrip|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sla|slast|sl|sleep|sm|smagic|sm|smap|smapc|smapclear|sme|smenu|sn|snext|sN|sNext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|sor|sort|so|source|spelld|spelldump|spe|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|sp|split|spr|sprevious|sre|srewind|sta|stag|startg|startgreplace|star|startinsert|startr|startreplace|stj|stjump|st|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tab|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabnew|tabn|tabnext|tabN|tabNext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|ta|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tm|tmenu|tn|tnext|tN|tNext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tu|tunmenu|una|unabbreviate|u|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|verb|verbose|ve|version|vert|vertical|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|vi|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|wa|wall|wh|while|winc|wincmd|windo|winp|winpos|win|winsize|wn|wnext|wN|wNext|wp|wprevious|wq|wqa|wqall|w|write|ws|wsverb|wv|wviminfo|X|xa|xall|x|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|XMLent|XMLns|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:autocmd|acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|t_AB|t_AF|t_al|t_AL|t_bc|t_cd|t_ce|t_Ce|t_cl|t_cm|t_Co|t_cs|t_Cs|t_CS|t_CV|t_da|t_db|t_dl|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_fs|t_IE|t_IS|t_k1|t_K1|t_k2|t_k3|t_K3|t_k4|t_K4|t_k5|t_K5|t_k6|t_K6|t_k7|t_K7|t_k8|t_K8|t_k9|t_K9|t_KA|t_kb|t_kB|t_KB|t_KC|t_kd|t_kD|t_KD|t_ke|t_KE|t_KF|t_KG|t_kh|t_KH|t_kI|t_KI|t_KJ|t_KK|t_kl|t_KL|t_kN|t_kP|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_RI|t_RV|t_Sb|t_se|t_Sf|t_SI|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_WP|t_WS|t_xs|t_ZH|t_ZR)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}; 16 | !function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.hooks.add("complete",function(e){if(e.code){var t=e.element.parentNode,s=/\s*\bline-numbers\b\s*/;if(t&&/pre/i.test(t.nodeName)&&(s.test(t.className)||s.test(e.element.className))&&!e.element.querySelector(".line-numbers-rows")){s.test(e.element.className)&&(e.element.className=e.element.className.replace(s,"")),s.test(t.className)||(t.className+=" line-numbers");var n,a=e.code.match(/\n(?!$)/g),l=a?a.length+1:1,r=new Array(l+1);r=r.join(""),n=document.createElement("span"),n.setAttribute("aria-hidden","true"),n.className="line-numbers-rows",n.innerHTML=r,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(n)}}})}(); 17 | --------------------------------------------------------------------------------