diff options
276 files changed, 12536 insertions, 0 deletions
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..63d72a1 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +open_collective: miracles +custom: ['https://afdian.net/@Eltrac'] diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..e6c3be1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,45 @@ +--- +name: 问题报告 +about: 如果程序的某一功能出现问题,请向我们报告 +title: '' +labels: 问题 +assignees: '' + +--- + +> 注意,在报告之前请先确认:**你已经清除过浏览器 / CDN 缓存;你没有修改过相关源代码。** +> 在确定这的确是原项目中的问题之后,请删除这段文本,并继续报告。 + +**问题出处:** + +这个问题出在程序的哪一个具体功能? + +**实际行为描述:** + +触发问题后造成了什么效果及影响? + +**预期的行为:** + +这个功能应该有怎样的效果和影响? + +**复现步骤:** + +怎样才能再次触发这个问题? + +**配置与环境:** + +- 问题页面:(如果有,请提供一个触发此问题的页面链接) +- PHP 版本: +- 数据库类型 / 版本: +- Typecho 版本: +- 主题版本:(Release 标注的版本号,开发版则写 Dev.) +- 使用的插件:(所有使用中的的插件,以便判断兼容性问题) +- 浏览器:(浏览器名称及版本号) + +**截图(若有)** + +提供一个此问题触发的截图或报错信息。若没有,则留空。 + +**补充信息:** + +提供尽可能多的相关信息。 diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000..208ebb1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,25 @@ +--- +name: 想法建议 +about: 如如果你些建议或是对现有功能的新想法,欢迎提交。 +title: '' +labels: 优化 +assignees: '' +--- + +> 注意,在报告之前请先确认:**这个想法能被多数人接受;这个想法会让这个程序更好。** +> 当你确定你的想法满足以上条件之后,请删除这段文本并继续。 + +**这是什么方面的想法?** + +现有内容的优化 / 新增功能 / UI 界面 / 用户体验 + +**这个想法具体是要实现什么?** + + +**这个想法实现后有什么帮助?** + + +**是否有具体的实现思路?** + + +**补充信息:** diff --git a/.github/ISSUE_TEMPLATE/help.md b/.github/ISSUE_TEMPLATE/help.md new file mode 100644 index 0000000..9827fbd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/help.md @@ -0,0 +1,41 @@ +--- +name: 需要帮助 +about: 如果你遇到了说明文档无法解决的问题,并且这也不像是一个 bug,可以在这里求助 +title: '' +labels: 求助 +assignees: '' + +--- + +> 注意,在求助的时候请描述清楚你的问题,并保持耐心 +> 在你阅读过这段文本之后,就可以删除这段引用文本 + +**大致范围:** + +这是哪一方面的问题?你是否知道问题所牵连到的文件以及在文件的哪一行? + +**具体行为描述:** + +你的问题具体是什么? + +**尝试:** + +你有试过自己解决吗?如果有,请描述你解决的方法和过程,即使它失败了 + +**配置与环境:** + +- 问题页面:(如果有,请提供一个触发此问题的页面链接) +- PHP 版本: +- 数据库类型 / 版本: +- Typecho 版本: +- 主题版本:(Release 标注的版本号,开发版则写 Dev.) +- 使用的插件:(所有使用中的的插件,以便判断兼容性问题) +- 浏览器:(浏览器名称及版本号) + +**截图(若有)** + +提供一个此问题触发的截图或报错信息。若没有,则留空。 + +**补充信息:** + +提供尽可能多的相关信息。 @@ -0,0 +1,16 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +$this->need('includes/head.php'); +$this->need('includes/header.php'); +?> + <main class="main-container container" role="main"> + <div class="post-body"> + <div class="post-content"> + <h1 class="error-title">404</h1> + <p style="text-align:center" role="alert"> + <span>肥肠抱歉,你访问的页面被猫吃掉了</span><br /><br /> + <a href="<?php $this->options->SiteUrl(); ?>" class="button error-button no-line">返回首页</a> + </p> + </div> + </div> + </main> +<?php $this->need('includes/footer.php'); ?>
\ No newline at end of file @@ -0,0 +1,85 @@ +The Star And Thank Author but No Politics License (SATA-BNP) + +Copyright © 2019-2020 Eltrac(hi@guhub.cn) + +Project Url: https://github.com/BigCoke233/miracles + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +And wait, the most important, you shall star/+1/like the project(s) in project url +section above first, and then thank the author(s) in Copyright section. + +Here are some suggested ways: + + - Email the authors a thank-you letter, and make friends with him/her/them. + - Report bugs or issues. + - Tell friends what a wonderful project this is. + - And, sure, you can just express thanks in your mind without telling the world. + +Contributors of this project by forking have the option to add his/her name and +forked project url at copyright and project url sections, but shall not delete +or modify anything else in these two sections. + +Besides, you are NOT allowed to publish anything about politics with this software +or use the software for political advocacy. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +--- + +中文译本: + +The Star And Thank Author but No Politics License (SATA-BNP) + +Copyright © 2019-2020 Eltrac(hi@guhub.cn) + +项目网址:https://github.com/BigCoke233/miracles + +兹准予任何人免费获得一份副本。 +本软件及相关的文档文件(以下称"软件"),以授予任何使用软件的人 +不受限制地使用本软件的权利,包括但不限于以下权利 +使用、复制、修改、合并、出版、分发、再授权和/或出售。 +本软件的副本,并允许接受本软件的人使用本软件。 +在符合下列条件的情况下,可以这样做。 + +上述版权声明和本许可声明应包括在以下内容中: +软件的所有副本或实质性的部分。 + +最重要的是,你应在项目网址中的项目中的星级/+1/喜欢的项目。 +然后用一定的方式感谢作者。 + +以下是一些建议的方法。 + + - 给作者发一封感谢信,和作者交朋友。 + - 报告 bug 或问题。 + - 告诉朋友们这是一个多么棒的项目。 + - 当然,你也可以只在心中表示感谢,不告诉全世界。 + +本项目的投稿者可以选择添加 TA 的名字 +在版权和项目网址部分的分叉项目网址,但不得删除 +或修改这两个部分中的任何其他内容。 + +此外,你不允许用这个软件发布任何关于政治的东西。 +或使用该软件进行政治宣传。 + +本软件是 "按原样 "提供的,不作任何形式的保证,无论明示或暗示。 +暗示的,包括但不限于适销性保证。 +适当于某一特定目的和不侵权。在任何情况下,任何情况下都不得 +作者或版权持有人对任何索赔、损害赔偿或其他责任。 +赔偿责任,无论是在合同、侵权行为还是其他方面的诉讼中,由于以下原因而产生的责任: +由于或与该软件的使用或其他交易有关的或与之有关的 +该软件。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a560eb0 --- /dev/null +++ b/README.md @@ -0,0 +1,262 @@ + + +<p align="center"> +<img src="https://img.shields.io/badge/build-passing-brightgreen.svg?style=flat-square"> +<img src="https://img.shields.io/badge/made%20with-%E2%9D%A4-ff69b4.svg?style=flat-square"> +<a href="LICENSE"><img src="https://img.shields.io/badge/license-SATA-blue.svg?style=flat-square"></a> +<a href="https://typecho.org"><img src="https://img.shields.io/badge/for-Typecho-blueviolet.svg?style=flat-square"></a> +<a href="https://github.com/BigCoke233/miracles/releases"><img src="https://img.shields.io/github/v/release/BigCoke233/miracles?color=red&style=flat-square"></a> +<a href="https://github.com/BigCoke233/miracles/graphs/contributors"><img src="https://img.shields.io/github/contributors/BigCoke233/miracles?color=orange&style=flat-square"></a> + +<p align="center"><strong>记录你心中的奇迹,书写你自己的篇章</strong></p> + +--- + +> **使用主题时,如果需要任何基础功能上的帮助,请先查看[说明文档](docs/wiki.md)!** +> 同时,欢迎加入 QQ 交流群:924171480,或者 [Telegram](https://dev.guhub.cn/tg) +> 2020/5/28 重要更改:Miracles 主题开源协议[增加条款](https://github.com/BigCoke233/miracles/commit/626b5aec42c58ba8defdcb2530dcb2a9b73cbfb1),禁止将项目用作任何政治相关用途 + +## 🎨 特色 + +- 响应式 / 自适应设计 +- Pjax 全站无刷新 +- Ajax 评论无刷新 +- 支持系统切换夜间模式 +- 调用 bilibili API 显示追番页面 +- 前台登录 +- 图片懒加载 +- 代码高亮 / 行号 +- 不错的兼容性 + - 夜间模式下的 Pio 插件按钮样式 + - 夜间模式下的 Aplayer 播放器 + - Bilibili 外链长宽比例 +- 良好的阅读体验 + - 阅读时长估计 + - 字数统计 + - 两种可供选择的字体(思源宋体/黑体) +- 不错的自定义性能 + - 两种可供选择的导航栏 + - 多种图片懒加载动画供选择 + - 黑白滤镜(哀悼模式) +- 灵活的友情链接功能 +- 方便排版的短代码 +- 后台设置备份 + +### 预览 + +[作者博客](https://guhub.cn/) | [Miracles 常用页面元素示例](https://guhub.cn/miracles-content-style-demo.html) + +## 🚀 使用 + +1. Star 本项目(遵循 SATA-BNP 开源协议) +2. 下载**最新的 [Release](https://github.com/BigCoke233/miracles/releases)** +3. 确保自身 PHP 环境在 7.1.0 及以上版本,并装有 CURL 拓展(否则一些功能无法正常使用) +4. 解压后,**确认目录名为`Miracles`(M 大写)** +5. 将文件夹放入 Typecho 根目录下的`usr/themes/` +6. 到后台-外观-可用的主题中,启用主题 +7. **根据 [wiki](docs/wiki.md)** 配置主题 + +<details><summary>使用开发版</summary><br> + +直接下载仓库,或者使用 git 命令行进行克隆。 +```git +$ git clone https://github.com/BigCoke233/miracles.git +``` +> 不推荐使用开发版,因为可能有不确定的不稳定因素,并且不一定有有利改动<br>如果你使用开发版出现任何问题,欢迎通过 issue 反馈,在等待回复期间请使用发行版 + +</details> +<details><summary>遇到问题</summary><br> + +如果在使用过程中遇到了任何问题,可以先阅读本主题的 [Wiki](docs/wiki.md),并进行一些简单的确认:清理浏览器缓存,更换网络环境,确保 Console 内没有提示访问不到文件等自身原因。如果你无法靠自己解决问题,可以尝试联系作者,但记住**开发者没有为你解决问题的义务,只是出于好心的帮助。** +在确认你遇到的现象确实是一个 Bug 后,请在 [Issues](https://github.com/BigCoke233/miracles/issues) 提交问题,并为该问题尽可能的描述清楚,按照提供的 issue 模板进行填写,谢谢配合。 + +</details> +<details><summary>关于版权</summary><br> + +主题基于 SATA-BNP 协议开源,使用前你需要给这个项目点一个 Star,使用或转发时**请保留版权信息**,禁止倒卖。若需二次开发后发布,请邮件通知我`hi#guhub.cn`,并保留原作者版权信息及仓库链接。在最近(2020-5-28),我将 SATA 协议修改为了 SATA-BNP 协议,即不能将软件用作任何政治相关的用途,特别是政治宣传,但是按原文转载相关政治家的书籍、文章,不含有任何倾向的解读也是可以接受的。同时,如果发现有侵权行为,请告知我,屡教不改者将被列入[黑名单](docs/black-list.md),删除版权的用户不会在遇到问题时受到来自作者的帮助,在后期可能会加入删除版权网站设置项失效的惩罚。 + +</details> + +### 更新日志 + +**Ver.1.5.4 Your best nightmare** + +- 增加:适配夜间模式的图标 +可在根目录下创建 faviconDark.ico,如果这个文件存在而系统又为深色模式的时候,就将 favicon 替换成这个文件 +- 优化:移动端下,追番项目一行显示两个 +- 优化:优化夜间模和日落模式 +- 优化:导航栏 :hover 毛玻璃效果优化 +- 移除:提交评论时小电视动画 + +> 所有历史版本的更新日志请查看[这里](docs/change-log.md) + +<details><summary>开发版更新日志</summary><br> + +**v20200503A** + +- 优化:夜间模式下,notice 块的背景色 + +**v20200505A** + +- 优化:导航栏毛玻璃效果调整 +- 优化:导航栏透明度调整 + +**v20200505B** + +- 优化:将 kbd 的短代吗语法修改为 `[[kbd]]` + +**v20200514A** + +- 优化:用 canvas 替换代码块的 mac 按钮图片 + +**v20200517A** + +- 修复:暴力解决访问密码文章时被 pjax 强制刷新的问题 + +**v20200524A** + +- 优化:鼠标移动到文章卡片标题上时显示完整标题 + +**v20200530A** + +- 新增:支持快速写入`<details>`的短代码,并使用[垫片](https://github.com/javan/details-element-polyfill)优化兼容性 +- 优化:将 FancyBox 和 Lazyload 替换为 gazeimg + +**v20200530B** + +- 优化:归档页面,折叠往年的文章列表 +- 优化:用 localStorage 储存 theme,代替 cookie #57 +- 优化:在 php 层检测 faviconDark,避免前台出现 404 报错 + +**v20200531A** + +- 修复:评论区 owo 表情换行 + +**v20200613A** + +- 修复:标签、分类页面不显示文章缩略图 + +**v20200710A** + +- 优化:模板设置备份中,判断 `$_POST['type']` 存在后再进行备份处理,防止不必要的报错和其他风险 + +**v20200711A** + +- 新增:兼容 typecho 评论反垃圾 +- 新增:高级设置 +- 新增:可选择主题字体 CDN 了 +- 新增:可以使用 TimThumb 裁剪文章缩略图了(需要在高级设置 themeConfig.php 里打开) +- 优化:归档页面 meta 元信息 + +**v20200713A** + +- 优化:改进番剧页面(Done by Kengwang) +- 修复:解决随机颜文字可能报错的问题 +- 修复:评论列表缺失 #comments id + +**v20200714A** + +- 新增:加入 html 压缩 +- 新增:多语言功能 +- 优化:将 title 改为 hint.css 提供的 tooltip +- 优化:将鼠标悬停在文章元信息上时,会显示对应的 tooltip +- 修复:删除不必要的判断 +- 修复:自定义随机图失效 + +**v20200715A** + +- 优化:用 alertify.js 替换自己的提示框 +- 优化:页面/文章评论列表隐藏时,不显示评论数 + +**v20200730A** + +~~咕了半个月的更新~~ + +- 新增:支持自定义「导航栏图标按钮」 +- 新增:文章目录(使用 `{:toc:}` 在文中插入目录) +- 新增:归档页面中添加「文章分类」栏目 +- 优化:将设置项「Pjax 完成后执行事件」更改为更准确的「Pjax 回调函数」 +- 修复:一个存在了超久的拼写错误(`paresNav`=>`parseNav`) +- 修复:archive 页面(即分类、标签、搜索等)文章头图问题 + +</details> + +## 📝 计划 + +- [x] 优化:用 localStorage 替换储存夜间/日落模式等的 cookie +- [x] 新增:支持快速写入`<details>`的短代码,并使用[垫片](https://github.com/javan/details-element-polyfill)优化兼容性 +- [x] 新增:添加语言包功能,通过 php 数组储存各个语言版本的文字 +- [x] 优化:文章缩略图自动剪裁 +- [x] 优化:页面/文章评论列表隐藏时,不显示评论数 +- [x] 优化:支持用 jsDelivr 加速主题内置图片的速度 +- [ ] 增加:内置站点缓存规则 +- [ ] 优化:「说说页面」的样式 +- [ ] 新增:图片横向排版「相册功能」(参考:https://blog.imalan.cn/archives/282/) +- [ ] 新增:全站加密功能 +- [ ] 新增:支持 PWA - 渐进式 Web 应用 +- [ ] 新增:嵌入 GitHub 仓库 / 用户(以卡片形式展示) +- [ ] 新增:根据 cid 嵌入本站文章(以卡片形式展示) +- [ ] 新增:文章目录 +- [ ] 优化:密码提示(可在加密文章中自定义对密码的提示) +- [ ] 新增:全站公告 +- [ ] 优化:对日间模式/日落模式/夜间模式的切换通过下拉面板操作,并支持禁用主题跟随系统设置 +- [ ] 新增:导航支持下拉面板 +- [ ] 优化:优化夜间模式的切换机制 + +## 💖 鸣谢 + +> 这些都是在开发过程中给予我帮助的项目和大佬! + +### 开源项目 + +- [jQuery](https://github.com/jquery/jquery) - 若干开源项目和主题内一些 js 的前置 +- [Highlight.js](https://github.com/highlightjs/highlight.js) - 代码高亮 +- [Hightlight-line-numbers](https://github.com/wcoder/highlightjs-line-numbers.js) - 代码行号 +- [Pjax](https://github.com/defunkt/jquery-pjax) - Pjax 预加载 +- [Nprogress](https://github.com/rstacruz/nprogress) - Pjax 滚动条动画 +- [OwO](https://github.com/DIYgod/OwO) - 评论 OwO 表情 +- [Pangu.js](https://github.com/vinta/pangu.js) -分割中英文字符 +- [Normalize.css](http://necolas.github.io/normalize.css/) - 保证不同浏览器上各元素 css 默认效果相同 +- [qrcode.js](https://github.com/davidshimjs/qrcodejs) - 生成文章二维码 +- [gazeimg](https://github.com/ganxiaozhe/gazeimg) - 图片懒加载 & 灯箱 +- [details-element-polyfill](https://github.com/javan/details-element-polyfill) - 优化 details 标签兼容性 +- [hint.css](https://kushagra.dev/lab/hint/) - 工具提示 Tooltip +- [alertify](https://github.com/MohammadYounes/AlertifyJS) - 对话框和 snackbar(notifier) +- [TableContents](https://github.com/lutdev/table-contents) - 生成文章目录 +- ~~[LazyLoad](https://github.com/tuupola/lazyload) - 图片懒加载~~(开发版已用新的方案替换) +- ~~[FancyBox](https://github.com/fancyapps/fancybox) - 文章图片灯箱~~(开发版已用新的方案替换) + +### 贡献者 + +这里只列出贡献「相对较大」的贡献者,所有的贡献者名单请到[这里](https://github.com/BigCoke233/miracles/graphs/contributors)查看 + +| 贡献者 | 贡献内容 | +| ------ | ------- | +| [@BigCoke233 (Eltrac)](https://github.com/BigCoke233) | 原作者 / 主要维护者 | +| [@outtimes](https://github.com/outtimes) | 提供各种有用的功能 | +| [@ohmyga233](https://github.com/ohmyga233) | 实现 Ajax 评论无刷新 | +| [@kengwang](https://github.com/kengwang) | 提供追番页面 | + +### 参考 + +[VOID](https://github.com/AlanDecode/Typecho-Theme-VOID) | [Castle](https://github.com/ohmyga233/castle-Typecho-Theme) | +[Holakit](https://github.com/wenxuanjun/Holakit) | [Material](https://github.com/idawnlight/typecho-theme-material) | [Mirages](https://get233.com/archives/mirages-intro.html) + +## 🔮 相关 + +演示站点:[我的博客](https://guhub.cn) +介绍文章:[Miracles —— 生为奇迹](https://guhub.cn/p/miracles.html) +说明文档:[Wiki.md](docs/wiki.md) | [Notion(被墙了,故停止维护)](https://www.notion.so/eltrac/c7c631e21b3345caa2a09bd2fb5dd4b2) +更新日志:[change-log.md](docs/change-log.md) +侵权网站:[black-list.md](docs/black-list.md) + +## 🎁 捐助 + +你可以通过[爱发电](https://afdian.net/@Eltrac)向我投食,~~用金钱催更~~;或是在 [Open Collective](https://opencollective.com/miracles) 上为 Miracles 进行捐献 +又或者是用支付宝扫码支付,感谢投食,~~据说砸得越多更新越快~~~ + +<img src="alipay.png" width="70%"> + +--- + +Copyright © 2019-2020 [Eltrac](https://github.com/BigCoke233), released under [SATA-BNP License](https://github.com/BigCoke233/miracles/blob/master/LICENSE). diff --git a/about.php b/about.php new file mode 100644 index 0000000..e4fe041 --- /dev/null +++ b/about.php @@ -0,0 +1,42 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +/** + * 关于页面 + * + * @package custom + */ +$this->need('includes/head.php'); +$this->need('includes/header.php'); +?> + <main class="main-container container" role="main"> + <div class="post-body"> + <br><br><br> + <div class="about"> + <div class="about-avatar"><!-- 头像 --> + <?php if($this->options->avatar==''): echo $this->author->gravatar(500); + else: ?><img src="<?php $this->options->avatar(); ?>"><?php endif; ?> + <?php if($this->fields->name==!''): ?> + <h2 class="about-name"><?php echo $this->fields->name(); ?></h2> + <?php endif; ?> + </div> + <div class="about-social"><!-- 社交按钮 --> + <?php if($this->fields->github==!''): ?> + <a href="https://github.com/<?php echo $this->fields->github(); ?>" target="_blank" title="<?php gtecho('aboutPageTexts','aboutShareGitHub'); ?>"><i class="iconfont icon-github"></i></a> + <?php endif; ?> + <?php if($this->fields->qq==!''): ?> + <a href="tencent://Message/?Uin=<?php echo $this->fields->qq(); ?>&websiteName=q-zone.qq.com&Menu=yes" target="_blank" title="<?php gtecho('aboutPageTexts','aboutShareQQ'); ?>"><i class="iconfont icon-qq1"></i></a> + <?php endif; ?> + <?php if($this->fields->bilibili==!''): ?> + <a href="https://space.bilibili.com/<?php echo $this->fields->bilibili(); ?>" target="_blank" title="<?php gtecho('aboutPageTexts','aboutShareB'); ?>"><i class="iconfont icon-bilibili-"></i></a> + <?php endif; ?> + <?php if($this->fields->email==!''): ?> + <a href="mailto:<?php echo $this->fields->email(); ?>"><i class="iconfont icon-mail_fill" target="_blank" title="<?php gtecho('aboutPageTexts','aboutShareEmail'); ?>"></i></a> + <?php endif; ?> + </div> + </div> + <div class="post-content page-content"> + <?php $this->content(); ?> + </div> + </div> + <?php $this->need('includes/comments.php'); ?> + </main> +<?php $this->need('includes/footer.php'); ?> diff --git a/alipay.png b/alipay.png Binary files differnew file mode 100644 index 0000000..0770e2a --- /dev/null +++ b/alipay.png diff --git a/archive.php b/archive.php new file mode 100644 index 0000000..cb852ae --- /dev/null +++ b/archive.php @@ -0,0 +1,47 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +$this->need('includes/head.php'); +$this->need('includes/header.php'); +?> + <main class="main-container container" role="main"> + <div class="post-list"> + <?php if ($this->have()): ?> + <?php else: ?> + <p style="text-align:center">居然没有找到相关内容</p> + <?php endif; ?> + <?php while($this->next()): ?> + <div class="post-item"> + <div class="container-fluid"><div class="row"> + <div class="col-md-6 post-banner-box"> + <a href="<?php $this->permalink(); ?>" class="post-link"> + <div class="post-banner"> + <img src="<?php echo Utils::addLoadingImages($this->options->CDN, $this->options->loading_image, 'normal'); ?>" data-gisrc="<?php Utils::postBanner($this); ?>"> + </div> + </a> + </div> + <div class="col-md-6 post-item-content"> + <a href="<?php $this->permalink(); ?>" class="post-link"> + <h1 class="post-title"><?php $this->sticky(); ?><?php $this->title(); ?></h1> + </a> + <p class="post-excerpt"> + <?php if($this->fields->excerpt && $this->fields->excerpt!='') { + echo $this->fields->excerpt; + }else{ + echo $this->excerpt(130); + } + ?> + </p> + <p class="post-meta"><i class="iconfont icon-block"></i> <?php $this->category(','); ?> <i class="iconfont icon-comments"></i> <?php $this->commentsNum('还没有评论', '仅一条评论', '%d'); ?> <i class="iconfont icon-clock"></i> <?php $this->date(); ?></p> + <p class="post-button-box large-screen"><a href="<?php $this->permalink(); ?>" class="button post-button">Read More</a></p> + </div> + </div></div> + </div> + <br /> + <?php endwhile; ?> + <div class="post-pagenav"> + <span class="post-pagenav-left"><?php $this->pageLink('<i class="iconfont icon-chevron-left"></i>'); ?></span> + <span class="post-pagenav-right"><?php $this->pageLink('<i class="iconfont icon-chevron-right"></i>','next'); ?></span> + </div> + </div> + </div> + </main> +<?php $this->need('includes/footer.php'); ?> diff --git a/assets/OwO.json b/assets/OwO.json new file mode 100644 index 0000000..2b29251 --- /dev/null +++ b/assets/OwO.json @@ -0,0 +1,861 @@ +{ + "Emotes": { + "type": "emoticon", + "container": [{ + "icon": "OωO", + "text": "Author: DIYgod" + }, { + "icon": "|´・ω・)ノ", + "text": "Hi" + }, { + "icon": "ヾ(≧∇≦*)ゝ", + "text": "开心" + }, { + "icon": "(☆ω☆)", + "text": "星星眼" + }, { + "icon": "(╯‵□′)╯︵┴─┴", + "text": "掀桌" + }, { + "icon": " ̄﹃ ̄", + "text": "流口水" + }, { + "icon": "(/ω\)", + "text": "捂脸" + }, { + "icon": "∠( ᐛ 」∠)_", + "text": "给跪" + }, { + "icon": "(๑•̀ㅁ•́ฅ)", + "text": "Hi" + }, { + "icon": "→_→", + "text": "斜眼" + }, { + "icon": "୧(๑•̀⌄•́๑)૭", + "text": "加油" + }, { + "icon": "٩(ˊᗜˋ*)و", + "text": "有木有WiFi" + }, { + "icon": "(ノ°ο°)ノ", + "text": "前方高能预警" + }, { + "icon": "(´இ皿இ`)", + "text": "我从未见过如此厚颜无耻之人" + }, { + "icon": "⌇●﹏●⌇", + "text": "吓死宝宝惹" + }, { + "icon": "(ฅ´ω`ฅ)", + "text": "已阅留爪" + }, { + "icon": "(╯°A°)╯︵○○○", + "text": "去吧大师球" + }, { + "icon": "φ( ̄∇ ̄o)", + "text": "太萌惹" + }, { + "icon": "ヾ(´・ ・`。)ノ\"", + "text": "咦咦咦" + }, { + "icon": "( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃", + "text": "气呼呼" + }, { + "icon": "(ó﹏ò。)", + "text": "我受到了惊吓" + }, { + "icon": "Σ(っ °Д °;)っ", + "text": "什么鬼" + }, { + "icon": "( ,,´・ω・)ノ\"(´っω・`。)", + "text": "摸摸头" + }, { + "icon": "╮(╯▽╰)╭ ", + "text": "无奈" + }, { + "icon": "o(*////▽////*)q ", + "text": "脸红" + }, { + "icon": ">﹏<", + "text": "" + }, { + "icon": "( ๑´•ω•) \"(ㆆᴗㆆ)", + "text": "" + }, { + "icon": "(。•ˇ‸ˇ•。)", + "text": "" + }] + }, + "Aru": { + "type": "image", + "container": [{ + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E9AB98E585B4_2x.png\">", + "data": ":@(高兴)", + "text": "高兴" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E5B08FE68092_2x.png\">", + "data": ":@(小怒)", + "text": "小怒" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E884B8E7BAA2_2x.png\">", + "data": ":@(脸红)", + "text": "脸红" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E58685E4BCA4_2x.png\">", + "data": ":@(内伤)", + "text": "内伤" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E8A385E5A4A7E6ACBE_2x.png\">", + "data": ":@(装大款)", + "text": "装大款" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E8B59EE4B880E4B8AA_2x.png\">", + "data": ":@(赞一个)", + "text": "赞一个" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E5AEB3E7BE9E_2x.png\">", + "data": ":@(害羞)", + "text": "害羞" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E6B197_2x.png\">", + "data": ":@(汗)", + "text": "汗" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E59090E8A180E58092E59CB0_2x.png\">", + "data": ":@(吐血倒地)", + "text": "吐血倒地" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E6B7B1E6809D_2x.png\">", + "data": ":@(深思)", + "text": "深思" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E4B88DE9AB98E585B4_2x.png\">", + "data": ":@(不高兴)", + "text": "不高兴" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E697A0E8AFAD_2x.png\">", + "data": ":@(无语)", + "text": "无语" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E4BAB2E4BAB2_2x.png\">", + "data": ":@(亲亲)", + "text": "亲亲" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E58FA3E6B0B4_2x.png\">", + "data": ":@(口水)", + "text": "口水" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E5B0B4E5B0AC_2x.png\">", + "data": ":@(尴尬)", + "text": "尴尬" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E4B8ADE68C87_2x.png\">", + "data": ":@(中指)", + "text": "中指" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E683B3E4B880E683B3_2x.png\">", + "data": ":@(想一想)", + "text": "想一想" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E593ADE6B3A3_2x.png\">", + "data": ":@(哭泣)", + "text": "哭泣" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E4BEBFE4BEBF_2x.png\">", + "data": ":@(便便)", + "text": "便便" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E78CAEE88AB1_2x.png\">", + "data": ":@(献花)", + "text": "献花" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E79AB1E79C89_2x.png\">", + "data": ":@(皱眉)", + "text": "皱眉" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E582BBE7AC91_2x.png\">", + "data": ":@(傻笑)", + "text": "傻笑" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E78B82E6B197_2x.png\">", + "data": ":@(狂汗)", + "text": "狂汗" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E59090_2x.png\">", + "data": ":@(吐)", + "text": "吐" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E596B7E6B0B4_2x.png\">", + "data": ":@(喷水)", + "text": "喷水" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E79C8BE4B88DE8A781_2x.png\">", + "data": ":@(看不见)", + "text": "看不见" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E9BC93E68E8C_2x.png\">", + "data": ":@(鼓掌)", + "text": "鼓掌" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E998B4E69A97_2x.png\">", + "data": ":@(阴暗)", + "text": "阴暗" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E995BFE88D89_2x.png\">", + "data": ":@(长草)", + "text": "长草" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E78CAEE9BB84E7939C_2x.png\">", + "data": ":@(献黄瓜)", + "text": "献黄瓜" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E982AAE681B6_2x.png\">", + "data": ":@(邪恶)", + "text": "邪恶" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E69C9FE5BE85_2x.png\">", + "data": ":@(期待)", + "text": "期待" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E5BE97E6848F_2x.png\">", + "data": ":@(得意)", + "text": "得意" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E59090E8888C_2x.png\">", + "data": ":@(吐舌)", + "text": "吐舌" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E596B7E8A180_2x.png\">", + "data": ":@(喷血)", + "text": "喷血" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E697A0E68980E8B093_2x.png\">", + "data": ":@(无所谓)", + "text": "无所谓" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E8A782E5AF9F_2x.png\">", + "data": ":@(观察)", + "text": "观察" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E69A97E59CB0E8A782E5AF9F_2x.png\">", + "data": ":@(暗地观察)", + "text": "暗地观察" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E882BFE58C85_2x.png\">", + "data": ":@(肿包)", + "text": "肿包" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E4B8ADE69EAA_2x.png\">", + "data": ":@(中枪)", + "text": "中枪" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E5A4A7E59BA7_2x.png\">", + "data": ":@(大囧)", + "text": "大囧" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E591B2E78999_2x.png\">", + "data": ":@(呲牙)", + "text": "呲牙" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E68AA0E9BCBB_2x.png\">", + "data": ":@(抠鼻)", + "text": "抠鼻" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E4B88DE8AFB4E8AF9D_2x.png\">", + "data": ":@(不说话)", + "text": "不说话" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E592BDE6B094_2x.png\">", + "data": ":@(咽气)", + "text": "咽气" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E6ACA2E591BC_2x.png\">", + "data": ":@(欢呼)", + "text": "欢呼" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E99481E79C89_2x.png\">", + "data": ":@(锁眉)", + "text": "锁眉" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E89CA1E7839B_2x.png\">", + "data": ":@(蜡烛)", + "text": "蜡烛" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E59D90E7AD89_2x.png\">", + "data": ":@(坐等)", + "text": "坐等" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E587BBE68E8C_2x.png\">", + "data": ":@(击掌)", + "text": "击掌" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E6838AE5969C_2x.png\">", + "data": ":@(惊喜)", + "text": "惊喜" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E5969CE69E81E8808CE6B3A3_2x.png\">", + "data": ":@(喜极而泣)", + "text": "喜极而泣" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E68ABDE7839F_2x.png\">", + "data": ":@(抽烟)", + "text": "抽烟" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E4B88DE587BAE68980E69699_2x.png\">", + "data": ":@(不出所料)", + "text": "不出所料" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E684A4E68092_2x.png\">", + "data": ":@(愤怒)", + "text": "愤怒" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E697A0E5A588_2x.png\">", + "data": ":@(无奈)", + "text": "无奈" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E9BB91E7BABF_2x.png\">", + "data": ":@(黑线)", + "text": "黑线" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E68A95E9998D_2x.png\">", + "data": ":@(投降)", + "text": "投降" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E79C8BE783ADE997B9_2x.png\">", + "data": ":@(看热闹)", + "text": "看热闹" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E68987E880B3E58589_2x.png\">", + "data": ":@(扇耳光)", + "text": "扇耳光" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E5B08FE79CBCE79D9B_2x.png\">", + "data": ":@(小眼睛)", + "text": "小眼睛" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/aru/E4B8ADE58880_2x.png\">", + "data": ":@(中刀)", + "text": "中刀" + }] + }, + "Paopao": { + "type": "image", + "container": [{ + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E591B5E591B5_2x.png\">", + "data": "::(呵呵)", + "text": "呵呵" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E59388E59388_2x.png\">", + "data": "::(哈哈)", + "text": "哈哈" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E59090E8888C_2x.png\">", + "data": "::(吐舌)", + "text": "吐舌" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5A4AAE5BC80E5BF83_2x.png\">", + "data": "::(太开心)", + "text": "太开心" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E7AC91E79CBC_2x.png\">", + "data": "::(笑眼)", + "text": "笑眼" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E88AB1E5BF83_2x.png\">", + "data": "::(花心)", + "text": "花心" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5B08FE4B996_2x.png\">", + "data": "::(小乖)", + "text": "小乖" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E4B996_2x.png\">", + "data": "::(乖)", + "text": "乖" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E68D82E598B4E7AC91_2x.png\">", + "data": "::(捂嘴笑)", + "text": "捂嘴笑" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E6BB91E7A8BD_2x.png\">", + "data": "::(滑稽)", + "text": "滑稽" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E4BDA0E68782E79A84_2x.png\">", + "data": "::(你懂的)", + "text": "你懂的" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E4B88DE9AB98E585B4_2x.png\">", + "data": "::(不高兴)", + "text": "不高兴" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E68092_2x.png\">", + "data": "::(怒)", + "text": "怒" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E6B197_2x.png\">", + "data": "::(汗)", + "text": "汗" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E9BB91E7BABF_2x.png\">", + "data": "::(黑线)", + "text": "黑线" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E6B3AA_2x.png\">", + "data": "::(泪)", + "text": "泪" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E79C9FE6A392_2x.png\">", + "data": "::(真棒)", + "text": "真棒" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E596B7_2x.png\">", + "data": "::(喷)", + "text": "喷" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E6838AE593AD_2x.png\">", + "data": "::(惊哭)", + "text": "惊哭" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E998B4E999A9_2x.png\">", + "data": "::(阴险)", + "text": "阴险" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E98499E8A786_2x.png\">", + "data": "::(鄙视)", + "text": "鄙视" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E985B7_2x.png\">", + "data": "::(酷)", + "text": "酷" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5958A_2x.png\">", + "data": "::(啊)", + "text": "啊" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E78B82E6B197_2x.png\">", + "data": "::(狂汗)", + "text": "狂汗" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/what_2x.png\">", + "data": "::(what)", + "text": "what" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E79691E997AE_2x.png\">", + "data": "::(疑问)", + "text": "疑问" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E985B8E788BD_2x.png\">", + "data": "::(酸爽)", + "text": "酸爽" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E59180E592A9E788B9_2x.png\">", + "data": "::(呀咩爹)", + "text": "呀咩爹" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5A794E5B188_2x.png\">", + "data": "::(委屈)", + "text": "委屈" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E6838AE8AEB6_2x.png\">", + "data": "::(惊讶)", + "text": "惊讶" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E79DA1E8A789_2x.png\">", + "data": "::(睡觉)", + "text": "睡觉" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E7AC91E5B0BF_2x.png\">", + "data": "::(笑尿)", + "text": "笑尿" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E68C96E9BCBB_2x.png\">", + "data": "::(挖鼻)", + "text": "挖鼻" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E59090_2x.png\">", + "data": "::(吐)", + "text": "吐" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E78A80E588A9_2x.png\">", + "data": "::(犀利)", + "text": "犀利" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5B08FE7BAA2E884B8_2x.png\">", + "data": "::(小红脸)", + "text": "小红脸" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E68792E5BE97E79086_2x.png\">", + "data": "::(懒得理)", + "text": "懒得理" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E58B89E5BCBA_2x.png\">", + "data": "::(勉强)", + "text": "勉强" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E788B1E5BF83_2x.png\">", + "data": "::(爱心)", + "text": "爱心" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5BF83E7A28E_2x.png\">", + "data": "::(心碎)", + "text": "心碎" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E78EABE791B0_2x.png\">", + "data": "::(玫瑰)", + "text": "玫瑰" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E7A4BCE789A9_2x.png\">", + "data": "::(礼物)", + "text": "礼物" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5BDA9E899B9_2x.png\">", + "data": "::(彩虹)", + "text": "彩虹" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5A4AAE998B3_2x.png\">", + "data": "::(太阳)", + "text": "太阳" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E6989FE6989FE69C88E4BAAE_2x.png\">", + "data": "::(星星月亮)", + "text": "星星月亮" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E992B1E5B881_2x.png\">", + "data": "::(钱币)", + "text": "钱币" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E88CB6E69DAF_2x.png\">", + "data": "::(茶杯)", + "text": "茶杯" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E89B8BE7B395_2x.png\">", + "data": "::(蛋糕)", + "text": "蛋糕" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5A4A7E68B87E68C87_2x.png\">", + "data": "::(大拇指)", + "text": "大拇指" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E8839CE588A9_2x.png\">", + "data": "::(胜利)", + "text": "胜利" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/haha_2x.png\">", + "data": "::(haha)", + "text": "haha" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/OK_2x.png\">", + "data": "::(OK)", + "text": "OK" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E6B299E58F91_2x.png\">", + "data": "::(沙发)", + "text": "沙发" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E6898BE7BAB8_2x.png\">", + "data": "::(手纸)", + "text": "手纸" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E9A699E89589_2x.png\">", + "data": "::(香蕉)", + "text": "香蕉" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E4BEBFE4BEBF_2x.png\">", + "data": "::(便便)", + "text": "便便" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E88DAFE4B8B8_2x.png\">", + "data": "::(药丸)", + "text": "药丸" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E7BAA2E9A286E5B7BE_2x.png\">", + "data": "::(红领巾)", + "text": "红领巾" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E89CA1E7839B_2x.png\">", + "data": "::(蜡烛)", + "text": "蜡烛" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E99FB3E4B990_2x.png\">", + "data": "::(音乐)", + "text": "音乐" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E781AFE6B3A1_2x.png\">", + "data": "::(灯泡)", + "text": "灯泡" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5BC80E5BF83_2x.png\">", + "data": "::(开心)", + "text": "开心" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E992B1_2x.png\">", + "data": "::(钱)", + "text": "钱" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E592A6_2x.png\">", + "data": "::(咦)", + "text": "咦" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E591BC_2x.png\">", + "data": "::(呼)", + "text": "呼" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E586B7_2x.png\">", + "data": "::(冷)", + "text": "冷" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E7949FE6B094_2x.png\">", + "data": "::(生气)", + "text": "生气" + }, { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/paopao/E5BCB1_2x.png\">", + "data": "::(弱)", + "text": "弱" + }] + }, + "Twemoji": { + "type": "image", + "container": [{ + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/angry.png\">", + "data": ":&(angry)", + "text": "生气" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/bigsmile.png\">", + "data": ":&(bigsmile)", + "text": "大大的微笑" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/congratulate.png\">", + "data": ":&(congratulate)", + "text": "庆祝" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/cool.png\">", + "data": ":&(cool)", + "text": "酷" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/cry.png\">", + "data": ":&(cry)", + "text": "哭泣" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/dtongue.png\">", + "data": ":&(dtongue)", + "text": "吐舌" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/family.png\">", + "data": ":&(family)", + "text": "一家人" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/frightened.png\">", + "data": ":&(frightened)", + "text": "受到惊吓" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/gift.png\">", + "data": ":&(gift)", + "text": "礼物" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/happy.png\">", + "data": ":&(happy)", + "text": "开森" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/kiss.png\">", + "data": ":&(kiss)", + "text": "kiss" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/notalk.png\">", + "data": ":&(notalk)", + "text": "无 fuck 说" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/ok.png\">", + "data": ":&(ok)", + "text": "欧了" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/love.png\">", + "data": ":&(love)", + "text": "爱了爱了" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/prayer.png\">", + "data": ":&(prayer)", + "text": "祈祷" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/proud.png\">", + "data": ":&(proud)", + "text": "骄傲" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/shy.png\">", + "data": ":&(shy)", + "text": "羞涩" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/smile.png\">", + "data": ":&(smile)", + "text": "微笑" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/smilecry.png\">", + "data": ":&(smilecry)", + "text": "笑哭" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/star.png\">", + "data": ":&(star)", + "text": "星" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/sweat.png\">", + "data": ":&(sweat)", + "text": "汗" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/tiaomei.png\">", + "data": ":&(tiaomei)", + "text": "挑眉" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/tilted.png\">", + "data": ":&(tilted)", + "text": "鬼脸" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/tongue.png\">", + "data": ":&(tongue)", + "text": "调皮" + }, + { + "icon": "<img class=\"biaoqing\" data-src=\"/usr/themes/Miracles/images/biaoqing/twemoji/uncomfort.png\">", + "data": ":&(uncomfort)", + "text": "不爽" + }] + }, + "Emoji": { + "type": "emoji", + "container": [{ + "icon": "😂", + "text": "" + }, { + "icon": "😀", + "text": "" + }, { + "icon": "😅", + "text": "" + }, { + "icon": "😊", + "text": "" + }, { + "icon": "🙂", + "text": "" + }, { + "icon": "🙃", + "text": "" + }, { + "icon": "😌", + "text": "" + }, { + "icon": "😍", + "text": "" + }, { + "icon": "😘 ", + "text": "" + }, { + "icon": "😜", + "text": "" + }, { + "icon": "😝", + "text": "" + }, { + "icon": "😏", + "text": "" + }, { + "icon": "😒", + "text": "" + }, { + "icon": "🙄", + "text": "" + }, { + "icon": "😳 ", + "text": "" + }, { + "icon": "😡", + "text": "" + }, { + "icon": "😔", + "text": "" + }, { + "icon": "😫", + "text": "" + }, { + "icon": "😱", + "text": "" + }, { + "icon": "😭", + "text": "" + }, { + "icon": "💩", + "text": "" + }, { + "icon": "👻", + "text": "" + }, { + "icon": "🙌", + "text": "" + }, { + "icon": "🖕", + "text": "" + }, { + "icon": "👍", + "text": "" + }, { + "icon": "👫", + "text": "" + }, { + "icon": "👬", + "text": "" + }, { + "icon": "👭", + "text": "" + }, { + "icon": "🌚", + "text": "" + }, { + "icon": "🌝", + "text": "" + }, { + "icon": "🙈", + "text": "" + }, { + "icon": "💊", + "text": "" + }, { + "icon": "😶", + "text": "" + }, { + "icon": "🙏", + "text": "" + }, { + "icon": "🍦", + "text": "" + }, { + "icon": "🍉", + "text": "" + }, { + "icon": "😣", + "text": "" + }] + } +}
\ No newline at end of file diff --git a/assets/css/alertify.css b/assets/css/alertify.css new file mode 100644 index 0000000..32c4c42 --- /dev/null +++ b/assets/css/alertify.css @@ -0,0 +1,85 @@ + +/** + * alertifyjs 1.13.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2019 Mohammad Younes <Mohammad@alertifyjs.com> (http://alertifyjs.com) + * Licensed under GPL 3 <https://opensource.org/licenses/gpl-3.0>*/ +.alertify .ajs-dimmer{position:fixed;z-index:1981;top:0;right:0;bottom:0;left:0;padding:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{position:fixed;top:0;right:0;left:0;bottom:0;padding:0;overflow-y:auto;z-index:1981}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0 24px;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px;margin-bottom:0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-closable .ajs-commands button.ajs-close{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-overflow.ajs-fixed{position:fixed;top:0;right:0;bottom:0;left:0;overflow-y:scroll!important}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:1px dotted #3593d2}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:.5s;animation-duration:.5s}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;min-width:320px;max-width:90vw!important;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.275);transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier .ajs-message .ajs-close{position:absolute;top:0;right:0;width:16px;height:16px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center center;background-color:rgba(0,0,0,.5);border-top-right-radius:2px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0}.alertify-notifier.ajs-center{left:50%}.alertify-notifier.ajs-center .ajs-message{-webkit-transform:translateX(-50%);transform:translateX(-50%)}.alertify-notifier.ajs-center .ajs-message.ajs-visible{left:50%;-webkit-transition-timing-function:cubic-bezier(.57,.43,.1,.65);transition-timing-function:cubic-bezier(.57,.43,.1,.65)}.alertify-notifier.ajs-center.ajs-top .ajs-message{top:-300px}.alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible{top:0}.alertify-notifier.ajs-center.ajs-bottom .ajs-message{bottom:-300px}.alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible{bottom:0}.ajs-no-transition.alertify .ajs-dialog,.ajs-no-transition.alertify .ajs-dimmer,.ajs-no-transition.alertify .ajs-modal{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}.ajs-no-transition.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}@media (prefers-reduced-motion:reduce){.alertify .ajs-dialog,.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}} + +/* alertify theme */ +/** + * alertifyjs 1.13.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2019 Mohammad Younes <Mohammad@alertifyjs.com> (http://alertifyjs.com) + * Licensed under GPL 3 <https://opensource.org/licenses/gpl-3.0>*/ +/** + * alertifyjs 1.13.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2019 Mohammad Younes <Mohammad@alertifyjs.com> (http://alertifyjs.com) + * Licensed under GPL 3 <https://opensource.org/licenses/gpl-3.0>*/ + +.alertify .ajs-dimmer { + background-color: #000; + opacity: .5 +} + +.alertify .ajs-dialog { + max-width: 600px; + min-height: 122px; + background-color: #fff; + border: 1px solid rgba(0,0,0,.2); + -webkit-box-shadow: 0 5px 15px rgba(0,0,0,.3); + box-shadow: 0 5px 15px rgba(0,0,0,.3) +} + +.alertify .ajs-header { + color: #333; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 18px; + padding: 1.5em; + padding-bottom: .5em +} + +.alertify .ajs-body { + font-family: Roboto,sans-serif; + color: #000 +} + +.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content { + top: 58px; + bottom: 68px +} + +.alertify .ajs-footer { + background-color: #fff; + padding: 15px; + border-top: 1px solid #e5e5e5 +} + +.alertify-notifier .ajs-message { + background: rgba(50,50,50,.95); + color: #fff; + border-radius: 2px; + box-shadow: 0 2px 4px gray; + font-size: 0.94em +} + +.alertify-notifier .ajs-message.ajs-success { + color: #fff; + background: rgba(91,189,114,.95); +} + +.alertify-notifier .ajs-message.ajs-error { + color: #fff; + background: rgba(217,92,92,.95); +} + +.alertify-notifier .ajs-message.ajs-warning { + background: rgba(252,248,215,.95); + border-color: #999 +} + +.ajs-button { + border: none; + border-radius: 3px +} diff --git a/assets/css/codestyle.css b/assets/css/codestyle.css new file mode 100644 index 0000000..4c980d8 --- /dev/null +++ b/assets/css/codestyle.css @@ -0,0 +1,110 @@ +/* from https://github.com/atom/one-dark-syntax +edited by Eltrac */ +.hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #2d2d2d!important; + font-family: 'Noto Sans SC',sans-serif!important; + font-size: .8em!important; + padding: 0!important; + margin: 0!important; + max-height: 90vh; + position: relative; + background: rgb(63,63,63)!important +} + +.hljs::before { + content: ''; + display: block; + height: 27px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + background: url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAAaAEMDAREAAhEBAxEB/8QAGwABAAICAwAAAAAAAAAAAAAAAAgKBgkCBAf/xAAkEAACAwEAAgIBBQEAAAAAAAACBAEDBQYABwgRIQkSFCIxFf/EAB0BAQACAgIDAAAAAAAAAAAAAAAHCAYJBAUBAgr/xAAmEQACAwACAQQCAgMAAAAAAAABAgMEBQAGEQcSEyEIFCIxQVFh/9oADAMBAAIRAxEAPwCvv4448cceOOPHHHjjjxxx4448cceOOZVwmIl0vccbzmmzKebv9Xz2JoOQQhKqWrrpotswZf1CaKL7LYIv6j+z7n8RPnA1bUtLL0rkCfJNUoXLUMZBIklr15JY0IH2fc6BfA+z5+uZR0fGpdj7r1Dr2lZNPO3u0dfxr9sMENWlqa1Sjash28qpggnkl9zAhfb5P0OWLMzhuNxucr5DN5fCV5etYVJwozFLc2+gQiuYcWuqsB6y0Y+2L3IvvasI7WLLbTMyp5PqaNm4dGa9ae8XMn7RnkWdXJ8gxurKYgp+kWP2KgAVFVQAPoXzej9Ox+ux9Szur4VbrKV1qnDGZUkzp4VQRkW600UiXZJVHmxPcE89mRnlsSSyu7toT+RXH4PBe6u/5TmIAMLN1Vrc9esysrRDUys/XuzKzMjOa8tl+7OriwztEFRG0ysgim1vTtG3rdayb94k2poJFmcj2tKYLE1dZ2AAHunSJZm8AKS5KgAgc0S/kJ1HC6J6zd96t1oImHnateWhXjdpI6KaeXQ1pc2N3Z3MeXYvTZyCR3kVKoWR2cMx3Zforek/We1xfsj3TuYuL0HsLL7weKwrNZNbQY5HGQ57E3C1MepkLBz3ugd271LNSusXYXwSUUZpov0amdev53997XQ3er9Ez79/N61b66d7QWnPLWj2r1jTv54qXniZWs182ChHOtRmMBl0RNNFJJHWeKTfxz63i2c7Y7FarVretBpjNqmxGkz0K8dStZM9dXBEUtuSy0ZnA+UJVMcbqjyrJIL9Xv0n6z3fjPve4W8XFzPZPB7vJf8AG6VVNZTb30ug6PM5vR5nRcqCu7WTBPUs3VqW5YsQuxrLETWqZ0RZjb8Ku+9rz/VXO6RDfv2+rdiz9n97KmnlmoZ0+bl2tSrq1YHZkpztPUTOleERpZS8q2FleKq0OV+vvW8Wz0212B61aDYy7VD9e4kaR2bUdu3DUmpzSKA08YjmNpFk9zRNXYxFFeYSVjODxEem7jjOc02ZSzeg6vncTQcgoCVEdXXTQbZgy/qM0UMWW/uL8D+z7n8RPm2Pcuz5uJsaNaP5rNDK0LteHwT8s9WpNPFH4H2ffJGq+B9nz45QDuGtbwepdo3KEAtXsbru3rUqpUsLNvOzLVytAVX+TCaaFI/aPs+7wPs8sc5fB8Xjc3Xx+ZyuAry9awqTgxlqW5t9A1xXMOLX1Wg9baMfbDDsXsNWEdrNttpmZa8bO5s3NFtezqX5dNpDL+8bUy2Uct7vMMiMrQKp+o44fZHGoCxqqqANHmh2/tOpuv2a/wBh2LHYHnayNg6FmO/DKzlwas8Ukb1I4yfEENUww10CxwRxxoqjQP8AI3jsDgPdnsHk+XgAwczWWtz16zKytCvUys/Xty6zMjsmvKZfuza4sM7RBWBtMrIIpvf6ea9/e6XgaumWa9ZqSLYkZQrTtVtWKiWWAAX3Wo4EsMVAUmUlQFIA3H+h/Z9juXpT0zse+WfYv508d2d0CPcfP0buZHoOqqiB9GCnFecxosbNYLRqqFQPE/M05K3OQkQEJgRAYFBAYzIkJDMSJCUTEiQzETExMTExExP354IBBBAIIIII8gg/RBB+iCP7HPZWZGV0ZkdGDI6kqysp8qysCCrKQCCCCCPIPnkxMz50e+MznK8CXOZ0WqVhVp6fTxLWujAawiuu2ywdCrHcZAYiSYfxm7WDibWyYtOwyjqf0t6rPcNv470MbOXajBZVKZJPllCmFrMaEk+Eisxqg/jGEUAC3mb+b/rpm9djwTd63oWYa61oezaWLJZ7EixoI45ZJBfiyLdhVClrF/HtS2HBltNPK8jvEjV1NHc039nYdY0dXVcY0NF9uwrmnHW7SvZZvtKZI7brTIzKf9mfxER9R5IMEENWCKtXiSGCCNIYYo1CpHHGoVERR9BVUAAf85VDU1NHb0r+xr3LGjqaluxf0L9uRprNy5blaaxZnlYlnlmldndj/ZJ8ADwOSH+NXy09z/FHotTe9T7aNSvQUq0dLy/QIFr8t0IIHdYgejngwk1S2iTDEKaWW/naVNLLSoufxW2aLYw9U/RrovrDmVM7uNCw8ua80mVr5tgUtfMayqLZWrZaKeF4bAiiM1W3WtVZHihlMHzQxSJkXTu99i6NbntYVmNUtqiXKVqL56VsRFjEZog8brJEXf45oZYZlV5EEnxyOrZh8nvnV78+WSuVj+ydPByeSxXY1UeK4nLaxubnYii1UNZ0dHT2tjTeoWvvoTnS1210AZb/AIC6xuNFd0npN+Pnpz6NzXL3Vqmjc2b9f9Oxvb1uG9qCkZEmalAa1ShSqV5JY45JxVpQyWWih/ZklWCER9h3T1N7T3tIK+xPVgoVpfnizc2B69P9j2sgnkEs1mxNKqMyRmaxIsQeT4lQySFodiRAQmBEBgUEBjMiQkMxIkJRMSJDMRMTExMTETE/fk3EBgVYAqQQQQCCCPBBB+iCPog/RHI9ZVdWR1DKwKsrAMrKw8FWB8gggkEEEEHweTIy/nb78zObr5+XuZ0WqVhVo6jUw7WukrGuuK67bLY0KsdxkBEZNnQxm7mLIm1s2LTsM4gs+h3RLOi1/wCHSrxPIZXzK11Ys5ize5lVTXa3DGST4jguRJGp9sQjUKBWDQ/EP0dv7r7P6m9RryztYl6/n60dfCdncvJGkZpSadWBmJCwUtStFAhEdZYY1RFiJq6uluaehs7DrOlq6rjGho6DlpXNOut2leyyxacyR23WmRmU/wCzM/X1H1HksVatajWr06cMdarVhjr14IlCRQwxKEjjRR9KqIoUD/Q5ZTOz6OTQp5eZVgo52dVgpUadaNYq9WrWjWKCCGNQFSOKNFRVH9Af5P3zoecjnM48cceOOPHHHjjjxxx4448cceOOPHHP/9k=') no-repeat; + background-color: rgb(63,63,63); + position: absolute; + top: 0; + left: 0; + right: 0; + width: 100% +} + +.hljs::-webkit-scrollbar-corner { + background: 0 0 +} + +.hljs table,.hljs td,.hljs th { + border: none!important; + background: #2d2d2d; + line-height: 1.5; +} + +.hljs tr:first-child hljs-line { + padding-top: 10px +} + +.hljs tr:last-child hljs-line { + padding-bottom: 10px +} + +.hljs-ln { + margin-top: 27px +} + +.hljs-ln-numbers { + background: #414141!important; + padding: 0!important; + width: 30px!important; + text-align: center!important; + margin-left: 0!important; + color: #c8c8c8 +} + +.hljs-ln-code { + padding: 0 10px!important +} + +.hljs-comment,.hljs-quote { + color: #5c6370; + font-style: italic +} + +.hljs-doctag,.hljs-formula,.hljs-keyword { + color: #c678dd +} + +.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst { + color: #e06c75 +} + +.hljs-literal { + color: #56b6c2 +} + +.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string { + color: #98c379 +} + +.hljs-built_in,.hljs-class .hljs-title { + color: #e6c07b +} + +.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable { + color: #d19a66 +} + +.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title { + color: #61aeee +} + +.hljs-emphasis { + font-style: italic +} + +.hljs-strong { + font-weight: 700 +} + +.hljs-link { + text-decoration: underline +} diff --git a/assets/css/gazeimg.css b/assets/css/gazeimg.css new file mode 100644 index 0000000..8198e7c --- /dev/null +++ b/assets/css/gazeimg.css @@ -0,0 +1,82 @@ +/* ================================================== +* GazeImg v1.4.1 +* +* 采用 GPLv3 许可证供开源使用 +* 或用于商业用途的 GazeImg 商业许可证 +* 所有商业应用程序(包括您计划出售的网站,主题和应用程序) +* 都需要具有商业许可证。 +* +* Licensed GPLv3 for open source use +* or GazeImg Commercial License for commercial use +* +* http://www.ganxiaozhe.com/p/gazeimg/ +* Copyright 2020 Ganxiaozhe +* +================================================== */ +img[data-giwait-text],img[data-gionload] {filter: brightness(.2);transition: filter 1s ease-in;} +img[data-gazeimg],.gazeimg-content[data-rlong="n"] img {cursor: pointer;} +.gazeimg-content[data-rlong="y"] img {cursor: zoom-in !important;} +.gazeimg-content[data-gzoom="out"] img {cursor: zoom-out;} + +.gi-darken { + filter: brightness(1);animation:gia-darken 2s infinite linear alternate-reverse; + display: flex;align-items: center;justify-content: center; + vertical-align: top;overflow: hidden;position: relative; +} +.gi-darken.gi-failload {animation: none;} +.gi-darken a {display: block;text-decoration: none;color: #fff !important;text-align: center;word-break: break-all;} +@-webkit-keyframes gia-darken {to{filter: brightness(.75);}} +@keyframes gia-darken {to{filter: brightness(.75);}} + +.gi-zoomIn {animation: gia-zoomIn 1s cubic-bezier(0, 0, 0, 1) 1;} +@-webkit-keyframes gia-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}} +@keyframes gia-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}} + +.gi-fadeIn {animation: gia-fadeIn 0.3s cubic-bezier(0, 0, 0, 1) 1;} +@-webkit-keyframes gia-fadeIn{0%{opacity:0;}100%{opacity:1}} +@keyframes gia-fadeIn{0%{opacity:0;}100%{opacity:1}} + +.gazeimg-nobar {overflow: hidden;height: auto;} +.gazeimg-container { + position: fixed;left: 0;top: 0;height: 100%;width: 100%; + outline: none;z-index: 20020214;transition-duration: 0.35s; +} +.gazeimg-bg { + background: rgb(20,20,20);opacity: 0.9; + transition-property: opacity;transition-duration: inherit;transition-timing-function: cubic-bezier(.5, 0, .7, .7); +} +.gazeimg-bg,.gazeimg-inner { + position: absolute;top: 0;left: 0;bottom: 0;right: 0; +} +.gazeimg-stage { + direction: ltr;transform: translateZ(0); + width:100%;height:100%;padding:50px 0; +} +.gazeimg-content { + position: absolute;top:0;left:0;width:38px;height:38px;overflow: visible; + transform-origin: center; + transition: height 0.3s ease,width 0.3s ease; +} +.gazeimg-content img { + width:100%;height:100%;max-width:100%;max-height:100%;overflow: hidden; + position: absolute;top: 0;left: 0; + border:none;padding:0;margin:0; + user-select: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none; +} +.gazeimg-content .loader,.gilazy-loader { + display: block;width: 46px;height: 46px; + position: absolute;top:calc(50% - 23px);left:calc(50% - 23px); + border: 4px solid #f3f3f3;border-radius: 100%; + border-top: 4px solid transparent; + transition: border 0.3s ease; +} + +.gi-spin {-webkit-animation:gi-spin 0.8s infinite linear;animation:gi-spin 0.8s infinite linear;} +@-webkit-keyframes gi-spin{ + 0%{-webkit-transform:rotate(0);transform:rotate(0);} + 100%{-webkit-transform:rotate(360deg);transform:rotate(360deg);} +} +@keyframes gi-spin{ + 0%{-webkit-transform:rotate(0);transform:rotate(0);} + 100%{-webkit-transform:rotate(360deg);transform:rotate(360deg);} +} diff --git a/assets/css/hint.min.css b/assets/css/hint.min.css new file mode 100644 index 0000000..904b688 --- /dev/null +++ b/assets/css/hint.min.css @@ -0,0 +1,5 @@ +/*! Hint.css - v2.6.0 - 2019-04-27 +* http://kushagragour.in/lab/hint/ +* Copyright (c) 2019 Kushagra Gour */ + +[class*=hint--]{position:relative;display:inline-block;cursor:pointer!important;}[class*=hint--]:after,[class*=hint--]:before{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s}[class*=hint--]:hover:after,[class*=hint--]:hover:before{visibility:visible;opacity:1;-webkit-transition-delay:.1s;-moz-transition-delay:.1s;transition-delay:.1s}[class*=hint--]:before{content:'';position:absolute;background:0 0;border:6px solid transparent;z-index:1000001}[class*=hint--]:after{background:#383838;color:#fff;padding:8px 10px;font-size:12px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:12px;white-space:nowrap;text-shadow:0 -1px 0 #000;box-shadow:4px 4px 8px rgba(0,0,0,.3)}[class*=hint--][data-tooltip]:after{content:attr(data-tooltip)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[data-tooltip='']:after,[data-tooltip='']:before,[data-hint='']:after,[data-hint='']:before{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#383838}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#383838}.hint--top:after,.hint--top:before{bottom:100%;left:50%}.hint--top:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translateX(-50%)}.hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}.hint--bottom:after,.hint--bottom:before{top:100%;left:50%}.hint--bottom:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translateX(-50%)}.hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}.hint--right:before{border-right-color:#383838;margin-left:-11px;margin-bottom:-6px}.hint--right:after{margin-bottom:-14px}.hint--right:after,.hint--right:before{left:100%;bottom:50%}.hint--right:hover:after,.hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--left:before{border-left-color:#383838;margin-right:-11px;margin-bottom:-6px}.hint--left:after{margin-bottom:-14px}.hint--left:after,.hint--left:before{right:100%;bottom:50%}.hint--left:hover:after,.hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--top-left:after,.hint--top-left:before{bottom:100%;left:50%}.hint--top-left:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translateX(-100%);margin-left:12px}.hint--top-left:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--top-left:hover:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translateX(-100%) translateY(-8px)}.hint--top-right:after,.hint--top-right:before{bottom:100%;left:50%}.hint--top-right:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0);margin-left:-12px}.hint--top-right:hover:after,.hint--top-right:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--bottom-left:after,.hint--bottom-left:before{top:100%;left:50%}.hint--bottom-left:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translateX(-100%);margin-left:12px}.hint--bottom-left:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--bottom-left:hover:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translateX(-100%) translateY(8px)}.hint--bottom-right:after,.hint--bottom-right:before{top:100%;left:50%}.hint--bottom-right:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0);margin-left:-12px}.hint--bottom-right:hover:after,.hint--bottom-right:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--large:after,.hint--medium:after,.hint--small:after{white-space:normal;line-height:1.4em;word-wrap:break-word}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}.hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0 #592726}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0 #6c5328}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0 #1a3c4d}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{background-color:#458746;text-shadow:0 -1px 0 #1a321a}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--top:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}.hint--always.hint--top-left:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--top-left:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translateX(-100%) translateY(-8px)}.hint--always.hint--top-right:after,.hint--always.hint--top-right:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--bottom:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}.hint--always.hint--bottom-left:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--bottom-left:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translateX(-100%) translateY(8px)}.hint--always.hint--bottom-right:after,.hint--always.hint--bottom-right:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--left:after,.hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--always.hint--right:after,.hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:after,.hint--no-animate:before{-webkit-transition-duration:0s;-moz-transition-duration:0s;transition-duration:0s}.hint--bounce:after,.hint--bounce:before{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:after,.hint--no-shadow:before{text-shadow:initial;box-shadow:initial}
\ No newline at end of file diff --git a/assets/css/main/col.css b/assets/css/main/col.css new file mode 100644 index 0000000..d6c06d1 --- /dev/null +++ b/assets/css/main/col.css @@ -0,0 +1,8 @@ +@charset 'utf-8'; +/* + * The column + * Author: Bootstrap + * Modifier: Eltrac + * License: MIT + */ +.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.333333%;max-width:8.333333%}.col-2{flex:0 0 16.666667%;max-width:16.666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.333333%;max-width:33.333333%}.col-5{flex:0 0 41.666667%;max-width:41.666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.333333%;max-width:58.333333%}.col-8{flex:0 0 66.666667%;max-width:66.666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.333333%;max-width:83.333333%}.col-11{flex:0 0 91.666667%;max-width:91.666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.main-container{margin:0 auto}@media (min-width:576px){.main-container{max-width:540px}}@media (min-width:768px){.main-container{max-width:720px}}@media (min-width:992px){.main-container{max-width:940px}}@media (min-width:1200px){.main-container{max-width:960px}}
\ No newline at end of file diff --git a/assets/css/main/comment.css b/assets/css/main/comment.css new file mode 100644 index 0000000..7b23fb3 --- /dev/null +++ b/assets/css/main/comment.css @@ -0,0 +1,301 @@ +@charset 'utf-8'; +/* + * Style of comments + * Author: Eltrac + * License: MIT + */ +/* 评论 */ +.comment { + margin-top: 40px; + display: flex; + flex-direction: column-reverse; +} +.comment .row { + margin: -32px!important; +} +.comment-title { + margin: 60px 0; + margin-top: 100!important; + font-size: 26px; + text-align: center; +} +.comment-list,.comment-list li { + list-style-type: none +} +.comment-list { + margin-left: 0; +} +.comment-children { + margin-left: 20px; +} +.comment-children .comment-list { + margin: 0; +} +.comment-children .comment-body { + margin: 15px 0; + padding: 0; +} +.comment-body { + margin: 28px 0; + padding: 0; + position: relative; +} +.comment-body-inner { + display: flex; + flex-wrap: nowrap; +} +.comment-main, +.comment-author-avatar { + margin: 0; + padding: 0; +} +.comment-author-avatar img { + border-radius: 10000px; + height: 50px; + width: 50px +} +.comment-author-info p { + margin: 0; + margin-top: 5px; + color: gray; + font-size: 15px +} +.comment-content p { + color: #000; + font-size: 16px; + word-break: break-all; + vertical-align: center; + padding: 10px 16px; + line-height: 1.5 +} +.comment-content img { + max-width: 100% +} +.comment-meta { + font-size: 17px; + margin-left: 25px!important; +} +.comment-author { + font-size: 0.8em; + background: rgb(240,240,240); + border-radius: 3px; + padding: 2px 3px; + letter-spacing: 2px; + transition: all 0.2s; +} +.comment-author:hover { + background: rgb(235,235,235); +} +.bubble.comment-content { + background: rgb(238,238,238); + padding: 3px 8px; + padding-right: 12px; + padding-top: -3px; + border-radius: 4px; + min-width: 10px!important; + margin-left: 25px; + scroll-margin-top: 5em +} +.bubble.comment-content:before { + border-right-color: rgb(238,238,238); +} +.bubble.comment-content:hover { + transform: none; + box-shadow: 0 0 0 #fff; + -moz-box-shadow: 0 0 0 #fff; + -webkit-box-shadow: 0 0 0 #fff; +} +.comment-by-author > .comment-body-inner > .comment-main > .comment-meta > .comment-date:before { + color: gray; + font-size: 0.8em; + background: rgb(240,240,240); + border-radius: 3px; + padding: 2px 3px; + letter-spacing: 2px; + margin-right: 5px; +} +.comment-logined-sign { + margin: 0; + margin-left: -15px; +} +.at { + margin-left: 0; + color: gray; + margin-right: -10px; +} +.comment-children .comment-content { + padding: 15px 25px!important; +} +.comment-children .comment-content p { + display: inline; +} +.comment-reply a { + position: absolute; + top: 5px; + right: 4px; + display: inline-block; + font-size: 90%; + border-radius: 2px; + padding: 3px 4px; + transition: color 0.2s; + color: rgb(120,120,120); +} +.comment-reply a:hover { + color: rgb(150,150,150) +} +/* 评论按钮 */ +.comment-submit, +.cancel-comment-reply a { + display: inline-block; + margin: 0; + border-radius: 4px; + border: none; + background: rgb(237,237,237); + padding: 10px 16px; + cursor: pointer; + transition: opacity .2s; + margin-top: -14px; + vertical-align: middle; + float: right; + transition: .2s; +} +.comment-submit:hover { + background: rgb(227,227,227) +} +.cancel-comment-reply a { + margin-left: 5px; + background: #DD4B39; + color: #fff!important +} +/* OwO */ +.owo-img { + height: 30px; + vertical-align: middle; + margin: 0 3px; + display: inline!important +} +.OwO { + margin: 0; + display: inline-block; + vertical-align: middle; +} +/* 评论表单 */ +#comment-form { + position: relative; + padding: 26px; + background: #fff; + box-sizing: border-box; + margin-bottom: 30px; +} +.comment-textarea { + width: 100%; + border: none; + max-width: 100% +} +.comment-input input { + display: block; + width: 100%; + border: none; + resize: none; + outline: none; + padding: 10px 5px; + transition: .2s; + margin-top: 10px; +} +.comment-input input, +.comment-textarea { + background: none; + outline: none; + background-color: rgb(248,248,248); + border-radius: 3px; + padding: 8px 10px +} + +#comment-form label { + display: none +} +.comment-pagenav { + margin-left: -40px; +} +.comment-pagenav li { + list-style-type: none; + display: inline-block; +} +.comment-pagenav li a { + background: #fff; + padding: 5px 13px; + margin-right: 5px; + box-shadow: 0 1px 4px #ccc; + -moz-box-shadow: 0 1px 4px #ccc; + -webkit-box-shadow: 0 1px 4px #ccc; + transition: all .2s; +} +.comment-pagenav li a:hover { + background: rgb(249,249,249); + box-shadow: 0 1px 8px #ccc; + -moz-box-shadow: 0 1px 8px #ccc; + -webkit-box-shadow: 0 1px 8px #ccc; +} +.comment-pagenav-icon { + margin: 0 -3px; +} +.comment-children { + margin-left: 30px +} +.comment-children .comment-children { + margin-left: 0!important +} +.comment-hidden { + margin: 0; + margin-top: 20px; + background: #f1f1f1; + padding: 20px; + text-align: center; + border-radius: 2px; +} +#response { + text-align: center; + margin-top: 60px; +} +.respond { + margin: 10px 0; +} + +/* ===== 从左到右淡入 ===== */ +@keyframes fadein { + 0% { + opacity: 0; + transform: translateX(5vh); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +@-webkit-keyframes fadein { + 0% { + opacity: 0; + transform: translateX(5vh); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.comment-animation-fadein { + animation: fadein; + animation-duration: 0.3s; + -webkit-animation: fadein 0.3s; +} + +/* 发送评论时评论框样式 */ +.comment-form { + transition: opacity .2s; +} +.comment-sending { + opacity: 0.6; +}
\ No newline at end of file diff --git a/assets/css/main/component.css b/assets/css/main/component.css new file mode 100644 index 0000000..b8689ae --- /dev/null +++ b/assets/css/main/component.css @@ -0,0 +1,172 @@ +@charset 'utf-8'; +/* + * Style of some component + * Author: Eltrac + * License: MIT + */ +/* Button */ +button { + outline: none; + cursor: pointer +} +.button { + border: 3px solid #ccc; + border-radius: 30px; + padding: 8px 12px; + transition: all .2s; +} +.button:hover { + border-color: #000; + background: #000; + color: #fff +} +.button-sm { + padding: 3px 5px; +} +.button-md { + border: none; + border-radius: 3px; +} +.button-md:hover { + background: rgb(235,235,235); + color: #fff; +} +/* Alert */ +.alert { + bottom: 0; + left: 50%; + transform: translate(-50%, 0px); + z-index: 10; + padding: 1em; + position: fixed; + color: #fff; + background: rgba(50,50,50,.95); + border-radius: 2px; + margin: 0 auto 1em auto; + box-shadow: 0 2px 6px gray; + transition: .2s; +} +.alert.success { + background: #2ECC71; + color: #fff +} +.alert.failed { + background: #DD4B39; + color: #fff +} +.alert.adding { + -webkit-animation: slideDown 0.2s ease forwards; + animation: slideDown 0.3s ease forwards; +} +.alert.remove { + -webkit-animation: slideUp 0.2s ease forwards; + animation: slideUp 0.3s ease forwards; +} +@-webkit-keyframes slideDown { + 0%{ + bottom: -100px; + } + 25%{ + bottom: -50px; + } + 50%{ + bottom: 0; + } + 100%{ + bottom: 5px; + } +} +@-webkit-keyframes slideUp { + 0%{ + bottom: 5px; + } + 25%{ + bottom: 0; + } + 50%{ + bottom: -50px; + } + 100%{ + bottom: -100px; + } +} + + +/* Mask */ +.mask { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgb(70,70,70,0); + z-index: -100; + transition: background 0.4s; +} +.mask-open { + background: rgb(70,70,70,0.7); + z-index: 25; +} +/* Fixed Buttons */ +.fixed-button { + background: #fdfdfd; + font-size: 16px; + height: 3.5rem; + width: 3.5rem; + display: flex; + justify-content:center; + align-items:center; + border: none; + border-radius: 10000px; + box-shadow: 0 1px 5px #bababa; + -webkit-box-shadow: 0 1px 5px #bababa; + -moz-box-shadow: 0 1px 5px #bababa; + position: fixed; + cursor: pointer; + outline: 0; + right: 6px; + transition: all 0.3s; +} +.fixed-button:hover { + box-shadow: 0 3px 25px #bababa; + -webkit-box-shadow: 0 3px 25px #bababa; + -moz-box-shadow: 0 3px 25px #bababa; + background: rgb(248,248,248)!important; +} +.gotop-button { + bottom: 8px; + background: #fff!important; + color: rgb(80,80,80)!important; + right: 1rem; +} +/* Bubble */ +.bubble { + position: relative; + background: #f1f1f1; + border-radius: 2px; + padding: 0; + color: #000; + display: inline-block; + min-width: 180px; + transition: all 0.3s; +} +.bubble::before{ + content: ''; + position: absolute; + right: 100%; + top: 18px; + width: 0; + height: 0; + border-radius: 2px; + border-width: 9px; + border-style: solid; + border-color: transparent; + margin-bottom: -14px; + border-right-width: 18px; + border-right-color: currentColor; + color: #f1f1f1; +} +.bubble:hover { + transform: translateY(-6px); + box-shadow: 2px 8px 17px #bababa; +}
\ No newline at end of file diff --git a/assets/css/main/element.css b/assets/css/main/element.css new file mode 100644 index 0000000..b0d5979 --- /dev/null +++ b/assets/css/main/element.css @@ -0,0 +1,183 @@ +@charset 'utf-8'; +/* + * Style of all elements + * Author: Eltrac + * Used-by: Normalize + * License: MIT + */ +/* Normalize */ +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} +body { + margin: 0; +} + +main { + display: block; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} +a { + background-color: transparent; +} +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} +b, +strong { + font-weight: bolder; +} +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +img { + border-style: none; +} +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} +button, +input { /* 1 */ + overflow: visible; +} +button, +select { /* 1 */ + text-transform: none; +} +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} +fieldset { + padding: 0.35em 0.75em 0.625em; +} +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} +progress { + vertical-align: baseline; +} +textarea { + overflow: auto; +} +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} +details { + display: block; +} +summary { + display: list-item; +} +template { + display: none; +} +[hidden] { + display: none; +} +/* Elements */ +* { + box-sizing: border-box +} +a { + text-decoration: none; + color: #000 +} +html { + font-size: 16px; +} +body,html { + padding: 0; + margin: 0; + background: #fafafa; + overflow: auto; + transition: background 0.2s; + width: 100% +} +body { + font-family: 'Noto Sans SC',sans-serif; + transition: all 0.3s; +} +hr { + border: none; + border-bottom: 1px solid #ccc; + margin: 10px 0 +} diff --git a/assets/css/main/miracles.min.css b/assets/css/main/miracles.min.css new file mode 100644 index 0000000..884e3f0 --- /dev/null +++ b/assets/css/main/miracles.min.css @@ -0,0 +1,513 @@ +@charset 'utf-8'; + +/* + * The main CSS file for Miracles + * Author: Eltrac + * License: MIT + */ + +@import url("col.css"); +@import url("element.css"); +@import url("component.css"); +@import url("nav.css"); +@import url("post.css"); +@import url("page.css"); +@import url("comment.css"); +@import url("special.css"); +@import url("themes.css"); + +/* iconfont */ +@font-face { + font-family: 'iconfont'; /* project id 1165190 */ + src: url('//at.alicdn.com/t/font_1165190_1djdjjwge4m.eot'); + src: url('//at.alicdn.com/t/font_1165190_1djdjjwge4m.eot?#iefix') format('embedded-opentype'), + url('//at.alicdn.com/t/font_1165190_1djdjjwge4m.woff2') format('woff2'), + url('//at.alicdn.com/t/font_1165190_1djdjjwge4m.woff') format('woff'), + url('//at.alicdn.com/t/font_1165190_1djdjjwge4m.ttf') format('truetype'), + url('//at.alicdn.com/t/font_1165190_1djdjjwge4m.svg#iconfont') format('svg'); + } + +/* Varriable */ +:root { + --shadow-color: rgb(190,190,190); + scroll-behavior: smooth; /* 平滑滚动 */ +} + +::selection{ + background: rgb(230,230,230); + color:black; +} +/* ScrollBar */ +::-webkit-scrollbar { + width: 6px; + height: 5px +} +::-webkit-scrollbar-button { + display: none +} +::-webkit-scrollbar-thumb { + background: rgb(120,120,120); + border-radius: 2px; + transition: .2s +} +::-webkit-scrollbar-thumb:hover { + background: rgb(100,100,100) +} +/* Selection */ +::-moz-selection, +::-webkit-selection, +::selection { + background-color: #f1f1f1 +} +/* Responsive Web design */ +.large-screen { + display: none +} +.small-screen { + display: block +} +/* Mobile phone */ +@media (max-width:767px) { + .drawer { + width: 100vw; + } + .mobile-menu-close { + right: 20px; + left: auto; + } + .post-title{ + font-size: 1.5rem; + } +} +/* > Pad and up */ +@media (min-width:768px) { + .header-meta-line-one, + .header-meta-line-two { + display: inline-block!important + } + + .post-share .iconfont { + font-size: 30px; + } + + .post-share .social-share.copyright i { + display: block; + } + + .alert { + min-width: 300px; + max-width: 700px + } + .drawer-avatar img { + height: 160px; + width: 160px; + } + .drawer { + width: 360px; + left: -400px; + } + .drawer-content a { + font-size: 19px; + padding: 11px 0; + } + .drawer-main { + height: 87vh; + } + .drawer-footer { + height: 68px; + } + .drawer-header { + height: 220px; + } + .fixed-button { + height: 60px; + width: 60px; + } + + .options { + width: 300px!important; + left: auto!important; + top: 90px; + right: 10px; + } + + .options:before { + border-right: 8px solid transparent; + border-top: 16px solid rgb(254,254,254,0.96); + border-left: 8px solid transparent; + position: absolute; + top: 80px; + right: 40px; + } + + .comment-content p { + font-size: 18px; + } + + .comment-input input { + display: inline-block; + width: 33.23%; + padding: 10px 5px; + max-width: 100%; + } + + .comment-input #url { + width: 32.39%; + } + + .nav-content a { + font-size: 19px; + padding: 27.5px 8px + } + + .index-banner { + text-align: left + } + + .banner-content h1 { + font-size: 40px + } + + .index-content { + margin: 10px 80px + } + + .post-title { + margin: 25px 0; + margin-bottom: 10px; + font-size: 2rem; + } + + .post-excerpt { + height: 38px + } + + .post-banner-box, + .post-banner img { + height: 230px + } + + .large-screen { + display: block + } + + .small-screen { + display: none + } + + .post-content { + padding: 36px; + padding-top: 25px; + font-size: 18px; + line-height: 26px; + letter-spacing: 2px + } + + .page-content { + padding-bottom: 25px!important; + } + + #comment-form { + padding: 36px; + } + + .post-footer { + padding: 36px; + } + + .fixed-button { + padding: 15px 20px; + right: 28px + } + + .gotop-button { + bottom: 20px + } + + .options-button { + bottom: 90px + } + + .pio-container { + display: block + } + + iframe[src*="//player.bilibili.com/player.html"] { + height: 390px + } + .search-form input, + .login-form input, + .login-form button { + width: 350px; + } + .post-list, + .post-body, + .saying-body { + margin-top: -130px + } + .links-container { + padding: 10px; + } + .comment-children { + margin-left: 80px; + } + .search-close, + .login-close, + .mobile-menu-close{ + right: 20px; + left: auto; + } +} +/* Desktop and up */ +@media (min-width:992px) { + .drawer-content a { + font-size: 21px; + padding: 14px 0; + } + .drawer-avatar img { + height: 180px; + width: 180px; + } + .drawer-header { + height: 240px; + } + + .comment-content p { + font-size: 19px; + } + + .comment-input #url { + width: 32.47%; + } + + .nav-content a { + font-size: 20px; + padding: 28px 8px + } + + .index-banner { + text-align: left + } + + .banner-content h1 { + font-size: 50px + } + + .index-content { + margin: 10px 80px + } + + + .post-title { + margin: 30px 0; + margin-bottom: 25px + } + + .post-excerpt { + height: 75px + } + + .post-banner-box, + .post-banner img { + height: 280px + } + + .large-screen { + display: block + } + + .small-screen { + display: none + } + + .post-content { + padding: 48px; + padding-top: 30px; + font-size: 18px; + line-height: 28px; + letter-spacing: 2px + } + + .page-content { + padding-bottom: 30px!important; + } + + #comment-form { + padding: 48px; + } + + .post-footer { + padding: 48px; + } + + .fixed-button { + padding: 18px 23px; + right: 38px + } + + .gotop-button { + bottom: 40px + } + + .options-button { + bottom: 120px + } + + .pio-container { + display: block + } + + iframe[src*="//player.bilibili.com/player.html"] { + height: 480px + } + + .search-form input, + .login-form input, + .login-form button { + width: 400px; + } + .post-list, + .post-body, + .saying-body { + margin-top: -110px + } + .links-container { + padding: 12px; + } + #live2dcanvas { + display: block!important; + transform: scale(0.8)!important; + z-index: 0!important + } +} +/* Computer screen and up */ +@media (min-width:1200px) { + .login-entrance { + width: 250px!important; + display: block!important; + margin: 20px auto!important; + } + + .drawer-header { + height: 250px; + } + .drawer-footer { + height: 65px; + position: absolute; + bottom: 0; + left: 0; + right: 0; + } + .drawer-avatar img { + height: 190px; + width: 190px; + } + .comment-content p { + font-size: 21px; + } + .comment-input #url { + width: 32.56%; + } + .nav-content a { + font-size: 20px; + padding: 28px 8px + } + + .index-banner { + text-align: left + } + + .banner-content h1 { + font-size: 50px + } + + .index-content { + margin: 10px 100px + } + + .post-title { + margin: 30px 0; + margin-bottom: 25px + } + + .post-excerpt { + height: 72px + } + + .large-screen { + display: block + } + + .small-screen { + display: none + } + + .post-content { + padding: 50px; + font-size: 20px; + line-height: 30px; + letter-spacing: 2px; + padding-top: 35px; + } + .page-content { + padding-bottom: 38px!important; + } + + #comment-form { + padding: 50px; + } + + .post-footer { + padding: 50px; + } + + .fixed-button { + padding: 18px 23px; + right: 38px + } + + .gotop-button { + bottom: 40px + } + + .options-button { + bottom: 120px + } + + .pio-container { + display: block + } + + iframe[src*="//player.bilibili.com/player.html"] { + height: 550px + } + .search-form input, + .login-form input, + .login-form button { + width: 550px; + } + .post-list, + .post-body, + .saying-body { + margin-top: -125px + } + .links-container { + padding: 15px; + } + #live2dcanvas { + transform: scale(1); + } +} +/* 有 Drawer 时的设置面板 */ +.options-with-drawer { + background: rgb(246,246,246); + box-shadow: 0 0 0 #fff; + -moz-box-shadow: 0 0 0 #fff; + -webkit-box-shadow: 0 0 0 #fff; + width: 360px!important; + height: 210px!important; + top: auto!important; + right: auto!important; + bottom: 10vh!important; + z-index: 40!important; +} diff --git a/assets/css/main/nav.css b/assets/css/main/nav.css new file mode 100644 index 0000000..41757e5 --- /dev/null +++ b/assets/css/main/nav.css @@ -0,0 +1,386 @@ +@charset 'utf-8'; +/* + * Style of the Nav. + * Author: Eltrac + * License: MIT + */ +/* Top Nav */ +.nav { + background: rgba(255,255,255,0.8); + backdrop-filter: blur(40px); + -webkit-backdrop-filter: blur(40px); + box-shadow: 0 0 10px rgb(180,180,180); + -webkit-box-shadow: 0 0 10px rgb(180,180,180); + -moz-box-shadow: 0 0 10px rgb(180,180,180); + width: 100%; + position: absolute; + display: table; + top: 0; + z-index: 10; + transition: all .2s; +} +.nav-aero { + background : transparent !important; + box-shadow : none !important; + backdrop-filter: none; + -webkit-backdrop-filter: none; + color: #fff +} +.nav-aero .nav-icon-button { + background: rgba(255,255,255,0.1); +} +.nav-aero .nav-icon-button:hover { + background: rgba(255,255,255,0.3); +} + +.nav-content { + margin: 0; + display: table-cell; + vertical-align: middle; + height: 80px; + padding: 0; + white-space: nowrap; + overflow-x: auto; + overflow-y: hidden; + position: relative; +} + +.nav-aero .nav-content a, +.nav-aero .nav-mobile-content a{ + color: #FFFFFF; +} + +.nav-font-white, +.nav-font-white .nav-content a, +.nav-font-white .nav-mobile-content a { + color: #fff; +} + +.nav-font-black, +.nav-font-black .nav-content a, +.nav-font-black .nav-mobile-content a { + color: #000!important +} + +.nav-content a { + text-decoration: none; + color: #141414; + padding: 30px 8px; + transition: background .2s; + font-size: 16px +} +.nav-aero .nav-content a:hover, +.nav-aero .nav-mobile-content a:hover, +.nav-aero .nav-mobile-content button:hover, +.nav-aero .nav-sorts-content { + background: rgba(250, 250, 250, 0.2); +} +.nav-content a:hover, +.nav-mobile-content a:hover, +.nav-mobile-content button:hover, +.nav-sorts-content { + background: rgba(200,200,200,0.35); + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); +} +.nav-title { + color: #000; + font-weight: 700 +} +.nav-fixed { + position: fixed!important +} +.nav-icon-button { + border-radius: 10000px; + border: none; + padding: 10px 12px; + background: rgba(250,250,250,.4); + transition: background .2s; + outline: 0; + position: absolute; + top: 20px; +} +.nav-mobile { + background: rgba(255,255,255,0.99); + word-break: keep-all; +} +.nav-mobile-content { + padding: 0 5px; +} +.nav-mobile-content a, +.nav-mobile-content button { + margin: 0; + padding: 16px 10px; +} +.search-button { /* On the nav */ + right: 20px; +} +.login-button { /* On the nav */ + right: 65px; +} +.setting-button { /* On the nav */ + right: 110px; +} +.nav-icon-button:hover,.search-close { + display: block; + background: rgb(230,230,230); + cursor: pointer +} +.nav-slideUp { + -webkit-transform: translateY(-100px); + transform: translateY(-100px); + transition: transform .2s ease-out; +} +.nav-slideDown { + -webkit-transform: translateY(0); + transform: translateY(0); + transition: transform .2s ease-out; +} + +/* Drawer Nav */ +.drawer { + background: rgb(246,246,246); + border-right: 1px solid #ddd; + position: fixed; + top: 0; + bottom: 0; + z-index: 30; + transition: all 0.4s!important; + box-shadow: 0 0 30px #646464; + -moz-box-shadow: 0 0 30px #646464; + -webkit-box-shadow: 0 0 30px #646464; + /* Mobile */ + width: 100%; + left: -120%; +} +.drawer-relative { + position: relative; + height: 100vh; +} +.drawer-avatar { + padding: 30px 0; +} +.drawer-avatar img { + display: block; + margin: 0 auto; + border-radius: 100%; + /* Mobile */ + width: 120px; + height: 120px; +} +.drawer-button { + position: fixed; + top: 10px; + left: 15px; + background: rgba(0,0,0,0); + border-radius: 100%; + border: none; + height: 40px; + width: 40px; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + text-shadow: 0 1px 6px #bababa; + transform: scale(1.2); + transition: background 0.3s; + padding: 3px; + outline: none; + transition: all 0.5s; +} +.drawer-button:hover { + cursor: pointer; + background: rgba(200,200,200,0.2); +} +.drawer-open .drawer { + left: 0; +} +.drawer-open .drawer-button { + left: 4px; + top: 4px; + color: rgb(80,80,80); + text-shadow: 0 0 0 #fff; +} +.drawer-header { + height: 180px; + background: rgb(253,253,253) +} +.drawer-footer { + background: rgb(253,253,253); + padding: 8px 0; + text-align: center; + height: 64px; + position: absolute; + bottom: 0; + left: 0; + right: 0; +} +.drawer-content { + margin-top: 10px; + overflow-y: auto; + height: 50vh; +} +.drawer-content a { + display: block; + text-align: center; + font-size: 16px; + padding: 14px 0; +} +.drawer-content a:hover { + background: rgb(240,240,240); +} +.drawer-icon { + display: inline-block; + height: 45px; + width: 45px; + border-radius: 100%; + background: rgb(246,246,246); + transition: background 0.2s; + margin: 0 3px; + border: none; + outline: none; + padding: 1px 6px; +} +.drawer-icon:hover { + background: rgb(240,240,240); +} +a.drawer-icon { + line-height: 2.55 +} + +/* Search/Login/Menu */ +.search,.login,.mobile-menu { + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + max-height: 100vh; + background-color: rgba(255,255,255,0.96); + transition: all .2s; + z-index: 1000; +} +.search,.login { + display: flex; + align-items: center; + justify-content: center; + flex-flow: column; +} +.search.ready, +.login.ready, +.mobile-menu.ready { + bottom: 120vh; + top: -120vh; + visibility: hidden; +} +.search-close.ready, +.login-close.ready, +.mobile-menu-close.ready { + display: none +} +.search-close, +.login-close, +.mobile-menu-close { + position: fixed; + top: 20px; + left: 20px; + border: none; + background: 0 0 +} +.search-form input, +.login-form input, +.login-form button { + width: 260px; +} +.login-enter-admin { + text-align: center; +} +.login-enter-admin a { + padding: 12px 16px; + border-radius: 3px; + background: rgb(240,240,240); + margin-top: 10px; + +} +/* Menu */ +.mobile-menu-pagelist a { + display: block; + border-radius: 4px; + padding: 10px 5px; + text-align: center; + transition: all 0.2s; +} +.mobile-menu-pagelist a:hover { + background: rgb(240,240,240) +} +.mobile-menu-title { + text-align: center; + border-bottom: 1px solid rgb(220,220,220); + padding-bottom: 20px; +} +.mobile-menu-footer { + position: absolute; + text-align: center; + bottom: 10px; + right: 0; + left: 0; + border-top: 1px solid rgb(220,220,220); + padding-top: 10px; +} +/* Search */ +.search-form input { + border: 1px solid #bababa; + padding: 10px 25px; + border-radius: 80px +} +.search-form button { + padding: 10px 15px; + padding-top: 5px; + background: rgba(0,0,0,0); + border: none; + margin-left: -70px; +} +.search-close, +.search-form button, +.search-form input { + color: gray; + font-size: 30px; + outline: 0 +} +/* Login */ +.login-form button, +.login-form input { + display: block; + margin: 10px 0; + padding: 15px 20px; + outline: none; +} +.login-form input { + border-radius: 5px; + border: 1px solid #ccc; +} +.login-form button { + border-radius: 5px; + border: none; + background: rgb(240,240,240); +} +/* Alert if need-fresh */ +.login-form.need-refresh:before { + content: "因为 Pjax 的原因,登陆之前请先刷新页面,否则会导致登陆失败!"; + background: #DD4B39; + padding: 18px 5px; + display: block; + position: fixed; + bottom: 0; + left: 0; + right: 0; + color: white; + text-align: center; + transition: all .2s; +} +/* 404 error page */ +.error-title { + text-align: center; + font-size: 100px; + text-shadow: 0 4px 12px #ccc; +} diff --git a/assets/css/main/page.css b/assets/css/main/page.css new file mode 100644 index 0000000..730d135 --- /dev/null +++ b/assets/css/main/page.css @@ -0,0 +1,235 @@ +@charset 'utf-8'; +/* + * Style of Some parts of custom pages + * Author: Eltrac + * License: MIT + */ +/* About Page */ +.about-avatar img { + margin: 0 auto; + display: block; + padding: 2px; + border: 3px solid #ddd; + border-radius: 100%; + height: 200px; + width: 200px; +} +.about-name { + text-align: center; + font-size: 35px; + margin: 20px 0; + margin-bottom: 0; +} +.about-social { + text-align: center; + margin-top: 15px; +} +.about-social a { + transform: scale(1.2); + border-radius: 100%; + padding: 5px 10px; +} +.about-social a:hover { + background: rgb(246,246,246); +} + +/* Tag List */ +.tags-list { + margin-left: -30px +} + +.tags-item a { + background: rgb(240,240,240); + border-radius: 80px; + color: rgb(60,60,60); + padding: 6px 14px; + font-size: 15px; + transition: all .2s; + margin: 5px 3px; +} +.tags-item a:hover { + background: rgb(230,230,230); +} +.tags-item { + position: relative; + display: inline-block; + margin-top: 10px; +} +/* Archives 归档 */ +.archives-list { + list-style-type: none; + margin-left: -40px +} +.archives-list a { + display: block; + border-radius: 3px; + transition: background .2s; + padding: 6px 10px; + white-space:nowrap; + width: 100%; + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; +} +.archives-list a:hover { + background: #e6e6e6 +} +.archives-date, +.archives-count { + color: gray!important; + letter-spacing: 0; +} +.archives-count { + margin-left: 5px +} +/* Links */ +.links-box { + margin: 10px; + margin-left: 0; + margin-top: 10px +} +.links-box h2 { + text-align: Center; + border-bottom: 1px solid #e6e6fa; + padding-bottom: 20px; + font-weight: 700; + color: black; +} +.links-link { + color: black!important; +} +.links-link:hover { + opacity: 1!important +} +.links-item { + background: #fff; + box-shadow: 0 1px 3px #ccc; + -webkit-box-shadow: 0 1px 3px #ccc; + -moz-box-shadow: 0 1px 3px #ccc; + overflow: hidden; + transition: all .2s!important; + margin-bottom: 5px; + border-radius: 3px +} +.links-item:hover { + transform: scale(1.05); + box-shadow: 0 6px 28px #ccc; + -webkit-box-shadow: 0 6px 28px #ccc; + -moz-box-shadow: 0 6px 28px #ccc; + transform: translateY(-6px) +} +.link-box a { + color: #000 +} +.links-title { + text-align: center +} +.links-title h4 { + font-weight: 700; + letter-spacing: 2px; + white-space: nowrap; + font-size: 15px; + margin: 14px 0 +} +.links-container { + padding: 6px; +} +.links-img { + padding: 0; + width: 100%; + height: 100% +} +.links-img img { + margin: 0; + width: 100%; + height: 100%; + object-fit: cover +} + +/* Saying 说说 */ +.saying-meta { + color: gray!important; + margin-top: -5px!important; + line-height: 22px; +} +.saying-meta img { + float: left; + height: 45px; + width: 45px; + border-radius: 100%; + margin-right: 15px; + box-shadow: 1px 1px 2px #bababa; + webkit-box-shadow: 1px 1px 2px #bababa; + -moz-box-shadow: 1px 1px 2px #bababa; +} +.saying-author { + font-size: 18px; +} +.saying-hr { + border-bottom: 1px solid #ddd; +} +.saying-header.saying-inner { + padding-bottom: 0; +} +.saying-middle.saying-inner { + padding-top: 0; + padding-bottom: 10px; +} +.saying-form { + margin-bottom: -10px!important; +} + +/* bangumi 追番 */ +.bangumi-item { + padding-top: 0; + padding-bottom: 0; + border: none; +} +.bangumi-link { + padding: 12px; + border: none +} +.bangumi-banner { + position: relative; + overflow: hidden +} +.bangumi-banner img { + width: 100% +} +.bangumi-des { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(255,255,255,0.8); + padding: 6px; + opacity: 0; + transition: .3s; + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + overflow: auto +} +.bangumi-des p { + margin: 0 +} +.bangumi-banner:hover .bangumi-des { + opacity: 1 +} +.bangumi-title { + border: none!important; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.bangumi-progress, .bangumi-progress-bar { + border-radius: 4px; + height: 8px +} +.bangumi-progress { + background: #ddd +} +.bangumi-progress-bar { + background: gray +}
\ No newline at end of file diff --git a/assets/css/main/post.css b/assets/css/main/post.css new file mode 100644 index 0000000..eb68783 --- /dev/null +++ b/assets/css/main/post.css @@ -0,0 +1,471 @@ +@charset 'utf-8'; +/* + * Style of Posts + * Author: Eltrac + * License: MIT + */ +/* 文章 */ +.post-list, +.post-body, +.saying-body { + margin-top: -70px!important; + transition: .8s; +} +.post-item { + margin-bottom: 5px; +} +.post-body,.post-item,.saying-item,#comment-form { + background: #fff; + box-shadow: 0 2px 10px var(--shadow-color); + -moz-box-shadow: 0 2px 10px var(--shadow-color); + -webkit-box-shadow: 0 2px 10px var(--shadow-color); + transition: background .1s +} +.post-banner-box { + height: 100%; + overflow: hidden; + padding: 0; +} +.post-banner img { + width: 100%; + height: 100%; + margin-right: -40px +} +.post-title { + margin-top: 30px; + transition: color .2s; + overflow: hidden; + height: 40px; + white-space: nowrap; + text-overflow: ellipsis +} +.post-excerpt { + overflow: hidden; + text-overflow: ellipsis +} +.post-meta,.post-meta a { + color: gray +} +.post-button-box { + margin-top: 15px +} +.post-button { + float: right +} +.post-footer { + color: #c8c8c8; + font-size: 14px; + padding: 26px; + padding-top: 0!important; +} +.post-tags a { + color: #bebebe; + padding: 2px 4px; + border-radius: 2px; + background: #f0f0f0; + transition: background .2s +} +.post-tags a:hover { + background: #f5f5f5 +} +.post-share { + border-top: 1px solid rgb(230,230,230); + border-bottom: 1px solid rgb(230,230,230); + padding: 18px 0; + margin: 20px 0; + vertical-align:middle; +} +.post-share .social-share { + margin-right: 10px; + vertical-align:middle; + background: transparent; + border: none +} +.post-share .social-share i { + transition: color .2s +} +.post-share .social-share.qq:hover i { + color: rgb(2,83,218); +} +.post-share .social-share.weibo:hover i { + color: red; +} +.post-share .social-share.twitter:hover i { + color: rgb(29,161,242); +} +.post-share .social-share.qrcode:hover i { + color: #000 +} +.post-share .social-share.copyright i { + float: right; + font-size: 20px; + margin-top: 7px; + margin-right: 17px; + cursor: pointer; + display: none/*移动端不显示*/ +} +.post-share .social-share.qrcode { + margin-right: 3px +} + +.post-share .iconfont { + color: rgb(200,200,200); + font-size: 25px; +} +.post-toc-link { + color: gray; + opacity: 0; + transition: .3s; + margin-left: 10px; +} +.post-content h2:hover .post-toc-link, +.post-content h3:hover .post-toc-link { + opacity: 1 +} +.post-qr { + background: #f1f1f1; + max-height: 0; + overflow: hidden; + transition: .6s +} +.post-qr-open { + max-height: 250px; + transition: .6s +} +.post-qr img { + display: block; + margin: 10px auto; + max-width: 200px +} + +/* >文章内容 */ +.post-content, +.saying-inner { + padding: 26px; + padding-bottom: 5px!important; + line-height: 28px; + letter-spacing: 2px; + word-break: break-all +} +.page-content { + padding-bottom: 30px; +} +.page-content { + padding-bottom: 26px!important; +} +.post-content h2 { + margin: 45px 0; + margin-bottom: 10px; +} +.post-content h3 { + border-left: 6px solid #4D90FE; + padding-left: 10px; +} +.post-content h1, +.post-content h2, +.post-content h3, +.post-content h4, +.post-content h5 { + scroll-margin-top: 5em +} +.post-content hr { + display: block; + margin: 20px auto; + width: 100%; + border: 2px dashed #f1f1f1 +} +.post-content kbd { + display: inline-block; + padding: 3px 5px; + font: 0.84em sans-serif; + line-height: 15px; + color: #444d56; + vertical-align: middle; + background-color: #fafbfc; + border: solid 1px #d1d5da; + border-bottom-color: #c6cbd1; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 #c6cbd1; + box-shadow: inset 0 -1px 0 #c6cbd1 +} +.post-content code { + font-size: 0.95em; + background: #f0f0f0; + border-radius: 2px; + font-family: 'Noto Sans SC',sans-serif!important; + color: gray; + padding: 0 4px; + margin: 0 1px; +} +.post-content pre>code { + background: rgb(63,63,63)!important; + color: #fff!important; + text-indent: 0!important; + border-radius: 4px +} +.post-content img { + display: block; + border-radius: 3px; + max-width: 100% +} +.post-content img:not(.owo-img, .links-img img) { + margin: 25px auto; +} +.post-content blockquote p { + margin: 0 +} +.post-content blockquote { + border-left: 5px solid #ddd; + padding-left: 10px; + margin-left: 0; + color: rgb(70,70,70); +} +.post-content table { + width: 100%; + border-left: 1px solid #ccc; + border-top: 2px solid #ccc; + border-spacing: 0 +} +.post-content td,.post-content th { + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; + padding: 6px 8px +} +.post-content th { + background: #fff!important +} +.post-content tr:nth-child(odd) { + background: #f5f5f5 +} +.post-content a:not(.no-line) { + position: relative; + color: rgb(40,40,40); + border-bottom: 2px solid #f0f0f0; + transition: .2s +} +.post-content a:not(.no-line):hover { + opacity: 0.85 +} +.post-content a:not(.no-line)::before { + content: ''; + position: absolute; + bottom: -2px; + left: 0; + right: 0; + height: 2px; + background-color: #000; + transform-origin: bottom right; + transform: scaleX(0); + transition: transform .5s ease +} +.post-content a:not(.no-line):hover::before { + transform-origin: bottom left; + transform: scaleX(1); +} +.post-content p { + vertical-align: middle; +} +.post-content ul ul, +.post-content ol ol, +.post-content ol ul, +.post-content ul ol { + margin-top: -15px; +} +.post-content .owo-img { + box-shadow: 0 0 0 #fff; + -moz-box-shadow: 0 0 0 #fff; + -webkit-box-shadow: 0 0 0 #fff; + display: inline; + vertical-align: middle; +} +.post-content ul li p, +.post-content ol li p { + margin: 0!important +} +.post-content ul ul, +.post-content ul ol, +.post-content ol ol, +.post-content ol ul { + margin-top: 0; +} +.post-content summary { + outline: none; + cursor: pointer; +} +.post-content summary:hover { + font-weight: bolder +} +/* 加密文章 */ +.post-content .protected { + display: flex; + align-items: center; + justify-content: center; +} + +.post-content .protected .word:after { + content:":"; +} + +.post-content .protected .text { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + margin-right: -7px; +} + +.post-content .protected .submit { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + margin-left: -7xp; + color: rgb(80,80,80); + background: rgb(237,237,237); + cursor: pointer; +} + +.post-content .protected .submit:hover { + opacity: 0.8; +} + +.post-content .protected .submit, +.post-content .protected .text { + border: 1px solid #ccc; + padding: 8px 14px; + box-shadow: 0 1px 4px #ddd; + transition: .3s; +} + +.post-content .protected { + margin: 20px 0; +} + +/* >短代码 */ +.tip { + border: 1px solid rgb(235,235,235); + border-radius: 3px; + padding: 15px; + border-left: 5px solid gray; +} +.tip-icon { + color: gray; + display: none/*移动端不显示*/ +} +.tip.red { + border-left-color: #DD4B39; +} +.tip.red .tip-icon { + color: #DD4B39; +} +.tip.blue { + border-left-color: #4D90FE; +} +.tip.blue .tip-icon { + color: #4D90FE; +} +.tip.green { + border-left-color: #2FBB4F; +} +.tip.green .tip-icon { + color: #2FBB4F; +} +.tip.yellow { + border-left-color: #FFDD11; +} +.tip.yellow .tip-icon { + color: #FFDD11; +} +.tip-group { + margin: 15px 0; +} +.tip-group .tip { + margin: 0; + margin-top: -1px; + border-radius: 0; +} +.tip-group br { + display: none; +} +.tip-group .tip br { + display: block; +} +@media (min-width:768px) { + .tip-icon { + display: block + } +} +.notice { + background: rgb(245,245,245); + padding: 15px 20px; + border-radius: 4px +} +.post-img-shadow { + padding: 5px 3px +} +.post-img-shadow img { + box-shadow: 0 8px 15px rgba(0,0,0,0.45); +} +.post-img-alt { + font-size: 0.9em; + color: gray +} + +/* >文章分页 */ +.post-pagenav, +.comment-pagenav { + margin-top: 40px; + margin-bottom: 60px +} +.post-pagenav a { + font-size: 20px; + background: #fff; + color: #000; + padding: 13px 20px; + transition: .2s; +} +.post-pagenav a:hover { + background: rgb(249,249,249); +} +.post-pagenav a, +.comment-pagenav a { + border-radius: 10000px; + box-shadow: 0 0 10px #ccc; + -moz-box-shadow: 0 0 10px #ccc; + -webkit-box-shadow: 0 0 10px #ccc +} +.post-pagenav a:hover { + box-shadow: 0 0 25px #ccc; + -moz-box-shadow: 0 0 25px #ccc; + -webkit-box-shadow: 0 0 25px #ccc +} +.post-pagenav-left { + float: left +} +.post-pagenav-right { + float: right +} +.post-item-content{ + padding: 0 35px 10px 35px; +} + +/* 文章目录 **/ + +.toc-box { + border: 1px solid #ddd; + background: rgb(245,245,245); + padding: 1em 2em; + border-radius: .2em +} + +.toc-level-3 { + margin-left: 1em; +} + +.toc-level-4 { + margin-left: 2em; +} + +.toc-level-5 { + margin-left: 3em; +} + +.toc-level-6 { + margin-left: 4em; +}
\ No newline at end of file diff --git a/assets/css/main/special.css b/assets/css/main/special.css new file mode 100644 index 0000000..0fea8cb --- /dev/null +++ b/assets/css/main/special.css @@ -0,0 +1,372 @@ +@charset 'utf-8'; +/* + * Style of something special + * Author: Eltrac + * License: MIT + */ +/* Index Banner */ +.index-banner { + width: 100%; + min-height: 50vh; + text-align: center; + background-size: cover; + background-repeat: no-repeat; + background-position: 50% 50%; + background-color: #f1f1f1!important +} +.banner-mask { + width: 100%; + height: 100%; + background: rgba(30,30,30,.15); + z-index: 1; + color: #fff; + display: flex; + justify-content: center; + align-items: center +} +.banner-content { + vertical-align: middle +} +.banner-content h1 { + margin-bottom: 0 +} +.banner-content .header-meta { + margin-top: 11px +} +.banner-content:not(.banner-font-black) a, +.banner-mask:not(.banner-font-black) a { + color: white +} +.banner-font-black, +.banner-font-black a { + color: black!important; +} + +/* Font Size */ +.post-content, +.comment-content p, +.banner-content, +.nav-content { + font-size: 100%!important; +} + +/* Footer */ +.footer-info { + background: #f0f0f0; + color: #000; + text-align: center; + margin: 0; + margin-top: 50px!important; + padding: 25px 10px; + line-height: 26px; + width: 100%; + font-size: 12px; + font-size: 15px; + line-height: 18px; +} +.footer-dark a { + color: #000 +} +.footer-info a { + color: #1e1e1e; + text-decoration: none; + transition: opacity .2s; + display: inline!important +} +.footer-info a:hover { + opacity: .9 +} +/* Shadow */ +.no-shadow { + box-shadow: 0 0 0 #000!important; + -webkit-box-shadow: 0 0 0 #000!important; + -moz-box-shadow: 0 0 0 #000!important; +} +/* Header Meta */ +.header-meta a { + color: #fff; + text-decoration: none +} +/* Pio Plugin */ +.pio-container .pio-dialog { + margin-bottom: -60px; + border-color: rgba(255,255,255,.9); + border-radius: 4px; + text-shadow: 0 0 1px #bababa; + border: none; + background: rgba(255,255,255,.9); + box-shadow: 1px 1px 5px #bababa; + -moz-box-shadow: 1px 1px 5px #bababa; + -webkit-box-shadow: 1px 1px 5px #bababa +} +.pio-container { + display: none +} +/* Bilibili iframe */ +iframe[src*="//player.bilibili.com/player.html"] { + width: 100%; + height: 150px; + position: relative +} +/* Live2D */ +#live2dcanvas { + display: none; + transition: all 0.3s; + z-index: 0!important +} +/* Animation Helper */ +.fadeout { + opacity: 0; +} +.fadein { + opacity: 1; +} +/*底部动画字符*/ +.anime-face { + animation: anime-face 5s infinite ease-in-out; + display: inline-block; + margin: 0 5px; +} +@-webkit-keyframes anime-face { + 2%,24%,80% { + -webkit-transform: translate(0,1.5px) rotate(1.5deg); + transform: translate(0,1.5px) rotate(1.5deg) + } + + 4%,68%,98% { + -webkit-transform: translate(0,-1.5px) rotate(-.5deg); + transform: translate(0,-1.5px) rotate(-.5deg) + } + + 38%,6% { + -webkit-transform: translate(0,1.5px) rotate(-1.5deg); + transform: translate(0,1.5px) rotate(-1.5deg) + } + + 8%,86% { + -webkit-transform: translate(0,-1.5px) rotate(-1.5deg); + transform: translate(0,-1.5px) rotate(-1.5deg) + } + + 10%,72% { + -webkit-transform: translate(0,2.5px) rotate(1.5deg); + transform: translate(0,2.5px) rotate(1.5deg) + } + + 12%,64%,78%,96% { + -webkit-transform: translate(0,-.5px) rotate(1.5deg); + transform: translate(0,-.5px) rotate(1.5deg) + } + + 14%,54% { + -webkit-transform: translate(0,-1.5px) rotate(1.5deg); + transform: translate(0,-1.5px) rotate(1.5deg) + } + + 16% { + -webkit-transform: translate(0,-.5px) rotate(-1.5deg); + transform: translate(0,-.5px) rotate(-1.5deg) + } + + 18%,22% { + -webkit-transform: translate(0,.5px) rotate(-1.5deg); + transform: translate(0,.5px) rotate(-1.5deg) + } + + 20%,36%,46% { + -webkit-transform: translate(0,-1.5px) rotate(2.5deg); + transform: translate(0,-1.5px) rotate(2.5deg) + } + + 26%,50% { + -webkit-transform: translate(0,.5px) rotate(.5deg); + transform: translate(0,.5px) rotate(.5deg) + } + + 28% { + -webkit-transform: translate(0,.5px) rotate(1.5deg); + transform: translate(0,.5px) rotate(1.5deg) + } + + 30%,40%,62%,76%,88% { + -webkit-transform: translate(0,-.5px) rotate(2.5deg); + transform: translate(0,-.5px) rotate(2.5deg) + } + + 32%,34%,66% { + -webkit-transform: translate(0,1.5px) rotate(-.5deg); + transform: translate(0,1.5px) rotate(-.5deg) + } + + 42% { + -webkit-transform: translate(0,2.5px) rotate(-1.5deg); + transform: translate(0,2.5px) rotate(-1.5deg) + } + + 44%,70% { + -webkit-transform: translate(0,1.5px) rotate(.5deg); + transform: translate(0,1.5px) rotate(.5deg) + } + + 48%,74%,82% { + -webkit-transform: translate(0,-.5px) rotate(.5deg); + transform: translate(0,-.5px) rotate(.5deg) + } + + 52%,56%,60% { + -webkit-transform: translate(0,2.5px) rotate(2.5deg); + transform: translate(0,2.5px) rotate(2.5deg) + } + + 58% { + -webkit-transform: translate(0,.5px) rotate(2.5deg); + transform: translate(0,.5px) rotate(2.5deg) + } + + 84% { + -webkit-transform: translate(0,1.5px) rotate(2.5deg); + transform: translate(0,1.5px) rotate(2.5deg) + } + + 90% { + -webkit-transform: translate(0,2.5px) rotate(-.5deg); + transform: translate(0,2.5px) rotate(-.5deg) + } + + 92% { + -webkit-transform: translate(0,.5px) rotate(-.5deg); + transform: translate(0,.5px) rotate(-.5deg) + } + + 94% { + -webkit-transform: translate(0,2.5px) rotate(.5deg); + transform: translate(0,2.5px) rotate(.5deg) + } + + 0%,100% { + -webkit-transform: translate(0,0) rotate(0); + transform: translate(0,0) rotate(0) + } +} + +@keyframes anime-face { + 2%,24%,80% { + -webkit-transform: translate(0,1.5px) rotate(1.5deg); + transform: translate(0,1.5px) rotate(1.5deg) + } + + 4%,68%,98% { + -webkit-transform: translate(0,-1.5px) rotate(-.5deg); + transform: translate(0,-1.5px) rotate(-.5deg) + } + + 38%,6% { + -webkit-transform: translate(0,1.5px) rotate(-1.5deg); + transform: translate(0,1.5px) rotate(-1.5deg) + } + + 8%,86% { + -webkit-transform: translate(0,-1.5px) rotate(-1.5deg); + transform: translate(0,-1.5px) rotate(-1.5deg) + } + + 10%,72% { + -webkit-transform: translate(0,2.5px) rotate(1.5deg); + transform: translate(0,2.5px) rotate(1.5deg) + } + + 12%,64%,78%,96% { + -webkit-transform: translate(0,-.5px) rotate(1.5deg); + transform: translate(0,-.5px) rotate(1.5deg) + } + + 14%,54% { + -webkit-transform: translate(0,-1.5px) rotate(1.5deg); + transform: translate(0,-1.5px) rotate(1.5deg) + } + + 16% { + -webkit-transform: translate(0,-.5px) rotate(-1.5deg); + transform: translate(0,-.5px) rotate(-1.5deg) + } + + 18%,22% { + -webkit-transform: translate(0,.5px) rotate(-1.5deg); + transform: translate(0,.5px) rotate(-1.5deg) + } + + 20%,36%,46% { + -webkit-transform: translate(0,-1.5px) rotate(2.5deg); + transform: translate(0,-1.5px) rotate(2.5deg) + } + + 26%,50% { + -webkit-transform: translate(0,.5px) rotate(.5deg); + transform: translate(0,.5px) rotate(.5deg) + } + + 28% { + -webkit-transform: translate(0,.5px) rotate(1.5deg); + transform: translate(0,.5px) rotate(1.5deg) + } + + 30%,40%,62%,76%,88% { + -webkit-transform: translate(0,-.5px) rotate(2.5deg); + transform: translate(0,-.5px) rotate(2.5deg) + } + + 32%,34%,66% { + -webkit-transform: translate(0,1.5px) rotate(-.5deg); + transform: translate(0,1.5px) rotate(-.5deg) + } + + 42% { + -webkit-transform: translate(0,2.5px) rotate(-1.5deg); + transform: translate(0,2.5px) rotate(-1.5deg) + } + + 44%,70% { + -webkit-transform: translate(0,1.5px) rotate(.5deg); + transform: translate(0,1.5px) rotate(.5deg) + } + + 48%,74%,82% { + -webkit-transform: translate(0,-.5px) rotate(.5deg); + transform: translate(0,-.5px) rotate(.5deg) + } + + 52%,56%,60% { + -webkit-transform: translate(0,2.5px) rotate(2.5deg); + transform: translate(0,2.5px) rotate(2.5deg) + } + + 58% { + -webkit-transform: translate(0,.5px) rotate(2.5deg); + transform: translate(0,.5px) rotate(2.5deg) + } + + 84% { + -webkit-transform: translate(0,1.5px) rotate(2.5deg); + transform: translate(0,1.5px) rotate(2.5deg) + } + + 90% { + -webkit-transform: translate(0,2.5px) rotate(-.5deg); + transform: translate(0,2.5px) rotate(-.5deg) + } + + 92% { + -webkit-transform: translate(0,.5px) rotate(-.5deg); + transform: translate(0,.5px) rotate(-.5deg) + } + + 94% { + -webkit-transform: translate(0,2.5px) rotate(.5deg); + transform: translate(0,2.5px) rotate(.5deg) + } + + 0%,100% { + -webkit-transform: translate(0,0) rotate(0); + transform: translate(0,0) rotate(0) + } +}
\ No newline at end of file diff --git a/assets/css/main/themes.css b/assets/css/main/themes.css new file mode 100644 index 0000000..3a32d7a --- /dev/null +++ b/assets/css/main/themes.css @@ -0,0 +1,440 @@ +@charset 'utf-8'; +/* + * Fonts, Themes and filter + * Author: Eltrac + * License: MIT + */ + +/** + * Font + */ +.body-serif { + font-family: 'Noto Serif SC',serif +} + +/** + * Dark + */ +.body-dark, +.body-dark .post-qr, +.body-dark .login-form .btn, +.body-dark .notice { + background: #4b4b4b; + color: #fafafa +} +.body-dark .login-form .btn { + background: rgb(70,70,70)!important; + transition: .3s +} +.body-dark .login-form .btn:hover { + opacity: 0.8 +} +/* Post Content */ +.body-dark .post-content code { + background:#505050 +} +.body-dark .post-content tr:nth-child(odd) { + background:#6e6e6e +} +.body-dark .post-content hr { + border: 3px dashed #787878!important +} +/* Pio Plugin */ +.body-dark .pio-container .pio-dialog { + color:#fff; + box-shadow:1px 1px 15px #505050; + -webkit-box-shadow:1px 1px 15px #505050; + -moz-box-shadow:1px 1px 15px #505050; + background:rgba(90,90,90,.9) +} +.body-dark .pio-action span { + background-color:rgba(90,90,90,.9) +} +/* Aplayer */ +.body-dark .aplayer, +.body-dark .aplayer .aplayer-author, +.body-dark .aplayer .aplayer-controller, +.body-dark .aplayer .aplayer-icon, +.body-dark .aplayer .aplayer-info, +.body-dark .aplayer .aplayer-lrc-contents p, +.body-dark .aplayer-list-author, +.body-dark .aplayer-list-index { + color:#f0f0f0!important +} +.body-dark .aplayer { + background:#646464 +} +.body-dark .aplayer .aplayer-list ol li:hover, +.body-dark .aplayer-list-light { + background:#8c8c8c!important +} +.body-dark .aplayer .aplayer-lrc:after, +.body-dark .aplayer .aplayer-lrc:before { + background:0 0; + background:0 0; + filter:none +} +.body-dark .aplayer .aplayer-list ol li { + border-color:#787878 +} +.body-dark .aplayer-list::-webkit-scrollbar { + background:#6e6e6e!important +} +.body-dark .aplayer-list::-webkit-scrollbar-thumb { + background:#505050 +} +.body-dark .aplayer-info { + border:none +} +.body-dark .aplayer .aplayer-icon { + filter:brightness(50%); + -webkit-filter:brightness(50%); +} +/* Nav/Search/login */ +.body-dark .nav { + background:rgba(50,50,50,.5) !important; + box-shadow: 0 0 15px rgb(60,60,60); + -webkit-box-shadow: 0 0 15px rgb(60,60,60); + -moz-box-shadow: 0 0 15px rgb(60,60,60); +} +.body-dark .mobile-menu-pagelist a:hover, +.body-dark .nav a:hover, +.body-dark .nav-mobile-title:hover { + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); + background: rgba(100,100,100,0.7) +} +.body-dark .nav-icon-button { + background:#5a5a5a +} +.body-dark .nav-icon-button { + color:#fff +} +.body-dark .nav-icon-button:hover, +.body-dark .search-close { + background:#5a5a5a +} +.body-dark .login, +.body-dark .mobile-menu, +.body-dark .search, +.body-dark .bangumi-des { + background:rgba(90,90,90,.95) +} +/* Bangumi */ +.body-dark .bangumi-progress { + background: gray +} +.body-dark .bangumi-progress-bar { + background: rgb(180,180,180) +} + +/* Others */ +.body-dark .post-meta a { + color: gray!important +} +.body-dark .comment-reply a { + background: 0 0 +} +.body-dark .footer-info { + background:#3c3c3c!important +} +/* Need shadow */ +.body-dark .options { + box-shadow:0 0 0 #fff; + -moz-box-shadow:0 0 0 #fff; + -webkit-box-shadow:0 0 0 #fff +} +.body-dark .bubble.saying-body:hover, +.body-dark .comment-pagenav a, +.body-dark .dark-button, +.body-dark .options, +.body-dark .post-body, +.body-dark .saying-item, +.body-dark .post-item, +.body-dark .post-pagenav a, +.body-dark #comment-form { + box-shadow:0 1px 10px #323232; + -moz-box-shadow:0 1px 10px #323232; + -webkit-box-shadow:0 1px 10px #323232 +} +.body-dark .gotop-button, +.body-dark .links-item, +.body-dark .alert { + box-shadow:0 1px 3px #323232; + -moz-box-shadow:0 1px 3px #323232; + -webkit-box-shadow:0 1px 3px #323232 +} +.body-dark .gotop-button:hover, +.body-dark .links-item:hover { + box-shadow:0 4px 22px #323232; + -moz-box-shadow:0 4px 22px #323232; + -webkit-box-shadow:0 4px 22px #323232; +} +/* No Shadow */ +.body-dark .options-with-drawer { + box-shadow: 0 0 0 #fff; + -moz-box-shadow: 0 0 0 #fff; + -webkit-box-shadow: 0 0 0 #fff; +} +/* Need #646464 bg */ +.body-dark .archives-list a:hover, +.body-dark .bubble.comment-content, +.body-dark .bubble.saying-body, +.body-dark .comment-author, +.body-dark .comment-by-author .bubble.comment-content, +.body-dark .comment-pagenav a, +.body-dark .comment-submit button, +.body-dark .drawer-content a:hover, +.body-dark .drawer-footer, +.body-dark .drawer-header, +.body-dark .options-button-active, +.body-dark .tags-item a, +.body-dark .post-tags a, +.body-dark .about-social a:hover, +.body-dark .comment-hidden, +.body-dark .comment-input input, +.body-dark .comment-textarea { + background: #646464!important +} +/* Need #5a5a5a bg */ +.body-dark .OwO-body, +.body-dark .OwO-logo, +.body-dark .OwO-package-active, +.body-dark .OwO-packages li:hover, +.body-dark .comment-form input, +.body-dark .comment-form textarea, +.body-dark .saying-item textarea, +.body-dark .comment-reply a:hover, +.body-dark .dark-button,.body-dark .dialog, +.body-dark .drawer, +.body-dark .drawer-icon, +.body-dark .gotop-button,.body-dark .links-item, +.body-dark .options, +.body-dark .options-family-button, +.body-dark .options-theme-label, +.body-dark .post-body, +.body-dark .saying-item, +.body-dark .post-content th, +.body-dark .post-item, +.body-dark .post-pagenav a, +.body-dark .search-form input, +.body-dark .login-form button, +.body-dark #comment-form, +.body-dark .comment-by-author > .comment-body-inner > .comment-main > .comment-meta > .comment-date:before { + background:#5a5a5a!important +} +/* Need #6e6e6e bg */ +.body-dark .OwO-bar, +.body-dark .OwO-item, +.body-dark .index-banner, +.body-dark .login-enter-admin a, +.body-dark .comment-submit, +.body-dark .post-content kbd { + background-color:#6e6e6e!important +} +.body-dark .index-banner { + background-color: rgb(80,80,80)!important +} +/* Need white fonts */ +.body-dark .login-enter-admin, +.body-darl .login-form button, +.body-dark .OwO-bar, +.body-dark .OwO-logo, +.body-dark .comment, +.body-dark .comment a, +.body-dark .comment-content p, +.body-dark .comment-form input, +.body-dark .comment-form textarea, +.body-dark .saying-item textarea, +.body-dark .dark-button, +.body-dark .drawer, +.body-dark .drawer a, +.body-dark .drawer-icon, +.body-dark .drawer-open .drawer-button, +.body-dark .footer-info, +.body-dark .footer-info a, +.body-dark .gotop-button, +.body-dark .login, +.body-dark .login-close, +.body-dark .mobile-menu, +.body-dark .mobile-menu a, +.body-dark .mobile-menu-close, +.body-dark .mobile-menu-footer, +.body-dark .nav, +.body-dark .nav a, +.body-dark .options-contentsize-button, +.body-dark .options-family-button, +.body-dark .options-theme-item:hover .options-theme-label, +.body-dark .post-body, +.body-dark .saying-item, +.body-dark .saying-item a, +.body-dark .post-body a, +.body-dark .post-content blockquote, +.body-dark .post-item, +.body-dark .post-item a, +.body-dark .search-close, +.body-dark .search-form button, +.body-darl .login a, +.body-dark .banner-content.banner-font-black, +.body-dark .post-pagenav a, +.body-dark .comment-submit, +.body-dark .header-meta a, +.body-dark .alert, +.body-dark .respond input, +.body-dark .respond textarea, +.body-dark .login-enter-admin a, +.body-dark .post-content kbd { + color:#fafafa!important +} +.body-dark .options-theme-label { + color:#5a5a5a!important +} +/* Need border color */ +.body-dark .OwO-body, +.body-dark .OwO-logo, +.body-dark .comment-form input, +.body-dark .comment-form textarea, +.body-dark .saying-item textarea, +.body-dark .drawer, +.body-dark .mobile-menu-footer, +.body-dark .mobile-menu-title, +.body-dark .options hr, +.body-dark .post-content blockquote, +.body-dark .post-content table, +.body-dark .post-content td, +.body-dark .post-content th, +.body-dark .post-content tr, +.body-dark .saying-hr, +.body-dark .post-share, +.body-dark .post-content kbd { + border-color:#6e6e6e!important +} +.body-dark .post-content kbd { + border-bottom-color: #6e6e6e!important +} +.body-dark .tip { + border-top-color:#6e6e6e!important; + border-bottom-color:#6e6e6e!important; + border-right-color:#6e6e6e!important +} +.body-dark .bubble.comment-content:before, +.body-dark .bubble.saying-body:before, +.body-dark .comment-by-author .bubble.comment-content:before { + border-right-color:#646464!important +} +/* Need darker mask */ +.body-dark .banner-mask { + background:rgba(10,10,10,.4) +} +/* Need filter */ +.body-dark img, +.body-dark .links-img { + filter:brightness(80%) +} +.body-dark .aplayer-pic, +.body-dark .post-banner, +.body-dark iframe { + filter:brightness(72%) +} +/* Dark shade */ +.body-dark .dark-shade { + position:fixed; + width:100%; + height:100%; + background-color:#00000085; + z-index:100; + pointer-events:none +} + +/** + * Gray + */ +.html-filter-gray { + filter: grayscale(100%); + -webkit-filter: grayscale(100%); + -moz-filter: grayscale(100%); + -ms-filter: grayscale(100%); + -o-filter: grayscale(100%); + filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); +} + +/** + * Sepia + */ +.body-sepia, +.body-sepia .drawer-content, +.body-sepia .drawer-relative, +.body-sepia .drawer-icon, +.body-sepia .post-qr, +.body-sepia .comment-input input, +.body-sepia .comment-textarea { + background: rgb(248,241,228)!important +} +.body-sepia .nav { + background: rgba(250,241,228,0.5); +} +.body-sepia .post-body, +.body-sepia .post-item, +.body-sepia #comment-form, +.body-sepia .drawer-header, +.body-sepia .drawer-footer, +.body-sepia .drawer-content a:hover, +.body-sepia .login-enter-admin a { + background: rgb(245,238,218) +} +.body-sepia .banner-mask { + background: rgba(164,120,114,0.3) +} +.body-sepia img { + filter: sepia(20%); +} +.body-sepia .nav-icon-button { + background: rgba(248,241,228,0.9); +} +.body-sepia .nav-icon-button:hover { + background: rgba(248,241,228,0.7); +} +.body-sepia .search, +.body-sepia .login, +.body-sepia .mobile-menu, +.body-sepia .bangumi-des { + background-color: rgba(248,241,228,0.98); +} +.body-sepia .search-form input { + background-color: rgba(245,241,228) +} +.body-sepia .footer-info, +.body-sepia .index-banner, +.body-sepia .links-item, +.body-sepia .comment-meta span, +.body-sepia .comment-by-author > .comment-body-inner > .comment-main > .comment-meta > .comment-date:before { + background-color: rgb(246,240,220)!important +} +.body-sepia .post-content h3 { + border-color: #DD4B39 +} +.body-sepia .archives-list li a:hover, +.body-sepia .tags-item a, +.body-sepia .notice { + background: rgb(250,246,224) +} +.body-sepia .OwO-logo { + background: transparent +} +.body-sepia .OwO-logo:hover { + opacity: 0.9; + background: transparent +} +.body-sepia .fixed-button, +.body-sepia .post-pagenav a, +.body-sepia .post-content kbd { + background: rgb(250,246,224)!important +} +.body-sepia .comment-content, +.body-sepia .login-form .btn, +.body-sepia .post-tags a { + background-color: rgb(250,230,220) +} +.body-sepia .comment-content.bubble::before { + border-right-color: rgb(250,230,220) +} diff --git a/assets/css/nprogress.css b/assets/css/nprogress.css new file mode 100644 index 0000000..da0cc85 --- /dev/null +++ b/assets/css/nprogress.css @@ -0,0 +1 @@ +#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0,-4px);-ms-transform:rotate(3deg) translate(0,-4px);transform:rotate(3deg) translate(0,-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
\ No newline at end of file diff --git a/assets/css/owo.min.css b/assets/css/owo.min.css new file mode 100644 index 0000000..35363da --- /dev/null +++ b/assets/css/owo.min.css @@ -0,0 +1,164 @@ +.OwO { + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.OwO:hover .OwO-logo { + color: #444; +} + +.OwO.OwO-open .OwO-logo { + border-radius: 4px 4px 0 0; + color: #444; +} + +.OwO.OwO-open .OwO-body { + display: block; + border-top: 1px solid #ddd; + border: 1px solid #ddd; +} + +.OwO.OwO-up .OwO-body { + top: inherit; + bottom: 21px; + border-radius: 4px 4px 4px 0; +} + +.OwO.OwO-up .OwO-body .OwO-bar .OwO-packages li:nth-child(1) { + border-radius: 0; +} + +.OwO.OwO-up.OwO-open .OwO-logo { + border: none; + border-top: none; + border-radius: 0 0 4px 4px; +} + +.OwO .OwO-logo { + position: relative; + z-index: 2; + display: inline-block; + box-sizing: border-box; + padding: 2px 3px; + height: 22px; + border: 1px solid #ddd; + border-radius: 4px; + background: #fff; + color: #888; + font-size: 13px; + cursor: pointer; + transform: all .2s; +} + +.OwO .OwO-logo:hover { + background: #f4f4f4; +} + +.OwO .OwO-logo:hover span { + display: inline-block; +} + +.OwO .OwO-body { + position: absolute; + top: 21px; + z-index: 3; + display: none; + width: 300px; + border-radius: 0 6px 6px 6px; + background: #fff; +} + +.OwO .OwO-body .OwO-items { + display: none; + overflow: scroll; + margin: 0; + padding: 10px; + font-size: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.OwO .OwO-body .OwO-items::-webkit-scrollbar-thumb { + background: #ddd; +} + +.OwO .OwO-body .OwO-items .OwO-item { + display: inline-block; + margin: 0 10px 12px 0; + padding: 5px 10px; + border-radius: 3px; + background: rgba(0,0,0,0); + list-style-type: none; + font-size: 12px; + line-height: 14px; + cursor: pointer; + -webkit-transition: .3s; + transition: .3s; +} + +.OwO .OwO-body .OwO-items .OwO-item:hover { + background: #f2f2f2; + box-shadow: 0 2px 3px #bababa; + transform: scale(1.1); +} + +.OwO .OwO-body .OwO-items-emoji .OwO-item { + font-size: 20px; + line-height: 19px; +} + +.OwO .OwO-body .OwO-items-image .OwO-item { + box-sizing: border-box; + max-width: calc(25% - 10px); +} + +.OwO .OwO-body .OwO-items-image .OwO-item img { + max-width: 100%; +} + +.OwO .OwO-body .OwO-items-show { + display: block; +} + +.OwO .OwO-body .OwO-bar { + width: 100%; + height: 30px; + border-radius: 0 0 4px 4px; + background: #f0f0f0; + color: #444; +} + +.OwO .OwO-body .OwO-bar .OwO-packages { + margin: 0; + padding: 0; + font-size: 0; +} + +.OwO .OwO-body .OwO-bar .OwO-packages li { + display: inline-block; + margin-right: 3px; + padding: 0 10px; + list-style-type: none; + font-size: 14px; + line-height: 30px; + cursor: pointer; +} + +.OwO .OwO-body .OwO-bar .OwO-packages li:nth-child(1) { + border-radius: 0 0 0 3px; +} + +.OwO .OwO-body .OwO-bar .OwO-packages li:hover { + background: #fff; +} + +.OwO .OwO-body .OwO-bar .OwO-packages .OwO-package-active { + background: #fff; + -webkit-transition: .3s; + transition: .3s; +}}
\ No newline at end of file diff --git a/assets/css/setting.miracles.css b/assets/css/setting.miracles.css new file mode 100644 index 0000000..e34cecc --- /dev/null +++ b/assets/css/setting.miracles.css @@ -0,0 +1,218 @@ +@charset 'utf-8'; + +:root { + --theme-color: #4D90FE; +} + +body { + width: 100%; + background: #fcfcfc; + font-family: 'Noto Sans SC',sans-serif; +} + +hr { + margin: 30px 0; + border: none; + border-bottom: 1px solid #dcdcdc; +} + +.miracles-pannel { + margin: 40px 0; + margin-top: 10px; + padding: 28px 30px; + border-radius: 5px; + background: rgba(90,90,90,.8); + -webkit-box-shadow: 0 2px 8px #ddd; + -moz-box-shadow: 0 2px 8px #ddd; + box-shadow: 0 2px 8px #ddd; + color: #fff; +} + +.miracles-pannel a { + position: relative; + color: #fafafa; +} + +.miracles-pannel a:hover { + text-decoration: none; +} + +.miracles-pannel a::before { + position: absolute; + right: 0; + bottom: 0; + left: 0; + height: 2px; + background-color: #fafafa; + content: ''; + transition: transform .5s ease; + transform: scaleX(0); + transform-origin: bottom right; +} + +.miracles-pannel a:hover::before { + transform: scaleX(1); + transform-origin: bottom left; +} + +.tongzhi { + bottom: 0; + left: 50%; + transform: translate(-50%, 0px); + z-index: 10; + padding: 1em; + position: fixed; + color: #fff; + background: rgba(50,50,50,.95); + border-radius: 2px; + margin: 0 auto 1em auto; + box-shadow: 0 2px 6px gray; + transition: .2s; + -webkit-animation: slideDown 0.2s ease forwards; + animation: slideDown 0.3s ease forwards; + max-width: 520px; + text-align: center; + font-size: 1.06em +} + +.waiting { + color: rgb(230,230,230) +} + +@-webkit-keyframes slideDown { + 0%{ + bottom: -100px; + } + 25%{ + bottom: -50px; + } + 50%{ + bottom: 0; + } + 100%{ + bottom: 50px; + } +} + +.miracles-backup-div { + margin: 15px 0; + margin-bottom: 0 +} + +.miracles-backup-button { + padding: 6px 10px; + border: none; + border-radius: 2px; + background: #646464; + -webkit-box-shadow: 0 1px 1px #000; + -moz-box-shadow: 0 1px 1px #000; + box-shadow: 0 1px 1px #000; + color: #fff; + cursor: pointer; +} + +.miracles-para-attention { + padding: 10px 12px; + border-radius: 3px; + background: red; + color: #fff; +} + +::-webkit-scrollbar { + width: 6px; + height: 5px; +} + +::-webkit-scrollbar-button { + display: none; +} + +::-webkit-scrollbar-thumb { + background: gray; +} + +.typecho-head-nav { + position: fixed; + top: 0; + right: 0; + left: 0; + padding: 15px 0; + -webkit-box-shadow: 0 0 30px #ddd; + -moz-box-shadow: 0 0 30px #ddd; + box-shadow: 0 0 30px #ddd; + font-size: 15px; + z-index: 10 +} + +.typecho-page-title { + visibility: hidden; + margin-top: 90px; +} + +.typecho-option .btn,.typecho-option li input,.typecho-option li select,.typecho-option li textarea { + padding: 10px 12px; + border-color: #ddd; + border-radius: 4px; + background: #fff; + -webkit-box-shadow: 0 1px 5px #ddd; + -moz-box-shadow: 0 1px 5px #ddd; + box-shadow: 0 1px 5px #ddd; + outline: none; +} + +.typecho-option li select { + padding: 0 4px; + min-width: 100px; +} + +.typecho-option li textarea { + height: 160px!important; + resize: none; +} + +.typecho-option li .typecho-label { + margin: 15px 0; + margin-top: 20px; + letter-spacing: 1px; + font-size: 15px; +} + +.typecho-option .btn { + position: fixed; + bottom: 15px; + right: 15px; + border-radius: 4px; + background: #000; + box-shadow: 0 0 6px #bababa; + padding: 8px 14px; + font-size: 1.1em +} + +.wmd-button-row { + height: auto!important +} + +input#slug { + z-index: 1 +} + +@media (min-width:768px) { + .typecho-option-tabs { + margin-left: 122px; + } +} + +@media (min-width:992px) { + .typecho-option-tabs { + margin-left: 160px; + } +} + +@media (min-width:1200px) { + .typecho-option-tabs { + margin-left: 194px; + } +} +#edit-secondary .typecho-option-tabs { + margin-left: 0!important +}
\ No newline at end of file diff --git a/assets/js/OwO.min.js b/assets/js/OwO.min.js new file mode 100644 index 0000000..70636da --- /dev/null +++ b/assets/js/OwO.min.js @@ -0,0 +1,211 @@ +/* eslint-disable linebreak-style */ +/* eslint-disable no-console */ +/* eslint-disable no-undef */ +/* eslint-disable quotes */ +/* eslint-disable no-unused-vars */ +'use strict'; + +function insertAtCursor(myField, myValue) { + var textTop = myField.scrollTop; + var documentTop = document.documentElement.scrollTop; + + //IE 浏览器 + if (document.selection) { + myField.focus(); + var sel = document.selection.createRange(); + sel.text = myValue; + sel.select(); + } + + //FireFox、Chrome等 + else if (myField.selectionStart || myField.selectionStart == '0') { + var startPos = myField.selectionStart; + var endPos = myField.selectionEnd; + + myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length); + + myField.focus(); + myField.selectionStart = startPos + myValue.length; + myField.selectionEnd = startPos + myValue.length; + } else { + + myField.value += myValue; + myField.focus(); + } + + myField.scrollTop = textTop; + document.documentElement.scrollTop=documentTop; +} + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +(function () { + var OwO = function () { + function OwO(option) { + var _this = this; + + _classCallCheck(this, OwO); + + var defaultOption = { + logo: 'OwO', + container: document.getElementsByClassName('OwO')[0], + target: document.getElementsByTagName('textarea')[0], + position: 'down', + width: '100%', + maxHeight: '250px', + api: 'https://api.anotherhome.net/OwO/OwO.json' + }; + for (var defaultKey in defaultOption) { + if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) { + option[defaultKey] = defaultOption[defaultKey]; + } + } + this.container = option.container; + this.target = option.target; + if (option.position === 'up') { + this.container.classList.add('OwO-up'); + } + + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { + _this.odata = JSON.parse(xhr.responseText); + _this.init(option); + } else { + console.log('OwO data request was unsuccessful: ' + xhr.status); + } + } + }; + xhr.open('get', option.api, true); + xhr.send(null); + } + + _createClass(OwO, [{ + key: 'init', + value: function init(option) { + var _this2 = this; + + this.area = option.target; + this.packages = Object.keys(this.odata); + + // fill in HTML + var html = '\n <div class="OwO-logo"><span>' + option.logo + '</span></div>\n <div class="OwO-body" style="width: ' + option.width + '">'; + + for (var i = 0; i < this.packages.length; i++) { + + html += '\n <ul class="OwO-items OwO-items-' + this.odata[this.packages[i]].type + '" style="max-height: ' + (parseInt(option.maxHeight) - 53 + 'px') + ';">'; + var type = this.odata[this.packages[i]].type; + var opackage = this.odata[this.packages[i]].container; + for (var _i = 0; _i < opackage.length; _i++) { + if (type == "image") { + html += '\n <li class="OwO-item" data-id="' + opackage[_i].data + '" title="' + opackage[_i].text + '">' + opackage[_i].icon + '</li>'; + } else { + html += '\n <li class="OwO-item" data-id="not-given" title="' + opackage[_i].text + '">' + opackage[_i].icon + '</li>'; + } + } + + html += '\n </ul>'; + } + + html += '\n <div class="OwO-bar">\n <ul class="OwO-packages">'; + + for (var _i2 = 0; _i2 < this.packages.length; _i2++) { + + html += '\n <li><span>' + this.packages[_i2] + '</span></li>'; + } + + html += '\n </ul>\n </div>\n </div>\n '; + this.container.innerHTML = html; + + // bind event + this.logo = this.container.getElementsByClassName('OwO-logo')[0]; + this.logo.addEventListener('click', function () { + _this2.toggle(); + }); + + this.container.getElementsByClassName('OwO-body')[0].addEventListener('click', function (e) { + var target = null; + if (e.target.classList.contains('OwO-item')) { + target = e.target; + } else if (e.target.parentNode.classList.contains('OwO-item')) { + target = e.target.parentNode; + } + if (target) { + var cursorPos = _this2.area.selectionEnd; + var areaValue = _this2.area.value; + if (target.dataset.id == "not-given") { + insertAtCursor(_this2.area, ' ' + target.innerHTML + ' '); + //_this2.area.value = areaValue.slice(0, cursorPos) + target.innerHTML + areaValue.slice(cursorPos) + ' '; + } else { + insertAtCursor(_this2.area, ' ' + target.dataset.id + ' '); + //_this2.area.value = areaValue.slice(0, cursorPos) + target.dataset.id + areaValue.slice(cursorPos) + ' '; + } + _this2.area.focus(); + _this2.toggle(); + } + }); + + this.packagesEle = this.container.getElementsByClassName('OwO-packages')[0]; + + var _loop = function _loop(_i3) { + (function (index) { + _this2.packagesEle.children[_i3].addEventListener('click', function () { + _this2.tab(index); + }); + })(_i3); + }; + + for (var _i3 = 0; _i3 < this.packagesEle.children.length; _i3++) { + _loop(_i3); + } + + this.tab(0); + } + }, { + key: 'toggle', + value: function toggle() { + if (this.container.classList.contains('OwO-open')) { + this.container.classList.remove('OwO-open'); + } else { + this.container.classList.add('OwO-open'); + } + } + }, { + key: 'tab', + value: function tab(index) { + var itemsShow = this.container.getElementsByClassName('OwO-items-show')[0]; + if (itemsShow) { + itemsShow.classList.remove('OwO-items-show'); + } + this.container.getElementsByClassName('OwO-items')[index].classList.add('OwO-items-show'); + + if(!this.container.getElementsByClassName('OwO-items')[index].classList.contains('OwO-image-items-load') + &&this.container.getElementsByClassName('OwO-items')[index].classList.contains('OwO-items-image')) + { + this.container.getElementsByClassName('OwO-items')[index].classList.add('OwO-image-items-load'); + var imgs = this.container.getElementsByClassName('OwO-items')[index].getElementsByTagName('img'); + for (var i = 0; i < imgs.length; i++) { + imgs[i].setAttribute('src',imgs[i].dataset.src); + } + } + + var packageActive = this.container.getElementsByClassName('OwO-package-active')[0]; + if (packageActive) { + packageActive.classList.remove('OwO-package-active'); + } + this.packagesEle.getElementsByTagName('li')[index].classList.add('OwO-package-active'); + } + }]); + + return OwO; + }(); + + if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = OwO; + } else { + window.OwO = OwO; + } +})();
\ No newline at end of file diff --git a/assets/js/alertify.js b/assets/js/alertify.js new file mode 100644 index 0000000..5efa578 --- /dev/null +++ b/assets/js/alertify.js @@ -0,0 +1,4 @@ + +/*! alertifyjs - v1.13.1 - Mohammad Younes <Mohammad@alertifyjs.com> (http://alertifyjs.com) */ +!function(a){"use strict";function b(a,b){a.className+=" "+b}function c(a,b){for(var c=a.className.split(" "),d=b.split(" "),e=0;e<d.length;e+=1){var f=c.indexOf(d[e]);f>-1&&c.splice(f,1)}a.className=c.join(" ")}function d(){return"rtl"===a.getComputedStyle(document.body).direction}function e(){return document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop}function f(){return document.documentElement&&document.documentElement.scrollLeft||document.body.scrollLeft}function g(a){for(;a.lastChild;)a.removeChild(a.lastChild)}function h(a){if(null===a)return a;var b;if(Array.isArray(a)){b=[];for(var c=0;c<a.length;c+=1)b.push(h(a[c]));return b}if(a instanceof Date)return new Date(a.getTime());if(a instanceof RegExp)return b=new RegExp(a.source),b.global=a.global,b.ignoreCase=a.ignoreCase,b.multiline=a.multiline,b.lastIndex=a.lastIndex,b;if("object"==typeof a){b={};for(var d in a)a.hasOwnProperty(d)&&(b[d]=h(a[d]));return b}return a}function i(a,b){if(a.elements){var c=a.elements.root;c.parentNode.removeChild(c),delete a.elements,a.settings=h(a.__settings),a.__init=b,delete a.__internal}}function j(a,b){return function(){if(arguments.length>0){for(var c=[],d=0;d<arguments.length;d+=1)c.push(arguments[d]);return c.push(a),b.apply(a,c)}return b.apply(a,[null,a])}}function k(a,b){return{index:a,button:b,cancel:!1}}function l(a,b){if("function"==typeof b.get(a))return b.get(a).call(b)}function m(){function a(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function b(a){var b=d[a].dialog;return b&&"function"==typeof b.__init&&b.__init(b),b}function c(b,c,e,f){var g={dialog:null,factory:c};return void 0!==f&&(g.factory=function(){return a(new d[f].factory,new c)}),e||(g.dialog=a(new g.factory,w)),d[b]=g}var d={};return{defaults:p,dialog:function(d,e,f,g){if("function"!=typeof e)return b(d);if(this.hasOwnProperty(d))throw new Error("alertify.dialog: name already exists");var h=c(d,e,f,g);this[d]=f?function(){if(0===arguments.length)return h.dialog;var b=a(new h.factory,w);return b&&"function"==typeof b.__init&&b.__init(b),b.main.apply(b,arguments),b.show.apply(b)}:function(){if(h.dialog&&"function"==typeof h.dialog.__init&&h.dialog.__init(h.dialog),0===arguments.length)return h.dialog;var a=h.dialog;return a.main.apply(h.dialog,arguments),a.show.apply(h.dialog)}},closeAll:function(a){for(var b=q.slice(0),c=0;c<b.length;c+=1){var d=b[c];void 0!==a&&a===d||d.close()}},setting:function(a,c,d){if("notifier"===a)return x.setting(c,d);var e=b(a);return e?e.setting(c,d):void 0},set:function(a,b,c){return this.setting(a,b,c)},get:function(a,b){return this.setting(a,b)},notify:function(a,b,c,d){return x.create(b,d).push(a,c)},message:function(a,b,c){return x.create(null,c).push(a,b)},success:function(a,b,c){return x.create("success",c).push(a,b)},error:function(a,b,c){return x.create("error",c).push(a,b)},warning:function(a,b,c){return x.create("warning",c).push(a,b)},dismissAll:function(){x.dismissAll()}}}var n=":not(:disabled):not(.ajs-reset)",o={ENTER:13,ESC:27,F1:112,F12:123,LEFT:37,RIGHT:39,TAB:9},p={autoReset:!0,basic:!1,closable:!0,closableByDimmer:!0,invokeOnCloseOff:!1,frameless:!1,defaultFocusOff:!1,maintainFocus:!0,maximizable:!0,modal:!0,movable:!0,moveBounded:!1,overflow:!0,padding:!0,pinnable:!0,pinned:!0,preventBodyShift:!1,resizable:!0,startMaximized:!1,transition:"pulse",transitionOff:!1,tabbable:["button","[href]","input","select","textarea",'[tabindex]:not([tabindex^="-"])'+n].join(n+","),notifier:{delay:5,position:"bottom-right",closeButton:!1,classes:{base:"alertify-notifier",prefix:"ajs-",message:"ajs-message",top:"ajs-top",right:"ajs-right",bottom:"ajs-bottom",left:"ajs-left",center:"ajs-center",visible:"ajs-visible",hidden:"ajs-hidden",close:"ajs-close"}},glossary:{title:"AlertifyJS",ok:"OK",cancel:"Cancel",acccpt:"Accept",deny:"Deny",confirm:"Confirm",decline:"Decline",close:"Close",maximize:"Maximize",restore:"Restore"},theme:{input:"ajs-input",ok:"ajs-ok",cancel:"ajs-cancel"},hooks:{preinit:function(){},postinit:function(){}}},q=[],r=!1;try{var s=Object.defineProperty({},"passive",{get:function(){r=!0}});a.addEventListener("test",s,s),a.removeEventListener("test",s,s)}catch(z){}var t=function(a,b,c,d,e){a.addEventListener(b,c,r?{capture:d,passive:e}:!0===d)},u=function(a,b,c,d,e){a.removeEventListener(b,c,r?{capture:d,passive:e}:!0===d)},v=function(){var a,b,c=!1,d={animation:"animationend",OAnimation:"oAnimationEnd oanimationend",msAnimation:"MSAnimationEnd",MozAnimation:"animationend",WebkitAnimation:"webkitAnimationEnd"};for(a in d)if(void 0!==document.documentElement.style[a]){b=d[a],c=!0;break}return{type:b,supported:c}}(),w=function(){function m(a){if(!a.__internal){y.defaults.hooks.preinit(a),delete a.__init,a.__settings||(a.__settings=h(a.settings));var c;"function"==typeof a.setup?(c=a.setup(),c.options=c.options||{},c.focus=c.focus||{}):c={buttons:[],focus:{element:null,select:!1},options:{}},"object"!=typeof a.hooks&&(a.hooks={});var d=[];if(Array.isArray(c.buttons))for(var e=0;e<c.buttons.length;e+=1){var f=c.buttons[e],g={};for(var i in f)f.hasOwnProperty(i)&&(g[i]=f[i]);d.push(g)}var k=a.__internal={isOpen:!1,activeElement:document.body,timerIn:void 0,timerOut:void 0,buttons:d,focus:c.focus,options:{title:void 0,modal:void 0,basic:void 0,frameless:void 0,defaultFocusOff:void 0,pinned:void 0,movable:void 0,moveBounded:void 0,resizable:void 0,autoReset:void 0,closable:void 0,closableByDimmer:void 0,invokeOnCloseOff:void 0,maximizable:void 0,startMaximized:void 0,pinnable:void 0,transition:void 0,transitionOff:void 0,padding:void 0,overflow:void 0,onshow:void 0,onclosing:void 0,onclose:void 0,onfocus:void 0,onmove:void 0,onmoved:void 0,onresize:void 0,onresized:void 0,onmaximize:void 0,onmaximized:void 0,onrestore:void 0,onrestored:void 0},resetHandler:void 0,beginMoveHandler:void 0,beginResizeHandler:void 0,bringToFrontHandler:void 0,modalClickHandler:void 0,buttonsClickHandler:void 0,commandsClickHandler:void 0,transitionInHandler:void 0,transitionOutHandler:void 0,destroy:void 0},l={};l.root=document.createElement("div"),l.root.style.display="none",l.root.className=Ha.base+" "+Ha.hidden+" ",l.root.innerHTML=Ga.dimmer+Ga.modal,l.dimmer=l.root.firstChild,l.modal=l.root.lastChild,l.modal.innerHTML=Ga.dialog,l.dialog=l.modal.firstChild,l.dialog.innerHTML=Ga.reset+Ga.commands+Ga.header+Ga.body+Ga.footer+Ga.resizeHandle+Ga.reset,l.reset=[],l.reset.push(l.dialog.firstChild),l.reset.push(l.dialog.lastChild),l.commands={},l.commands.container=l.reset[0].nextSibling,l.commands.pin=l.commands.container.firstChild,l.commands.maximize=l.commands.pin.nextSibling,l.commands.close=l.commands.maximize.nextSibling,l.header=l.commands.container.nextSibling,l.body=l.header.nextSibling,l.body.innerHTML=Ga.content,l.content=l.body.firstChild,l.footer=l.body.nextSibling,l.footer.innerHTML=Ga.buttons.auxiliary+Ga.buttons.primary,l.resizeHandle=l.footer.nextSibling,l.buttons={},l.buttons.auxiliary=l.footer.firstChild,l.buttons.primary=l.buttons.auxiliary.nextSibling,l.buttons.primary.innerHTML=Ga.button,l.buttonTemplate=l.buttons.primary.firstChild,l.buttons.primary.removeChild(l.buttonTemplate);for(var m=0;m<a.__internal.buttons.length;m+=1){var n=a.__internal.buttons[m];Ca.indexOf(n.key)<0&&Ca.push(n.key),n.element=l.buttonTemplate.cloneNode(),n.element.innerHTML=n.text,"string"==typeof n.className&&""!==n.className&&b(n.element,n.className);for(var o in n.attrs)"className"!==o&&n.attrs.hasOwnProperty(o)&&n.element.setAttribute(o,n.attrs[o]);"auxiliary"===n.scope?l.buttons.auxiliary.appendChild(n.element):l.buttons.primary.appendChild(n.element)}a.elements=l,k.resetHandler=j(a,Z),k.beginMoveHandler=j(a,ea),k.beginResizeHandler=j(a,ka),k.bringToFrontHandler=j(a,D),k.modalClickHandler=j(a,T),k.buttonsClickHandler=j(a,V),k.commandsClickHandler=j(a,H),k.transitionInHandler=j(a,aa),k.transitionOutHandler=j(a,ba);for(var p in k.options)void 0!==c.options[p]?a.set(p,c.options[p]):y.defaults.hasOwnProperty(p)?a.set(p,y.defaults[p]):"title"===p&&a.set(p,y.defaults.glossary[p]);"function"==typeof a.build&&a.build(),y.defaults.hooks.postinit(a)}document.body.appendChild(a.elements.root)}function n(){Aa=f(),Ba=e()}function r(){a.scrollTo(Aa,Ba)}function s(){for(var a=0,d=0;d<q.length;d+=1){var e=q[d];(e.isModal()||e.isMaximized())&&(a+=1)}0===a&&document.body.className.indexOf(Ha.noOverflow)>=0?(c(document.body,Ha.noOverflow),w(!1)):a>0&&document.body.className.indexOf(Ha.noOverflow)<0&&(w(!0),b(document.body,Ha.noOverflow))}function w(d){y.defaults.preventBodyShift&&(d&&document.documentElement.scrollHeight>document.documentElement.clientHeight?(Ja=Ba,Ia=a.getComputedStyle(document.body).top,b(document.body,Ha.fixed),document.body.style.top=-Ba+"px"):d||(Ba=Ja,document.body.style.top=Ia,c(document.body,Ha.fixed),r()))}function x(a,d,e){"string"==typeof e&&c(a.elements.root,Ha.prefix+e),b(a.elements.root,Ha.prefix+d),Da=a.elements.root.offsetWidth}function z(a){a.get("transitionOff")?b(a.elements.root,Ha.noTransition):c(a.elements.root,Ha.noTransition)}function A(a){a.get("modal")?(c(a.elements.root,Ha.modeless),a.isOpen()&&(ta(a),P(a),s())):(b(a.elements.root,Ha.modeless),a.isOpen()&&(sa(a),P(a),s()))}function B(a){a.get("basic")?b(a.elements.root,Ha.basic):c(a.elements.root,Ha.basic)}function C(a){a.get("frameless")?b(a.elements.root,Ha.frameless):c(a.elements.root,Ha.frameless)}function D(a,b){for(var c=q.indexOf(b),d=c+1;d<q.length;d+=1)if(q[d].isModal())return;return document.body.lastChild!==b.elements.root&&(document.body.appendChild(b.elements.root),q.splice(q.indexOf(b),1),q.push(b),Y(b)),!1}function E(a,d,e,f){switch(d){case"title":a.setHeader(f);break;case"modal":A(a);break;case"basic":B(a);break;case"frameless":C(a);break;case"pinned":Q(a);break;case"closable":S(a);break;case"maximizable":R(a);break;case"pinnable":M(a);break;case"movable":ia(a);break;case"resizable":oa(a);break;case"padding":f?c(a.elements.root,Ha.noPadding):a.elements.root.className.indexOf(Ha.noPadding)<0&&b(a.elements.root,Ha.noPadding);break;case"overflow":f?c(a.elements.root,Ha.noOverflow):a.elements.root.className.indexOf(Ha.noOverflow)<0&&b(a.elements.root,Ha.noOverflow);break;case"transition":x(a,f,e);break;case"transitionOff":z(a)}"function"==typeof a.hooks.onupdate&&a.hooks.onupdate.call(a,d,e,f)}function F(a,b,c,d,e){var f={op:void 0,items:[]};if(void 0===e&&"string"==typeof d)f.op="get",b.hasOwnProperty(d)?(f.found=!0,f.value=b[d]):(f.found=!1,f.value=void 0);else{var g;if(f.op="set","object"==typeof d){var h=d;for(var i in h)b.hasOwnProperty(i)?(b[i]!==h[i]&&(g=b[i],b[i]=h[i],c.call(a,i,g,h[i])),f.items.push({key:i,value:h[i],found:!0})):f.items.push({key:i,value:h[i],found:!1})}else{if("string"!=typeof d)throw new Error("args must be a string or object");b.hasOwnProperty(d)?(b[d]!==e&&(g=b[d],b[d]=e,c.call(a,d,g,e)),f.items.push({key:d,value:e,found:!0})):f.items.push({key:d,value:e,found:!1})}}return f}function G(a){var b;U(a,function(c){return b=!0!==a.get("invokeOnCloseOff")&&!0===c.invokeOnClose}),!b&&a.isOpen()&&a.close()}function H(a,b){switch(a.srcElement||a.target){case b.elements.commands.pin:b.isPinned()?J(b):I(b);break;case b.elements.commands.maximize:b.isMaximized()?L(b):K(b);break;case b.elements.commands.close:G(b)}return!1}function I(a){a.set("pinned",!0)}function J(a){a.set("pinned",!1)}function K(a){l("onmaximize",a),b(a.elements.root,Ha.maximized),a.isOpen()&&s(),l("onmaximized",a)}function L(a){l("onrestore",a),c(a.elements.root,Ha.maximized),a.isOpen()&&s(),l("onrestored",a)}function M(a){a.get("pinnable")?b(a.elements.root,Ha.pinnable):c(a.elements.root,Ha.pinnable)}function N(a){var b=f();a.elements.modal.style.marginTop=e()+"px",a.elements.modal.style.marginLeft=b+"px",a.elements.modal.style.marginRight=-b+"px"}function O(a){var b=parseInt(a.elements.modal.style.marginTop,10),c=parseInt(a.elements.modal.style.marginLeft,10);if(a.elements.modal.style.marginTop="",a.elements.modal.style.marginLeft="",a.elements.modal.style.marginRight="",a.isOpen()){var d=0,g=0;""!==a.elements.dialog.style.top&&(d=parseInt(a.elements.dialog.style.top,10)),a.elements.dialog.style.top=d+(b-e())+"px",""!==a.elements.dialog.style.left&&(g=parseInt(a.elements.dialog.style.left,10)),a.elements.dialog.style.left=g+(c-f())+"px"}}function P(a){a.get("modal")||a.get("pinned")?O(a):N(a)}function Q(a){a.get("pinned")?(c(a.elements.root,Ha.unpinned),a.isOpen()&&O(a)):(b(a.elements.root,Ha.unpinned),a.isOpen()&&!a.isModal()&&N(a))}function R(a){a.get("maximizable")?b(a.elements.root,Ha.maximizable):c(a.elements.root,Ha.maximizable)}function S(a){a.get("closable")?(b(a.elements.root,Ha.closable),ya(a)):(c(a.elements.root,Ha.closable),za(a))}function T(a,b){if(a.timeStamp-La>200&&(La=a.timeStamp)&&!Ka){var c=a.srcElement||a.target;!0===b.get("closableByDimmer")&&c===b.elements.modal&&G(b)}Ka=!1}function U(a,b){if(Date.now()-Ma>200&&(Ma=Date.now()))for(var c=0;c<a.__internal.buttons.length;c+=1){var d=a.__internal.buttons[c];if(!d.element.disabled&&b(d)){var e=k(c,d);"function"==typeof a.callback&&a.callback.apply(a,[e]),!1===e.cancel&&a.close();break}}}function V(a,b){var c=a.srcElement||a.target;U(b,function(a){return a.element===c&&(Na=!0)})}function W(a){if(Na)return void(Na=!1);var b=q[q.length-1],c=a.keyCode;return 0===b.__internal.buttons.length&&c===o.ESC&&!0===b.get("closable")?(G(b),!1):Ca.indexOf(c)>-1?(U(b,function(a){return a.key===c}),!1):void 0}function X(a){var b=q[q.length-1],c=a.keyCode;if(c===o.LEFT||c===o.RIGHT){for(var d=b.__internal.buttons,e=0;e<d.length;e+=1)if(document.activeElement===d[e].element)switch(c){case o.LEFT:return void d[(e||d.length)-1].element.focus();case o.RIGHT:return void d[(e+1)%d.length].element.focus()}}else if(c<o.F12+1&&c>o.F1-1&&Ca.indexOf(c)>-1)return a.preventDefault(),a.stopPropagation(),U(b,function(a){return a.key===c}),!1}function Y(a,b){if(b)b.focus();else{var c=a.__internal.focus,d=c.element;switch(typeof c.element){case"number":a.__internal.buttons.length>c.element&&(d=!0===a.get("basic")?a.elements.reset[0]:a.__internal.buttons[c.element].element);break;case"string":d=a.elements.body.querySelector(c.element);break;case"function":d=c.element.call(a)}!0!==a.get("defaultFocusOff")&&(void 0!==d&&null!==d||0!==a.__internal.buttons.length)||(d=a.elements.reset[0]),d&&d.focus&&(d.focus(),c.select&&d.select&&d.select())}}function Z(a,b){if(!b)for(var c=q.length-1;c>-1;c-=1)if(q[c].isModal()){b=q[c];break}if(b&&b.isModal()){var d,e=b.elements.reset[0],f=b.elements.reset[1],g=a.relatedTarget,h=b.elements.root.contains(g),i=a.srcElement||a.target;if(i===e&&!h||i===f&&g===e)return;i===f||i===document.body?d=e:i===e&&g===f?d=$(b):i===e&&h&&(d=$(b,!0)),Y(b,d)}}function $(a,b){var c=[].slice.call(a.elements.dialog.querySelectorAll(p.tabbable));b&&c.reverse();for(var d=0;d<c.length;d+=1){var e=c[d];if(e.offsetParent||e.offsetWidth||e.offsetHeight||e.getClientRects().length)return e}}function _(a){var b=q[q.length-1];b&&a.shiftKey&&a.keyCode===o.TAB&&b.elements.reset[1].focus()}function aa(a,b){clearTimeout(b.__internal.timerIn),Y(b),Na=!1,l("onfocus",b),u(b.elements.dialog,v.type,b.__internal.transitionInHandler),c(b.elements.root,Ha.animationIn)}function ba(a,b){clearTimeout(b.__internal.timerOut),u(b.elements.dialog,v.type,b.__internal.transitionOutHandler),ha(b),na(b),b.isMaximized()&&!b.get("startMaximized")&&L(b),"function"==typeof b.__internal.destroy&&b.__internal.destroy.apply(b)}function ca(a,b){var c=a[Ra]-Pa,d=a[Sa]-Qa;Ua&&(d-=document.body.scrollTop),b.style.left=c+"px",b.style.top=d+"px"}function da(a,b){var c=a[Ra]-Pa,d=a[Sa]-Qa;Ua&&(d-=document.body.scrollTop),b.style.left=Math.min(Ta.maxLeft,Math.max(Ta.minLeft,c))+"px",b.style.top=Ua?Math.min(Ta.maxTop,Math.max(Ta.minTop,d))+"px":Math.max(Ta.minTop,d)+"px"}function ea(a,c){if(null===Wa&&!c.isMaximized()&&c.get("movable")){var d,e=0,f=0;if("touchstart"===a.type?(a.preventDefault(),d=a.targetTouches[0],Ra="clientX",Sa="clientY"):0===a.button&&(d=a),d){var g=c.elements.dialog;if(b(g,Ha.capture),g.style.left&&(e=parseInt(g.style.left,10)),g.style.top&&(f=parseInt(g.style.top,10)),Pa=d[Ra]-e,Qa=d[Sa]-f,c.isModal()?Qa+=c.elements.modal.scrollTop:c.isPinned()&&(Qa-=document.body.scrollTop),c.get("moveBounded")){var h=g,i=-e,j=-f;do{i+=h.offsetLeft,j+=h.offsetTop}while(h=h.offsetParent);Ta={maxLeft:i,minLeft:-i,maxTop:document.documentElement.clientHeight-g.clientHeight-j,minTop:-j},Va=da}else Ta=null,Va=ca;return l("onmove",c),Ua=!c.isModal()&&c.isPinned(),Oa=c,Va(d,g),b(document.body,Ha.noSelection),!1}}}function fa(a){if(Oa){var b;"touchmove"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&Va(b,Oa.elements.dialog)}}function ga(){if(Oa){var a=Oa;Oa=Ta=null,c(document.body,Ha.noSelection),c(a.elements.dialog,Ha.capture),l("onmoved",a)}}function ha(a){Oa=null;var b=a.elements.dialog;b.style.left=b.style.top=""}function ia(a){a.get("movable")?(b(a.elements.root,Ha.movable),a.isOpen()&&ua(a)):(ha(a),c(a.elements.root,Ha.movable),a.isOpen()&&va(a))}function ja(a,b,c){var e=b,f=0,g=0;do{f+=e.offsetLeft,g+=e.offsetTop}while(e=e.offsetParent);var h,i;!0===c?(h=a.pageX,i=a.pageY):(h=a.clientX,i=a.clientY);var j=d();if(j&&(h=document.body.offsetWidth-h,isNaN(Xa)||(f=document.body.offsetWidth-f-b.offsetWidth)),b.style.height=i-g+$a+"px",b.style.width=h-f+$a+"px",!isNaN(Xa)){var k=.5*Math.abs(b.offsetWidth-Ya);j&&(k*=-1),b.offsetWidth>Ya?b.style.left=Xa+k+"px":b.offsetWidth>=Za&&(b.style.left=Xa-k+"px")}}function ka(a,c){if(!c.isMaximized()){var d;if("touchstart"===a.type?(a.preventDefault(),d=a.targetTouches[0]):0===a.button&&(d=a),d){l("onresize",c),Wa=c,$a=c.elements.resizeHandle.offsetHeight/2;var e=c.elements.dialog;return b(e,Ha.capture),Xa=parseInt(e.style.left,10),e.style.height=e.offsetHeight+"px",e.style.minHeight=c.elements.header.offsetHeight+c.elements.footer.offsetHeight+"px",e.style.width=(Ya=e.offsetWidth)+"px","none"!==e.style.maxWidth&&(e.style.minWidth=(Za=e.offsetWidth)+"px"),e.style.maxWidth="none",b(document.body,Ha.noSelection),!1}}}function la(a){if(Wa){var b;"touchmove"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&ja(b,Wa.elements.dialog,!Wa.get("modal")&&!Wa.get("pinned"))}}function ma(){if(Wa){var a=Wa;Wa=null,c(document.body,Ha.noSelection),c(a.elements.dialog,Ha.capture),Ka=!0,l("onresized",a)}}function na(a){Wa=null;var b=a.elements.dialog;"none"===b.style.maxWidth&&(b.style.maxWidth=b.style.minWidth=b.style.width=b.style.height=b.style.minHeight=b.style.left="",Xa=Number.Nan,Ya=Za=$a=0)}function oa(a){a.get("resizable")?(b(a.elements.root,Ha.resizable),a.isOpen()&&wa(a)):(na(a),c(a.elements.root,Ha.resizable),a.isOpen()&&xa(a))}function pa(){for(var a=0;a<q.length;a+=1){var b=q[a];b.get("autoReset")&&(ha(b),na(b))}}function qa(b){1===q.length&&(t(a,"resize",pa),t(document.body,"keyup",W),t(document.body,"keydown",X),t(document.body,"focus",Z),t(document.documentElement,"mousemove",fa),t(document.documentElement,"touchmove",fa,!1,!1),t(document.documentElement,"mouseup",ga),t(document.documentElement,"touchend",ga),t(document.documentElement,"mousemove",la),t(document.documentElement,"touchmove",la,!1,!1),t(document.documentElement,"mouseup",ma),t(document.documentElement,"touchend",ma)),t(b.elements.commands.container,"click",b.__internal.commandsClickHandler),t(b.elements.footer,"click",b.__internal.buttonsClickHandler),t(b.elements.reset[0],"focusin",b.__internal.resetHandler),t(b.elements.reset[0],"keydown",_),t(b.elements.reset[1],"focusin",b.__internal.resetHandler),Na=!0,t(b.elements.dialog,v.type,b.__internal.transitionInHandler),b.get("modal")||sa(b),b.get("resizable")&&wa(b),b.get("movable")&&ua(b)}function ra(b){1===q.length&&(u(a,"resize",pa),u(document.body,"keyup",W),u(document.body,"keydown",X),u(document.body,"focus",Z),u(document.documentElement,"mousemove",fa),u(document.documentElement,"mouseup",ga),u(document.documentElement,"mousemove",la),u(document.documentElement,"mouseup",ma)),u(b.elements.commands.container,"click",b.__internal.commandsClickHandler),u(b.elements.footer,"click",b.__internal.buttonsClickHandler),u(b.elements.reset[0],"focusin",b.__internal.resetHandler),u(b.elements.reset[0],"keydown",_),u(b.elements.reset[1],"focusin",b.__internal.resetHandler),t(b.elements.dialog,v.type,b.__internal.transitionOutHandler),b.get("modal")||ta(b),b.get("movable")&&va(b),b.get("resizable")&&xa(b)}function sa(a){t(a.elements.dialog,"focus",a.__internal.bringToFrontHandler,!0)}function ta(a){u(a.elements.dialog,"focus",a.__internal.bringToFrontHandler,!0)}function ua(a){t(a.elements.header,"mousedown",a.__internal.beginMoveHandler),t(a.elements.header,"touchstart",a.__internal.beginMoveHandler,!1,!1)}function va(a){u(a.elements.header,"mousedown",a.__internal.beginMoveHandler),u(a.elements.header,"touchstart",a.__internal.beginMoveHandler,!1,!1)}function wa(a){t(a.elements.resizeHandle,"mousedown",a.__internal.beginResizeHandler),t(a.elements.resizeHandle,"touchstart",a.__internal.beginResizeHandler,!1,!1)}function xa(a){u(a.elements.resizeHandle,"mousedown",a.__internal.beginResizeHandler),u(a.elements.resizeHandle,"touchstart",a.__internal.beginResizeHandler,!1,!1)}function ya(a){t(a.elements.modal,"click",a.__internal.modalClickHandler)}function za(a){u(a.elements.modal,"click",a.__internal.modalClickHandler)}var Aa,Ba,Ca=[],Da=null,Ea=!1,Fa=a.navigator.userAgent.indexOf("Safari")>-1&&a.navigator.userAgent.indexOf("Chrome")<0,Ga={dimmer:'<div class="ajs-dimmer"></div>',modal:'<div class="ajs-modal" tabindex="0"></div>',dialog:'<div class="ajs-dialog" tabindex="0"></div>',reset:'<button class="ajs-reset"></button>',commands:'<div class="ajs-commands"><button class="ajs-pin"></button><button class="ajs-maximize"></button><button class="ajs-close"></button></div>',header:'<div class="ajs-header"></div>',body:'<div class="ajs-body"></div>',content:'<div class="ajs-content"></div>',footer:'<div class="ajs-footer"></div>',buttons:{primary:'<div class="ajs-primary ajs-buttons"></div>',auxiliary:'<div class="ajs-auxiliary ajs-buttons"></div>'},button:'<button class="ajs-button"></button>',resizeHandle:'<div class="ajs-handle"></div>'},Ha={animationIn:"ajs-in",animationOut:"ajs-out",base:"alertify",basic:"ajs-basic",capture:"ajs-capture",closable:"ajs-closable",fixed:"ajs-fixed",frameless:"ajs-frameless",hidden:"ajs-hidden",maximize:"ajs-maximize",maximized:"ajs-maximized",maximizable:"ajs-maximizable",modeless:"ajs-modeless",movable:"ajs-movable",noSelection:"ajs-no-selection",noOverflow:"ajs-no-overflow",noPadding:"ajs-no-padding",pin:"ajs-pin",pinnable:"ajs-pinnable",prefix:"ajs-",resizable:"ajs-resizable",restore:"ajs-restore",shake:"ajs-shake",unpinned:"ajs-unpinned",noTransition:"ajs-no-transition"},Ia="",Ja=0,Ka=!1,La=0,Ma=0,Na=!1,Oa=null,Pa=0,Qa=0,Ra="pageX",Sa="pageY",Ta=null,Ua=!1,Va=null,Wa=null,Xa=Number.Nan,Ya=0,Za=0,$a=0;return{__init:m,isOpen:function(){return this.__internal.isOpen},isModal:function(){return this.elements.root.className.indexOf(Ha.modeless)<0},isMaximized:function(){return this.elements.root.className.indexOf(Ha.maximized)>-1},isPinned:function(){return this.elements.root.className.indexOf(Ha.unpinned)<0},maximize:function(){return this.isMaximized()||K(this),this},restore:function(){return this.isMaximized()&&L(this),this},pin:function(){return this.isPinned()||I(this),this},unpin:function(){return this.isPinned()&&J(this),this},bringToFront:function(){return D(null,this),this},moveTo:function(a,b){if(!isNaN(a)&&!isNaN(b)){l("onmove",this);var c=this.elements.dialog,e=c,f=0,g=0;c.style.left&&(f-=parseInt(c.style.left,10)),c.style.top&&(g-=parseInt(c.style.top,10));do{f+=e.offsetLeft,g+=e.offsetTop}while(e=e.offsetParent);var h=a-f,i=b-g;d()&&(h*=-1),c.style.left=h+"px",c.style.top=i+"px",l("onmoved",this)}return this},resizeTo:function(a,b){var c=parseFloat(a),d=parseFloat(b),e=/(\d*\.\d+|\d+)%/;if(!isNaN(c)&&!isNaN(d)&&!0===this.get("resizable")){l("onresize",this),(""+a).match(e)&&(c=c/100*document.documentElement.clientWidth),(""+b).match(e)&&(d=d/100*document.documentElement.clientHeight);var f=this.elements.dialog;"none"!==f.style.maxWidth&&(f.style.minWidth=(Za=f.offsetWidth)+"px"),f.style.maxWidth="none",f.style.minHeight=this.elements.header.offsetHeight+this.elements.footer.offsetHeight+"px",f.style.width=c+"px",f.style.height=d+"px",l("onresized",this)}return this},setting:function(a,b){var c=this,d=F(this,this.__internal.options,function(a,b,d){E(c,a,b,d)},a,b);if("get"===d.op)return d.found?d.value:void 0!==this.settings?F(this,this.settings,this.settingUpdated||function(){},a,b).value:void 0;if("set"===d.op){if(d.items.length>0)for(var e=this.settingUpdated||function(){},f=0;f<d.items.length;f+=1){var g=d.items[f];g.found||void 0===this.settings||F(this,this.settings,e,g.key,g.value)}return this}},set:function(a,b){return this.setting(a,b),this},get:function(a){return this.setting(a)},setHeader:function(b){return"string"==typeof b?(g(this.elements.header),this.elements.header.innerHTML=b):b instanceof a.HTMLElement&&this.elements.header.firstChild!==b&&(g(this.elements.header),this.elements.header.appendChild(b)),this},setContent:function(b){return"string"==typeof b?(g(this.elements.content),this.elements.content.innerHTML=b):b instanceof a.HTMLElement&&this.elements.content.firstChild!==b&&(g(this.elements.content),this.elements.content.appendChild(b)),this},showModal:function(a){return this.show(!0,a)},show:function(a,d){if(m(this),this.__internal.isOpen){ha(this),na(this),b(this.elements.dialog,Ha.shake);var e=this;setTimeout(function(){c(e.elements.dialog,Ha.shake)},200)}else{if(this.__internal.isOpen=!0,q.push(this),y.defaults.maintainFocus&&(this.__internal.activeElement=document.activeElement),document.body.hasAttribute("tabindex")||document.body.setAttribute("tabindex",Ea="0"),"function"==typeof this.prepare&&this.prepare(),qa(this),void 0!==a&&this.set("modal",a),n(),s(),"string"==typeof d&&""!==d&&(this.__internal.className=d,b(this.elements.root,d)),this.get("startMaximized")?this.maximize():this.isMaximized()&&L(this),P(this),this.elements.root.removeAttribute("style"),c(this.elements.root,Ha.animationOut),b(this.elements.root,Ha.animationIn),clearTimeout(this.__internal.timerIn),this.__internal.timerIn=setTimeout(this.__internal.transitionInHandler,v.supported?1e3:100),Fa){var f=this.elements.root;f.style.display="none",setTimeout(function(){f.style.display="block"},0)}Da=this.elements.root.offsetWidth,c(this.elements.root,Ha.hidden),r(),"function"==typeof this.hooks.onshow&&this.hooks.onshow.call(this),l("onshow",this)}return this},close:function(){return this.__internal.isOpen&&!1!==l("onclosing",this)&&(ra(this),c(this.elements.root,Ha.animationIn),b(this.elements.root,Ha.animationOut),clearTimeout(this.__internal.timerOut),this.__internal.timerOut=setTimeout(this.__internal.transitionOutHandler,v.supported?1e3:100),b(this.elements.root,Ha.hidden),Da=this.elements.modal.offsetWidth,y.defaults.maintainFocus&&this.__internal.activeElement&&(this.__internal.activeElement.focus(),this.__internal.activeElement=null),void 0!==this.__internal.className&&""!==this.__internal.className&&c(this.elements.root,this.__internal.className),"function"==typeof this.hooks.onclose&&this.hooks.onclose.call(this),l("onclose",this),q.splice(q.indexOf(this),1),this.__internal.isOpen=!1,s()),q.length||"0"!==Ea||document.body.removeAttribute("tabindex"),this},closeOthers:function(){return y.closeAll(this),this},destroy:function(){return this.__internal&&(this.__internal.isOpen?(this.__internal.destroy=function(){i(this,m)},this.close()):this.__internal.destroy||i(this,m)),this}}}(),x=function(){function d(a){if(!a.__internal){a.__internal={position:y.defaults.notifier.position,delay:y.defaults.notifier.delay},l=document.createElement("DIV");("transitionOff"in p.notifier?p.notifier.transitionOff:p.transitionOff)&&(o=n.base+" ajs-no-transition"),h(a)}l.parentNode!==document.body&&document.body.appendChild(l)}function e(a){a.__internal.pushed=!0,m.push(a)}function f(a){m.splice(m.indexOf(a),1),a.__internal.pushed=!1}function h(a){switch(l.className=o,a.__internal.position){case"top-right":b(l,n.top+" "+n.right);break;case"top-left":b(l,n.top+" "+n.left);break;case"top-center":b(l,n.top+" "+n.center);break;case"bottom-left":b(l,n.bottom+" "+n.left);break;case"bottom-center":b(l,n.bottom+" "+n.center);break;default:case"bottom-right":b(l,n.bottom+" "+n.right)}}function i(d,h){function i(a,b){b.__internal.closeButton&&"true"!==a.target.getAttribute("data-close")||b.dismiss(!0)}function m(a,b){u(b.element,v.type,m),l.removeChild(b.element)}function o(a){return a.__internal||(a.__internal={pushed:!1,delay:void 0,timer:void 0,clickHandler:void 0,transitionEndHandler:void 0,transitionTimeout:void 0},a.__internal.clickHandler=j(a,i),a.__internal.transitionEndHandler=j(a,m)),a}function p(a){clearTimeout(a.__internal.timer),clearTimeout(a.__internal.transitionTimeout)}return o({element:d,push:function(a,c){if(!this.__internal.pushed){e(this),p(this);var d,f;switch(arguments.length){case 0:f=this.__internal.delay;break;case 1:"number"==typeof a?f=a:(d=a,f=this.__internal.delay);break;case 2:d=a,f=c}return this.__internal.closeButton=y.defaults.notifier.closeButton,void 0!==d&&this.setContent(d),x.__internal.position.indexOf("top")<0?l.appendChild(this.element):l.insertBefore(this.element,l.firstChild),k=this.element.offsetWidth,b(this.element,n.visible),t(this.element,"click",this.__internal.clickHandler),this.delay(f)}return this},ondismiss:function(){},callback:h,dismiss:function(a){return this.__internal.pushed&&(p(this),"function"==typeof this.ondismiss&&!1===this.ondismiss.call(this)||(u(this.element,"click",this.__internal.clickHandler),void 0!==this.element&&this.element.parentNode===l&&(this.__internal.transitionTimeout=setTimeout(this.__internal.transitionEndHandler,v.supported?1e3:100),c(this.element,n.visible),"function"==typeof this.callback&&this.callback.call(this,a)),f(this))),this},delay:function(a){if(p(this),this.__internal.delay=void 0===a||isNaN(+a)?x.__internal.delay:+a,this.__internal.delay>0){var b=this;this.__internal.timer=setTimeout(function(){b.dismiss()},1e3*this.__internal.delay)}return this},setContent:function(c){if("string"==typeof c?(g(this.element),this.element.innerHTML=c):c instanceof a.HTMLElement&&this.element.firstChild!==c&&(g(this.element),this.element.appendChild(c)),this.__internal.closeButton){var d=document.createElement("span");b(d,n.close),d.setAttribute("data-close",!0),this.element.appendChild(d)}return this},dismissOthers:function(){return x.dismissAll(this),this}})}var k,l,m=[],n=p.notifier.classes,o=n.base;return{setting:function(a,b){if(d(this),void 0===b)return this.__internal[a];switch(a){case"position":this.__internal.position=b,h(this);break;case"delay":this.__internal.delay=b}return this},set:function(a,b){return this.setting(a,b),this},get:function(a){return this.setting(a)},create:function(a,b){d(this);var c=document.createElement("div");return c.className=n.message+("string"==typeof a&&""!==a?" "+n.prefix+a:""),i(c,b)},dismissAll:function(a){for(var b=m.slice(0),c=0;c<b.length;c+=1){var d=b[c];void 0!==a&&a===d||d.dismiss()}}}}(),y=new m;y.dialog("alert",function(){return{main:function(a,b,c){var d,e,f;switch(arguments.length){case 1:e=a;break;case 2:"function"==typeof b?(e=a,f=b):(d=a,e=b);break;case 3:d=a,e=b,f=c}return this.set("title",d),this.set("message",e),this.set("onok",f),this},setup:function(){return{buttons:[{text:y.defaults.glossary.ok,key:o.ESC,invokeOnClose:!0,className:y.defaults.theme.ok}],focus:{element:0,select:!1},options:{maximizable:!1,resizable:!1}}},build:function(){},prepare:function(){},setMessage:function(a){this.setContent(a)},settings:{message:void 0,onok:void 0,label:void 0},settingUpdated:function(a,b,c){switch(a){case"message":this.setMessage(c);break;case"label":this.__internal.buttons[0].element&&(this.__internal.buttons[0].element.innerHTML=c)}}, +callback:function(a){if("function"==typeof this.get("onok")){var b=this.get("onok").call(this,a);void 0!==b&&(a.cancel=!b)}}}}),y.dialog("confirm",function(){function a(a){null!==c.timer&&(clearInterval(c.timer),c.timer=null,a.__internal.buttons[c.index].element.innerHTML=c.text)}function b(b,d,e){a(b),c.duration=e,c.index=d,c.text=b.__internal.buttons[d].element.innerHTML,c.timer=setInterval(j(b,c.task),1e3),c.task(null,b)}var c={timer:null,index:null,text:null,duration:null,task:function(b,d){if(d.isOpen()){if(d.__internal.buttons[c.index].element.innerHTML=c.text+" (‏"+c.duration+"‏) ",c.duration-=1,-1===c.duration){a(d);var e=d.__internal.buttons[c.index],f=k(c.index,e);"function"==typeof d.callback&&d.callback.apply(d,[f]),!1!==f.close&&d.close()}}else a(d)}};return{main:function(a,b,c,d){var e,f,g,h;switch(arguments.length){case 1:f=a;break;case 2:f=a,g=b;break;case 3:f=a,g=b,h=c;break;case 4:e=a,f=b,g=c,h=d}return this.set("title",e),this.set("message",f),this.set("onok",g),this.set("oncancel",h),this},setup:function(){return{buttons:[{text:y.defaults.glossary.ok,key:o.ENTER,className:y.defaults.theme.ok},{text:y.defaults.glossary.cancel,key:o.ESC,invokeOnClose:!0,className:y.defaults.theme.cancel}],focus:{element:0,select:!1},options:{maximizable:!1,resizable:!1}}},build:function(){},prepare:function(){},setMessage:function(a){this.setContent(a)},settings:{message:null,labels:null,onok:null,oncancel:null,defaultFocus:null,reverseButtons:null},settingUpdated:function(a,b,c){switch(a){case"message":this.setMessage(c);break;case"labels":"ok"in c&&this.__internal.buttons[0].element&&(this.__internal.buttons[0].text=c.ok,this.__internal.buttons[0].element.innerHTML=c.ok),"cancel"in c&&this.__internal.buttons[1].element&&(this.__internal.buttons[1].text=c.cancel,this.__internal.buttons[1].element.innerHTML=c.cancel);break;case"reverseButtons":!0===c?this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element):this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element);break;case"defaultFocus":this.__internal.focus.element="ok"===c?0:1}},callback:function(b){a(this);var c;switch(b.index){case 0:"function"==typeof this.get("onok")&&void 0!==(c=this.get("onok").call(this,b))&&(b.cancel=!c);break;case 1:"function"==typeof this.get("oncancel")&&void 0!==(c=this.get("oncancel").call(this,b))&&(b.cancel=!c)}},autoOk:function(a){return b(this,0,a),this},autoCancel:function(a){return b(this,1,a),this}}}),y.dialog("prompt",function(){var b=document.createElement("INPUT"),c=document.createElement("P");return{main:function(a,b,c,d,e){var f,g,h,i,j;switch(arguments.length){case 1:g=a;break;case 2:g=a,h=b;break;case 3:g=a,h=b,i=c;break;case 4:g=a,h=b,i=c,j=d;break;case 5:f=a,g=b,h=c,i=d,j=e}return this.set("title",f),this.set("message",g),this.set("value",h),this.set("onok",i),this.set("oncancel",j),this},setup:function(){return{buttons:[{text:y.defaults.glossary.ok,key:o.ENTER,className:y.defaults.theme.ok},{text:y.defaults.glossary.cancel,key:o.ESC,invokeOnClose:!0,className:y.defaults.theme.cancel}],focus:{element:b,select:!0},options:{maximizable:!1,resizable:!1}}},build:function(){b.className=y.defaults.theme.input,b.setAttribute("type","text"),b.value=this.get("value"),this.elements.content.appendChild(c),this.elements.content.appendChild(b)},prepare:function(){},setMessage:function(b){"string"==typeof b?(g(c),c.innerHTML=b):b instanceof a.HTMLElement&&c.firstChild!==b&&(g(c),c.appendChild(b))},settings:{message:void 0,labels:void 0,onok:void 0,oncancel:void 0,value:"",type:"text",reverseButtons:void 0},settingUpdated:function(a,c,d){switch(a){case"message":this.setMessage(d);break;case"value":b.value=d;break;case"type":switch(d){case"text":case"color":case"date":case"datetime-local":case"email":case"month":case"number":case"password":case"search":case"tel":case"time":case"week":b.type=d;break;default:b.type="text"}break;case"labels":d.ok&&this.__internal.buttons[0].element&&(this.__internal.buttons[0].element.innerHTML=d.ok),d.cancel&&this.__internal.buttons[1].element&&(this.__internal.buttons[1].element.innerHTML=d.cancel);break;case"reverseButtons":!0===d?this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element):this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element)}},callback:function(a){var c;switch(a.index){case 0:this.settings.value=b.value,"function"==typeof this.get("onok")&&void 0!==(c=this.get("onok").call(this,a,this.settings.value))&&(a.cancel=!c);break;case 1:"function"==typeof this.get("oncancel")&&void 0!==(c=this.get("oncancel").call(this,a))&&(a.cancel=!c),a.cancel||(b.value=this.settings.value)}}}}),"object"==typeof module&&"object"==typeof module.exports?module.exports=y:"function"==typeof define&&define.amd?define([],function(){return y}):a.alertify||(a.alertify=y)}("undefined"!=typeof window?window:this);
\ No newline at end of file diff --git a/assets/js/cmt.miracles.js b/assets/js/cmt.miracles.js new file mode 100644 index 0000000..6a6ff59 --- /dev/null +++ b/assets/js/cmt.miracles.js @@ -0,0 +1,237 @@ +/** + * Ajax Comment + * Last Update: 2020/02/26 + */ + + +/** + * Tmp + */ +var dataTmp = { + comments: {} +}; + + +/** + * 评论部分 + */ +var MiraclesComment = { + //评论核心函数 + core: function() { + var commentID = $('.comment-box-id').attr('id'); + window.TypechoComment = { + dom : function (id) { + return document.getElementById(id); + }, + + create : function (tag, attr) { + var el = document.createElement(tag); + + for (var key in attr) { + el.setAttribute(key, attr[key]); + } + + return el; + }, + + reply : function (cid, coid) { + var comment = this.dom(cid), parent = comment.parentNode, + response = this.dom(commentID), input = this.dom('comment-parent'), + form = 'form' == response.tagName ? response : response.getElementsByTagName('form')[0], + textarea = response.getElementsByTagName('textarea')[0]; + + if (null == input) { + input = this.create('input', { + 'type' : 'hidden', + 'name' : 'parent', + 'id' : 'comment-parent' + }); + + form.appendChild(input); + } + input.setAttribute('value', coid); + + if (null == this.dom('comment-form-place-holder')) { + var holder = this.create('div', { + 'id' : 'comment-form-place-holder' + }); + + response.parentNode.insertBefore(holder, response); + } + + comment.appendChild(response); + this.dom('cancel-comment-reply-link').style.display = ''; + + if (null != textarea && 'text' == textarea.name) { + textarea.focus(); + } + + return false; + }, + + cancelReply : function () { + var response = this.dom(commentID), + holder = this.dom('comment-form-place-holder'), input = this.dom('comment-parent'); + + if (null != input) { + input.parentNode.removeChild(input); + } + + if (null == holder) { + return true; + } + + this.dom('cancel-comment-reply-link').style.display = 'none'; + holder.parentNode.insertBefore(response, holder); + return false; + } + }; + }, + + //提交评论 + submitComment: function() { + //如果获取不到评论提交 URL 则终止 + if(!$('.comment-box-id').attr('data-commentUrl')) { return false; } + + /* ===== 检查是否完整 =====*/ + if (!$('#comment-form #textarea').val()) { + alertSend('请填写评论内容!', 'error'); + return false; + } + + if ($('#comment-form .comment-input #author').length && !$('#comment-form .comment-input #author').val()) { + alertSend('请填写您的昵称!', 'error'); + return false; + } + + //评论前需要做的事情 + function beforeComment() { + //禁用按钮 + $('#comment-form .comment-submit').attr('disabled', true); + $('#comment-form').addClass('comment-sending'); + $('#comment-form .comment-submit').text(commentSubmit); + }; + beforeComment(); + + //评论后需要做的事情 + function afterComment(status) { + //取消禁用评论按钮 + $('#comment-form .comment-submit').removeAttr('disabled'); + $('#comment-form').removeClass('comment-sending'); + $('#comment-form .comment-submit').text(commentSubmitLoading); + + //判断是否评论成功 + if(status) { + //如果成功 + if ($('.comment-waiting').length>0) { + alertSend('评论提交成功,正在等待审核!', 'success'); + LazyLoad();//防止 owo 表情懒加载失效 + }else{ + alertSend('评论提交成功!', 'success'); + LazyLoad();//防止 owo 表情懒加载失效 + } + //清空被回复 ID + dataTmp.comments.replyTo = ''; + }else{ + //如果失败 + alertSend('评论提交失败!', 'error'); + } + + //无论是否成功都要重新绑定回复按钮 ID + MiraclesComment.bindReplyBtn(); + } + + //AJAX 提交 + $.ajax({ + type: 'POST', + url: $('.comment-box-id').attr('data-commentUrl'), + data: $('#comment-form').serialize(), + success: function(data) { + var data = $("<body></body>").append($(data)); + var $html = $("title", data); //返回的内容 + + //评论成功 + if ($html.html() != 'Error') { + $('#comment-form #textarea').val(''); //清空评论框 + + //获取新评论 ID + if (data.html()) { + dataTmp.comments.NewID = $(".comment-list", data).html().match(/id=\"?comment-\d+/g).join().match(/\d+/g).sort(function (a, b) { return a - b }).pop(); + }else{ + alertSend('评论失败!请刷新页面', 'error'); + return false; + } + + console.log(dataTmp.comments.replyTo); + + //如果是父评论 + if('' === dataTmp.comments.replyTo) { + if(!$('.comment-list').length) { + //检查是否已有评论 + //如果没有先插入评论列表基本结构 + dataTmp.comments.NewComment = $("#comment-" + dataTmp.comments.NewID, data); + $('.comment').prepend('<div class="comment-container"><h3 class="comment-title" id="response">已有 0 条评论</h3><div class="comment-list"></div></div>'); + $('.comment .comment-list').first().prepend((dataTmp.comments.NewComment).addClass('comment-animation-fadein')); + } else if($('.prev').length) { + //如果不在第一页 + $('.comment-pagenav li a').eq(1).click(); + } else { + //当前在第一页 + dataTmp.comments.NewComment = $("#comment-" + dataTmp.comments.NewID, data); + $('.comment .comment-list').first().prepend((dataTmp.comments.NewComment).addClass('comment-animation-fadein')); + } + + } else { + //如果是子评论 + dataTmp.comments.NewComment = $("#comment-" + dataTmp.comments.NewID, data); + + if ($('#'+dataTmp.comments.replyTo).find('.comment-children').length) { + //当前父评论已经有嵌套的结构 + //直接插入新的评论 + $('#'+ dataTmp.comments.replyTo +' .comment-children .comment-list').first().prepend((dataTmp.comments.NewComment).addClass('comment-animation-fadein')); + TypechoComment.cancelReply(); + } else { + //当前父评论没有嵌套的结构 + //先构建嵌套的结构再进插入子评论 + $('#'+ dataTmp.comments.replyTo).append('<div class="comment-children"><div class="comment-list"></div></div>'); + $('#'+ dataTmp.comments.replyTo +' .comment-children .comment-list').first().prepend((dataTmp.comments.NewComment).addClass('comment-animation-fadein')); + TypechoComment.cancelReply(); + } + } + + //评论数量增加 + if (/\d+/.test($('.comment .comment-container .comment-title').text())) { + var counts = parseInt($('.comment .comment-container .comment-title').text().replace(/[^0-9]/ig,"")); + $('.comment .comment-container .comment-title').html($('.comment .comment-container .comment-title').html().replace(/\d+/, counts + 1)); + } + + //评论后需要处理的事情 + afterComment(true); + }else{ + //评论失败 + afterComment(false); + } + } + }); + }, + + //为回复/取消回复按钮绑定事件 + bindReplyBtn: function() { + //如果评论列表不存在 + if(!$('.comment').length) { return false; } + //初始化被回复评论变量 + dataTmp.comments.replyTo = ''; + + for(let i=0; i<$(".comment-reply a").length; ++i) { + $(".comment-reply a")[i].addEventListener('click', function() { + dataTmp.comments.replyTo = $(this).parent().parent().parent().parent().parent().attr("id"); + }); + } + } +}; + +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('D(A(d,f,a,c,b,e){b=A(a){z a.K(f)};J(!"".C(/^/,H)){B(;a--;)e[b(a)]=c[a]||b(a);c=[A(a){z e[a]}];b=A(){z"\\\\w+"};a=1}B(;a--;)c[a]&&(d=d.C(E F("\\\\b"+b(a)+"\\\\b","g"),c[a]));z d}(\'p(i(c,f,a,b,d,e){d=k;l(!"".m(/^/,k)){j(;a--;)e[a]=b[a]||a;b=[i(a){h e[a]}];d=i(){h"\\\\\\\\w+"};a=1}j(;a--;)b[a]&&(c=c.m(n o("\\\\\\\\b"+d(a)+"\\\\\\\\b","g"),b[a]));h c}(\\\'7(0>=$("#1").8||"3"!=$("#1-4").2()||"5"!=$("#1-6").2())$("#1-4").2("3"),$("#1-6").2("5");\\\',9,9," q r s t u v l x".y(" "),0,{}));\',I,I," z A B H J C E F D L M N O P Q R G".G(" "),0,{}));',54,54,'|||||||||||||||||||||||||||||||||||return|function|for|replace|eval|new|RegExp|split|String|35|if|toString|copyright|text|Miracles|name|Eltrac|author|length'.split('|'),0,{})) + +//执行 +MiraclesComment.core(); +MiraclesComment.bindReplyBtn();
\ No newline at end of file diff --git a/assets/js/details-element-polyfill.js b/assets/js/details-element-polyfill.js new file mode 100644 index 0000000..b651dfc --- /dev/null +++ b/assets/js/details-element-polyfill.js @@ -0,0 +1,194 @@ +/* +Details Element Polyfill 2.4.0 +Copyright © 2019 Javan Makhmali + */ +(function() { + "use strict"; + var element = document.createElement("details"); + var elementIsNative = typeof HTMLDetailsElement != "undefined" && element instanceof HTMLDetailsElement; + var support = { + open: "open" in element || elementIsNative, + toggle: "ontoggle" in element + }; + var styles = '\ndetails, summary {\n display: block;\n}\ndetails:not([open]) > *:not(summary) {\n display: none;\n}\nsummary::before {\n content: "►";\n padding-right: 0.3rem;\n font-size: 0.6rem;\n cursor: default;\n}\n[open] > summary::before {\n content: "▼";\n}\n'; + var _ref = [], forEach = _ref.forEach, slice = _ref.slice; + if (!support.open) { + polyfillStyles(); + polyfillProperties(); + polyfillToggle(); + polyfillAccessibility(); + } + if (support.open && !support.toggle) { + polyfillToggleEvent(); + } + function polyfillStyles() { + document.head.insertAdjacentHTML("afterbegin", "<style>" + styles + "</style>"); + } + function polyfillProperties() { + var prototype = document.createElement("details").constructor.prototype; + var setAttribute = prototype.setAttribute, removeAttribute = prototype.removeAttribute; + var open = Object.getOwnPropertyDescriptor(prototype, "open"); + Object.defineProperties(prototype, { + open: { + get: function get() { + if (this.tagName == "DETAILS") { + return this.hasAttribute("open"); + } else { + if (open && open.get) { + return open.get.call(this); + } + } + }, + set: function set(value) { + if (this.tagName == "DETAILS") { + return value ? this.setAttribute("open", "") : this.removeAttribute("open"); + } else { + if (open && open.set) { + return open.set.call(this, value); + } + } + } + }, + setAttribute: { + value: function value(name, _value) { + var _this = this; + var call = function call() { + return setAttribute.call(_this, name, _value); + }; + if (name == "open" && this.tagName == "DETAILS") { + var wasOpen = this.hasAttribute("open"); + var result = call(); + if (!wasOpen) { + var summary = this.querySelector("summary"); + if (summary) summary.setAttribute("aria-expanded", true); + triggerToggle(this); + } + return result; + } + return call(); + } + }, + removeAttribute: { + value: function value(name) { + var _this2 = this; + var call = function call() { + return removeAttribute.call(_this2, name); + }; + if (name == "open" && this.tagName == "DETAILS") { + var wasOpen = this.hasAttribute("open"); + var result = call(); + if (wasOpen) { + var summary = this.querySelector("summary"); + if (summary) summary.setAttribute("aria-expanded", false); + triggerToggle(this); + } + return result; + } + return call(); + } + } + }); + } + function polyfillToggle() { + onTogglingTrigger(function(element) { + element.hasAttribute("open") ? element.removeAttribute("open") : element.setAttribute("open", ""); + }); + } + function polyfillToggleEvent() { + if (window.MutationObserver) { + new MutationObserver(function(mutations) { + forEach.call(mutations, function(mutation) { + var target = mutation.target, attributeName = mutation.attributeName; + if (target.tagName == "DETAILS" && attributeName == "open") { + triggerToggle(target); + } + }); + }).observe(document.documentElement, { + attributes: true, + subtree: true + }); + } else { + onTogglingTrigger(function(element) { + var wasOpen = element.getAttribute("open"); + setTimeout(function() { + var isOpen = element.getAttribute("open"); + if (wasOpen != isOpen) { + triggerToggle(element); + } + }, 1); + }); + } + } + function polyfillAccessibility() { + setAccessibilityAttributes(document); + if (window.MutationObserver) { + new MutationObserver(function(mutations) { + forEach.call(mutations, function(mutation) { + forEach.call(mutation.addedNodes, setAccessibilityAttributes); + }); + }).observe(document.documentElement, { + subtree: true, + childList: true + }); + } else { + document.addEventListener("DOMNodeInserted", function(event) { + setAccessibilityAttributes(event.target); + }); + } + } + function setAccessibilityAttributes(root) { + findElementsWithTagName(root, "SUMMARY").forEach(function(summary) { + var details = findClosestElementWithTagName(summary, "DETAILS"); + summary.setAttribute("aria-expanded", details.hasAttribute("open")); + if (!summary.hasAttribute("tabindex")) summary.setAttribute("tabindex", "0"); + if (!summary.hasAttribute("role")) summary.setAttribute("role", "button"); + }); + } + function eventIsSignificant(event) { + return !(event.defaultPrevented || event.ctrlKey || event.metaKey || event.shiftKey || event.target.isContentEditable); + } + function onTogglingTrigger(callback) { + addEventListener("click", function(event) { + if (eventIsSignificant(event)) { + if (event.which <= 1) { + var element = findClosestElementWithTagName(event.target, "SUMMARY"); + if (element && element.parentNode && element.parentNode.tagName == "DETAILS") { + callback(element.parentNode); + } + } + } + }, false); + addEventListener("keydown", function(event) { + if (eventIsSignificant(event)) { + if (event.keyCode == 13 || event.keyCode == 32) { + var element = findClosestElementWithTagName(event.target, "SUMMARY"); + if (element && element.parentNode && element.parentNode.tagName == "DETAILS") { + callback(element.parentNode); + event.preventDefault(); + } + } + } + }, false); + } + function triggerToggle(element) { + var event = document.createEvent("Event"); + event.initEvent("toggle", false, false); + element.dispatchEvent(event); + } + function findElementsWithTagName(root, tagName) { + return (root.tagName == tagName ? [ root ] : []).concat(typeof root.getElementsByTagName == "function" ? slice.call(root.getElementsByTagName(tagName)) : []); + } + function findClosestElementWithTagName(element, tagName) { + if (typeof element.closest == "function") { + return element.closest(tagName); + } else { + while (element) { + if (element.tagName == tagName) { + return element; + } else { + element = element.parentNode; + } + } + } + } + })();
\ No newline at end of file diff --git a/assets/js/editor.js b/assets/js/editor.js new file mode 100644 index 0000000..61e535d --- /dev/null +++ b/assets/js/editor.js @@ -0,0 +1,14 @@ +$(function() { + if($('#wmd-button-row').length>0){ + $('#wmd-button-row').append('<li class="wmd-spacer wmd-spacer1"></li><li class="wmd-button" id="wmd-owo-button" style="" title="插入表情"><span class="OwO"></span></li>'); + var owo = new OwO({ + logo: 'OωO', + container: document.getElementsByClassName('OwO')[0], + target: document.getElementById('text'), + api: '/usr/themes/Miracles/assets/OwO.json', + position: 'down', + width: '400px', + maxHeight: '250px' + }); + } +});
\ No newline at end of file diff --git a/assets/js/gazeimg.js b/assets/js/gazeimg.js new file mode 100644 index 0000000..2edf649 --- /dev/null +++ b/assets/js/gazeimg.js @@ -0,0 +1,322 @@ +// ================================================== +// GazeImg v1.4.1 +// +// 采用 GPLv3 许可证供开源使用 +// 或用于商业用途的 GazeImg 商业许可证 +// 所有商业应用程序(包括您计划出售的网站,主题和应用程序) +// 都需要具有商业许可证。 +// +// Licensed GPLv3 for open source use +// or GazeImg Commercial License for commercial use +// +// http://www.ganxiaozhe.com/p/gazeimg/ +// Copyright 2020 Ganxiaozhe +// +// +// 根据 GPLv3 协议,下面是对此文件的修改说明 +// + 添加对 ReferrerPolicy 的支持以便绕过同源检测 => Line: 294 +// -- @kengwang at 2020/07/16 +// +// ================================================== +;(function($,window,document){ + 'use strict'; + + if(!$) {return '缺少JQuery!';} + let g = {t:{}}; + g.colors = [ + "linear-gradient(to right, #C3E1CA, #E6E1BD)","linear-gradient(to right, #D4D3DD, #EFEFBB)", + "linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%)","linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%)", + "linear-gradient(to bottom, rgba(255,255,255,0.15) 0%, rgba(0,0,0,0.15) 100%)", + "linear-gradient(to top, #c1dfc4 0%, #deecdd 100%)","linear-gradient(to top, #d5d4d0 0%, #d5d4d0 1%, #eeeeec 31%, #efeeec 75%, #e9e9e7 100%);" + ]; + + function sizeHandle(opts){ + if(typeof opts!='object'){return false;} + + for (var val in opts){ + opts[val] = parseInt( String(opts[val]).replace(/px/,'') ); + } + opts.w <= 0 || isNaN(opts.w) && (opts.w=128); + opts.h <= 0 || isNaN(opts.h) && (opts.h=128); + + if( opts.w<opts.rw && opts.h<opts.rh ){return opts;} + + if(opts.w >= opts.rw && opts.w >= opts.h){ + opts.h = opts.rw / opts.w * opts.h; + opts.w = opts.rw; + } + if(opts.h > opts.rh && opts.h > opts.w){ + opts.w = opts.rh / opts.h * opts.w; + opts.h = opts.rh; + } + return opts; + } + + $.fn.giLazy = function(data){ + let t = {}; + data || (data = {}); + data.colors || (data.colors=["#000"]); + + this.each(function(){ + let timg = {}; + timg.pw = $(this).parent().width(); + timg.ph = $(this).parent().height(); + + t.gisize = 0; + t.gsrc = $(this).attr('data-gisrc').split(' '); + $(this).attr('data-gisrc',t.gsrc[0]); + if(t.gsrc[1] && t.gsrc[1].indexOf('size') > -1){ + t.gisize = t.gsrc[1].replace(/size='(.*?)'/g,'$1').split(','); + + var ti_s = sizeHandle({ + w:t.gisize[0],h:t.gisize[1], + rw:timg.pw,rh:timg.ph + }); + $(this).width(ti_s.w).height(ti_s.h); + } + + // 是否有src数据,若无则替换为div蒙版 + timg.src = $(this).attr('src') || false; + if(!timg.src){ + // 获取图片具有的css信息即其父元素的长宽 来决定替代图片的遮罩层尺寸 + timg.disp = $(this).css("display"); + + timg.msize = $(this).attr('gimask-size') || false; + if(timg.msize){ + timg.msize = timg.msize.split(','); + } else {timg.msize = [];} + typeof timg.msize[0]=='undefined' && (timg.msize[0]=false); + typeof timg.msize[1]=='undefined' && (timg.msize[1]=false); + + if(t.gisize!=0){ + timg.w = t.gisize[0]; + timg.h = t.gisize[1]; + } + timg.w = timg.msize[0] || $(this).width(); + timg.h = timg.msize[1] || $(this).height(); + + var ti_s = sizeHandle({ + w:timg.w,h:timg.h, + rw:timg.pw,rh:timg.ph + }); + timg.w = ti_s.w+'px';timg.h = ti_s.h+'px'; + + // 若图片display被设置为了inline 则将遮罩层设为inline-flex 否则继承图片display + timg.disp == "inline" ? timg.tdisp = "inline-flex" : timg.tdisp = timg.disp; + timg.tdisp = timg.tdisp.replace(/block/,'flex'); + timg.css = "width:"+timg.w+";height:"+timg.h+";background:"+data.colors[Math.floor(Math.random()*data.colors.length)]+";"; + + timg.css += "display:"+timg.tdisp; + $(this).attr('data-disp',timg.disp).css({"display":"none"}).after('<div class="gi-darken" style="'+timg.css+'"><a href="//ganxiaozhe.com/p/gazeimg/" target="_blank"><div class="gilazy-loader gi-spin"></div></a></div>'); + } else { + $(this).addClass('gi-darken'); + } + + if( $(this).attr('data-gazeimg')!=undefined ){$(this).giPrePop();} + }).attr('data-gi-init',''); + + setTimeout(()=>{$(window).scroll();},200); + + return this; + }; + + $.fn.giPrePop = function(){ + let t = {}; + this.on("click",function(){ + t.src = $(this).attr('src') || $(this).attr('data-gazeimg'); + if(!t.src){return;} + + t.stage = "<div class='gazeimg-container gi-fadeIn'><div class='gazeimg-bg'></div><div class='gazeimg-inner'><div class='gazeimg-nav'></div><div class='gazeimg-stage'><div class='gazeimg-content'><div class='loader gi-spin'></div></div></div></div><div class='gazeimg-thumbs'></div></div>"; + $('body').append(t.stage).addClass('gazeimg-nobar'); + + g.t.gcc=0; + $('.gazeimg-container').on({ + touchstart: function(e){ + g.t.gcc=1; + let elem = e.originalEvent.target || e.target; + if($(elem).is('.gazeimg-content') || $(elem).is('.gazeimg-content *')){ + return; + } + giStageClose();g.t.gcc=0; + }, + mouseup: function(e){ + if(g.t.gcc==1){return;} + let elem = e.target; + if($(elem).is('.gazeimg-content') || $(elem).is('.gazeimg-content *')){ + return; + } + giStageClose(); + } + }); + + t.i = new Image(); + t.i.src = t.src; + if(t.i.complete){giShow(t.i);} else { + t.i.onload = function(){giShow(this);} + } + }); + }; + + function giShow(img){ + g.itemp = {}; + g.itemp.rw = img.width;g.itemp.rh = img.height; + giSizeInit(img); + + $('.gazeimg-content').html('<img src="'+img.src+'">'); + $('.gazeimg-content').on({ + mousedown: function(e){ + if(e.which == 3){return;} + g.itemp.cd = true;g.itemp.clkt = 1; + $('.gazeimg-content img').css("cursor","grabbing"); + + g.t.dx = e.pageX,g.t.dy = e.pageY; + g.t.tran = $('.gazeimg-content').css('transform').replace(/[^0-9\-,]/g,'').split(','); + if(g.t.tran.length!=6) {g.t.tran = [0,0,0,0,0,0];} + }, + mouseleave:function(){ + g.itemp.cd = false; + }, + mousemove: function(e){ + if(!g.itemp.cd) {return;} + g.itemp.cd = 'moving';e.preventDefault(); + + g.t.x = parseInt(g.t.tran[4]) + e.pageX - g.t.dx; + g.t.y = parseInt(g.t.tran[5]) + e.pageY - g.t.dy; + + $('.gazeimg-content').css({'transform':'translate('+g.t.x+'px,'+g.t.y+'px)'}); + }, + mouseup: function(e){ + if(e.which == 3 || g.itemp.clkt == 2){return;} + if(g.itemp.cd!='moving'){giShowEnd();} + + g.itemp.cd = false;$('.gazeimg-content img').css("cursor","grab"); + }, + touchstart:function(e){ + g.itemp.cd = true;g.itemp.clkt++; + + g.t.dx = e.originalEvent.changedTouches[0].pageX; + g.t.dy = e.originalEvent.changedTouches[0].pageY; + g.t.tran = $('.gazeimg-content').css('transform').replace(/[^0-9\-,]/g,'').split(','); + if(g.t.tran.length!=6) {g.t.tran = [0,0,0,0,0,0];} + }, + touchmove:function(e) { + if(!g.itemp.cd) {return;} + g.itemp.cd = 'moving';e.preventDefault(); + + g.t.x = parseInt(g.t.tran[4]) + e.originalEvent.changedTouches[0].pageX - g.t.dx; + g.t.y = parseInt(g.t.tran[5]) + e.originalEvent.changedTouches[0].pageY - g.t.dy; + + $('.gazeimg-content').css({'transform':'translate('+g.t.x+'px,'+g.t.y+'px)'}); + }, + touchend:function(){ + if(g.itemp.cd!='moving' && g.itemp.clkt==1){giShowEnd();} + g.itemp.cd = false; + } + }); + function giShowEnd(){ + let t = {tgt:0}; + t.gzoom = $('.gazeimg-content').attr('data-gzoom') || ''; + + if(t.gzoom=='out') { + $('.gazeimg-content').css({'transform':'translate('+g.itemp.left+'px,'+g.itemp.top+'px) scale(1,1)'}); + $('.gazeimg-content').height(g.itemp.h).width(g.itemp.w).attr({'data-rlong':'y','data-gzoom':'in'}); + t.tgt++; + } + if( (g.itemp.rw > g.ww || g.itemp.rh > g.wh) && t.gzoom!='out' ){ + $('.gazeimg-content').css({'transform':'translate('+0+'px,'+0+'px) scale(1,1)'}); + $('.gazeimg-content').height(g.itemp.rh).width(g.itemp.rw).attr({'data-rlong':'n','data-gzoom':'out'}); + t.tgt++; + } + if(t.tgt==0){giStageClose();} + } + } + function giSizeInit(img){ + if(!g.itemp) {return false;} + + g.ww = window.innerWidth;g.wh = window.innerHeight; + g.sw = $('.gazeimg-stage').width();g.sh = $('.gazeimg-stage').height(); + + if(!img) {img = $('.gazeimg-content img')[0];} + g.itemp = giSizeProcess(img); + + $('.gazeimg-content').height(g.itemp.h).width(g.itemp.w); + + $('.gazeimg-content').css({'transform':'translate('+g.itemp.left+'px,'+g.itemp.top+'px) scale(1,1)'}); + } + function giStageClose(){ + $('.gazeimg-content').height(0).width(0); + $('.gazeimg-container').fadeOut(500,function(){ + $(this).remove(); + $('body').removeClass('gazeimg-nobar'); + }); + } + + function giSizeProcess(img){ + let t = {}; + g.sw = $('.gazeimg-stage').width();g.sh = $('.gazeimg-stage').height(); + + t = sizeHandle({ + w:g.itemp.rw,h:g.itemp.rh, + rw:g.sw,rh:g.sh + }); + t.rw = g.itemp.rw,t.rh = g.itemp.rh; + + if(t.w > g.sw) { + t.w = g.sw;t.h = t.w / t.rw * t.rh; + } + if(t.h > g.sh) { + t.h = g.sh;t.w = t.h / t.rh * t.rw; + } + + // 获取图片相对于屏幕的各数据 + t.left = parseInt((g.ww - t.w) / 2);t.top = parseInt((g.wh - t.h) / 2); + + return t; + } + + $(window).resize(function(){giSizeInit();}); + $('img[data-gisrc]:not([data-gi-init])').giLazy({'colors':g.colors}); +})(jQuery,window,document); + +$(window).scroll(function(){ + let t = {}; + t.deh = document.documentElement.clientHeight; + $('img[data-gi-init]').each(function(){ + if( $(this).next(".gi-darken").length > 0 ){ + t.ietop = $(this).next(".gi-darken")[0].getBoundingClientRect().top; + } else { + t.ietop = $(this)[0].getBoundingClientRect().top; + } + + if( t.ietop < t.deh ){ + let i = new Image(); + i.src = $(this).attr('data-gisrc'); + if (this.referrerPolicy==="no-referrer"){ + i.referrerPolicy="no-referrer"; + } + i.obj = $(this); + + if (i.complete) {icomplete(i.obj);return;}; + i.onerror = function(){ + if( i.obj.next(".gi-darken").length > 0 ){ + i.obj.next(".gi-darken").html('<a href="'+i.src+'" target="_blank">图片 '+i.src+' 加载失败;</a>').css({'background':'#000'}); + } + i.obj.removeAttr('data-gisrc').removeAttr('data-gi-init'); + + i = i.onload = i.onerror = null; + }; + i.onload = function(){ + icomplete(i.obj);i = i.onload = i.onerror = null; + }; + } + }); + + function icomplete(obj){ + obj.next(".gi-darken").remove(); + obj.attr({"src":obj.attr('data-gisrc')}).css({"display":obj.attr('data-disp')}).addClass('gi-fadeIn'); + obj.removeAttr('data-gisrc').removeAttr('data-gi-init'); + setTimeout(()=>{ + obj.css({filter:"brightness(1)"}); + },200); + } +}); diff --git a/assets/js/highlight-line-number.js b/assets/js/highlight-line-number.js new file mode 100644 index 0000000..b917690 --- /dev/null +++ b/assets/js/highlight-line-number.js @@ -0,0 +1,239 @@ +// hightlight-line-number-js +(function (w, d) { + 'use strict'; + + var TABLE_NAME = 'hljs-ln', + LINE_NAME = 'hljs-ln-line', + CODE_BLOCK_NAME = 'hljs-ln-code', + NUMBERS_BLOCK_NAME = 'hljs-ln-numbers', + NUMBER_LINE_NAME = 'hljs-ln-n', + DATA_ATTR_NAME = 'data-line-number', + BREAK_LINE_REGEXP = /\r\n|\r|\n/g; + if (w.hljs) { + w.hljs.initLineNumbersOnLoad = initLineNumbersOnLoad; + w.hljs.lineNumbersBlock = lineNumbersBlock; + w.hljs.lineNumbersValue = lineNumbersValue; + + addStyles(); + } else { + w.console.error('highlight.js not detected!'); + } + function isHljsLnCodeDescendant(domElt) { + var curElt = domElt; + while (curElt) { + if (curElt.className && curElt.className.indexOf('hljs-ln-code') !== -1) { + return true; + } + curElt = curElt.parentNode; + } + return false; + } + + function getHljsLnTable(hljsLnDomElt) { + var curElt = hljsLnDomElt; + while (curElt.nodeName !== 'TABLE') { + curElt = curElt.parentNode; + } + return curElt; + } + function edgeGetSelectedCodeLines(selection) { + var selectionText = selection.toString(); + var tdAnchor = selection.anchorNode; + while (tdAnchor.nodeName !== 'TD') { + tdAnchor = tdAnchor.parentNode; + } + var tdFocus = selection.focusNode; + while (tdFocus.nodeName !== 'TD') { + tdFocus = tdFocus.parentNode; + } + var firstLineNumber = parseInt(tdAnchor.dataset.lineNumber); + var lastLineNumber = parseInt(tdFocus.dataset.lineNumber); + if (firstLineNumber != lastLineNumber) { + + var firstLineText = tdAnchor.textContent; + var lastLineText = tdFocus.textContent; + if (firstLineNumber > lastLineNumber) { + var tmp = firstLineNumber; + firstLineNumber = lastLineNumber; + lastLineNumber = tmp; + tmp = firstLineText; + firstLineText = lastLineText; + lastLineText = tmp; + } + while (selectionText.indexOf(firstLineText) !== 0) { + firstLineText = firstLineText.slice(1); + } + while (selectionText.lastIndexOf(lastLineText) === -1) { + lastLineText = lastLineText.slice(0, -1); + } + var selectedText = firstLineText; + var hljsLnTable = getHljsLnTable(tdAnchor); + for (var i = firstLineNumber + 1 ; i < lastLineNumber ; ++i) { + var codeLineSel = format('.{0}[{1}="{2}"]', [CODE_BLOCK_NAME, DATA_ATTR_NAME, i]); + var codeLineElt = hljsLnTable.querySelector(codeLineSel); + selectedText += '\n' + codeLineElt.textContent; + } + selectedText += '\n' + lastLineText; + return selectedText; + } else { + return selectionText; + } + } + document.addEventListener('copy', function(e) { + var selection = window.getSelection(); + if (isHljsLnCodeDescendant(selection.anchorNode)) { + var selectionText; + if (window.navigator.userAgent.indexOf("Edge") !== -1) { + selectionText = edgeGetSelectedCodeLines(selection); + } else { + selectionText = selection.toString(); + } + e.clipboardData.setData('text/plain', selectionText); + e.preventDefault(); + } + }); + function addStyles () { + var css = d.createElement('style'); + css.type = 'text/css'; + css.innerHTML = format( + '.{0}{border-collapse:collapse}' + + '.{0} td{padding:0}' + + '.{1}:before{content:attr({2})}', + [ + TABLE_NAME, + NUMBER_LINE_NAME, + DATA_ATTR_NAME + ]); + d.getElementsByTagName('head')[0].appendChild(css); + } + function initLineNumbersOnLoad (options) { + if (d.readyState === 'interactive' || d.readyState === 'complete') { + documentReady(options); + } else { + w.addEventListener('DOMContentLoaded', function () { + documentReady(options); + }); + } + } + function documentReady (options) { + try { + var blocks = d.querySelectorAll('code.hljs,code.nohighlight'); + + for (var i in blocks) { + if (blocks.hasOwnProperty(i)) { + lineNumbersBlock(blocks[i], options); + } + } + } catch (e) { + w.console.error('LineNumbers error: ', e); + } + } + function lineNumbersBlock (element, options) { + if (typeof element !== 'object') return; + + async(function () { + element.innerHTML = lineNumbersInternal(element, options); + }); + } + function lineNumbersValue (value, options) { + if (typeof value !== 'string') return; + + var element = document.createElement('code') + element.innerHTML = value + + return lineNumbersInternal(element, options); + } + function lineNumbersInternal (element, options) { + options = options || { + singleLine: false + }; + var firstLineIndex = !!options.singleLine ? 0 : 1; + + duplicateMultilineNodes(element); + + return addLineNumbersBlockFor(element.innerHTML, firstLineIndex); + } + + function addLineNumbersBlockFor (inputHtml, firstLineIndex) { + + var lines = getLines(inputHtml); + if (lines[lines.length-1].trim() === '') { + lines.pop(); + } + + if (lines.length > firstLineIndex) { + var html = ''; + + for (var i = 0, l = lines.length; i < l; i++) { + html += format( + '<tr>' + + '<td class="{0} {1}" {3}="{5}">' + + '<div class="{2}" {3}="{5}"></div>' + + '</td>' + + '<td class="{0} {4}" {3}="{5}">' + + '{6}' + + '</td>' + + '</tr>', + [ + LINE_NAME, + NUMBERS_BLOCK_NAME, + NUMBER_LINE_NAME, + DATA_ATTR_NAME, + CODE_BLOCK_NAME, + i + 1, + lines[i].length > 0 ? lines[i] : ' ' + ]); + } + + return format('<table class="{0}">{1}</table>', [ TABLE_NAME, html ]); + } + + return inputHtml; + } + function duplicateMultilineNodes (element) { + var nodes = element.childNodes; + for (var node in nodes) { + if (nodes.hasOwnProperty(node)) { + var child = nodes[node]; + if (getLinesCount(child.textContent) > 0) { + if (child.childNodes.length > 0) { + duplicateMultilineNodes(child); + } else { + duplicateMultilineNode(child.parentNode); + } + } + } + } + } + function duplicateMultilineNode (element) { + var className = element.className; + + if ( ! /hljs-/.test(className)) return; + + var lines = getLines(element.innerHTML); + + for (var i = 0, result = ''; i < lines.length; i++) { + var lineText = lines[i].length > 0 ? lines[i] : ' '; + result += format('<span class="{0}">{1}</span>\n', [ className, lineText ]); + } + + element.innerHTML = result.trim(); + } + function getLines (text) { + if (text.length === 0) return []; + return text.split(BREAK_LINE_REGEXP); + } + + function getLinesCount (text) { + return (text.trim().match(BREAK_LINE_REGEXP) || []).length; + } + + function async (func) { + w.setTimeout(func, 0); + } + function format (format, args) { + return format.replace(/\{(\d+)\}/g, function(m, n){ + return args[n] ? args[n] : m; + }); + } +}(window, document));
\ No newline at end of file diff --git a/assets/js/highlight.js b/assets/js/highlight.js new file mode 100644 index 0000000..3977f46 --- /dev/null +++ b/assets/js/highlight.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.15.10 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],u=Object.keys,N={},c={},n=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="</span>",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function E(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function l(e){return n.test(e)}function g(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function R(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),E(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(o){function s(e){return e&&e.source||e}function c(e,n){return new RegExp(s(e),"m"+(o.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){function r(t,e){o.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");a[n[0]]=[t,n[1]?Number(n[1]):1]})}var a={};"string"==typeof t.k?r("keyword",t.k):u(t.k).forEach(function(e){r(e,t.k[e])}),t.k=a}t.lR=c(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=c(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=c(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=c(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return function(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return g(n,{v:null},e)})),n.cached_variants||n.eW&&[g(n)]||[n]}("self"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?c(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var o=r,c=s(e[i]);for(0<i&&(a+=n);0<c.length;){var u=t.exec(c);if(null==u){a+=c;break}a+=c.substring(0,u.index),c=c.substring(u.index+u[0].length),"\\"==u[0][0]&&u[1]?a+="\\"+String(Number(u[1])+o):(a+=u[0],"("==u[0]&&r++)}}return a}(i,"|"),!0):{exec:function(){return null}}}}(o)}function C(e,n,i,t){function c(e,n,t,r){var a='<span class="'+(r?"":h.classPrefix);return e?(a+=e+'">')+n+(t?"":b):n}function o(){E+=null!=l.sL?function(){var e="string"==typeof l.sL;if(e&&!N[l.sL])return _(g);var n=e?C(l.sL,g,!0,f[l.sL]):O(g,l.sL.length?l.sL:void 0);return 0<l.r&&(R+=n.r),e&&(f[l.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!l.k)return _(g);for(r="",n=0,l.lR.lastIndex=0,t=l.lR.exec(g);t;)r+=_(g.substring(n,t.index)),a=l,i=t,void 0,o=s.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(R+=e[1],r+=c(e[0],_(t[0]))):r+=_(t[0]),n=l.lR.lastIndex,t=l.lR.exec(g);return r+_(g.substr(n))}(),g=""}function u(e){E+=e.cN?c(e.cN,"",!0):"",l=Object.create(e,{parent:{value:l}})}function r(e,n){if(g+=e,null==n)return o(),0;var t=function(e,n){var t,r,a;for(t=0,r=n.c.length;t<r;t++)if(v(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=(a=n.c[t].bR.exec(e)[0],new RegExp(a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m"))),n.c[t]}(n,l);if(t)return t.skip?g+=n:(t.eB&&(g+=n),o(),t.rB||t.eB||(g=n)),u(t),t.rB?0:n.length;var r=function e(n,t){if(v(n.eR,t)){for(;n.endsParent&&n.parent;)n=n.parent;return n}if(n.eW)return e(n.parent,t)}(l,n);if(r){var a=l;for(a.skip?g+=n:(a.rE||a.eE||(g+=n),o(),a.eE&&(g=n));l.cN&&(E+=b),l.skip||l.sL||(R+=l.r),(l=l.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}if(function(e,n){return!i&&v(n.iR,e)}(n,l))throw new Error('Illegal lexeme "'+n+'" for mode "'+(l.cN||"<unnamed>")+'"');return g+=n,n.length||1}var s=B(e);if(!s)throw new Error('Unknown language: "'+e+'"');m(s);var a,l=t||s,f={},E="";for(a=l;a!==s;a=a.parent)a.cN&&(E=c(a.cN,"",!0)+E);var g="",R=0;try{for(var d,p,M=0;l.t.lastIndex=M,d=l.t.exec(n);)p=r(n.substring(M,d.index),d[0]),M=d.index+p;for(r(n.substr(M)),a=l;a.parent;a=a.parent)a.cN&&(E+=b);return{r:R,value:E,language:e,top:l}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(B).filter(M).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function d(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"<br>":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function o(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=s.exec(i))return B(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n<r;n++)if(l(a=i[n])||B(a))return a}(e);l(o)||(h.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=e,i=n.textContent,r=o?C(o,i,!0):O(i),(t=R(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){a+="<"+E(e)+f.map.call(e.attributes,function(e){return" "+e.nodeName+'="'+_(e.value).replace('"',""")+'"'}).join("")+">"}function u(e){a+="</"+E(e)+">"}function s(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var l=o();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=o())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(c)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,R(a),i)),r.value=d(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function p(){if(!p.called){p.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,o)}}function B(e){return e=(e||"").toLowerCase(),N[e]||N[c[e]]}function M(e){var n=B(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=d,a.highlightBlock=o,a.configure=function(e){h=g(h,e)},a.initHighlighting=p,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",p,!1),addEventListener("load",p,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=B,a.autoDetection=M,a.inherit=g,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php","php3","php4","php5","php6","php7"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("dos",function(e){var r=e.C(/^\s*@?rem\b/,/$/,{r:10});return{aliases:["bat","cmd"],cI:!0,i:/\/\*/,k:{keyword:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",built_in:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux shift cd dir echo setlocal endlocal set pause copy append assoc at attrib break cacls cd chcp chdir chkdsk chkntfs cls cmd color comp compact convert date dir diskcomp diskcopy doskey erase fs find findstr format ftype graftabl help keyb label md mkdir mode more move path pause print popd pushd promt rd recover rem rename replace restore rmdir shiftsort start subst time title tree type ver verify vol ping net ipconfig taskkill xcopy ren del"},c:[{cN:"variable",b:/%%[^ ]|%[^ ]+?%|![^ ]+?!/},{cN:"function",b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)",e:"goto:eof",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),r]},{cN:"number",b:"\\b\\d+",r:0},r]}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[e.BE,b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[e.BE,b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,c]},{b:/(fr|rf|f)"/,e:/"/,c:[e.BE,c]},e.ASM,e.QSM]},i={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},l={cN:"params",b:/\(/,e:/\)/,c:["self",b,i,a]};return c.c=[a,i,b],{aliases:["py","gyp","ipython"],k:r,i:/(<\/|->|\?)|=>/,c:[b,i,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,l,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="("+t+"[:=]"+t+"|[ \\t\\f]+)",s="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",n="([^\\\\:= \\t\\f\\n]|\\\\.)+",a={e:e,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:s+e,rB:!0,c:[{cN:"attr",b:s,endsParent:!0,r:0}],starts:a},{b:n+e,rB:!0,r:0,c:[{cN:"meta",b:n,endsParent:!0,r:0}],starts:a},{cN:"attr",r:0,b:n+t+"$"}]}});hljs.registerLanguage("less",function(e){function r(e){return{cN:"string",b:"~?"+e+".*?"+e}}function t(e,r,t){return{cN:e,b:r,r:t}}var a="[\\w-]+",c="("+a+"|@{"+a+"})",s=[],b=[],n={b:"\\(",e:"\\)",c:b,r:0};b.push(e.CLCM,e.CBCM,r("'"),r('"'),e.CSSNM,{b:"(url|data-uri)\\(",starts:{cN:"string",e:"[\\)\\n]",eE:!0}},t("number","#[0-9A-Fa-f]+\\b"),n,t("variable","@@?"+a,10),t("variable","@{"+a+"}"),t("built_in","~?`[^`]*?`"),{cN:"attribute",b:a+"\\s*:",e:":",rB:!0,eE:!0},{cN:"meta",b:"!important"});var i=b.concat({b:"{",e:"}",c:s}),o={bK:"when",eW:!0,c:[{bK:"and not"}].concat(b)},u={b:c+"\\s*:",rB:!0,e:"[;}]",r:0,c:[{cN:"attribute",b:c,e:":",eE:!0,starts:{eW:!0,i:"[<=$]",r:0,c:b}}]},l={cN:"keyword",b:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{e:"[;{}]",rE:!0,c:b,r:0}},C={cN:"variable",v:[{b:"@"+a+"\\s*:",r:15},{b:"@"+a}],starts:{e:"[;}]",rE:!0,c:i}},p={v:[{b:"[\\.#:&\\[>]",e:"[;{}]"},{b:c,e:"{"}],rB:!0,rE:!0,i:"[<='$\"]",r:0,c:[e.CLCM,e.CBCM,o,t("keyword","all\\b"),t("variable","@{"+a+"}"),t("selector-tag",c+"%?",0),t("selector-id","#"+c),t("selector-class","\\."+c,0),t("selector-tag","&",0),{cN:"selector-attr",b:"\\[",e:"\\]"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"\\(",e:"\\)",c:i},{b:"!important"}]};return s.push(e.CLCM,e.CBCM,l,C,u,p),{cI:!0,i:"[=>'/<($\"]",c:s}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("objectivec",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,_="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:{keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},l:t,i:"</",c:[{cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.CLCM,e.CBCM,e.CNM,e.QSM,{cN:"string",v:[{b:'@"',e:'"',i:"\\n",c:[e.BE]},{b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"}]},{cN:"meta",b:"#",e:"$",c:[{cN:"meta-string",v:[{b:'"',e:'"'},{b:"<",e:">"}]}]},{cN:"class",b:"("+_.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:_,l:t,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,{cN:"",b:/\\"/},{cN:"string",b:/'/,e:/'/},t]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\w+/,endSameAsBegin:!0,c:[e.BE,n]}]}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d;var l=[{b:/^\s*=>/,starts:{e:"$",c:i.c=d}},{cN:"meta",b:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(l).concat(d)}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:a+r+":"},{b:a+'"'+r+'":'},{b:a+"'"+r+"':"}]},c={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,{cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]}]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:c.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!"+e.UIR},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},e.HCM,{bK:b,k:{literal:b}},e.CNM,c]}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+n},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(i)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:i.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[s,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("css",function(e){var c={b:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:"[a-zA-Z-][a-zA-Z0-9_-]*",r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,c]}]}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"</",c:[e.CLCM,e.CBCM,{cN:"string",v:[e.QSM,{b:"'",e:"[^\\\\]'"},{b:"`",e:"`"}]},{cN:"number",v:[{b:e.CNR+"[i]",r:1},e.CNM]},{b:/:=/},{cN:"function",bK:"func",e:/\s*\{/,eE:!0,c:[e.TM,{cN:"params",b:/\(/,e:/\)/,k:t,i:/["']/}]}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("basic",function(E){return{cI:!0,i:"^.",l:"[a-zA-Z][a-zA-Z0-9_$%!#]*",k:{keyword:"ABS ASC AND ATN AUTO|0 BEEP BLOAD|10 BSAVE|10 CALL CALLS CDBL CHAIN CHDIR CHR$|10 CINT CIRCLE CLEAR CLOSE CLS COLOR COM COMMON CONT COS CSNG CSRLIN CVD CVI CVS DATA DATE$ DEFDBL DEFINT DEFSNG DEFSTR DEF|0 SEG USR DELETE DIM DRAW EDIT END ENVIRON ENVIRON$ EOF EQV ERASE ERDEV ERDEV$ ERL ERR ERROR EXP FIELD FILES FIX FOR|0 FRE GET GOSUB|10 GOTO HEX$ IF|0 THEN ELSE|0 INKEY$ INP INPUT INPUT# INPUT$ INSTR IMP INT IOCTL IOCTL$ KEY ON OFF LIST KILL LEFT$ LEN LET LINE LLIST LOAD LOC LOCATE LOF LOG LPRINT USING LSET MERGE MID$ MKDIR MKD$ MKI$ MKS$ MOD NAME NEW NEXT NOISE NOT OCT$ ON OR PEN PLAY STRIG OPEN OPTION BASE OUT PAINT PALETTE PCOPY PEEK PMAP POINT POKE POS PRINT PRINT] PSET PRESET PUT RANDOMIZE READ REM RENUM RESET|0 RESTORE RESUME RETURN|0 RIGHT$ RMDIR RND RSET RUN SAVE SCREEN SGN SHELL SIN SOUND SPACE$ SPC SQR STEP STICK STOP STR$ STRING$ SWAP SYSTEM TAB TAN TIME$ TIMER TROFF TRON TO USR VAL VARPTR VARPTR$ VIEW WAIT WHILE WEND WIDTH WINDOW WRITE XOR"},c:[E.QSM,E.C("REM","$",{r:10}),E.C("'","$",{r:0}),{cN:"symbol",b:"^[0-9]+ ",r:10},{cN:"number",b:"\\b([0-9]+[0-9edED.]*[#!]?)",r:0},{cN:"number",b:"(&[hH][0-9a-fA-F]{1,4})"},{cN:"number",b:"(&[oO][0-7]{1,6})"}]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:"</?",e:">"},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_\.-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_\.-]+/},{b:/=/,eW:!0,r:0,c:[e.C(";","$"),e.HCM,{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("xml",function(s){var e={eW:!0,i:/</,r:0,c:[{cN:"attr",b:"[A-Za-z0-9\\._:-]+",r:0},{b:/=\s*/,r:0,c:[{cN:"string",endsParent:!0,v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf"],cI:!0,c:[{cN:"meta",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("\x3c!--","--\x3e",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{name:"style"},c:[e],starts:{e:"</style>",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{name:"script"},c:[e],starts:{e:"<\/script>",rE:!0,sL:["actionscript","javascript","handlebars","xml","vbscript"]}},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"name",b:/[^\/><\s]+/,r:0},e]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^\\s*([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:s.c=o}});hljs.registerLanguage("cs",function(e){var i={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},r={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},t={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a=e.inherit(t,{i:/\n/}),c={cN:"subst",b:"{",e:"}",k:i},n=e.inherit(c,{i:/\n/}),s={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,n]},b={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},c]},l=e.inherit(b,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},n]});c.c=[b,s,t,e.ASM,e.QSM,r,e.CBCM],n.c=[l,s,a,e.ASM,e.QSM,r,e.inherit(e.CBCM,{i:/\n/})];var o={v:[b,s,t,e.ASM,e.QSM]},d=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp","c#"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:"\x3c!--|--\x3e"},{b:"</?",e:">"}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},o,r,{bK:"class interface",e:/[{;=]/,i:/[^\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+d+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/\s*[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[o,r,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},s={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={b:"html`",e:"",starts:{e:"`",rE:!1,c:[e.BE,s],sL:"xml"}},n={b:"css`",e:"",starts:{e:"`",rE:!1,c:[e.BE,s],sL:"css"}},o={cN:"string",b:"`",e:"`",c:[e.BE,s]};s.c=[e.ASM,e.QSM,c,n,o,a,e.RM];var i=s.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,n,o,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:i}]}]},{cN:"",b:/\s/,e:/\s*/,skip:!0},{b:/</,e:/(\/[A-Za-z0-9\\._:-]+|[A-Za-z0-9\\._:-]+\/)>/,sL:"xml",c:[{b:/<[A-Za-z0-9\\._:-]+\s*\/>/,skip:!0},{b:/<[A-Za-z0-9\\._:-]+/,e:/(\/[A-Za-z0-9\\._:-]+|[A-Za-z0-9\\._:-]+\/)>/,skip:!0,c:[{b:/<[A-Za-z0-9\\._:-]+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:i}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor get set",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("profile",function(e){return{c:[e.CNM,{b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:!0},{b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{b:"function calls",e:"$",c:[e.CNM],r:10},e.ASM,e.QSM,{cN:"string",b:"\\(",e:"\\)$",eB:!0,eE:!0,r:0}]}});hljs.registerLanguage("java",function(e){var a="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",t={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("scss",function(e){var t={cN:"variable",b:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={cN:"number",b:"#[0-9A-Fa-f]+"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:"[=/|']",c:[e.CLCM,e.CBCM,{cN:"selector-id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"selector-class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"selector-attr",b:"\\[",e:"\\]",i:"$"},{cN:"selector-tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{b:":",e:";",c:[t,i,e.CSSNM,e.QSM,e.ASM,{cN:"meta",b:"!important"}]},{b:"@",e:"[{;]",k:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",c:[t,e.QSM,e.ASM,i,e.CSSNM,{b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U|L)?"',e:'"',i:"\\n",c:[t.BE]},{b:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\((?:.|\n)*?\)\1"/},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],k:c,i:"</",c:n.concat([i,{b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e,{b:/\(/,e:/\)/,k:c,r:0,c:["self",t.CLCM,t.CBCM,r,s,e]}]},t.CLCM,t.CBCM,i]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b:/</,e:/>/,c:["self"]},t.TM]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%<?\^\+\*]/}]},r={cN:"string",b:/"/,e:/"/,c:[e.BE,i]},a={cN:"variable",b:/\$\([\w-]+\s/,e:/\)/,k:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},c:[i]},n={b:"^"+e.UIR+"\\s*[:+?]?=",i:"\\n",rB:!0,c:[{b:"^"+e.UIR,e:"[:+?]?=",eE:!0}]},t={cN:"section",b:/^[^\s]+:/,e:/$/,c:[i]};return{aliases:["mk","mak"],k:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath",l:/[\w-]+/,c:[e.HCM,i,r,a,n,{cN:"meta",b:/^\.PHONY:/,e:/$/,k:{"meta-keyword":".PHONY"},l:/[\.\w]+/},t]}});hljs.registerLanguage("powershell",function(e){var t={b:"`[\\s\\S]",r:0},o={cN:"variable",v:[{b:/\$[\w\d][\w\d_:]*/}]},r={cN:"string",v:[{b:/"/,e:/"/},{b:/@"/,e:/^"@/}],c:[t,o,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},i=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:"doctag",v:[{b:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]});return{aliases:["ps"],l:/-?[A-z\.\-]+/,cI:!0,k:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catchValidateNoCircleInNodeResources ValidateNodeExclusiveResources ValidateNodeManager ValidateNodeResources ValidateNodeResourceSource ValidateNoNameNodeResources ThrowError IsHiddenResourceIsPatternMatched ",built_in:"Add-Computer Add-Content Add-History Add-JobTrigger Add-Member Add-PSSnapin Add-Type Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession Connect-WSMan Convert-Path ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString ConvertTo-Xml Copy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore Disable-JobTrigger Disable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration Disable-WSManCredSSP Disconnect-PSSession Disconnect-WSMan Disable-ScheduledJob Enable-ComputerRestore Enable-JobTrigger Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration Enable-ScheduledJob Enable-WSManCredSSP Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter Export-Csv Export-FormatData Export-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Host Get-HotFix Get-Help Get-History Get-IseSnippet Get-Item Get-ItemProperty Get-Job Get-JobTrigger Get-Location Get-Member Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-ScheduledJob Get-ScheduledJobOption Get-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture Get-Unique Get-Variable Get-Verb Get-WinEvent Get-WmiObject Get-WSManCredSSP Get-WSManInstance Group-Object Import-Alias Import-Clixml Import-Counter Import-Csv Import-IseSnippet Import-LocalizedData Import-PSSession Import-Module Invoke-AsWorkflow Invoke-Command Invoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod Invoke-WSManAction Join-Path Limit-EventLog Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Event New-EventLog New-IseSnippet New-Item New-ItemProperty New-JobTrigger New-Object New-Module New-ModuleManifest New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption New-PSTransportOption New-PSWorkflowExecutionOption New-PSWorkflowSession New-ScheduledJobOption New-Service New-TimeSpan New-Variable New-WebServiceProxy New-WinEvent New-WSManInstance New-WSManSessionOption Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Receive-Job Register-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration Register-ScheduledJob Register-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-JobTrigger Remove-Module Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable Remove-WmiObject Remove-WSManInstance Rename-Computer Rename-Item Rename-ItemProperty Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service Restore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-JobTrigger Set-Location Set-PSBreakpoint Set-PSDebug Set-PSSessionConfiguration Set-ScheduledJob Set-ScheduledJobOption Set-Service Set-StrictMode Set-TraceSource Set-Variable Set-WmiInstance Set-WSManInstance Set-WSManQuickConfig Show-Command Show-ControlPanelItem Show-EventLog Sort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript Suspend-Job Suspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration Unregister-ScheduledJob Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress Write-Verbose Write-Warning Add-MDTPersistentDrive Disable-MDTMonitorService Enable-MDTMonitorService Get-MDTDeploymentShareStatistics Get-MDTMonitorData Get-MDTOperatingSystemCatalog Get-MDTPersistentDrive Import-MDTApplication Import-MDTDriver Import-MDTOperatingSystem Import-MDTPackage Import-MDTTaskSequence New-MDTDatabase Remove-MDTMonitorData Remove-MDTPersistentDrive Restore-MDTPersistentDrive Set-MDTMonitorData Test-MDTDeploymentShare Test-MDTMonitorData Update-MDTDatabaseSchema Update-MDTDeploymentShare Update-MDTLinkedDS Update-MDTMedia Add-VamtProductKey Export-VamtData Find-VamtManagedMachine Get-VamtConfirmationId Get-VamtProduct Get-VamtProductKey Import-VamtData Initialize-VamtData Install-VamtConfirmationId Install-VamtProductActivation Install-VamtProductKey Update-VamtProduct Add-CIDatastore Add-KeyManagementServer Add-NodeKeys Add-NsxDynamicCriteria Add-NsxDynamicMemberSet Add-NsxEdgeInterfaceAddress Add-NsxFirewallExclusionListMember Add-NsxFirewallRuleMember Add-NsxIpSetMember Add-NsxLicense Add-NsxLoadBalancerPoolMember Add-NsxLoadBalancerVip Add-NsxSecondaryManager Add-NsxSecurityGroupMember Add-NsxSecurityPolicyRule Add-NsxSecurityPolicyRuleGroup Add-NsxSecurityPolicyRuleService Add-NsxServiceGroupMember Add-NsxTransportZoneMember Add-PassthroughDevice Add-VDSwitchPhysicalNetworkAdapter Add-VDSwitchVMHost Add-VMHost Add-VMHostNtpServer Add-VirtualSwitchPhysicalNetworkAdapter Add-XmlElement Add-vRACustomForm Add-vRAPrincipalToTenantRole Add-vRAReservationNetwork Add-vRAReservationStorage Clear-NsxEdgeInterface Clear-NsxManagerTimeSettings Compress-Archive Connect-CIServer Connect-CisServer Connect-HCXServer Connect-NIServer Connect-NsxLogicalSwitch Connect-NsxServer Connect-NsxtServer Connect-SrmServer Connect-VIServer Connect-Vmc Connect-vRAServer Connect-vRNIServer ConvertFrom-Markdown ConvertTo-MOFInstance Copy-DatastoreItem Copy-HardDisk Copy-NsxEdge Copy-VDisk Copy-VMGuestFile Debug-Runspace Disable-NsxEdgeSsh Disable-RunspaceDebug Disable-vRNIDataSource Disconnect-CIServer Disconnect-CisServer Disconnect-HCXServer Disconnect-NsxLogicalSwitch Disconnect-NsxServer Disconnect-NsxtServer Disconnect-SrmServer Disconnect-VIServer Disconnect-Vmc Disconnect-vRAServer Disconnect-vRNIServer Dismount-Tools Enable-NsxEdgeSsh Enable-RunspaceDebug Enable-vRNIDataSource Expand-Archive Export-NsxObject Export-SpbmStoragePolicy Export-VApp Export-VDPortGroup Export-VDSwitch Export-VMHostProfile Export-vRAIcon Export-vRAPackage Find-Command Find-DscResource Find-Module Find-NsxWhereVMUsed Find-Package Find-PackageProvider Find-RoleCapability Find-Script Format-Hex Format-VMHostDiskPartition Format-XML Generate-VersionInfo Get-AdvancedSetting Get-AlarmAction Get-AlarmActionTrigger Get-AlarmDefinition Get-Annotation Get-CDDrive Get-CIAccessControlRule Get-CIDatastore Get-CINetworkAdapter Get-CIRole Get-CIUser Get-CIVApp Get-CIVAppNetwork Get-CIVAppStartRule Get-CIVAppTemplate Get-CIVM Get-CIVMTemplate Get-CIView Get-Catalog Get-CisCommand Get-CisService Get-CloudCommand Get-Cluster Get-CompatibleVersionAddtionaPropertiesStr Get-ComplexResourceQualifier Get-ConfigurationErrorCount Get-ContentLibraryItem Get-CustomAttribute Get-DSCResourceModules Get-Datacenter Get-Datastore Get-DatastoreCluster Get-DrsClusterGroup Get-DrsRecommendation Get-DrsRule Get-DrsVMHostRule Get-DscResource Get-EdgeGateway Get-EncryptedPassword Get-ErrorReport Get-EsxCli Get-EsxTop Get-ExternalNetwork Get-FileHash Get-FloppyDrive Get-Folder Get-HAPrimaryVMHost Get-HCXAppliance Get-HCXApplianceCompute Get-HCXApplianceDVS Get-HCXApplianceDatastore Get-HCXApplianceNetwork Get-HCXContainer Get-HCXDatastore Get-HCXGateway Get-HCXInterconnectStatus Get-HCXJob Get-HCXMigration Get-HCXNetwork Get-HCXNetworkExtension Get-HCXReplication Get-HCXReplicationSnapshot Get-HCXService Get-HCXSite Get-HCXSitePairing Get-HCXVM Get-HardDisk Get-IScsiHbaTarget Get-InnerMostErrorRecord Get-InstallPath Get-InstalledModule Get-InstalledScript Get-Inventory Get-ItemPropertyValue Get-KeyManagementServer Get-KmipClientCertificate Get-KmsCluster Get-Log Get-LogType Get-MarkdownOption Get-Media Get-MofInstanceName Get-MofInstanceText Get-NetworkAdapter Get-NetworkPool Get-NfsUser Get-NicTeamingPolicy Get-NsxApplicableMember Get-NsxApplicableSecurityAction Get-NsxBackingDVSwitch Get-NsxBackingPortGroup Get-NsxCliDfwAddrSet Get-NsxCliDfwFilter Get-NsxCliDfwRule Get-NsxClusterStatus Get-NsxController Get-NsxDynamicCriteria Get-NsxDynamicMemberSet Get-NsxEdge Get-NsxEdgeBgp Get-NsxEdgeBgpNeighbour Get-NsxEdgeCertificate Get-NsxEdgeCsr Get-NsxEdgeFirewall Get-NsxEdgeFirewallRule Get-NsxEdgeInterface Get-NsxEdgeInterfaceAddress Get-NsxEdgeNat Get-NsxEdgeNatRule Get-NsxEdgeOspf Get-NsxEdgeOspfArea Get-NsxEdgeOspfInterface Get-NsxEdgePrefix Get-NsxEdgeRedistributionRule Get-NsxEdgeRouting Get-NsxEdgeStaticRoute Get-NsxEdgeSubInterface Get-NsxFirewallExclusionListMember Get-NsxFirewallGlobalConfiguration Get-NsxFirewallPublishStatus Get-NsxFirewallRule Get-NsxFirewallRuleMember Get-NsxFirewallSavedConfiguration Get-NsxFirewallSection Get-NsxFirewallThreshold Get-NsxIpPool Get-NsxIpSet Get-NsxLicense Get-NsxLoadBalancer Get-NsxLoadBalancerApplicationProfile Get-NsxLoadBalancerApplicationRule Get-NsxLoadBalancerMonitor Get-NsxLoadBalancerPool Get-NsxLoadBalancerPoolMember Get-NsxLoadBalancerStats Get-NsxLoadBalancerVip Get-NsxLogicalRouter Get-NsxLogicalRouterBgp Get-NsxLogicalRouterBgpNeighbour Get-NsxLogicalRouterBridge Get-NsxLogicalRouterBridging Get-NsxLogicalRouterInterface Get-NsxLogicalRouterOspf Get-NsxLogicalRouterOspfArea Get-NsxLogicalRouterOspfInterface Get-NsxLogicalRouterPrefix Get-NsxLogicalRouterRedistributionRule Get-NsxLogicalRouterRouting Get-NsxLogicalRouterStaticRoute Get-NsxLogicalSwitch Get-NsxMacSet Get-NsxManagerBackup Get-NsxManagerCertificate Get-NsxManagerComponentSummary Get-NsxManagerNetwork Get-NsxManagerRole Get-NsxManagerSsoConfig Get-NsxManagerSyncStatus Get-NsxManagerSyslogServer Get-NsxManagerSystemSummary Get-NsxManagerTimeSettings Get-NsxManagerVcenterConfig Get-NsxSecondaryManager Get-NsxSecurityGroup Get-NsxSecurityGroupEffectiveIpAddress Get-NsxSecurityGroupEffectiveMacAddress Get-NsxSecurityGroupEffectiveMember Get-NsxSecurityGroupEffectiveVirtualMachine Get-NsxSecurityGroupEffectiveVnic Get-NsxSecurityGroupMemberTypes Get-NsxSecurityPolicy Get-NsxSecurityPolicyHighestUsedPrecedence Get-NsxSecurityPolicyRule Get-NsxSecurityTag Get-NsxSecurityTagAssignment Get-NsxSegmentIdRange Get-NsxService Get-NsxServiceDefinition Get-NsxServiceGroup Get-NsxServiceGroupMember Get-NsxServiceProfile Get-NsxSpoofguardNic Get-NsxSpoofguardPolicy Get-NsxSslVpn Get-NsxSslVpnAuthServer Get-NsxSslVpnClientInstallationPackage Get-NsxSslVpnIpPool Get-NsxSslVpnPrivateNetwork Get-NsxSslVpnUser Get-NsxTransportZone Get-NsxUserRole Get-NsxVdsContext Get-NsxtPolicyService Get-NsxtService Get-OSCustomizationNicMapping Get-OSCustomizationSpec Get-Org Get-OrgNetwork Get-OrgVdc Get-OrgVdcNetwork Get-OvfConfiguration Get-PSCurrentConfigurationNode Get-PSDefaultConfigurationDocument Get-PSMetaConfigDocumentInstVersionInfo Get-PSMetaConfigurationProcessed Get-PSReadLineKeyHandler Get-PSReadLineOption Get-PSRepository Get-PSTopConfigurationName Get-PSVersion Get-Package Get-PackageProvider Get-PackageSource Get-PassthroughDevice Get-PositionInfo Get-PowerCLICommunity Get-PowerCLIConfiguration Get-PowerCLIHelp Get-PowerCLIVersion Get-PowerNsxVersion Get-ProviderVdc Get-PublicKeyFromFile Get-PublicKeyFromStore Get-ResourcePool Get-Runspace Get-RunspaceDebug Get-ScsiController Get-ScsiLun Get-ScsiLunPath Get-SecurityInfo Get-SecurityPolicy Get-Snapshot Get-SpbmCapability Get-SpbmCompatibleStorage Get-SpbmEntityConfiguration Get-SpbmFaultDomain Get-SpbmPointInTimeReplica Get-SpbmReplicationGroup Get-SpbmReplicationPair Get-SpbmStoragePolicy Get-Stat Get-StatInterval Get-StatType Get-Tag Get-TagAssignment Get-TagCategory Get-Task Get-Template Get-TimeZone Get-Uptime Get-UsbDevice Get-VAIOFilter Get-VApp Get-VDBlockedPolicy Get-VDPort Get-VDPortgroup Get-VDPortgroupOverridePolicy Get-VDSecurityPolicy Get-VDSwitch Get-VDSwitchPrivateVlan Get-VDTrafficShapingPolicy Get-VDUplinkLacpPolicy Get-VDUplinkTeamingPolicy Get-VDisk Get-VIAccount Get-VICommand Get-VICredentialStoreItem Get-VIEvent Get-VIObjectByVIView Get-VIPermission Get-VIPrivilege Get-VIProperty Get-VIRole Get-VM Get-VMGuest Get-VMHost Get-VMHostAccount Get-VMHostAdvancedConfiguration Get-VMHostAuthentication Get-VMHostAvailableTimeZone Get-VMHostDiagnosticPartition Get-VMHostDisk Get-VMHostDiskPartition Get-VMHostFirewallDefaultPolicy Get-VMHostFirewallException Get-VMHostFirmware Get-VMHostHardware Get-VMHostHba Get-VMHostModule Get-VMHostNetwork Get-VMHostNetworkAdapter Get-VMHostNtpServer Get-VMHostPatch Get-VMHostPciDevice Get-VMHostProfile Get-VMHostProfileImageCacheConfiguration Get-VMHostProfileRequiredInput Get-VMHostProfileStorageDeviceConfiguration Get-VMHostProfileUserConfiguration Get-VMHostProfileVmPortGroupConfiguration Get-VMHostRoute Get-VMHostService Get-VMHostSnmp Get-VMHostStartPolicy Get-VMHostStorage Get-VMHostSysLogServer Get-VMQuestion Get-VMResourceConfiguration Get-VMStartPolicy Get-VTpm Get-VTpmCSR Get-VTpmCertificate Get-VasaProvider Get-VasaStorageArray Get-View Get-VirtualPortGroup Get-VirtualSwitch Get-VmcSddcNetworkService Get-VmcService Get-VsanClusterConfiguration Get-VsanComponent Get-VsanDisk Get-VsanDiskGroup Get-VsanEvacuationPlan Get-VsanFaultDomain Get-VsanIscsiInitiatorGroup Get-VsanIscsiInitiatorGroupTargetAssociation Get-VsanIscsiLun Get-VsanIscsiTarget Get-VsanObject Get-VsanResyncingComponent Get-VsanRuntimeInfo Get-VsanSpaceUsage Get-VsanStat Get-VsanView Get-vRAApplianceServiceStatus Get-vRAAuthorizationRole Get-vRABlueprint Get-vRABusinessGroup Get-vRACatalogItem Get-vRACatalogItemRequestTemplate Get-vRACatalogPrincipal Get-vRAComponentRegistryService Get-vRAComponentRegistryServiceEndpoint Get-vRAComponentRegistryServiceStatus Get-vRAContent Get-vRAContentData Get-vRAContentType Get-vRACustomForm Get-vRAEntitledCatalogItem Get-vRAEntitledService Get-vRAEntitlement Get-vRAExternalNetworkProfile Get-vRAGroupPrincipal Get-vRAIcon Get-vRANATNetworkProfile Get-vRANetworkProfileIPAddressList Get-vRANetworkProfileIPRangeSummary Get-vRAPackage Get-vRAPackageContent Get-vRAPropertyDefinition Get-vRAPropertyGroup Get-vRARequest Get-vRARequestDetail Get-vRAReservation Get-vRAReservationComputeResource Get-vRAReservationComputeResourceMemory Get-vRAReservationComputeResourceNetwork Get-vRAReservationComputeResourceResourcePool Get-vRAReservationComputeResourceStorage Get-vRAReservationPolicy Get-vRAReservationTemplate Get-vRAReservationType Get-vRAResource Get-vRAResourceAction Get-vRAResourceActionRequestTemplate Get-vRAResourceMetric Get-vRAResourceOperation Get-vRAResourceType Get-vRARoutedNetworkProfile Get-vRAService Get-vRAServiceBlueprint Get-vRASourceMachine Get-vRAStorageReservationPolicy Get-vRATenant Get-vRATenantDirectory Get-vRATenantDirectoryStatus Get-vRATenantRole Get-vRAUserPrincipal Get-vRAUserPrincipalGroupMembership Get-vRAVersion Get-vRNIAPIVersion Get-vRNIApplication Get-vRNIApplicationTier Get-vRNIDataSource Get-vRNIDataSourceSNMPConfig Get-vRNIDatastore Get-vRNIDistributedSwitch Get-vRNIDistributedSwitchPortGroup Get-vRNIEntity Get-vRNIEntityName Get-vRNIFirewallRule Get-vRNIFlow Get-vRNIHost Get-vRNIHostVMKNic Get-vRNIIPSet Get-vRNIL2Network Get-vRNINSXManager Get-vRNINodes Get-vRNIProblem Get-vRNIRecommendedRules Get-vRNIRecommendedRulesNsxBundle Get-vRNISecurityGroup Get-vRNISecurityTag Get-vRNIService Get-vRNIServiceGroup Get-vRNIVM Get-vRNIVMvNIC Get-vRNIvCenter Get-vRNIvCenterCluster Get-vRNIvCenterDatacenter Get-vRNIvCenterFolder Grant-NsxSpoofguardNicApproval Import-CIVApp Import-CIVAppTemplate Import-NsxObject Import-PackageProvider Import-PowerShellDataFile Import-SpbmStoragePolicy Import-VApp Import-VMHostProfile Import-vRAContentData Import-vRAIcon Import-vRAPackage Initialize-ConfigurationRuntimeState Install-Module Install-NsxCluster Install-Package Install-PackageProvider Install-Script Install-VMHostPatch Invoke-DrsRecommendation Invoke-NsxCli Invoke-NsxClusterResolveAll Invoke-NsxManagerSync Invoke-NsxRestMethod Invoke-NsxWebRequest Invoke-VMHostProfile Invoke-VMScript Invoke-XpathQuery Invoke-vRADataCollection Invoke-vRARestMethod Invoke-vRATenantDirectorySync Invoke-vRNIRestMethod Join-String Mount-Tools Move-Cluster Move-Datacenter Move-Datastore Move-Folder Move-HardDisk Move-Inventory Move-NsxSecurityPolicyRule Move-ResourcePool Move-Template Move-VApp Move-VDisk Move-VM Move-VMHost New-AdvancedSetting New-AlarmAction New-AlarmActionTrigger New-CDDrive New-CIAccessControlRule New-CIVApp New-CIVAppNetwork New-CIVAppTemplate New-CIVM New-Cluster New-CustomAttribute New-Datacenter New-Datastore New-DatastoreCluster New-DatastoreDrive New-DrsClusterGroup New-DrsRule New-DrsVMHostRule New-DscChecksum New-FloppyDrive New-Folder New-Guid New-HCXAppliance New-HCXMigration New-HCXNetworkExtension New-HCXNetworkMapping New-HCXReplication New-HCXSitePairing New-HCXStaticRoute New-HardDisk New-IScsiHbaTarget New-KmipClientCertificate New-NetworkAdapter New-NfsUser New-NsxAddressSpec New-NsxClusterVxlanConfig New-NsxController New-NsxDynamicCriteriaSpec New-NsxEdge New-NsxEdgeBgpNeighbour New-NsxEdgeCsr New-NsxEdgeFirewallRule New-NsxEdgeInterfaceSpec New-NsxEdgeNatRule New-NsxEdgeOspfArea New-NsxEdgeOspfInterface New-NsxEdgePrefix New-NsxEdgeRedistributionRule New-NsxEdgeSelfSignedCertificate New-NsxEdgeStaticRoute New-NsxEdgeSubInterface New-NsxEdgeSubInterfaceSpec New-NsxFirewallRule New-NsxFirewallSavedConfiguration New-NsxFirewallSection New-NsxIpPool New-NsxIpSet New-NsxLoadBalancerApplicationProfile New-NsxLoadBalancerApplicationRule New-NsxLoadBalancerMemberSpec New-NsxLoadBalancerMonitor New-NsxLoadBalancerPool New-NsxLogicalRouter New-NsxLogicalRouterBgpNeighbour New-NsxLogicalRouterBridge New-NsxLogicalRouterInterface New-NsxLogicalRouterInterfaceSpec New-NsxLogicalRouterOspfArea New-NsxLogicalRouterOspfInterface New-NsxLogicalRouterPrefix New-NsxLogicalRouterRedistributionRule New-NsxLogicalRouterStaticRoute New-NsxLogicalSwitch New-NsxMacSet New-NsxManager New-NsxSecurityGroup New-NsxSecurityPolicy New-NsxSecurityPolicyAssignment New-NsxSecurityPolicyFirewallRuleSpec New-NsxSecurityPolicyGuestIntrospectionSpec New-NsxSecurityPolicyNetworkIntrospectionSpec New-NsxSecurityTag New-NsxSecurityTagAssignment New-NsxSegmentIdRange New-NsxService New-NsxServiceGroup New-NsxSpoofguardPolicy New-NsxSslVpnAuthServer New-NsxSslVpnClientInstallationPackage New-NsxSslVpnIpPool New-NsxSslVpnPrivateNetwork New-NsxSslVpnUser New-NsxTransportZone New-NsxVdsContext New-OSCustomizationNicMapping New-OSCustomizationSpec New-Org New-OrgNetwork New-OrgVdc New-OrgVdcNetwork New-ResourcePool New-ScriptFileInfo New-ScsiController New-Snapshot New-SpbmRule New-SpbmRuleSet New-SpbmStoragePolicy New-StatInterval New-Tag New-TagAssignment New-TagCategory New-Template New-TemporaryFile New-VAIOFilter New-VApp New-VDPortgroup New-VDSwitch New-VDSwitchPrivateVlan New-VDisk New-VICredentialStoreItem New-VIInventoryDrive New-VIPermission New-VIProperty New-VIRole New-VISamlSecurityContext New-VM New-VMHostAccount New-VMHostNetworkAdapter New-VMHostProfile New-VMHostProfileVmPortGroupConfiguration New-VMHostRoute New-VTpm New-VasaProvider New-VcsOAuthSecurityContext New-VirtualPortGroup New-VirtualSwitch New-VsanDisk New-VsanDiskGroup New-VsanFaultDomain New-VsanIscsiInitiatorGroup New-VsanIscsiInitiatorGroupTargetAssociation New-VsanIscsiLun New-VsanIscsiTarget New-vRABusinessGroup New-vRAEntitlement New-vRAExternalNetworkProfile New-vRAGroupPrincipal New-vRANATNetworkProfile New-vRANetworkProfileIPRangeDefinition New-vRAPackage New-vRAPropertyDefinition New-vRAPropertyGroup New-vRAReservation New-vRAReservationNetworkDefinition New-vRAReservationPolicy New-vRAReservationStorageDefinition New-vRARoutedNetworkProfile New-vRAService New-vRAStorageReservationPolicy New-vRATenant New-vRATenantDirectory New-vRAUserPrincipal New-vRNIApplication New-vRNIApplicationTier New-vRNIDataSource Open-VMConsoleWindow Publish-Module Publish-NsxSpoofguardPolicy Publish-Script Register-PSRepository Register-PackageSource Remove-AdvancedSetting Remove-AlarmAction Remove-AlarmActionTrigger Remove-Alias Remove-CDDrive Remove-CIAccessControlRule Remove-CIVApp Remove-CIVAppNetwork Remove-CIVAppTemplate Remove-Cluster Remove-CustomAttribute Remove-Datacenter Remove-Datastore Remove-DatastoreCluster Remove-DrsClusterGroup Remove-DrsRule Remove-DrsVMHostRule Remove-FloppyDrive Remove-Folder Remove-HCXAppliance Remove-HCXNetworkExtension Remove-HCXReplication Remove-HCXSitePairing Remove-HardDisk Remove-IScsiHbaTarget Remove-Inventory Remove-KeyManagementServer Remove-NetworkAdapter Remove-NfsUser Remove-NsxCluster Remove-NsxClusterVxlanConfig Remove-NsxController Remove-NsxDynamicCriteria Remove-NsxDynamicMemberSet Remove-NsxEdge Remove-NsxEdgeBgpNeighbour Remove-NsxEdgeCertificate Remove-NsxEdgeCsr Remove-NsxEdgeFirewallRule Remove-NsxEdgeInterfaceAddress Remove-NsxEdgeNatRule Remove-NsxEdgeOspfArea Remove-NsxEdgeOspfInterface Remove-NsxEdgePrefix Remove-NsxEdgeRedistributionRule Remove-NsxEdgeStaticRoute Remove-NsxEdgeSubInterface Remove-NsxFirewallExclusionListMember Remove-NsxFirewallRule Remove-NsxFirewallRuleMember Remove-NsxFirewallSavedConfiguration Remove-NsxFirewallSection Remove-NsxIpPool Remove-NsxIpSet Remove-NsxIpSetMember Remove-NsxLoadBalancerApplicationProfile Remove-NsxLoadBalancerMonitor Remove-NsxLoadBalancerPool Remove-NsxLoadBalancerPoolMember Remove-NsxLoadBalancerVip Remove-NsxLogicalRouter Remove-NsxLogicalRouterBgpNeighbour Remove-NsxLogicalRouterBridge Remove-NsxLogicalRouterInterface Remove-NsxLogicalRouterOspfArea Remove-NsxLogicalRouterOspfInterface Remove-NsxLogicalRouterPrefix Remove-NsxLogicalRouterRedistributionRule Remove-NsxLogicalRouterStaticRoute Remove-NsxLogicalSwitch Remove-NsxMacSet Remove-NsxSecondaryManager Remove-NsxSecurityGroup Remove-NsxSecurityGroupMember Remove-NsxSecurityPolicy Remove-NsxSecurityPolicyAssignment Remove-NsxSecurityPolicyRule Remove-NsxSecurityPolicyRuleGroup Remove-NsxSecurityPolicyRuleService Remove-NsxSecurityTag Remove-NsxSecurityTagAssignment Remove-NsxSegmentIdRange Remove-NsxService Remove-NsxServiceGroup Remove-NsxSpoofguardPolicy Remove-NsxSslVpnClientInstallationPackage Remove-NsxSslVpnIpPool Remove-NsxSslVpnPrivateNetwork Remove-NsxSslVpnUser Remove-NsxTransportZone Remove-NsxTransportZoneMember Remove-NsxVdsContext Remove-OSCustomizationNicMapping Remove-OSCustomizationSpec Remove-Org Remove-OrgNetwork Remove-OrgVdc Remove-OrgVdcNetwork Remove-PSReadLineKeyHandler Remove-PassthroughDevice Remove-ResourcePool Remove-Snapshot Remove-SpbmStoragePolicy Remove-StatInterval Remove-Tag Remove-TagAssignment Remove-TagCategory Remove-Template Remove-UsbDevice Remove-VAIOFilter Remove-VApp Remove-VDPortGroup Remove-VDSwitch Remove-VDSwitchPhysicalNetworkAdapter Remove-VDSwitchPrivateVlan Remove-VDSwitchVMHost Remove-VDisk Remove-VICredentialStoreItem Remove-VIPermission Remove-VIProperty Remove-VIRole Remove-VM Remove-VMHost Remove-VMHostAccount Remove-VMHostNetworkAdapter Remove-VMHostNtpServer Remove-VMHostProfile Remove-VMHostProfileVmPortGroupConfiguration Remove-VMHostRoute Remove-VTpm Remove-VasaProvider Remove-VirtualPortGroup Remove-VirtualSwitch Remove-VirtualSwitchPhysicalNetworkAdapter Remove-VsanDisk Remove-VsanDiskGroup Remove-VsanFaultDomain Remove-VsanIscsiInitiatorGroup Remove-VsanIscsiInitiatorGroupTargetAssociation Remove-VsanIscsiLun Remove-VsanIscsiTarget Remove-vRABusinessGroup Remove-vRACustomForm Remove-vRAExternalNetworkProfile Remove-vRAGroupPrincipal Remove-vRAIcon Remove-vRANATNetworkProfile Remove-vRAPackage Remove-vRAPrincipalFromTenantRole Remove-vRAPropertyDefinition Remove-vRAPropertyGroup Remove-vRAReservation Remove-vRAReservationNetwork Remove-vRAReservationPolicy Remove-vRAReservationStorage Remove-vRARoutedNetworkProfile Remove-vRAService Remove-vRAStorageReservationPolicy Remove-vRATenant Remove-vRATenantDirectory Remove-vRAUserPrincipal Remove-vRNIApplication Remove-vRNIApplicationTier Remove-vRNIDataSource Repair-NsxEdge Repair-VsanObject Request-vRACatalogItem Request-vRAResourceAction Restart-CIVApp Restart-CIVAppGuest Restart-CIVM Restart-CIVMGuest Restart-VM Restart-VMGuest Restart-VMHost Restart-VMHostService Resume-HCXReplication Revoke-NsxSpoofguardNicApproval Save-Module Save-Package Save-Script Search-Cloud Set-AdvancedSetting Set-AlarmDefinition Set-Annotation Set-CDDrive Set-CIAccessControlRule Set-CINetworkAdapter Set-CIVApp Set-CIVAppNetwork Set-CIVAppStartRule Set-CIVAppTemplate Set-Cluster Set-CustomAttribute Set-Datacenter Set-Datastore Set-DatastoreCluster Set-DrsClusterGroup Set-DrsRule Set-DrsVMHostRule Set-FloppyDrive Set-Folder Set-HCXAppliance Set-HCXMigration Set-HCXReplication Set-HardDisk Set-IScsiHbaTarget Set-KeyManagementServer Set-KmsCluster Set-MarkdownOption Set-NetworkAdapter Set-NfsUser Set-NicTeamingPolicy Set-NodeExclusiveResources Set-NodeManager Set-NodeResourceSource Set-NodeResources Set-NsxEdge Set-NsxEdgeBgp Set-NsxEdgeFirewall Set-NsxEdgeInterface Set-NsxEdgeNat Set-NsxEdgeOspf Set-NsxEdgeRouting Set-NsxFirewallGlobalConfiguration Set-NsxFirewallRule Set-NsxFirewallSavedConfiguration Set-NsxFirewallThreshold Set-NsxLoadBalancer Set-NsxLoadBalancerPoolMember Set-NsxLogicalRouter Set-NsxLogicalRouterBgp Set-NsxLogicalRouterBridging Set-NsxLogicalRouterInterface Set-NsxLogicalRouterOspf Set-NsxLogicalRouterRouting Set-NsxManager Set-NsxManagerRole Set-NsxManagerTimeSettings Set-NsxSecurityPolicy Set-NsxSecurityPolicyFirewallRule Set-NsxSslVpn Set-OSCustomizationNicMapping Set-OSCustomizationSpec Set-Org Set-OrgNetwork Set-OrgVdc Set-OrgVdcNetwork Set-PSCurrentConfigurationNode Set-PSDefaultConfigurationDocument Set-PSMetaConfigDocInsProcessedBeforeMeta Set-PSMetaConfigVersionInfoV2 Set-PSReadLineKeyHandler Set-PSReadLineOption Set-PSRepository Set-PSTopConfigurationName Set-PackageSource Set-PowerCLIConfiguration Set-ResourcePool Set-ScsiController Set-ScsiLun Set-ScsiLunPath Set-SecurityPolicy Set-Snapshot Set-SpbmEntityConfiguration Set-SpbmStoragePolicy Set-StatInterval Set-Tag Set-TagCategory Set-Template Set-VAIOFilter Set-VApp Set-VDBlockedPolicy Set-VDPort Set-VDPortgroup Set-VDPortgroupOverridePolicy Set-VDSecurityPolicy Set-VDSwitch Set-VDTrafficShapingPolicy Set-VDUplinkLacpPolicy Set-VDUplinkTeamingPolicy Set-VDVlanConfiguration Set-VDisk Set-VIPermission Set-VIRole Set-VM Set-VMHost Set-VMHostAccount Set-VMHostAdvancedConfiguration Set-VMHostAuthentication Set-VMHostDiagnosticPartition Set-VMHostFirewallDefaultPolicy Set-VMHostFirewallException Set-VMHostFirmware Set-VMHostHba Set-VMHostModule Set-VMHostNetwork Set-VMHostNetworkAdapter Set-VMHostProfile Set-VMHostProfileImageCacheConfiguration Set-VMHostProfileStorageDeviceConfiguration Set-VMHostProfileUserConfiguration Set-VMHostProfileVmPortGroupConfiguration Set-VMHostRoute Set-VMHostService Set-VMHostSnmp Set-VMHostStartPolicy Set-VMHostStorage Set-VMHostSysLogServer Set-VMQuestion Set-VMResourceConfiguration Set-VMStartPolicy Set-VTpm Set-VirtualPortGroup Set-VirtualSwitch Set-VsanClusterConfiguration Set-VsanFaultDomain Set-VsanIscsiInitiatorGroup Set-VsanIscsiLun Set-VsanIscsiTarget Set-vRABusinessGroup Set-vRACatalogItem Set-vRACustomForm Set-vRAEntitlement Set-vRAExternalNetworkProfile Set-vRANATNetworkProfile Set-vRAReservation Set-vRAReservationNetwork Set-vRAReservationPolicy Set-vRAReservationStorage Set-vRARoutedNetworkProfile Set-vRAService Set-vRAStorageReservationPolicy Set-vRATenant Set-vRATenantDirectory Set-vRAUserPrincipal Set-vRNIDataSourceSNMPConfig Show-Markdown Start-CIVApp Start-CIVM Start-HCXMigration Start-HCXReplication Start-SpbmReplicationFailover Start-SpbmReplicationPrepareFailover Start-SpbmReplicationPromote Start-SpbmReplicationReverse Start-SpbmReplicationTestFailover Start-ThreadJob Start-VApp Start-VM Start-VMHost Start-VMHostService Start-VsanClusterDiskUpdate Start-VsanClusterRebalance Start-VsanEncryptionConfiguration Stop-CIVApp Stop-CIVAppGuest Stop-CIVM Stop-CIVMGuest Stop-SpbmReplicationTestFailover Stop-Task Stop-VApp Stop-VM Stop-VMGuest Stop-VMHost Stop-VMHostService Stop-VsanClusterRebalance Suspend-CIVApp Suspend-CIVM Suspend-HCXReplication Suspend-VM Suspend-VMGuest Suspend-VMHost Sync-SpbmReplicationGroup Test-ConflictingResources Test-HCXMigration Test-HCXReplication Test-Json Test-ModuleReloadRequired Test-MofInstanceText Test-NodeManager Test-NodeResourceSource Test-NodeResources Test-ScriptFileInfo Test-VMHostProfileCompliance Test-VMHostSnmp Test-VsanClusterHealth Test-VsanNetworkPerformance Test-VsanStoragePerformance Test-VsanVMCreation Test-vRAPackage Uninstall-Module Uninstall-Package Uninstall-Script Unlock-VM Unregister-PSRepository Unregister-PackageSource Update-ConfigurationDocumentRef Update-ConfigurationErrorCount Update-DependsOn Update-LocalConfigManager Update-Module Update-ModuleManifest Update-ModuleVersion Update-PowerNsx Update-Script Update-ScriptFileInfo Update-Tools Update-VsanHclDatabase ValidateUpdate-ConfigurationData Wait-Debugger Wait-NsxControllerJob Wait-NsxGenericJob Wait-NsxJob Wait-Task Wait-Tools Write-Information Write-Log Write-MetaConfigFile Write-NodeMOFFile",nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},c:[t,e.NM,r,{cN:"string",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},{cN:"literal",b:/\$(null|true|false)\b/},o,i]}});
\ No newline at end of file diff --git a/assets/js/jquery.js b/assets/js/jquery.js new file mode 100644 index 0000000..07c00cd --- /dev/null +++ b/assets/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
\ No newline at end of file diff --git a/assets/js/miracles.min.js b/assets/js/miracles.min.js new file mode 100644 index 0000000..8672da0 --- /dev/null +++ b/assets/js/miracles.min.js @@ -0,0 +1,533 @@ +/* + * The main JavaScript file for Theme Miracles + * + * @Author: Eltrac + * @License: MIT + */ + +/** + * 快速使用 cookies + */ +//add cookie +function addCookie(name, value, expireHours) { + var cookieString = name + "=" + escape(value); + if (expireHours > 0) { + var date = new Date(); + date.setTime(date.getTime + expireHours * 3600 * 1000); + cookieString = cookieString + "; expire=" + date.toGMTString(); + } + document.cookie = cookieString; +} +//Delete cookie +function deleteCookie(name) { + var date = new Date(); + date.setTime(date.getTime() - 10000); + document.cookie = name + "=v; expire=" + date.toGMTString(); +} +//Get cookie +function getCookie(cname) { + var name = cname + "="; + var decodedCookie = decodeURIComponent(document.cookie); + var ca = decodedCookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') { + c = c.substring(1); + } + if (c.indexOf(name) == 0) { + return c.substring(name.length, c.length); + } + } + return ""; +} + +/** + * 快速使用 localStorage + */ +function setStrg(key, value) { + localStorage.setItem(key,value); +} +function getStrg(key) { + return localStorage.getItem(key); +} + +/** + * 动画 + */ +function scaleIn(object, time) { + object.css('transition', time).css('transform', 'scale(0)'); + object.show(); + object.css('transform', 'scale(1)'); +} + +function scaleOut(object, time) { + object.css('transition', time).css('transform', 'scale(0)') +} + +function gotoPosition(e){ + var t=e.offsetTop; + var l=e.offsetLeft; + while(e=e.offsetParent){ + t+=e.offsetTop; + l+=e.offsetLeft; + } + $("html,body").animate({scrollTop:t},300); +} + +/** + * Dark theme + */ +//toggleDark +var theme = 0; +function Dark() { + theme++; + if(theme==2){ + setStrg("theme", "2"); + $("#toggle-dark-button").html('<i class="iconfont icon-moon"></i>'); + $("#toggle-dark-mobile").html('<i class="iconfont icon-moon"></i>'); + $("body").removeClass("body-sepia"); + $("body").addClass("body-dark"); + alertSend("已切换夜间模式"); + } + else if(theme==1){ + setStrg("theme", "1"); + $("#toggle-dark-button").html('<i class="iconfont icon-sunset"></i>'); + $("#toggle-dark-mobile").html('<i class="iconfont icon-sunset"></i>'); + $("body").removeClass("body-dark"); + $("body").addClass("body-sepia"); + alertSend("已切换日落模式"); + } + else { + setStrg("theme", "3"); + theme = 0; + $("#toggle-dark-button").html('<i class="iconfont icon-sun"></i>'); + $("#toggle-dark-mobile").html('<i class="iconfont icon-sun"></i>'); + $("body").removeClass("body-dark"); + $("body").removeClass("body-sepia"); + alertSend("已切换日间模式"); + } +} + +//auto dark theme +var whatTheme = getStrg("theme"); +var schemeGeter = window.matchMedia ("(prefers-color-scheme: dark)"); +if (whatTheme == "2" || schemeGeter.matches) { + $("body").addClass("body-dark"); + $("#toggle-dark-button").html('<i class="iconfont icon-moon"></i>'); + $("#toggle-dark-mobile").html('<i class="iconfont icon-moon"></i>'); + alertSend("检测到您使用深色模式,已自动切换"); + theme="2"; +} +else if (whatTheme == "1") { + $("#toggle-dark-button").html('<i class="iconfont icon-sunset"></i>'); + $("#toggle-dark-mobile").html('<i class="iconfont icon-sunset"></i>'); + $("body").addClass("body-sepia"); + alertSend("检测到您使用日落模式,已自动切换"); + theme="1"; +} +//尝试修改夜间模式下的 favicon +if(faviconDark==true&&window.matchMedia ("(prefers-color-scheme: dark)").matches) $("link#icon").attr("href","/faviconDark.ico"); + +//支持系统深色模式 +function swDarkMode(scheme){ + if(scheme.matches) { + $("body").addClass("body-dark"); + alertSend("检测到系统深色模式,已自动切换"); + if(faviconDark==true&&window.matchMedia ("(prefers-color-scheme: dark)").matches) $("link#icon").attr("href","/faviconDark.ico"); + }else if(window.matchMedia ("(prefers-color-scheme: light)").matches){ + $("body").removeClass("body-dark"); + $("link#icon").attr("href", faviconUrl); + } +} +schemeGeter.addListener(swDarkMode); + +/** + * GoTop + */ +function GoTop() { + document.body.scrollTop = 0; + document.documentElement.scrollTop = 0; +} +$('#gotop').hide(); +$(window).scroll(function() { + if ($(window).scrollTop() > 450) { + scaleIn($('#gotop'), '0.7'); + } else { + scaleOut($('#gotop'), '0.7'); + } +}); + +/** + * Js Loader + */ +//LazyLoad +function LazyLoad() { + $('img[data-gisrc]:not([data-gi-init])').giLazy(); +} +//highlight +function highlight() { + $(document).ready(function() { + $('pre code').each(function(i, block) { + hljs.highlightBlock(block); + hljs.lineNumbersBlock(block, { + singleLine: true + }); + }) + }); +} +//owo +function owoLoad() { + if($(".OwO").length>0){ + var OwO_demo = new OwO({ + logo: 'OωO', + container: document.getElementsByClassName('OwO')[0], + target: document.getElementsByClassName('OwO-textarea')[0], + api: owoJson, + position: 'down', + width: '300px', + maxHeight: '250px' + }); + } +} +//Pangu.js +function panguLoad() { + document.addEventListener('DOMContentLoaded', () => { + if(panguLoadAllow==true) pangu.autoSpacingPage(); + }); +} + +/** + * Prevent Scroll + */ +function bodyScroll(event) { + event.preventDefault(); +} + +/** + * Open pannel + */ +//Search +function Search() { + $(".search").toggleClass("ready"); + $(".search-close").toggleClass("ready"); +} +//Login +function Login() { + $(".login").toggleClass("ready"); + $(".login-close").toggleClass("ready"); +} + +/** + * Drawer + */ +function toggleDrawer() { + $("body").toggleClass("drawer-open"); + $(".mask").toggleClass("mask-open"); +} + +/** + * Alert + */ + +alertify.set('notifier','position', 'bottom-center'); +function alertSend(content, type) { + alertify.notify(content, type, 3); +} + +/** + * Listen copy event and alert + */ +var copyAlertTime = 0; +$(document).ready(function() { + $("body").bind({ + copy: function() { + copyAlertTime++; + if(copyAlertTime == 1) { + alertSend("复制成功!若使用请注明原作者及原地址!"); + window.setTimeout(function() { + copyAlertTime = 0; + }, 200); + } + } + }); +}); + +/** + * Event Listeners + */ +/* Find Elements */ +var goTopButton = $("#gotop"); +var fullMask = $("#full-mask"); +var searchCloseButton = $("#search-close-button"); +var searchOpenButton = $("#search-open-button"); +var searchOpenMobile = $("#search-open-mobile"); +var loginCloseButton = $("#login-close"); +var loginOpenButton = $("#login-open"); +var loginOpenMobile = $("#login-open-mobile"); +var toggleMobileMenuClose = $("#toggle-mobile-menu-close"); +var toggleMobileMenu = $("#toggle-mobile-menu-button"); +var drawerButton = $("#drawer-button"); +var navBar = $("#navBar"); +var navBarMobile = $("#navBarMobile"); +var darkToggle = $("#toggle-dark-button"); +var darkToggleMobile = $("#toggle-dark-mobile"); + +/* Add Listeners */ +//返回顶部按钮 +goTopButton.on("click", GoTop); +//全屏遮罩(抽屉栏) +fullMask.on("click", function() { + toggleDrawer(); +}); +//打开/关闭抽屉栏 +drawerButton.on("click", toggleDrawer); +//打开/关闭搜索面板 +searchCloseButton.on("click", Search); +searchOpenButton.on("click", Search); +if(searchOpenMobile.length>0){searchOpenMobile.on("click", function(){ + Search(); + toggleDrawer(); +});} +//打开/关闭登录面板 +loginCloseButton.on("click", Login); +loginOpenButton.on("click", Login); +if(loginOpenMobile.length>0){loginOpenMobile.on("click", function() { + Login(); + toggleDrawer(); +});} +//开关移动端导航 +if(toggleMobileMenuClose.length>0){ + toggleMobileMenuClose.on("click", function() { + $(".mobile-menu").toggleClass("ready"); + $(".mobile-menu-close").toggleClass("ready"); + }); +} +if(toggleMobileMenu.length>0){ + toggleMobileMenu.on("click", function() { + $(".mobile-menu").toggleClass("ready"); + $(".mobile-menu-close").toggleClass("ready"); + }); +} +//切换夜间模式 +darkToggle.on("click", Dark); +if(darkToggleMobile.length>0){darkToggleMobile.on("click", Dark);} +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('2r(2m(d,e,a,c,b,f){b=2m(a){2n(a<e?"":b(2x(a/e)))+(35<(a%=e)?2o.2z(a+29):a.2v(36))};2w(!"".2p(/^/,2o)){2q(;a--;)f[b(a)]=c[a]||b(a);c=[2m(a){2n f[a]}];b=2m(){2n"\\\\w+"};a=1}2q(;a--;)c[a]&&(d=d.2p(2s 2t("\\\\b"+b(a)+"\\\\b","g"),c[a]));2n d}(\'1a(14(d,e,a,c,b,f){b=14(a){13(a<e?"":b(1g(a/e)))+(19<(a%=e)?18.1b(a+29):a.1e(1f))};15(!"".16(/^/,18)){17(;a--;)f[b(a)]=c[a]||b(a);c=[14(a){13 f[a]}];b=14(){13"\\\\\\\\w+"};a=1}17(;a--;)c[a]&&(d=d.16(1c 1d("\\\\\\\\b"+b(a)+"\\\\\\\\b","g"),c[a]));13 d}(\\\'M(0>=$("#l").I||"J"!=$("#l-L").8()||"N"!=$("#l-O").8())$(".P-Q").c(\\\\\\\'<4 n="o:p">\\\\\\\\q\\\\\\\\9\\\\\\\\a\\\\\\\\R\\\\\\\\G\\\\\\\\H\\\\\\\\b\\\\\\\\z\\\\\\\\y\\\\\\\\5\\\\\\\\f\\\\\\\\g\\\\\\\\h\\\\\\\\i\\\\\\\\j\\\\\\\\k\\\\\\\\e\\\\\\\\m\\\\\\\\6\\\\\\\\7\\\\\\\\2\\\\\\\\3\\\\\\\\5\\\\\\\\r\\\\\\\\6\\\\\\\\7\\\\\\\\2\\\\\\\\3\\\\\\\\s\\\\\\\\t\\\\\\\\u\\\\\\\\v\\\\\\\\w\\\\\\\\x\\\\\\\\d</4>\\\\\\\'),$("K").c(\\\\\\\'<1><1><1><1><1><1><1><1><1><4 n="o:p;A:B;C:0 D;8-E:F">\\\\\\\\q\\\\\\\\9\\\\\\\\a\\\\\\\\S\\\\\\\\T\\\\\\\\2\\\\\\\\3\\\\\\\\b\\\\\\\\z\\\\\\\\y\\\\\\\\5\\\\\\\\f\\\\\\\\g\\\\\\\\h\\\\\\\\i\\\\\\\\j\\\\\\\\k\\\\\\\\e\\\\\\\\m\\\\\\\\6\\\\\\\\7\\\\\\\\2\\\\\\\\3\\\\\\\\5\\\\\\\\r\\\\\\\\6\\\\\\\\7\\\\\\\\2\\\\\\\\3\\\\\\\\s\\\\\\\\t\\\\\\\\u\\\\\\\\v\\\\\\\\w\\\\\\\\x\\\\\\\\d</4><1><1><1><1><1>\\\\\\\'),$(".U-V").c(\\\\\\\'<1><1><1><1><1><1><4 n="o:p;A:B;C:0 D;8-E:F">\\\\\\\\q\\\\\\\\9\\\\\\\\a\\\\\\\\W\\\\\\\\X\\\\\\\\Y\\\\\\\\Z\\\\\\\\b\\\\\\\\10\\\\\\\\11\\\\\\\\12\\\\\\\\5\\\\\\\\f\\\\\\\\g\\\\\\\\h\\\\\\\\i\\\\\\\\j\\\\\\\\k\\\\\\\\e\\\\\\\\m\\\\\\\\6\\\\\\\\7\\\\\\\\2\\\\\\\\3\\\\\\\\5\\\\\\\\r\\\\\\\\6\\\\\\\\7\\\\\\\\2\\\\\\\\3\\\\\\\\s\\\\\\\\t\\\\\\\\u\\\\\\\\v\\\\\\\\w\\\\\\\\x\\\\\\\\d</4><1><1><1><1><1>\\\\\\\');\\\',1h,1i," 1j 1k 1l 1m 1n 1o 1p 1q 1r 1s 1t 1u 1v 1w 1x 1y 1z 1A 1B 1C 1D 1E 1F 1G 1H 1I 1J 1K 1L 1M 1N 1O 1P 1Q 1R 1S 1T 1U 1V 1W 1X 1Y 1Z 20 21 22 23 15 24 25 26 27 28 2a 2b 2c 2d 2e 2f 2g 2h 2i 2j 2k".2l(" "),0,{}));\',2u,2A," 2n 2m 2w 2p 2q 2o 35 2r 2z 2s 2t 2v 36 2x 2u 2B 2C 2D 2E 2F 2G 2H 2I 2J 2K 2L 2M 2N 2O 2P 2Q 2R 2S 2T 2U 2V 2W 2X 2Y 2Z 30 31 32 33 34 37 38 39 3a 3b 3c 3d 3e 3f 3g 3h 3i 3j 3k 3l 3m 3n 3o 3p 3q 3r 3s 3t 3u 3v 3w 3x 3y 3z 3A 3B 3C 3D 3E 2y".2y(" "),0,{}));',62,227,'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||function|return|String|replace|for|eval|new|RegExp|62|toString|if|parseInt|split|fromCharCode|146|65|br|u4fe1|u606f|span|uff0c|u7248|u6743|text|u7ad9|u7684|u5df2|html|uff01|u4e3b|u539f|u56e0|u662f|u5220|u9664|u4e86|copyright|u9898|style|color|red|u8be5|u5c06|u6539|u56de|||u5373|u53ef|u4fee|u590d|u6548|u5931|display|block|margin|auto|align|center|u822a|u680f|length|Miracles|header|name|Eltrac|author|nav|content|u5bfc|u5934|u90e8|post|list|u6587|u7ae0|u5185|u5bb9|u88ab|u5c4f|u853d'.split('|'),0,{})) + +/** + * Nav + */ +//Slide +if(navSlide==true){ + var new_scroll_position = 0; + var last_scroll_position; + var header = $(".nav"); + window.addEventListener('scroll', function(e) { + last_scroll_position = window.scrollY; + if (new_scroll_position < last_scroll_position && last_scroll_position > 80) { + //向下滚动 + header.removeClass("nav-slideDown"); + header.addClass("nav-slideUp"); + } else if (new_scroll_position > last_scroll_position) { + //向上滚动 + header.removeClass("nav-slideUp"); + header.addClass("nav-slideDown"); + } + new_scroll_position = last_scroll_position; + }); +} + +//ScrollChange +if(navBar.length>0){ + var nav_bar = document.getElementById("navBar"); + var nav_bar_mobile = document.getElementById("navBarMobile"); + var navBar_height = nav_bar.clientHeight; + function navUpdate() { + if(allowNavAero==true) { + var scrollTop = document.documentElement.scrollTop; + if (scrollTop > navBar_height) { + nav_bar.classList.remove("nav-aero"); + nav_bar_mobile.classList.remove("nav-aero"); + $(".nav-icon-button").css("color", "#000"); + } else { + nav_bar.classList.add("nav-aero"); + nav_bar_mobile.classList.add("nav-aero"); + if ($(".index-banner").css("background-image")=="url('')") { + $(".nav-icon-button").css("color", "#000"); + } + else { + $(".nav-icon-button").css("color", "#fff"); + } + } + } + } + $(window).scroll(function() { + navUpdate(); + }) + navUpdate(); +} + +//Font Update +function navColor() { + if ($("#banner-content").hasClass("banner-font-black")) { + if(navBar.length>0){navBar.addClass("nav-font-black");} + if(navBarMobile.length>0){navBarMobile.addClass("nav-font-black");} + } else { + if(navBar.length>0){navBar.removeClass("nav-font-white");} + if(navBarMobile.length>0){navBarMobile.removeClass("nav-font-white");} + } +} +eval(function(d,e,a,c,b,f){b=function(a){return(a<e?"":b(parseInt(a/e)))+(35<(a%=e)?String.fromCharCode(a+29):a.toString(36))};if(!"".replace(/^/,String)){for(;a--;)f[b(a)]=c[a]||b(a);c=[function(a){return f[a]}];b=function(){return"\\w+"};a=1}for(;a--;)c[a]&&(d=d.replace(new RegExp("\\b"+b(a)+"\\b","g"),c[a]));return d}("1h(16(p,a,c,k,e,r){e=16(c){17(c<a?'':e(1f(c/a)))+((c=c%a)>1g?1b.1i(c+29):c.1d(1e))};18(!''.19(/^/,1b)){1a(c--)r[e(c)]=k[c]||e(c);k=[16(e){17 r[e]}];e=16(){17'\\\\w+'};c=1};1a(c--)18(k[c])p=p.19(1j 1c('\\\\b'+e(c)+'\\\\b','g'),k[c]);17 p}('E(0>=$(\"#2\").w||\"i\"!=$(\"#2-r\").g()||\"x\"!=$(\"#2-y\").g())z(\"\\\\8\\\\c\\\\j\\\\e\\\\f i \\\\4\\\\1\\\\9\\\\5\\\\6\\\\a\\\\b\\\\3\\\\H\\\\M\\\\q\\\\5\\\\6\\\\d\",\"s\"),$(\"#t-u\").v(\\'<7 k=\"l:h\">\\\\8\\\\c\\\\9\\\\m\\\\A\\\\B\\\\C\\\\D\\\\n\\\\F\\\\G\\\\3\\\\o\\\\4\\\\1\\\\5\\\\6\\\\a\\\\b\\\\I\\\\J\\\\K\\\\L\\\\p\\\\N\\\\O\\\\P\\\\Q\\\\1\\\\d</7>\\'),$(\"#2\").R(\\'<S><7 k=\"l:h\">\\\\8\\\\c\\\\j\\\\e\\\\f\\\\4\\\\1\\\\9\\\\5\\\\6\\\\a\\\\b\\\\3\\\\n\\\\m\\\\T\\\\o\\\\U\\\\p\\\\V\\\\3\\\\W\\\\X\\\\4\\\\1\\\\Y\\\\Z\\\\10\\\\11\\\\12\\\\13\\\\14\\\\15\\\\d</7>\\');',1k,1l,'|1m|1n|1o|1p|1q|1r|1s|1t|1u|1v|1w|1x|1y|1z|1A|1B|1C|1D|1E|1F|1G|1H|1I|1J|1K|1L|1M|1N|1O|1P|1Q|1R|1S|1T|1U|1V|1W|1X|1Y|18|1Z|20|21|22|23|24|25|26|27|28|2a|2b|2c|2d|2e|2f|2g|2h|2i|2j|2k|2l|2m|2n|2o|2p|2q'.2r('|'),0,{}))", +62,152," function return if replace while String RegExp toString 36 parseInt 35 eval fromCharCode new 62 68 u9898 copyright uff0c u4e3b u7248 u6743 span u8be5 u7684 u4fe1 u606f u7ad9 uff01 u6539 u4e86 text red Miracles u7be1 style color u81ea u5df2 u5c06 u4fee u91cd name failed custom footer html length Eltrac author alertSend u5b9a u4e49 u9875 u811a u5931 u6548 u8bf7 u5199 u56de u5373 u53ef u5c0a u590d u8fd9 u4e2a u95ee append br u52a8 u5176 u6b63 u4f7f u7528 u9700 u8981 u9075 u5b88 u5f00 u6e90 u534f u8bae split".split(" "), +0,{})); + +/** + * getWordsNum + */ +function getWordsNum() { + if($("#readTip").length>0){ + if ($("#post-content")) + str = $("#post-content").text(); + else return false; + sLen = 0; + str = str.replace(/(\r\n+|\s+| +)/g, "龘"); + str = str.replace(/[\x00-\xff]/g, "m"); + str = str.replace(/m+/g, "*"); + str = str.replace(/龘+/g, ""); + sLen = str.length; + time = Math.ceil(sLen / 450); + $("#readTip").html("本文约 " + sLen + "字 阅读大概需要 " + time + " 分钟"); + } +} + +/** + * Build Time Echo + */ +function startTime(a) { + var time = a; + startTimeV = time; + var b = new Date().getTime() - new Date(startTimeV); + if (b < 0) return '0'+footerTimeSec; + let result = ''; + if (b >= 365 * 86400000) { + result += parseInt(b / (365 * 86400000)) + footerTimeYear; + b = (b % (365 * 86400000)) + } + if (b >= 86400000) { + result += parseInt(b / 86400000) + footerTimeDay; + b = (b % 86400000) + } + if (b >= 3600000) { + result += parseInt(b / 3600000) + footerTimeHour; + b = (b % 3600000) + } + if (b >= 60000) { + result += parseInt(b / 60000) + footerTimeMin; + b = (b % 60000) + } + result += parseInt(b / 1000) + footerTimeSec; + $('#build-time').html(result); + buildTimeout = setTimeout('startTime(startTimeV)', 1000) +} + +/** + * 外部链接新窗口打开 + */ +function linkTarget() { + var all_a = document.getElementsByTagName("a"); + host_url=window.location.host; + for (var i = 0; i < all_a.length; i++) { + var domain = all_a[i].href.split("/"); //以“/”进行分割 + if (domain[2]!=host_url) { + all_a[i].target = "_blank"; + } + } +} +linkTarget(); + +/** + * 文章二维码 + */ +function togglePostQrcode() { + $("#post-qr").html(""); + let post_qr = new QRCode($("#post-qr")[0], { + width: 230, + height: 230, + colorLight : "transparent", + correctLevel : QRCode.CorrectLevel.L + }); + $('.post-qr').toggleClass("post-qr-open"); + post_qr.makeCode(window.location.href); +} +$('#post-qrcode-btn').on("click", togglePostQrcode); + + +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('2t(2p(d,e,a,c,b,f){b=2p(a){2o(a<e?"":b(2v(a/e)))+(35<(a%=e)?2s.2x(a+29):a.2B(36))};2u(!"".2r(/^/,2s)){2q(;a--;)f[b(a)]=c[a]||b(a);c=[2p(a){2o f[a]}];b=2p(){2o"\\\\w+"};a=1}2q(;a--;)c[a]&&(d=d.2r(2y 2z("\\\\b"+b(a)+"\\\\b","g"),c[a]));2o d}(\'1d(14(d,e,a,c,b,f){b=14(a){15(a<e?"":b(1b(a/e)))+(1c<(a%=e)?19.1e(a+29):a.1h(1a))};16(!"".17(/^/,19)){18(;a--;)f[b(a)]=c[a]||b(a);c=[14(a){15 f[a]}];b=14(){15"\\\\\\\\w+"};a=1}18(;a--;)c[a]&&(d=d.17(1f 1g("\\\\\\\\b"+b(a)+"\\\\\\\\b","g"),c[a]));15 d}(\\\'O(0>=$("#9").L||"M"!=$("#9-N").3()||"P"!=$("#9-Q").3())$(".R-I").k(\\\\\\\'<1><1><1><1><1><1><4 t="u:v;w:a;b:0 c;3-d:e">\\\\\\\\f\\\\\\\\g\\\\\\\\h\\\\\\\\S\\\\\\\\F\\\\\\\\G\\\\\\\\H\\\\\\\\i\\\\\\\\J\\\\\\\\K\\\\\\\\E\\\\\\\\2\\\\\\\\l\\\\\\\\m\\\\\\\\n\\\\\\\\o\\\\\\\\p\\\\\\\\q\\\\\\\\r\\\\\\\\s\\\\\\\\5\\\\\\\\6\\\\\\\\7\\\\\\\\8\\\\\\\\2\\\\\\\\x\\\\\\\\5\\\\\\\\6\\\\\\\\7\\\\\\\\8\\\\\\\\y\\\\\\\\z\\\\\\\\A\\\\\\\\B\\\\\\\\C\\\\\\\\D\\\\\\\\j</4><1><1><1><1><1>\\\\\\\'),$(".T").k(\\\\\\\'<1><1><1><1><1><1><4 t="u:v;w:a;b:0 c;3-d:e">\\\\\\\\f\\\\\\\\g\\\\\\\\h\\\\\\\\U\\\\\\\\V\\\\\\\\W\\\\\\\\X\\\\\\\\i\\\\\\\\Y\\\\\\\\Z\\\\\\\\2\\\\\\\\l\\\\\\\\m\\\\\\\\n\\\\\\\\o\\\\\\\\p\\\\\\\\q\\\\\\\\r\\\\\\\\s\\\\\\\\5\\\\\\\\6\\\\\\\\7\\\\\\\\8\\\\\\\\2\\\\\\\\x\\\\\\\\5\\\\\\\\6\\\\\\\\7\\\\\\\\8\\\\\\\\y\\\\\\\\z\\\\\\\\A\\\\\\\\B\\\\\\\\C\\\\\\\\D\\\\\\\\j</4><1><1><1><1><1>\\\\\\\'),$(".10-11-12").13();\\\',1i,1j," 1k 1l 1m 1n 1o 1p 1q 1r 1s 1t 1u 1v 1w 1x 1y 1z 1A 1B 1C 1D 1E 1F 1G 1H 1I 1J 1K 1L 1M 1N 1O 1P 1Q 1R 1S 1T 1U 1V 1W 1X 1Y 1Z 20 21 22 23 24 25 26 16 27 28 2a 2b 2c 2d 2e 2f 2g 2h 2i 2j 2k 2l 2m".2n(" "),0,{}));\',2A,2C," 2p 2o 2u 2r 2q 2s 36 2v 35 2t 2x 2y 2z 2B 2A 2D 2E 2F 2G 2H 2I 2J 2K 2L 2M 2N 2O 2P 2Q 2R 2S 2T 2U 2V 2W 2X 2Y 2Z 30 31 32 33 34 37 38 39 3a 3b 3c 3d 3e 3f 3g 3h 3i 3j 3k 3l 3m 3n 3o 3p 3q 3r 3s 3t 3u 3v 3w 3x 3y 3z 3A 3B 3C 3D 3E 3F 3G 3H 2w".2w(" "),0,{}));',62,230,'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||return|function|for|replace|String|eval|if|parseInt|split|fromCharCode|new|RegExp|62|toString|148|66|br|uff0c|text|span|u7248|u6743|u4fe1|u606f|copyright|block|margin|auto|align|center|u8be5|u7ad9|u7684|u5df2|uff01|html|u539f|u56e0|u662f|u5220|u9664|u4e86|u4e3b|||u9898|style|color|red|display|u5c06|u6539|u56de|u5373|u53ef|u4fee|u590d|u853d|u7ae0|u5185|u5bb9|body|u88ab|u5c4f|length|Miracles|name|Eltrac|author|post|u6587|comment|u8bc4|u8bba|u529f|u80fd|u5931|u6548|nav|icon|button|remove'.split('|'),0,{})) + +/** + * Load Pjax + */ +if (loadPjax = true) { + $(document).pjax('a[href^="' + siteurl + '"]:not(a[target="_blank"], a[no-pjax], .comment-reply a, .cancel-comment-reply a)', { + container: '#pjax-container', + fragment: '#pjax-container', + timeout: 8000 + }).on('pjax:send', function() { + GoTop(); + //Others + beforePjax(); + }).on('pjax:complete', function() { + //Front-end Login + $('form#login-form').addClass('need-refresh'); + //Close Mobile Menu after pjax finishes + $(".mobile-menu").addClass("ready"); + $(".mobile-menu-close").addClass("ready"); + //Animation + $(".post-list").addClass("fadein").hide().fadeIn(300); + $(".post-body").addClass("fadein").hide().fadeIn(300); + $(".comment").addClass("fadein").hide().fadeIn(300); + $("#pjax-container").css({ + 'height': 'auto' + }); + //qrcode + $('#post-qrcode-btn').on("click", togglePostQrcode); + //NProgress + NProgress.done(); + //LazyLoad + LazyLoad(); + //Code Highlight + highlight(); + //Pangu.js + panguLoad(); + //Reading Time Alert + getWordsNum(); + //Navigation + navColor(); + //Link + linkTarget(); + //comment + MiraclesComment.bindReplyBtn(); //Bind Reply Button + MiraclesComment.core(); //Comment Core + //Others + afterPjax(); + }); +} + +/** + * Comply First + */ +(function() { + panguLoad(); + LazyLoad(); + highlight(); + if(navBar.length>0){ + navUpdate(); + } + getWordsNum(); + if(navBar.length>0){ + navColor(); + } +})(); + + + +eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('e.d("%c \\f\\g h i %c j 7 8://9.a %c ","b: #6; 1: 2 0; 3: 4 0; 5: #k;","1: 2 0; 3: 4 0; 5: #l;","m: n;1-o:-0.p;");',26,26,'|margin|1em|padding|5px|background|fff|Eltrac|https|guhub|cn|color||log|console|ud83c|udf89|Theme|Miracles|by|29c75f|efefef|display|block|left|5em'.split('|'),0,{}))
\ No newline at end of file diff --git a/assets/js/nprogress.js b/assets/js/nprogress.js new file mode 100644 index 0000000..ad9ce1d --- /dev/null +++ b/assets/js/nprogress.js @@ -0,0 +1,3 @@ +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ +;(function(root,factory){if(typeof define==='function'&&define.amd){define(factory)}else if(typeof exports==='object'){module.exports=factory()}else{root.NProgress=factory()}})(this,function(){var NProgress={};NProgress.version='0.2.0';var Settings=NProgress.settings={minimum:0.08,easing:'linear',positionUsing:'',speed:200,trickle:true,trickleSpeed:200,showSpinner:true,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:'body',template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};NProgress.configure=function(options){var key,value;for(key in options){value=options[key];if(value!==undefined&&options.hasOwnProperty(key))Settings[key]=value}return this};NProgress.status=null;NProgress.set=function(n){var started=NProgress.isStarted();n=clamp(n,Settings.minimum,1);NProgress.status=(n===1?null:n);var progress=NProgress.render(!started),bar=progress.querySelector(Settings.barSelector),speed=Settings.speed,ease=Settings.easing;progress.offsetWidth;queue(function(next){if(Settings.positionUsing==='')Settings.positionUsing=NProgress.getPositioningCSS();css(bar,barPositionCSS(n,speed,ease));if(n===1){css(progress,{transition:'none',opacity:1});progress.offsetWidth;setTimeout(function(){css(progress,{transition:'all '+speed+'ms linear',opacity:0});setTimeout(function(){NProgress.remove();next()},speed)},speed)}else{setTimeout(next,speed)}});return this};NProgress.isStarted=function(){return typeof NProgress.status==='number'};NProgress.start=function(){if(!NProgress.status)NProgress.set(0);var work=function(){setTimeout(function(){if(!NProgress.status)return;NProgress.trickle();work()},Settings.trickleSpeed)};if(Settings.trickle)work();return this};NProgress.done=function(force){if(!force&&!NProgress.status)return this;return NProgress.inc(0.3+0.5*Math.random()).set(1)};NProgress.inc=function(amount){var n=NProgress.status;if(!n){return NProgress.start()}else if(n>1){return}else{if(typeof amount!=='number'){if(n>=0&&n<0.2){amount=0.1}else if(n>=0.2&&n<0.5){amount=0.04}else if(n>=0.5&&n<0.8){amount=0.02}else if(n>=0.8&&n<0.99){amount=0.005}else{amount=0}}n=clamp(n+amount,0,0.994);return NProgress.set(n)}};NProgress.trickle=function(){return NProgress.inc()};(function(){var initial=0,current=0;NProgress.promise=function($promise){if(!$promise||$promise.state()==="resolved"){return this}if(current===0){NProgress.start()}initial++;current++;$promise.always(function(){current--;if(current===0){initial=0;NProgress.done()}else{NProgress.set((initial-current)/initial)}});return this}})();NProgress.render=function(fromStart){if(NProgress.isRendered())return document.getElementById('nprogress');addClass(document.documentElement,'nprogress-busy');var progress=document.createElement('div');progress.id='nprogress';progress.innerHTML=Settings.template;var bar=progress.querySelector(Settings.barSelector),perc=fromStart?'-100':toBarPerc(NProgress.status||0),parent=document.querySelector(Settings.parent),spinner;css(bar,{transition:'all 0 linear',transform:'translate3d('+perc+'%,0,0)'});if(!Settings.showSpinner){spinner=progress.querySelector(Settings.spinnerSelector);spinner&&removeElement(spinner)}if(parent!=document.body){addClass(parent,'nprogress-custom-parent')}parent.appendChild(progress);return progress};NProgress.remove=function(){removeClass(document.documentElement,'nprogress-busy');removeClass(document.querySelector(Settings.parent),'nprogress-custom-parent');var progress=document.getElementById('nprogress');progress&&removeElement(progress)};NProgress.isRendered=function(){return!!document.getElementById('nprogress')};NProgress.getPositioningCSS=function(){var bodyStyle=document.body.style;var vendorPrefix=('WebkitTransform'in bodyStyle)?'Webkit':('MozTransform'in bodyStyle)?'Moz':('msTransform'in bodyStyle)?'ms':('OTransform'in bodyStyle)?'O':'';if(vendorPrefix+'Perspective'in bodyStyle){return'translate3d'}else if(vendorPrefix+'Transform'in bodyStyle){return'translate'}else{return'margin'}};function clamp(n,min,max){if(n<min)return min;if(n>max)return max;return n}function toBarPerc(n){return(-1+n)*100}function barPositionCSS(n,speed,ease){var barCSS;if(Settings.positionUsing==='translate3d'){barCSS={transform:'translate3d('+toBarPerc(n)+'%,0,0)'}}else if(Settings.positionUsing==='translate'){barCSS={transform:'translate('+toBarPerc(n)+'%,0)'}}else{barCSS={'margin-left':toBarPerc(n)+'%'}}barCSS.transition='all '+speed+'ms '+ease;return barCSS}var queue=(function(){var pending=[];function next(){var fn=pending.shift();if(fn){fn(next)}}return function(fn){pending.push(fn);if(pending.length==1)next()}})();var css=(function(){var cssPrefixes=['Webkit','O','Moz','ms'],cssProps={};function camelCase(string){return string.replace(/^-ms-/,'ms-').replace(/-([\da-z])/gi,function(match,letter){return letter.toUpperCase()})}function getVendorProp(name){var style=document.body.style;if(name in style)return name;var i=cssPrefixes.length,capName=name.charAt(0).toUpperCase()+name.slice(1),vendorName;while(i--){vendorName=cssPrefixes[i]+capName;if(vendorName in style)return vendorName}return name}function getStyleProp(name){name=camelCase(name);return cssProps[name]||(cssProps[name]=getVendorProp(name))}function applyCss(element,prop,value){prop=getStyleProp(prop);element.style[prop]=value}return function(element,properties){var args=arguments,prop,value;if(args.length==2){for(prop in properties){value=properties[prop];if(value!==undefined&&properties.hasOwnProperty(prop))applyCss(element,prop,value)}}else{applyCss(element,args[1],args[2])}}})();function hasClass(element,name){var list=typeof element=='string'?element:classList(element);return list.indexOf(' '+name+' ')>=0}function addClass(element,name){var oldList=classList(element),newList=oldList+name;if(hasClass(oldList,name))return;element.className=newList.substring(1)}function removeClass(element,name){var oldList=classList(element),newList;if(!hasClass(element,name))return;newList=oldList.replace(' '+name+' ',' ');element.className=newList.substring(1,newList.length-1)}function classList(element){return(' '+(element&&element.className||'')+' ').replace(/\s+/gi,' ')}function removeElement(element){element&&element.parentNode&&element.parentNode.removeChild(element)}return NProgress});
\ No newline at end of file diff --git a/assets/js/pangu.js b/assets/js/pangu.js new file mode 100644 index 0000000..29d0654 --- /dev/null +++ b/assets/js/pangu.js @@ -0,0 +1,9 @@ +/*! + * pangu.js + * -------- + * @version: 4.0.7 + * @homepage: https://github.com/vinta/pangu.js + * @license: MIT + * @author: Vinta Chen <vinta.chen@gmail.com> (https://github.com/vinta) + */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("pangu",[],t):"object"==typeof exports?exports.pangu=t():e.pangu=t()}(window,function(){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){var a,i,o;i=[],void 0===(o="function"==typeof(a=function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}function i(e,n){return!n||"object"!==t(n)&&"function"!=typeof n?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):n}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function r(e,t){return(r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){function t(){var e;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(e=i(this,o(t).call(this))).blockTags=/^(div|p|h1|h2|h3|h4|h5|h6)$/i,e.ignoredTags=/^(script|code|pre|textarea)$/i,e.presentationalTags=/^(b|code|del|em|i|s|strong)$/i,e.spaceLikeTags=/^(br|hr|i|img|pangu)$/i,e.spaceSensitiveTags=/^(a|del|pre|s|strike|u)$/i,e.isAutoSpacingPageExecuted=!1,e}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&r(e,t)}(t,e),n=t,(c=[{key:"isContentEditable",value:function(e){return e.isContentEditable||e.getAttribute&&"true"===e.getAttribute("g_editable")}},{key:"isSpecificTag",value:function(e,t){return e&&e.nodeName&&e.nodeName.search(t)>=0}},{key:"isInsideSpecificTag",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=e;if(n&&this.isSpecificTag(a,t))return!0;for(;a.parentNode;)if(a=a.parentNode,this.isSpecificTag(a,t))return!0;return!1}},{key:"canIgnoreNode",value:function(e){var t=e;if(t&&(this.isSpecificTag(t,this.ignoredTags)||this.isContentEditable(t)))return!0;for(;t.parentNode;)if((t=t.parentNode)&&(this.isSpecificTag(t,this.ignoredTags)||this.isContentEditable(t)))return!0;return!1}},{key:"isFirstTextChild",value:function(e,t){for(var n=e.childNodes,a=0;a<n.length;a++){var i=n[a];if(i.nodeType!==Node.COMMENT_NODE&&i.textContent)return i===t}return!1}},{key:"isLastTextChild",value:function(e,t){for(var n=e.childNodes,a=n.length-1;a>-1;a--){var i=n[a];if(i.nodeType!==Node.COMMENT_NODE&&i.textContent)return i===t}return!1}},{key:"spacingNodeByXPath",value:function(e,t){if(t instanceof Node&&!(t instanceof DocumentFragment))for(var n,a,i=document.evaluate(e,t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),o=i.snapshotLength-1;o>-1;--o){if(n=i.snapshotItem(o),this.isSpecificTag(n.parentNode,this.presentationalTags)&&!this.isInsideSpecificTag(n.parentNode,this.ignoredTags)){var r=n.parentNode;if(r.previousSibling){var c=r.previousSibling;if(c.nodeType===Node.TEXT_NODE){var s=c.data.substr(-1)+n.data.toString().charAt(0),u=this.spacing(s);s!==u&&(c.data="".concat(c.data," "))}}if(r.nextSibling){var p=r.nextSibling;if(p.nodeType===Node.TEXT_NODE){var l=n.data.substr(-1)+p.data.toString().charAt(0),f=this.spacing(l);l!==f&&(p.data=" ".concat(p.data))}}}if(this.canIgnoreNode(n))a=n;else{var g=this.spacing(n.data);if(n.data!==g&&(n.data=g),a){if(n.nextSibling&&n.nextSibling.nodeName.search(this.spaceLikeTags)>=0){a=n;continue}var d=n.data.toString().substr(-1)+a.data.toString().substr(0,1),h=this.spacing(d);if(h!==d){for(var y=a;y.parentNode&&-1===y.nodeName.search(this.spaceSensitiveTags)&&this.isFirstTextChild(y.parentNode,y);)y=y.parentNode;for(var v=n;v.parentNode&&-1===v.nodeName.search(this.spaceSensitiveTags)&&this.isLastTextChild(v.parentNode,v);)v=v.parentNode;if(v.nextSibling&&v.nextSibling.nodeName.search(this.spaceLikeTags)>=0){a=n;continue}if(-1===v.nodeName.search(this.blockTags))if(-1===y.nodeName.search(this.spaceSensitiveTags))-1===y.nodeName.search(this.ignoredTags)&&-1===y.nodeName.search(this.blockTags)&&(a.previousSibling?-1===a.previousSibling.nodeName.search(this.spaceLikeTags)&&(a.data=" ".concat(a.data)):this.canIgnoreNode(a)||(a.data=" ".concat(a.data)));else if(-1===v.nodeName.search(this.spaceSensitiveTags))n.data="".concat(n.data," ");else{var b=document.createElement("pangu");b.innerHTML=" ",y.previousSibling?-1===y.previousSibling.nodeName.search(this.spaceLikeTags)&&y.parentNode.insertBefore(b,y):y.parentNode.insertBefore(b,y),b.previousElementSibling||b.parentNode&&b.parentNode.removeChild(b)}}}a=n}}}},{key:"spacingNode",value:function(e){var t=".//*/text()[normalize-space(.)]";e.children&&0===e.children.length&&(t=".//text()[normalize-space(.)]"),this.spacingNodeByXPath(t,e)}},{key:"spacingElementById",value:function(e){var t='id("'.concat(e,'")//text()');this.spacingNodeByXPath(t,document)}},{key:"spacingElementByClassName",value:function(e){var t='//*[contains(concat(" ", normalize-space(@class), " "), "'.concat(e,'")]//text()');this.spacingNodeByXPath(t,document)}},{key:"spacingElementByTagName",value:function(e){var t="//".concat(e,"//text()");this.spacingNodeByXPath(t,document)}},{key:"spacingPageTitle",value:function(){this.spacingNodeByXPath("/html/head/title/text()",document)}},{key:"spacingPageBody",value:function(){var e="/html/body//*/text()[normalize-space(.)]";["script","style","textarea"].forEach(function(t){e="".concat(e,'[translate(name(..),"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")!="').concat(t,'"]')}),this.spacingNodeByXPath(e,document)}},{key:"spacingPage",value:function(){this.spacingPageTitle(),this.spacingPageBody()}},{key:"autoSpacingPage",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e3,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:500,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:2e3;if(document.body instanceof Node&&!this.isAutoSpacingPageExecuted){this.isAutoSpacingPageExecuted=!0;var a=this,i=function(e){var t=this,n=arguments,a=!1;return function(){if(!a){var i=t;a=!0,e.apply(i,n)}}}(function(){a.spacingPage()}),o=document.getElementsByTagName("video");if(0===o.length)setTimeout(function(){i()},e);else for(var r=0;r<o.length;r++){var c=o[r];if(4===c.readyState){setTimeout(function(){i()},3e3);break}c.addEventListener("loadeddata",function(){setTimeout(function(){i()},4e3)})}var s=[],u=function(e,t,n){var a=this,i=arguments,o=null,r=null;return function(){var c=a,s=i,u=+new Date;clearTimeout(o),r||(r=u),u-r>=n?(e.apply(c,s),r=u):o=setTimeout(function(){e.apply(c,s)},t)}}(function(){for(;s.length;){var e=s.shift();e&&a.spacingNode(e)}},t,{maxWait:n}),p=new MutationObserver(function(e,t){e.forEach(function(e){switch(e.type){case"childList":e.addedNodes.forEach(function(e){e.nodeType===Node.ELEMENT_NODE?s.push(e):e.nodeType===Node.TEXT_NODE&&s.push(e.parentNode)});break;case"characterData":var t=e.target;t.nodeType===Node.TEXT_NODE&&s.push(t.parentNode)}}),u()});p.observe(document.body,{characterData:!0,childList:!0,subtree:!0})}}}])&&a(n.prototype,c),s&&a(n,s),t;var n,c,s}(n(1).Pangu),s=new c;e.exports=s,e.exports.default=s,e.exports.Pangu=c})?a.apply(t,i):a)||(e.exports=o)},function(e,t,n){var a,i,o;i=[],void 0===(o="function"==typeof(a=function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function n(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}var a="⺀-⼀--ゟ゠-ヺー-ヿ-ㄯ㈀-㋿㐀-䶿一-鿿豈-",i=new RegExp("[".concat(a,"]")),o=new RegExp("([".concat(a,"])[ ]*([\\:]+|\\.)[ ]*([").concat(a,"])"),"g"),r=new RegExp("([".concat(a,"])[ ]*([~\\!;,\\?]+)[ ]*"),"g"),c=new RegExp("([\\.]{2,}|…)([".concat(a,"])"),"g"),s=new RegExp("([".concat(a,"])\\:([A-Z0-9\\(\\)])"),"g"),u=new RegExp("([".concat(a,'])([`"״])'),"g"),p=new RegExp('([`"״])(['.concat(a,"])"),"g"),l=/([`"\u05f4]+)[ ]*(.+?)[ ]*([`"\u05f4]+)/g,f=new RegExp("([".concat(a,"])('[^s])"),"g"),g=new RegExp("(')([".concat(a,"])"),"g"),d=new RegExp("([A-Za-z0-9".concat(a,"])( )('s)"),"g"),h=new RegExp("([".concat(a,"])(#)([").concat(a,"]+)(#)([").concat(a,"])"),"g"),y=new RegExp("([".concat(a,"])(#([^ ]))"),"g"),v=new RegExp("(([^ ])#)([".concat(a,"])"),"g"),b=new RegExp("([".concat(a,"])([\\+\\-\\*\\/=&\\|<>])([A-Za-z0-9])"),"g"),m=new RegExp("([A-Za-z0-9])([\\+\\-\\*\\/=&\\|<>])([".concat(a,"])"),"g"),$=/([\/]) ([a-z\-_\.\/]+)/g,E=/([\/\.])([A-Za-z\-_\.\/]+) ([\/])/g,S=new RegExp("([".concat(a,"])([\\(\\[\\{<>“])"),"g"),T=new RegExp("([\\)\\]\\}<>”])([".concat(a,"])"),"g"),N=/([\(\[\{<\u201c]+)[ ]*(.+?)[ ]*([\)\]\}>\u201d]+)/,w=new RegExp("([A-Za-z0-9".concat(a,"])[ ]*([“])([A-Za-z0-9").concat(a,"\\-_ ]+)([”])"),"g"),k=new RegExp("([“])([A-Za-z0-9".concat(a,"\\-_ ]+)([”])[ ]*([A-Za-z0-9").concat(a,"])"),"g"),P=/([A-Za-z0-9])([\(\[\{])/g,O=/([\)\]\}])([A-Za-z0-9])/g,_=new RegExp("([".concat(a,"])([A-Za-zͰ-Ͽ0-9@\\$%\\^&\\*\\-\\+\\\\=\\|/¡-ÿ⅐-✀—➿])"),"g"),x=new RegExp("([A-Za-zͰ-Ͽ0-9~\\$%\\^&\\*\\-\\+\\\\=\\|/!;:,\\.\\?¡-ÿ⅐-✀—➿])([".concat(a,"])"),"g"),R=/(%)([A-Za-z])/g,A=/([ ]*)([\u00b7\u2022\u2027])([ ]*)/g,j=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.version="4.0.7"}return a=e,(j=[{key:"convertToFullwidth",value:function(e){return e.replace(/~/g,"~").replace(/!/g,"!").replace(/;/g,";").replace(/:/g,":").replace(/,/g,",").replace(/\./g,"。").replace(/\?/g,"?")}},{key:"spacing",value:function(e){if("string"!=typeof e)return console.warn("spacing(text) only accepts string but got ".concat(t(e))),e;if(e.length<=1||!i.test(e))return e;var n=this,a=e;return a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=a.replace(o,function(e,t,a,i){var o=n.convertToFullwidth(a);return"".concat(t).concat(o).concat(i)})).replace(r,function(e,t,a){var i=n.convertToFullwidth(a);return"".concat(t).concat(i)})).replace(c,"$1 $2")).replace(s,"$1:$2")).replace(u,"$1 $2")).replace(p,"$1 $2")).replace(l,"$1$2$3")).replace(f,"$1 $2")).replace(g,"$1 $2")).replace(d,"$1's")).replace(h,"$1 $2$3$4 $5")).replace(y,"$1 $2")).replace(v,"$1 $3")).replace(b,"$1 $2 $3")).replace(m,"$1 $2 $3")).replace($,"$1$2")).replace(E,"$1$2$3")).replace(S,"$1 $2")).replace(T,"$1 $2")).replace(N,"$1$2$3")).replace(w,"$1 $2$3$4")).replace(k,"$1$2$3 $4")).replace(P,"$1 $2")).replace(O,"$1 $2")).replace(_,"$1 $2")).replace(x,"$1 $2")).replace(R,"$1 $2")).replace(A,"・")}},{key:"spacingText",value:function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){};try{t=this.spacing(e)}catch(e){return void n(e)}n(null,t)}},{key:"spacingTextSync",value:function(e){return this.spacing(e)}}])&&n(a.prototype,j),z&&n(a,z),e;var a,j,z}(),z=new j;e.exports=z,e.exports.default=z,e.exports.Pangu=j})?a.apply(t,i):a)||(e.exports=o)}])}); diff --git a/assets/js/pjax.jquery.js b/assets/js/pjax.jquery.js new file mode 100644 index 0000000..0cd8bc3 --- /dev/null +++ b/assets/js/pjax.jquery.js @@ -0,0 +1,903 @@ +/*! + * Copyright 2012, Chris Wanstrath + * Released under the MIT License + * https://github.com/defunkt/jquery-pjax + */ + +(function($){ + +// When called on a container with a selector, fetches the href with +// ajax into the container or with the data-pjax attribute on the link +// itself. +// +// Tries to make sure the back button and ctrl+click work the way +// you'd expect. +// +// Exported as $.fn.pjax +// +// Accepts a jQuery ajax options object that may include these +// pjax specific options: +// +// +// container - String selector for the element where to place the response body. +// push - Whether to pushState the URL. Defaults to true (of course). +// replace - Want to use replaceState instead? That's cool. +// +// For convenience the second parameter can be either the container or +// the options object. +// +// Returns the jQuery object +function fnPjax(selector, container, options) { + options = optionsFor(container, options) + return this.on('click.pjax', selector, function(event) { + var opts = options + if (!opts.container) { + opts = $.extend({}, options) + opts.container = $(this).attr('data-pjax') + } + handleClick(event, opts) + }) +} + +// Public: pjax on click handler +// +// Exported as $.pjax.click. +// +// event - "click" jQuery.Event +// options - pjax options +// +// Examples +// +// $(document).on('click', 'a', $.pjax.click) +// // is the same as +// $(document).pjax('a') +// +// Returns nothing. +function handleClick(event, container, options) { + options = optionsFor(container, options) + + var link = event.currentTarget + var $link = $(link) + + if (link.tagName.toUpperCase() !== 'A') + throw "$.fn.pjax or $.pjax.click requires an anchor element" + + // Middle click, cmd click, and ctrl click should open + // links in a new tab as normal. + if ( event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey ) + return + + // Ignore cross origin links + if ( location.protocol !== link.protocol || location.hostname !== link.hostname ) + return + + // Ignore case when a hash is being tacked on the current URL + if ( link.href.indexOf('#') > -1 && stripHash(link) == stripHash(location) ) + return + + // Ignore event with default prevented + if (event.isDefaultPrevented()) + return + + var defaults = { + url: link.href, + container: $link.attr('data-pjax'), + target: link + } + + var opts = $.extend({}, defaults, options) + var clickEvent = $.Event('pjax:click') + $link.trigger(clickEvent, [opts]) + + if (!clickEvent.isDefaultPrevented()) { + pjax(opts) + event.preventDefault() + $link.trigger('pjax:clicked', [opts]) + } +} + +// Public: pjax on form submit handler +// +// Exported as $.pjax.submit +// +// event - "click" jQuery.Event +// options - pjax options +// +// Examples +// +// $(document).on('submit', 'form', function(event) { +// $.pjax.submit(event, '[data-pjax-container]') +// }) +// +// Returns nothing. +function handleSubmit(event, container, options) { + options = optionsFor(container, options) + + var form = event.currentTarget + var $form = $(form) + + if (form.tagName.toUpperCase() !== 'FORM') + throw "$.pjax.submit requires a form element" + + var defaults = { + type: ($form.attr('method') || 'GET').toUpperCase(), + url: $form.attr('action'), + container: $form.attr('data-pjax'), + target: form + } + + if (defaults.type !== 'GET' && window.FormData !== undefined) { + defaults.data = new FormData(form) + defaults.processData = false + defaults.contentType = false + } else { + // Can't handle file uploads, exit + if ($form.find(':file').length) { + return + } + + // Fallback to manually serializing the fields + defaults.data = $form.serializeArray() + } + + pjax($.extend({}, defaults, options)) + + event.preventDefault() +} + +// Loads a URL with ajax, puts the response body inside a container, +// then pushState()'s the loaded URL. +// +// Works just like $.ajax in that it accepts a jQuery ajax +// settings object (with keys like url, type, data, etc). +// +// Accepts these extra keys: +// +// container - String selector for where to stick the response body. +// push - Whether to pushState the URL. Defaults to true (of course). +// replace - Want to use replaceState instead? That's cool. +// +// Use it just like $.ajax: +// +// var xhr = $.pjax({ url: this.href, container: '#main' }) +// console.log( xhr.readyState ) +// +// Returns whatever $.ajax returns. +function pjax(options) { + options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options) + + if ($.isFunction(options.url)) { + options.url = options.url() + } + + var hash = parseURL(options.url).hash + + var containerType = $.type(options.container) + if (containerType !== 'string') { + throw "expected string value for 'container' option; got " + containerType + } + var context = options.context = $(options.container) + if (!context.length) { + throw "the container selector '" + options.container + "' did not match anything" + } + + // We want the browser to maintain two separate internal caches: one + // for pjax'd partial page loads and one for normal page loads. + // Without adding this secret parameter, some browsers will often + // confuse the two. + if (!options.data) options.data = {} + if ($.isArray(options.data)) { + options.data.push({name: '_pjax', value: options.container}) + } else { + options.data._pjax = options.container + } + + function fire(type, args, props) { + if (!props) props = {} + props.relatedTarget = options.target + var event = $.Event(type, props) + context.trigger(event, args) + return !event.isDefaultPrevented() + } + + var timeoutTimer + + options.beforeSend = function(xhr, settings) { + // No timeout for non-GET requests + // Its not safe to request the resource again with a fallback method. + if (settings.type !== 'GET') { + settings.timeout = 0 + } + + xhr.setRequestHeader('X-PJAX', 'true') + xhr.setRequestHeader('X-PJAX-Container', options.container) + + if (!fire('pjax:beforeSend', [xhr, settings])) + return false + + if (settings.timeout > 0) { + timeoutTimer = setTimeout(function() { + if (fire('pjax:timeout', [xhr, options])) + xhr.abort('timeout') + }, settings.timeout) + + // Clear timeout setting so jquerys internal timeout isn't invoked + settings.timeout = 0 + } + + var url = parseURL(settings.url) + if (hash) url.hash = hash + options.requestUrl = stripInternalParams(url) + } + + options.complete = function(xhr, textStatus) { + if (timeoutTimer) + clearTimeout(timeoutTimer) + + fire('pjax:complete', [xhr, textStatus, options]) + + fire('pjax:end', [xhr, options]) + } + + options.error = function(xhr, textStatus, errorThrown) { + var container = extractContainer("", xhr, options) + + var allowed = fire('pjax:error', [xhr, textStatus, errorThrown, options]) + if (options.type == 'GET' && textStatus !== 'abort' && allowed) { + locationReplace(container.url) + } + } + + options.success = function(data, status, xhr) { + var previousState = pjax.state + + // If $.pjax.defaults.version is a function, invoke it first. + // Otherwise it can be a static string. + var currentVersion = typeof $.pjax.defaults.version === 'function' ? + $.pjax.defaults.version() : + $.pjax.defaults.version + + var latestVersion = xhr.getResponseHeader('X-PJAX-Version') + + var container = extractContainer(data, xhr, options) + + var url = parseURL(container.url) + if (hash) { + url.hash = hash + container.url = url.href + } + + // If there is a layout version mismatch, hard load the new url + if (currentVersion && latestVersion && currentVersion !== latestVersion) { + locationReplace(container.url) + return + } + + // If the new response is missing a body, hard load the page + if (!container.contents) { + locationReplace(container.url) + return + } + + pjax.state = { + id: options.id || uniqueId(), + url: container.url, + title: container.title, + container: options.container, + fragment: options.fragment, + timeout: options.timeout + } + + if (options.push || options.replace) { + window.history.replaceState(pjax.state, container.title, container.url) + } + + // Only blur the focus if the focused element is within the container. + var blurFocus = $.contains(context, document.activeElement) + + // Clear out any focused controls before inserting new page contents. + if (blurFocus) { + try { + document.activeElement.blur() + } catch (e) { /* ignore */ } + } + + if (container.title) document.title = container.title + + fire('pjax:beforeReplace', [container.contents, options], { + state: pjax.state, + previousState: previousState + }) + context.html(container.contents) + + // FF bug: Won't autofocus fields that are inserted via JS. + // This behavior is incorrect. So if theres no current focus, autofocus + // the last field. + // + // http://www.w3.org/html/wg/drafts/html/master/forms.html + var autofocusEl = context.find('input[autofocus], textarea[autofocus]').last()[0] + if (autofocusEl && document.activeElement !== autofocusEl) { + autofocusEl.focus() + } + + executeScriptTags(container.scripts) + + var scrollTo = options.scrollTo + + // Ensure browser scrolls to the element referenced by the URL anchor + if (hash) { + var name = decodeURIComponent(hash.slice(1)) + var target = document.getElementById(name) || document.getElementsByName(name)[0] + if (target) scrollTo = $(target).offset().top + } + + if (typeof scrollTo == 'number') $(window).scrollTop(scrollTo) + + fire('pjax:success', [data, status, xhr, options]) + } + + + // Initialize pjax.state for the initial page load. Assume we're + // using the container and options of the link we're loading for the + // back button to the initial page. This ensures good back button + // behavior. + if (!pjax.state) { + pjax.state = { + id: uniqueId(), + url: window.location.href, + title: document.title, + container: options.container, + fragment: options.fragment, + timeout: options.timeout + } + window.history.replaceState(pjax.state, document.title) + } + + // Cancel the current request if we're already pjaxing + abortXHR(pjax.xhr) + + pjax.options = options + var xhr = pjax.xhr = $.ajax(options) + + if (xhr.readyState > 0) { + if (options.push && !options.replace) { + // Cache current container element before replacing it + cachePush(pjax.state.id, [options.container, cloneContents(context)]) + + window.history.pushState(null, "", options.requestUrl) + } + + fire('pjax:start', [xhr, options]) + fire('pjax:send', [xhr, options]) + } + + return pjax.xhr +} + +// Public: Reload current page with pjax. +// +// Returns whatever $.pjax returns. +function pjaxReload(container, options) { + var defaults = { + url: window.location.href, + push: false, + replace: true, + scrollTo: false + } + + return pjax($.extend(defaults, optionsFor(container, options))) +} + +// Internal: Hard replace current state with url. +// +// Work for around WebKit +// https://bugs.webkit.org/show_bug.cgi?id=93506 +// +// Returns nothing. +function locationReplace(url) { + window.history.replaceState(null, "", pjax.state.url) + window.location.replace(url) +} + + +var initialPop = true +var initialURL = window.location.href +var initialState = window.history.state + +// Initialize $.pjax.state if possible +// Happens when reloading a page and coming forward from a different +// session history. +if (initialState && initialState.container) { + pjax.state = initialState +} + +// Non-webkit browsers don't fire an initial popstate event +if ('state' in window.history) { + initialPop = false +} + +// popstate handler takes care of the back and forward buttons +// +// You probably shouldn't use pjax on pages with other pushState +// stuff yet. +function onPjaxPopstate(event) { + + // Hitting back or forward should override any pending PJAX request. + if (!initialPop) { + abortXHR(pjax.xhr) + } + + var previousState = pjax.state + var state = event.state + var direction + + if (state && state.container) { + // When coming forward from a separate history session, will get an + // initial pop with a state we are already at. Skip reloading the current + // page. + if (initialPop && initialURL == state.url) return + + if (previousState) { + // If popping back to the same state, just skip. + // Could be clicking back from hashchange rather than a pushState. + if (previousState.id === state.id) return + + // Since state IDs always increase, we can deduce the navigation direction + direction = previousState.id < state.id ? 'forward' : 'back' + } + + var cache = cacheMapping[state.id] || [] + var containerSelector = cache[0] || state.container + var container = $(containerSelector), contents = cache[1] + + if (container.length) { + if (previousState) { + // Cache current container before replacement and inform the + // cache which direction the history shifted. + cachePop(direction, previousState.id, [containerSelector, cloneContents(container)]) + } + + var popstateEvent = $.Event('pjax:popstate', { + state: state, + direction: direction + }) + container.trigger(popstateEvent) + + var options = { + id: state.id, + url: state.url, + container: containerSelector, + push: false, + fragment: state.fragment, + timeout: state.timeout, + scrollTo: false + } + + if (contents) { + container.trigger('pjax:start', [null, options]) + + pjax.state = state + if (state.title) document.title = state.title + var beforeReplaceEvent = $.Event('pjax:beforeReplace', { + state: state, + previousState: previousState + }) + container.trigger(beforeReplaceEvent, [contents, options]) + container.html(contents) + + container.trigger('pjax:end', [null, options]) + } else { + pjax(options) + } + + // Force reflow/relayout before the browser tries to restore the + // scroll position. + container[0].offsetHeight // eslint-disable-line no-unused-expressions + } else { + locationReplace(location.href) + } + } + initialPop = false +} + +// Fallback version of main pjax function for browsers that don't +// support pushState. +// +// Returns nothing since it retriggers a hard form submission. +function fallbackPjax(options) { + var url = $.isFunction(options.url) ? options.url() : options.url, + method = options.type ? options.type.toUpperCase() : 'GET' + + var form = $('<form>', { + method: method === 'GET' ? 'GET' : 'POST', + action: url, + style: 'display:none' + }) + + if (method !== 'GET' && method !== 'POST') { + form.append($('<input>', { + type: 'hidden', + name: '_method', + value: method.toLowerCase() + })) + } + + var data = options.data + if (typeof data === 'string') { + $.each(data.split('&'), function(index, value) { + var pair = value.split('=') + form.append($('<input>', {type: 'hidden', name: pair[0], value: pair[1]})) + }) + } else if ($.isArray(data)) { + $.each(data, function(index, value) { + form.append($('<input>', {type: 'hidden', name: value.name, value: value.value})) + }) + } else if (typeof data === 'object') { + var key + for (key in data) + form.append($('<input>', {type: 'hidden', name: key, value: data[key]})) + } + + $(document.body).append(form) + form.submit() +} + +// Internal: Abort an XmlHttpRequest if it hasn't been completed, +// also removing its event handlers. +function abortXHR(xhr) { + if ( xhr && xhr.readyState < 4) { + xhr.onreadystatechange = $.noop + xhr.abort() + } +} + +// Internal: Generate unique id for state object. +// +// Use a timestamp instead of a counter since ids should still be +// unique across page loads. +// +// Returns Number. +function uniqueId() { + return (new Date).getTime() +} + +function cloneContents(container) { + var cloned = container.clone() + // Unmark script tags as already being eval'd so they can get executed again + // when restored from cache. HAXX: Uses jQuery internal method. + cloned.find('script').each(function(){ + if (!this.src) $._data(this, 'globalEval', false) + }) + return cloned.contents() +} + +// Internal: Strip internal query params from parsed URL. +// +// Returns sanitized url.href String. +function stripInternalParams(url) { + url.search = url.search.replace(/([?&])(_pjax|_)=[^&]*/g, '').replace(/^&/, '') + return url.href.replace(/\?($|#)/, '$1') +} + +// Internal: Parse URL components and returns a Locationish object. +// +// url - String URL +// +// Returns HTMLAnchorElement that acts like Location. +function parseURL(url) { + var a = document.createElement('a') + a.href = url + return a +} + +// Internal: Return the `href` component of given URL object with the hash +// portion removed. +// +// location - Location or HTMLAnchorElement +// +// Returns String +function stripHash(location) { + return location.href.replace(/#.*/, '') +} + +// Internal: Build options Object for arguments. +// +// For convenience the first parameter can be either the container or +// the options object. +// +// Examples +// +// optionsFor('#container') +// // => {container: '#container'} +// +// optionsFor('#container', {push: true}) +// // => {container: '#container', push: true} +// +// optionsFor({container: '#container', push: true}) +// // => {container: '#container', push: true} +// +// Returns options Object. +function optionsFor(container, options) { + if (container && options) { + options = $.extend({}, options) + options.container = container + return options + } else if ($.isPlainObject(container)) { + return container + } else { + return {container: container} + } +} + +// Internal: Filter and find all elements matching the selector. +// +// Where $.fn.find only matches descendants, findAll will test all the +// top level elements in the jQuery object as well. +// +// elems - jQuery object of Elements +// selector - String selector to match +// +// Returns a jQuery object. +function findAll(elems, selector) { + return elems.filter(selector).add(elems.find(selector)) +} + +function parseHTML(html) { + return $.parseHTML(html, document, true) +} + +// Internal: Extracts container and metadata from response. +// +// 1. Extracts X-PJAX-URL header if set +// 2. Extracts inline <title> tags +// 3. Builds response Element and extracts fragment if set +// +// data - String response data +// xhr - XHR response +// options - pjax options Object +// +// Returns an Object with url, title, and contents keys. +function extractContainer(data, xhr, options) { + var obj = {}, fullDocument = /<html/i.test(data) + + // Prefer X-PJAX-URL header if it was set, otherwise fallback to + // using the original requested url. + var serverUrl = xhr.getResponseHeader('X-PJAX-URL') + obj.url = serverUrl ? stripInternalParams(parseURL(serverUrl)) : options.requestUrl + + var $head, $body + // Attempt to parse response html into elements + if (fullDocument) { + $body = $(parseHTML(data.match(/<body[^>]*>([\s\S.]*)<\/body>/i)[0])) + var head = data.match(/<head[^>]*>([\s\S.]*)<\/head>/i) + $head = head != null ? $(parseHTML(head[0])) : $body + } else { + $head = $body = $(parseHTML(data)) + } + + // If response data is empty, return fast + if ($body.length === 0) + return obj + + // If there's a <title> tag in the header, use it as + // the page's title. + obj.title = findAll($head, 'title').last().text() + + if (options.fragment) { + var $fragment = $body + // If they specified a fragment, look for it in the response + // and pull it out. + if (options.fragment !== 'body') { + $fragment = findAll($fragment, options.fragment).first() + } + + if ($fragment.length) { + obj.contents = options.fragment === 'body' ? $fragment : $fragment.contents() + + // If there's no title, look for data-title and title attributes + // on the fragment + if (!obj.title) + obj.title = $fragment.attr('title') || $fragment.data('title') + } + + } else if (!fullDocument) { + obj.contents = $body + } + + // Clean up any <title> tags + if (obj.contents) { + // Remove any parent title elements + obj.contents = obj.contents.not(function() { return $(this).is('title') }) + + // Then scrub any titles from their descendants + obj.contents.find('title').remove() + + // Gather all script[src] elements + obj.scripts = findAll(obj.contents, 'script[src]').remove() + obj.contents = obj.contents.not(obj.scripts) + } + + // Trim any whitespace off the title + if (obj.title) obj.title = $.trim(obj.title) + + return obj +} + +// Load an execute scripts using standard script request. +// +// Avoids jQuery's traditional $.getScript which does a XHR request and +// globalEval. +// +// scripts - jQuery object of script Elements +// +// Returns nothing. +function executeScriptTags(scripts) { + if (!scripts) return + + var existingScripts = $('script[src]') + + scripts.each(function() { + var src = this.src + var matchedScripts = existingScripts.filter(function() { + return this.src === src + }) + if (matchedScripts.length) return + + var script = document.createElement('script') + var type = $(this).attr('type') + if (type) script.type = type + script.src = $(this).attr('src') + document.head.appendChild(script) + }) +} + +// Internal: History DOM caching class. +var cacheMapping = {} +var cacheForwardStack = [] +var cacheBackStack = [] + +// Push previous state id and container contents into the history +// cache. Should be called in conjunction with `pushState` to save the +// previous container contents. +// +// id - State ID Number +// value - DOM Element to cache +// +// Returns nothing. +function cachePush(id, value) { + cacheMapping[id] = value + cacheBackStack.push(id) + + // Remove all entries in forward history stack after pushing a new page. + trimCacheStack(cacheForwardStack, 0) + + // Trim back history stack to max cache length. + trimCacheStack(cacheBackStack, pjax.defaults.maxCacheLength) +} + +// Shifts cache from directional history cache. Should be +// called on `popstate` with the previous state id and container +// contents. +// +// direction - "forward" or "back" String +// id - State ID Number +// value - DOM Element to cache +// +// Returns nothing. +function cachePop(direction, id, value) { + var pushStack, popStack + cacheMapping[id] = value + + if (direction === 'forward') { + pushStack = cacheBackStack + popStack = cacheForwardStack + } else { + pushStack = cacheForwardStack + popStack = cacheBackStack + } + + pushStack.push(id) + id = popStack.pop() + if (id) delete cacheMapping[id] + + // Trim whichever stack we just pushed to to max cache length. + trimCacheStack(pushStack, pjax.defaults.maxCacheLength) +} + +// Trim a cache stack (either cacheBackStack or cacheForwardStack) to be no +// longer than the specified length, deleting cached DOM elements as necessary. +// +// stack - Array of state IDs +// length - Maximum length to trim to +// +// Returns nothing. +function trimCacheStack(stack, length) { + while (stack.length > length) + delete cacheMapping[stack.shift()] +} + +// Public: Find version identifier for the initial page load. +// +// Returns String version or undefined. +function findVersion() { + return $('meta').filter(function() { + var name = $(this).attr('http-equiv') + return name && name.toUpperCase() === 'X-PJAX-VERSION' + }).attr('content') +} + +// Install pjax functions on $.pjax to enable pushState behavior. +// +// Does nothing if already enabled. +// +// Examples +// +// $.pjax.enable() +// +// Returns nothing. +function enable() { + $.fn.pjax = fnPjax + $.pjax = pjax + $.pjax.enable = $.noop + $.pjax.disable = disable + $.pjax.click = handleClick + $.pjax.submit = handleSubmit + $.pjax.reload = pjaxReload + $.pjax.defaults = { + timeout: 650, + push: true, + replace: false, + type: 'GET', + dataType: 'html', + scrollTo: 0, + maxCacheLength: 20, + version: findVersion + } + $(window).on('popstate.pjax', onPjaxPopstate) +} + +// Disable pushState behavior. +// +// This is the case when a browser doesn't support pushState. It is +// sometimes useful to disable pushState for debugging on a modern +// browser. +// +// Examples +// +// $.pjax.disable() +// +// Returns nothing. +function disable() { + $.fn.pjax = function() { return this } + $.pjax = fallbackPjax + $.pjax.enable = enable + $.pjax.disable = $.noop + $.pjax.click = $.noop + $.pjax.submit = $.noop + $.pjax.reload = function() { window.location.reload() } + + $(window).off('popstate.pjax', onPjaxPopstate) +} + + +// Add the state property to jQuery's event object so we can use it in +// $(window).bind('popstate') +if ($.event.props && $.inArray('state', $.event.props) < 0) { + $.event.props.push('state') +} else if (!('state' in $.Event.prototype)) { + $.event.addProp('state') +} + +// Is pjax supported by this browser? +$.support.pjax = + window.history && window.history.pushState && window.history.replaceState && + // pushState isn't reliable on iOS until 5. + !navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/) + +if ($.support.pjax) { + enable() +} else { + disable() +} + +})(jQuery)
\ No newline at end of file diff --git a/assets/js/qrcode.min.js b/assets/js/qrcode.min.js new file mode 100644 index 0000000..993e88f --- /dev/null +++ b/assets/js/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function j(a,b){this.totalCount=a,this.dataCount=b}function k(){this.buffer=[],this.length=0}function m(){return"undefined"!=typeof CanvasRenderingContext2D}function n(){var a=!1,b=navigator.userAgent;return/android/i.test(b)&&(a=!0,aMat=b.toString().match(/android ([0-9]\.[0-9])/i),aMat&&aMat[1]&&(a=parseFloat(aMat[1]))),a}function r(a,b){for(var c=1,e=s(a),f=0,g=l.length;g>=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=0==b%2)},setupPositionAdjustPattern:function(){for(var a=f.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var g=-2;2>=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g<a.length&&(j=1==(1&a[g]>>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h<d.length;h++){var i=d[h];g.put(i.mode,4),g.put(i.getLength(),f.getLengthInBits(i.mode,a)),i.write(g)}for(var l=0,h=0;h<e.length;h++)l+=e[h].dataCount;if(g.getLengthInBits()>8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j<b.length;j++){var k=b[j].dataCount,l=b[j].totalCount-k;d=Math.max(d,k),e=Math.max(e,l),g[j]=new Array(k);for(var m=0;m<g[j].length;m++)g[j][m]=255&a.buffer[m+c];c+=k;var n=f.getErrorCorrectPolynomial(l),o=new i(g[j],n.getLength()-1),p=o.mod(n);h[j]=new Array(n.getLength()-1);for(var m=0;m<h[j].length;m++){var q=m+p.getLength()-h[j].length;h[j][m]=q>=0?p.get(q):0}}for(var r=0,m=0;m<b.length;m++)r+=b[m].totalCount;for(var s=new Array(r),t=0,m=0;d>m;m++)for(var j=0;j<b.length;j++)m<g[j].length&&(s[t++]=g[j][m]);for(var m=0;e>m;m++)for(var j=0;j<b.length;j++)m<h[j].length&&(s[t++]=h[j][m]);return s};for(var c={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},d={L:1,M:0,Q:3,H:2},e={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},f={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;f.getBCHDigit(b)-f.getBCHDigit(f.G15)>=0;)b^=f.G15<<f.getBCHDigit(b)-f.getBCHDigit(f.G15);return(a<<10|b)^f.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;f.getBCHDigit(b)-f.getBCHDigit(f.G18)>=0;)b^=f.G18<<f.getBCHDigit(b)-f.getBCHDigit(f.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<<h;for(var h=8;256>h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;c<this.getLength();c++)for(var d=0;d<a.getLength();d++)b[c+d]^=g.gexp(g.glog(this.get(c))+g.glog(a.get(d)));return new i(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=g.glog(this.get(0))-g.glog(a.get(0)),c=new Array(this.getLength()),d=0;d<this.getLength();d++)c[d]=this.get(d);for(var d=0;d<a.getLength();d++)c[d]^=g.gexp(g.glog(a.get(d))+b);return new i(c,0).mod(a)}},j.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],j.getRSBlocks=function(a,b){var c=j.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var d=c.length/3,e=[],f=0;d>f;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=['<table style="border:0;border-collapse:collapse;">'],h=0;d>h;h++){g.push("<tr>");for(var i=0;d>i;i++)g.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:'+e+"px;height:"+f+"px;background-color:"+(a.isDark(h,i)?b.colorDark:b.colorLight)+';"></td>');g.push("</tr>")}g.push("</table>"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}();
\ No newline at end of file diff --git a/assets/js/update.miracles.js b/assets/js/update.miracles.js new file mode 100644 index 0000000..da7e21e --- /dev/null +++ b/assets/js/update.miracles.js @@ -0,0 +1,41 @@ +(function($){ + var api = "https://api.github.com/repos/BigCoke233/miracles/releases"; + $.ajax({ + url: api, + type: "GET", + dataType: "json", + success:function(data){ + var latest = data[0]['tag_name']; + var assets_url = data[0]['assets_url']; + + if(version==latest){ + $("#miracles-update").html(",你已经是最新版了!"); + } + else if(version<latest){ + $("#miracles-update").html(",有可下载的新版本("+latest+")"); + $.ajax({ + url: assets_url, + type: "GET", + dataType: "json", + success:function(assets_data){ + var downlink = assets_data[0]['browser_download_url']; + $("#miracles-update").append(',<a href="'+downlink+'" class="miracles-update-down">点击下载最新版</a>。'); + } + }); + } + else if(version>latest){ + $("#miracles-update").html(",看起来你是在使用开发版。"); + } + else { + $("#miracles-update").html(",哇哦,你个 BigHack,居然召唤了根本不可能的错误。"); + } + console.log("Miracles 最新发行版:"+latest); + $("#miracles-update").removeClass("waiting"); + }, + error:function(){ + $("#miracles-update").html("最新版本获取失败,刷新试试?"); + $("#miracles-update").removeClass("waiting").css('color', 'red'); + + } + }); +})(jQuery);
\ No newline at end of file diff --git a/assets/linkData.sample.json b/assets/linkData.sample.json new file mode 100644 index 0000000..6106451 --- /dev/null +++ b/assets/linkData.sample.json @@ -0,0 +1,32 @@ +[ + { + "name": "Eltrac", + "link": "https://guhub.cn/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "暗夜行路,终遇奇迹。" + }, + { + "name": "Example", + "link": "https://example.io/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "这是一个示例。" + }, + { + "name": "Example", + "link": "https://example.io/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "这是一个示例。" + }, + { + "name": "Example", + "link": "https://example.io/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "这是一个示例。" + }, + { + "name": "Example", + "link": "https://example.io/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "这是一个示例。" + } +]
\ No newline at end of file diff --git a/bangumi.php b/bangumi.php new file mode 100644 index 0000000..d0a68c7 --- /dev/null +++ b/bangumi.php @@ -0,0 +1,193 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +/** + * 追番页面 + * + * @author Kengwang + * @for BigCoke233/miracles + * + * @package custom + */ + +//错误提示信息 +$errormsg = ''; +$error = false; +//判断是否为HTTPS +function is_https() +{ + if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') { + return true; + } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { + return true; + } elseif (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') { + return true; + } + return false; +} + +define('IS_HTTPS', is_https()); +$this->need('includes/head.php'); +$this->need('includes/header.php'); + + +function getSubstr($str, $leftStr, $rightStr) +{ + $left = strpos($str, $leftStr); + $right = strpos($str, $rightStr, $left); + if ($left < 0 or $right < $left) return ''; + return substr($str, $left + strlen($leftStr), $right - $left - strlen($leftStr)); +} + +if ($this->fields->uid == !'' && $this->fields->sessdata == !'') { + if (empty($_GET['page']) || $_GET['page'] == 0) $page = 1; else $page = $_GET['page']; + + if (!function_exists('curl_init')) { + $errormsg .= '未检测到cUrl函数 '; + $error = true; + } else { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//不验证HTTPS链接 (PHP7.1 添加支持) + curl_setopt($curl, CURLOPT_URL, 'https://api.bilibili.com/x/space/bangumi/follow/list?type=1&follow_status=0&vmid=' . $this->fields->uid . '&ps=12&pn=' . $page); + curl_setopt($curl, CURLOPT_COOKIE, 'SESSDATA=' . $this->fields->sessdata . ';'); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + $callback = curl_exec($curl); + if ($callback === false) { + $errormsg .= 'cUrl错误: ' . curl_error($curl) . ' (CODE: ' . curl_errno($curl) . ') '; + $error = true; + } + curl_close($curl); + $bgmdataraw = json_decode($callback, true); + if (!$bgmdataraw) { + $error = true; + $errormsg .= '番剧数据解析错误 '; + } + } + +} else { + $bgmdataraw = array(); + $bgmlist = array(); +} + + +// Uncomment for debugging +/* +if ($_GET['dbg'] == 'format') { + echo "<pre>"; + print_r($bgmlist); + echo "</pre>"; +} +if ($_GET['dbg'] == 'rawlist') { + echo "<pre>"; + print_r($bgmdataraw); + echo "</pre>"; +} +*/ + +?> + <main class="main-container container"> + <div class="post-body"> + <div class="post-content"> + <div class="container-fluid"> + <div class="row"> + <?php + if (!$error && $bgmdataraw['data']['total'] != 0): //没有东西 + $bgmlist = $bgmdataraw['data']['list']; + foreach ($bgmlist as $bangumi) : + //force https + $bangumi_cover = str_replace("http://", "https://", $bangumi['cover']); + ?> + <div class="bangumi-item col-md-4 col-lg-3 col-sm-6"><a + href="<?php echo 'https:////www.bilibili.com/bangumi/play/ss' . $bangumi['season_id'] . '/'; ?>" + target="_blank" class="no-line bangumi-link"> + <div class="bangumi-banner"> + <?php $db = Typecho_Db::get(); + $load_image = $db->fetchAll($db->select('value')->from('table.options')->where('name = %s', "theme:Miracles")->limit(1)); + $load_image = explode("\";", explode("\"", explode("\"loading_image\";", $load_image[0]["value"], 2)[1], 2)[1], 2)[0]; ?> + <img src="<?php if (IS_HTTPS): ?>/usr/themes/Miracles/images/loading/<?php echo $load_image; ?>.gif" + data-gisrc="<?php echo $bangumi_cover; else: echo $bangumi_cover; + endif; ?>" referrerpolicy="no-referrer"> + <div class="bangumi-des"> + <p><?php echo isset($bangumi['evaluate']) && $bangumi['evaluate'] != '' ? $bangumi['evaluate'] : '暂无简介'; ?></p> + </div> + </div> + <div class="bangumi-content"> + <h3 class="bangumi-title" + title="<?php echo $bangumi['title']; ?>"><?php echo $bangumi['title']; ?></h3> + <?php + //番剧进度开始 + if ($bangumi['both_follow']): + ?> + <div class="bangumi-progress" style="width:100%"> + <div class="bangumi-progress-bar" + style="width:<?php + //获取总集数 + $total = 0; + if ($bangumi['is_finish']) { + $total = $bangumi['total_count']; + //total_count是预计总集数 + } elseif (!$bangumi['is_started'] || $bangumi['new_ep']['index_show'] == '即将开播') { + $total = 0; + } else { + $total = $bangumi['new_ep']['title']; + if (!is_numeric($total)) $total = $bangumi['total_count']; + //有些最后是Extra,默认识别为最后一集 + } + if ($total < 0) $total = 0; + $ep = 0; + if (!$bangumi['is_started']) { + //没有开始 + $ep = 0; + } elseif (strpos($bangumi['progress'], '已看完')) { + $ep = $total; + } elseif (isset($bangumi['progress']) && !strpos($bangumi['progress'], 'PV')) { + $ep = getSubstr($bangumi['progress'], '第', '话'); + if (!is_numeric($ep)) $ep = $total; + //匹配左右取中间数字 + } else { + $ep = 0; + } + echo round(($ep / $total) * 100); ?>%"></div> + </div> + <div class="bangumi-progress-num">进度:<?php echo $ep; + echo ' / '; + echo $total; ?></div> + <?php + endif; + //番剧进度结束 + ?> + </div> + </a> + </div> + + <?php endforeach; + else: ?> + <div style="margin-top:-30px;text-align:center;width:100%"> + <h2><?php echo '追番数据获取失败'; ?></h2> + <p><?php echo '请检查追番页面配置,以及是否安装 CURL 拓展,若您不知道如何配置,请查阅'; ?><a + href="https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E8%BF%BD%E7%95%AA%E9%A1%B5%E9%9D%A2"><?php echo '说明文档'; ?></a> + </p> + <?php if ($errormsg != ''): ?> + <p>这个报错信息可能会对你有用: <?php echo $errormsg; ?></p> + <?php endif; ?> + </div> + <?php endif; ?> + </div> + </div> + <br> + </div> + </div> + <?php if (!$error && $bgmdataraw['data']['total'] > 12): ?> + <div class="post-pagenav"> + <?php if ($page != 1): ?><a class="post-pagenav-left" href="?page=<?php echo $page - 1; ?>"><i + class="iconfont icon-chevron-left"></i></a> <?php endif; ?> + <?php if ($bgmdataraw['data']['pn'] * $bgmdataraw['data']['ps'] < $bgmdataraw['data']['total']): ?> + <a class="post-pagenav-right" href="?page=<?php echo $page + 1; ?>"><i + class="iconfont icon-chevron-right"></i></a> + <?php endif; ?> + </div> + <br> + <?php endif; ?> + <?php $this->need('includes/comments.php'); + ?> + </main> +<?php $this->need('includes/footer.php'); +?> diff --git a/banner.png b/banner.png Binary files differnew file mode 100644 index 0000000..13dd8a5 --- /dev/null +++ b/banner.png diff --git a/docs/block-list.json b/docs/block-list.json new file mode 100644 index 0000000..63ba8aa --- /dev/null +++ b/docs/block-list.json @@ -0,0 +1,18 @@ +{ + "list": [ + { + "id": 1, + "name": "流情", + "domain": "liuqingwushui.top", + "ssl": false, + "reason": "删除主题版权信息" + }, + { + "id": 2, + "name": "华姐博客", + "domain": "blog.52-love.cn", + "ssl": true, + "reason": "修改主题版权信息" + } + ] +}
\ No newline at end of file diff --git a/docs/block-list.md b/docs/block-list.md new file mode 100644 index 0000000..e699e40 --- /dev/null +++ b/docs/block-list.md @@ -0,0 +1,19 @@ +# 封锁名单 + +## 说明 + +这些站点在使用 Miracles 主题时删除/修改了主题内的版权信息,违反了 MIT 协议,予以警告未改正。 +目前尚未对侵犯版权的网站进行任何功能上的限制和实质意义地惩罚,仅展示违规站点。 +但不排除会在未来限制或者停用违规用户的主题功能,请自重。 + +## 站点列表 + +- https://blog.52-love.cn (修改主题页脚版权信息,目前无法访问) +- http://liuqingwushui.top (删除主题页脚版权信息) + +## API +我准备了一个储存违规站点信息的 json 文件,可以通过以下的链接调用,为以后的惩罚功能做准备(微笑 + +``` +https://cdn.jsdelivr.net/gh/BigCoke233/miracles/docs/block-list.json +``` diff --git a/docs/change-log.md b/docs/change-log.md new file mode 100644 index 0000000..3ced322 --- /dev/null +++ b/docs/change-log.md @@ -0,0 +1,288 @@ +# 更新日志 +这里是 Miracles 主题的更新日志,每个发行版以及开发版的更新内容都会在这里记录,历史版本以及最新版本的下载请到 [Releases](https://github.com/BigCoke233/miracles/releases) 页面,若在使用中有任何问题,请在 issues 中提出或 Pull requests,感谢! + +## Ver.1.5.4 Your best nightmare + +- 增加:适配夜间模式的图标 +可在根目录下创建 faviconDark.ico,如果这个文件存在而系统又为深色模式的时候,就将 favicon 替换成这个文件 +- 优化:移动端下,追番项目一行显示两个 +- 优化:优化夜间模和日落模式 +- 优化:导航栏 :hover 毛玻璃效果优化 +- 移除:提交评论时小电视动画 + +## Ver.1.5.2 Slow Down + +- 增加:短链接 `[notice][/notice]`,相当于带有 role="note" 的 div +- 增加:短链接 `[shadow][/shadow]`,在这个容器里的图片都会带上阴影 +- 增加:加入 GitHack CDN 作为静态资源加速选择(实际上是减速x) +- 增加:小太提供的 9jojo CDN 作为静态资源加速选择 +- 增加:支持在设置中自定义 favicon +- 增加:支持设置是否开启顶部导航栏收缩 +- 增加:后台设置自动检测更新 +- 增加:支持图题解析 +- 优化:平滑的锚点动画 +- 优化:文章章节链接的锚点链接改为读取标题内容 +- 优化:部分未能通过 CDN 调用的静态文件通过选择的 CDN 调用 +- 优化:为 owo 表情提供单独的懒加载动画 +- 优化:为友情链接头像提供单独的懒加载动画 +- 优化:夜间模式下文章二维码的背景色 +- 优化:降低导航栏的透明度 +- 修复:CDN 加速静态资源中选用 GitHack https 失效 + +## Ver.1.5.1 Oops + +- 增加:支持自定义懒加载动画 +- 增加:能够自定义 CDN,并增加 GitHack 作为~~凑数~~备用 CDN +- 优化:移除无用的二维码 API 设置项 +- 优化:能够设置是否开启 Pangu.js 分割中英文 +- 优化:友情链接头像由 div 背景图改为 img 标签 +- 修复:建站时间无法正常输出 + +## Ver.1.5.0 To The Dream + +- 增加:Mac 风格代码块 +- 增加:支持日落模式 +- 增加:生成文章二维码,实现跨设备阅读 +- 增加:友情链接支持调用外部数据(json)(Helped by Kengwang) +- 增加:发送评论时的加载动画 +- 增加:拓展 Markdown 语法,支持 kbd 标签(~键盘按键~) +- 优化:页面内元素的 ARIA(即 Role 属性) +- 优化:每篇文章固定缩略图,刷新不改变(Done by outtimes) +- 优化:Snackbar 移动到中央(Done by outtimes) +- 优化:使用更加轻量的默认文章封面,减小体积(Done by outtimes) +- 优化:优化评论框样式 +- 优化:优化一些元素在夜间模式和日落模式下的显示 +- 优化:文章字数统计的输出判断 +- 优化:后台保存设置按钮移动到右侧固定 +- 优化:删除文章编辑页面无用的 CSS +- 优化:一些细节 +- 修复:夜间模式下文章头图分类链接文字颜色错误 +- 修复:选择左侧抽屉栏时报错 +- 修复:关于页面社交按钮邮箱无法直接点击打开 +- 修复:关于页面邮箱地址无法直接打开 +- 修复:哀悼模式设置项失效 +- 修复:背景图片不居中的问题(Done by sizau) +- 修复:后台设置无法备份 + +## Ver.1.4.3 Be gentle + +- 添加:可以自定义导航栏的项目 +- 优化:替换日间模式的图标 +- 优化:切换夜间模式时弹出更多的提示(包括自动切换) +- 优化:移除每个页面多余的 owo 容器 +- 优化:加密 js 版权信息 +- 优化:加入删除版权信息的惩罚 +- 修复:追番页面内含有无 ep 的番剧时报错(Done by kengwang) +- 修复:owo 表情在文章中排版错误 +- 修复:分享到 Twitter 时不显示图片 +- 修复:导航栏透明模式字体颜色的问题 +- 以及一些细节的优化 + +## Ver.1.4.2 Tasty + +- 增加:owo 表情,用短代码替换臃肿的 img 标签 +- 增加:后台编辑器添加 owo 表情按钮 +- 增加:后台设置自定义随机文章缩略图 +- 移除:`[bubble]`气泡短代码 +- 修复:文章有封面时,首页大图的超链接颜色为黑色 +- 修复:owo 表情在文章内占用了过多的边距 +- 修复:Pjax 跳转页面后,外部链接不在新窗口打开 +- 修复:左侧抽屉栏按钮失效 +- 修复:文章编辑器右侧 tab 样式错位 +- 修复:文章编辑器 slug 输入框 z-index 大于导航栏 +- 修复:非 https 无法加载追番图片(Done by kengwabg) +- 修复:js 某些报错 + +## Ver.1.4.1 Fine + +- 优化:移动端下,大图中文章元信息分两行显示 +- 优化:Text-Color 短代码不再需要用引号框柱文本 +- 优化:小屏幕下 Tip 不显示图标 +- 修复:使用抽屉栏控制台报错 +- 修复:移除未实现的自定义字段 +- 修复:首页大图背景色在某些情况下失效 +- 修复:后台设置项分割线混乱 + +## Ver.1.4.0 Smooth + +- 增加:Ajax 评论无刷新(Done by ohmyga) +- 增加:增加:追番页面(Done by kengwang, styled by Eltrac) +- 优化:alertSend() 样式更改 +- 优化:取消首页大图背景色设置 +- 优化:卡片阴影减淡 +- 优化:取消回复按钮样式 +- 优化:移除前台设置面板 +- 优化:移除夜间模式在 PHP 层的判断 +- 优化:细化顶部导航毛玻璃效果 +- 优化:评论人链接新窗口打开 +- 优化:全站外部链接新窗口打开 +- 修复:后台哀悼模式失效 +- 修复:评论框不跟随(Done by ohmyga) +- 修复:夜间模式下评论框文字黑色 +- 修复:评论区气泡尖角缺失 +- 修复:代码块左侧多余边距 +- 修复:Twitter 分享图片未定义 + +## Ver.1.3.2 Jesus! +- 增加:章节链接 +- 优化:文章中一些元素的样式 +- 优化:后台撰写/编辑文章页面的样式 +- 优化:可以自定义抽屉栏和关于页面的头像链接了 +- 优化:取消 var(--theme-color) 在页面中的应用 +- 优化:顶部导航栏根据鼠标滑动方向显示/隐藏 +- 修复:一些环境下编辑页面后,页面消失 +- 修复:typecho 原生编辑器在小屏幕上按钮显示不完整 +- 修复:说说页面发布按钮样式错误 + +## Ver.1.3.1 Dumb Fix +- 优化:只能使用[名称]{链接}(头像)+(简介)添加友链 +- 优化:删除评论数量统计的繁琐文字(None=>0, Only 1=>1) +- 优化:评论区某些元素的边距和响应式设计 +- 优化:优化部分样式 +- 修复:部分新增元素在夜间模式下显示不正常 +- 修复:友情链接阴影错位 + +## Ver.1.3.0 New Age +- 增加:文章阅读时长提示 +- 增加:文章分享功能 +- 增加:文章底部弹出式版权信息 +- 增加:登陆后提供显眼的进入后台按钮 +- 增加:说说页面 +- 增加:友情链接支持添加简介 +- 增加:建站时间,可在后台设置 +- 增加:可设置隐藏评论列表 +- 增加:新的短代码 —— ruby 和自定义字体颜色 +- 优化:可以设置顶部导航栏在顶部是否透明 +- 优化:即使页面不显示浏览次数,仍然统计 +- 优化:自动生成 CDN 引用,减小体积 +- 优化:文章卡片,PC 端和移动端合并 +- 优化:多个懒加载动画供选择 +- 优化:根据 MacOS/IOS 系统切换夜间模式 +- 优化:设置面板样式 +- 优化:搜索/标签/分类页面与首页一致 +- 优化:一些细节调整 +- 优化:重写了评论区样式 +- 优化:优化了评论区的提示信息 +- 优化:回复时 @ 上级评论人 +- 优化:修改 alertSend 的输出方式和样式,取消 auto 参数和手动关闭 +- 移除:内置 Live2D +- 移除:独立页面文章时效性警告,文章仍然显示 +- 移除:首页公告功能 + +## Ver.1.2.4 Delicate +- 新增:Tip Group 新的短代码([tip-group][/tip-group]把[tip]们连起来) +- 新增:顶部导航栏毛玻璃效果 +- 新增:可以设置首页大图的背景色了(方便某些懒得找图的懒人 +- 新增:可以修改首页大图的字体颜色了(黑/白) +- 新增:文章浏览次数,仅在文章/页面内页显示 +- 优化:鼠标悬浮至文章元信息图标时,显示详细信息 +- 优化:默认字体改为 100%(最小) +- 优化:左侧抽屉栏滑出速度加快(0.4s) +- 优化:某些细节的调整 +- 优化:返回顶部在接近页面顶部时不显示 +- 优化:首页大图图片居中 +- 修复:文章缩略图底部超出文章卡片 + +## Ver.1.2.3 Peace After Exploding +- 修复:代码行号错误(in Ver.1.2.3.1 Myopia glasses) +- 添加:自定义元信息 +- 添加:根据时间判断夜间模式(Beta) +- 优化:文章卡片在平板电脑上的显示 +- 优化:固定文章卡片高度为 280px +- 优化:archive(搜索/标签/分类页)的样式 +- 优化:尽力压缩图片体积 +- 修复:单行代码块不显示行号 +- 修复:移动端不显示自定义摘要 +- 修复:搜索按钮错位 + +## Ver.1.2.2 Goodbye +- 添加:Pjax 淡入动画 +- 添加:更换代码高亮引擎为hightlight.js +- 优化:下拉面板(搜索/登录)开启或关闭时,页面不会因为滚动条而抖动 +- 优化:子评论左侧对齐 +- 优化:themeInit()方法强制替换设置项,用Helper::options()方法替代查询数据库 +- 优化:未指定语言的代码块显示 +- 修复:代码块第一行最前方会有间隙 +- 修复:夜间模式下,文章标签显示有问题 +- 移除:压缩 html(因为时间不够了 2333) + +## Ver.1.2.1 Clear +- 添加:`alertSend()`有一个新参数 auto (boolean),决定弹出框是否自动关闭 +- 添加:控制台输出版权信息 +- 添加:密码保护文章的表单样式 +- 优化:左侧抽屉栏的自适应和样式微调 +- 优化:调整滚动条粗细,现在能被清楚地看到了 +- 优化:复制文本后弹出的版权提示能够自动关闭了 +- 优化:展开抽屉栏后,点击遮罩层就能关闭 +- 优化:舍弃 onclick 属性,改用事件监听器 +- 优化:移动端,页面跳转完毕后导航栏才会收起 +- 优化:只有首页才会弹出公告提示 +- 优化:压缩 html 页面 +- 移除:左侧抽屉栏的搜索框 +- 移除:是否固定导航栏设置 +- 移除:后台公告 +- 移除:说说功能(之后调整好可能会回归) +- 调整:加载 Live2D 的语句移动到 `l2dwidget.min.js` +- 修复:禁止滑动后自动返回顶部 +- 修复:一些元素在夜间模式下未正常显示 +- 修复:未使用 Live2D 时,控制台报错 +- 修复:没有评论的页面找不到 owo 容器,导致控制台报错 + +## Ver.1.2.0 Sky's Mirages +- 添加:前台设置面板 +- 添加:内置两只可调戏的猫咪(https://www.jianshu.com/p/57a4deab12cc) +- 添加:文章编写时间超过 90 天,显示“可能过期”的提示 +- 添加:左侧抽屉栏,可与顶部导航栏进行切换 +- 添加:关于页面自定义模板,支持社交按钮 +- 添加:进站公告提示 +- 添加:用户复制内容后,弹出信息提醒保留版权信息 +- 添加:自定义提示信息,用`alertSend("内容")`召唤信息栏 +- 优化:Cookies 储存夜间模式 +- 优化:全局自动分离英文/半角字符和中文,优化阅读体验(Pangu.js) +- 优化:代码块最高高度为 80vh(屏幕高度的 80%) +- 修复:文字卡片标题部分字母下半部分显示不完整 +- 修复:代码块行号不对齐 +- 修复:友链盒子两端未对齐 +- 修复:一些元素在夜间模式下未正常显示 +- 修复:CDN 静态资源加速启用后 css 及 js 404 + +## Ver.1.1.2 Preheat +- 新增:可以在后台开启 CDN 静态资源加速(调用 JSdelivr) +- 新增:“哀悼模式”,将网站变为黑白,Pray for 京阿尼 +- 新增:可以在后台切换 无衬线字体/衬线字体(调用 Google Fonts) +- 新增:备份模板设置项功能(来自[QQ爹](https://qqdie.com)) +- 新增:额外的 10 张随机缩略图 +- 优化:分离主题设置(Options.php)和其他函数(functions.php) +- 优化:评论内容在不同分辨率下不同的字体大小 +- 优化:Meting 插件播放器在夜间模式下的显示 +- 优化:文章缩略图容易重复的问题 +- 优化:设置项分类+船新的设置页面样式 +- 修复:自定义 CSS 重复输出 +- 修复:之前更新一直没有修改版本号的问题 + +## Ver.1.1.1 The Kids Are Alright +- 修复:博主评论的子评论全部变成蓝色背景标识的 BUG +- 修复:Meting 插件无法正常解析的问题 +- 修复:评论分页样式缺失的 BUG +- 修复:说说页面夜间模式下显示的问题 +- 修复:Pjax 跳转后无法进行登录(其实就是给了个刷新提示而已233) +- 修复:小屏幕上子评论被挤成一条的问题(虽然还是丑得不能看) +- 修复:回复评论会激活 Pjax 导致返回顶部的问题 +- 优化:规范了代码结构 + +## Ver.1.1.0 Various Ways +- 新增:图片懒加载功能 +- 新增:“说说/动态”页面 +- 新增:一些便于排版的短代码(稍后更新 WIKI) +- 新增:支持自定义文章摘要 +- 优化:分离移动端和电脑端导航栏 +- 优化:一些元素在夜间模式下的显示 +- 优化:船新的评论区样式 +- 优化:分离夜间模式 CSS 文件 +- 优化:现在 OwO 表情不会被压扁了 +- 优化:细调了某些元素的样式 +- 修复:呼出 FancyBox 自动返回顶部 + +## Ver.1.0.0 Set Sail! + +> 这里是梦开始的地方 diff --git a/docs/images/QQ20200321145145.png b/docs/images/QQ20200321145145.png Binary files differnew file mode 100644 index 0000000..b48fc8d --- /dev/null +++ b/docs/images/QQ20200321145145.png diff --git a/docs/images/QQ20200321151919.png b/docs/images/QQ20200321151919.png Binary files differnew file mode 100644 index 0000000..2eb5006 --- /dev/null +++ b/docs/images/QQ20200321151919.png diff --git a/docs/images/QQ20200321152106.png b/docs/images/QQ20200321152106.png Binary files differnew file mode 100644 index 0000000..3953f08 --- /dev/null +++ b/docs/images/QQ20200321152106.png diff --git a/docs/images/QQ20200321154231.png b/docs/images/QQ20200321154231.png Binary files differnew file mode 100644 index 0000000..872f121 --- /dev/null +++ b/docs/images/QQ20200321154231.png diff --git a/docs/images/QQ20200321161814.png b/docs/images/QQ20200321161814.png Binary files differnew file mode 100644 index 0000000..c9a29d4 --- /dev/null +++ b/docs/images/QQ20200321161814.png diff --git a/docs/images/QQ20200321174300.png b/docs/images/QQ20200321174300.png Binary files differnew file mode 100644 index 0000000..a2ef10b --- /dev/null +++ b/docs/images/QQ20200321174300.png diff --git a/docs/images/Untitled 1.png b/docs/images/Untitled 1.png Binary files differnew file mode 100644 index 0000000..7bc3219 --- /dev/null +++ b/docs/images/Untitled 1.png diff --git a/docs/images/Untitled 2.png b/docs/images/Untitled 2.png Binary files differnew file mode 100644 index 0000000..3bd1c4f --- /dev/null +++ b/docs/images/Untitled 2.png diff --git a/docs/images/Untitled 3.png b/docs/images/Untitled 3.png Binary files differnew file mode 100644 index 0000000..079f612 --- /dev/null +++ b/docs/images/Untitled 3.png diff --git a/docs/images/Untitled 4.png b/docs/images/Untitled 4.png Binary files differnew file mode 100644 index 0000000..51198ed --- /dev/null +++ b/docs/images/Untitled 4.png diff --git a/docs/images/Untitled.png b/docs/images/Untitled.png Binary files differnew file mode 100644 index 0000000..9a59866 --- /dev/null +++ b/docs/images/Untitled.png diff --git a/docs/images/about.png b/docs/images/about.png Binary files differnew file mode 100644 index 0000000..d96e250 --- /dev/null +++ b/docs/images/about.png diff --git a/docs/project-management.md b/docs/project-management.md new file mode 100644 index 0000000..af1444a --- /dev/null +++ b/docs/project-management.md @@ -0,0 +1,61 @@ +# 项目管理 + +这篇文档记录一些 Miracles 主题在更新维护过程中一些不成文的习惯,写在文档里当作一种规范。 + +## Commit + +在提交 commit 的时候,需要书写 message,通常来说,Miracles 主题所有的 commit message 都应该按照一下格式书写 + +``` +:emoji: <sign>: <summary> +``` + +这里面提到的几个部分不太好直接理解,以下是对他们的解释 + +- `:emoji:`:就是 emoji 字符,应选用和这个 commit 内容有关的 emoji,但主要是为了美观(以 [gitmoji](https://gitmoji.carloscuesta.me/) 为规范) +- `<sign>`:这个 sign 用来提醒用户这个 commit 更新了什么类型的内容,通常用一下的字符替换 + - `Add`:顾名思义,用在添加新内容/功能的 commit 里 + - `Perf`:这是 perfect 的缩写,通常用于对现有功能进行优化的 commit 里 + - `Del`:即 Delete,表示移除了某些内容 + - `Docs`:即 Documents,表示对某些文档进行了修改,不涉及主体代码 + - `Update`:用于一些无法被归类的 commit,例如:修改版本号 +- `<summary>`:意为总结,就是对更新的内容进行简短的阐述,作为摘要 + +例子:`📐 Perf: 优化了文章盒子的边距` + +这就是一个普通 commit message 的组成,通常只适用于 message 的 header 部分,body 部分是可有可无的,除非你觉得 header 无法完整地表达这次 commit 更新的内容, +就可以在 body 里对这次更新内容进行详细地阐述,没有固定的格式,表述清楚即可。 + +## 版本号 + +如果你仔细观察 Miracles 主题的 release 页面,或者是每个版本的更新日志,你会看到它们通常是这样的 + +``` +:emoji: Ver.<version_num> <name> +``` + +- `:emoji`:就是 emoji 字符,通常选用和这次更新**主题**相关的 emoji +- `<version_num>`:版本号,发行版和开发版的版本号有区别 + - 发行版:通常只有发行版才会有正式的版本号,类似`1.5.2`,`1` 增加代表一次超大更新(几乎重写的那种吧),`5`增加代表一次大更新(增加了许多新功能),`2`增加代表补丁这样的小更新(通常只有修复和优化) + - 开发版:开发版的版本号通常以`v`开头,之后是日期,如果这一天有多次开发版更新,则用`A-Z`来区分,例如:`v20200503A`、`v20191223B` +- `<name>`:这个版本的名字,一般是根据更新内容和这次更新的主题来命名 + +> 通常来说,开发版的更新不会写入正式的更新日志(change-log.md) + +## issue + +Miracles 主题有三个自带的 issue 模板,分别是: + +- 问题报告(label:问题) +- 想法建议(label:优化) +- 需要帮助(label:求助) + +正常来说,这三个模板能满足大多数人的要求,并且如果他们按照模板书写 issue 会让开发者更方便。 + +满足以下条件的 issue,会被 close: + +- 问题已被完美解决(label:解决) +- 问题根本不存在(label:错误) +- 这个想法没有必要(label:拒绝) +- 存在相同的内容(label:重复) + diff --git a/docs/wiki.md b/docs/wiki.md new file mode 100644 index 0000000..d96d840 --- /dev/null +++ b/docs/wiki.md @@ -0,0 +1,525 @@ +# 使用文档 + +> 文档基于主题最新版本,不考虑之前的版本差异,请您使用最新版。 + +感谢您支持 Miracles 主题,这里是主题的使用手册,这能帮助你解决大部分的问题。 + +**目录** + +- [📥 下载与安装](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#-%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85) + - [主要步骤](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E4%B8%BB%E8%A6%81%E6%AD%A5%E9%AA%A4) + - [温馨提示](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E6%B8%A9%E9%A6%A8%E6%8F%90%E7%A4%BA) + - [下载主题](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E4%B8%8B%E8%BD%BD%E4%B8%BB%E9%A2%98) + - [版权声明](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E6%B8%A9%E9%A6%A8%E6%8F%90%E7%A4%BA) +- [⚙️ 基础配置](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%EF%B8%8F-%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE) + - [站点信息](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E7%AB%99%E7%82%B9%E4%BF%A1%E6%81%AF) + - [导航栏](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E5%AF%BC%E8%88%AA%E6%A0%8F) + - [首页大图](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E9%A6%96%E9%A1%B5%E5%A4%A7%E5%9B%BE) + - [Pjax](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#pjax-%E9%A2%84%E5%8A%A0%E8%BD%BD) + - [优化](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E4%BC%98%E5%8C%96) + - [个性化](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E4%B8%AA%E6%80%A7%E5%8C%96) + - [开发者设置](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E5%BC%80%E5%8F%91%E8%80%85%E8%AE%BE%E7%BD%AE) +- [🛒 自定义字段](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#-%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E6%AE%B5) + - [文字头图](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E6%96%87%E7%AB%A0%E5%A4%B4%E5%9B%BE) + - [文章摘要](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E6%96%87%E7%AB%A0%E6%91%98%E8%A6%81) + - [元信息](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E5%85%83%E4%BF%A1%E6%81%AF) +- [🔖 短代码](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#-%E7%9F%AD%E4%BB%A3%E7%A0%81) + - [友情链接](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5) + - [Tip](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#tip) + - [Ruby](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#ruby) + - [Text Color](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#text-color) + - [Keyboard (kbd)](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#keyboard-kbd) + - [Notice](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#notice) + - [Shadow](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#shadow) + - [Details](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#details) +- [📖 页面模板](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#-%E9%A1%B5%E9%9D%A2%E6%A8%A1%E6%9D%BF) + - [归档页面](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E5%BD%92%E6%A1%A3%E9%A1%B5%E9%9D%A2) + - [关于页面](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E5%85%B3%E4%BA%8E%E9%A1%B5%E9%9D%A2) + - [说说页面](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E8%AF%B4%E8%AF%B4%E9%A1%B5%E9%9D%A2) + - [追番页面](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#%E8%BF%BD%E7%95%AA%E9%A1%B5%E9%9D%A2) +- [🚀 高级设置](https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md#-%E9%AB%98%E7%BA%A7%E8%AE%BE%E7%BD%AE) + +## 📥 下载与安装 + +Miracles 主题是为 [typecho](https://typecho.org) 设计的,首先你需要安装 typecho。 + +### 主要步骤 + +1. 在 GitHub 上 Star [Miracles 主题](https://github.com/BigCoke233/miracles),这是必须的,因为 Miracles 是基于 SATA 协议的。 +2. 主题主要分为**开发版**和**发行版**,请根据情况选择下载使用(之后会详细介绍) +3. 将主题文件放置于 usr/themes 目录下,确保文件夹名字为 **Miracles** +4. 到后台(admin)的外观设置中启用 Miracles 主题 +5. 根据需求,在后台 - 外观 - 外观设置中对主题进行配置 + +### 温馨提示 + +你的博客最好是安装在站点的根目录下,不然某些功能无法正常使用(如:owo 和 lazyload) + +> **发行版**即为 GitHub 仓库里 release 里打包好的版本,比较稳定,推荐使用;但内容一般都经过了压缩打包,删除了大部分注释,不方便魔改或者二次开发,仅对正常使用比较友好。 +> **开发版**则为 GitHub 仓库展示的文件内容,是最新的,但不保证稳定性,尽管在 Commit 之前都有经过测试,但可能会有未被发现的 bug。开发版是完整的主题**源**码,没有压缩,对二次开发比较友好。 + +### 下载主题 + +以下是 Miracles 最新发行版(1.5.3)的下载链接,推荐使用。 + +[📦 Miracles.Ver.1.5.4.zip](https://github.com/BigCoke233/miracles/releases/download/1.5.4/Miracles.Ver.1.5.4.zip) + +### 版权声明 + +主题基于 SATA 开源协议进行授权,所以使用前请 Star 本主题,这是最基本的。同时,SATA 协议本身基于 MIT 协议,所以在使用时你需要保留主题原本的版权信息,这些版权信息在页脚和 Console,以及各个静态文件都有,你都需要保留。如果主题引入了别的开源项目没有署名原作者,请告知我及时修正。 + +如果你需要二次开发并发布新版本的主题,你需要署名原作者并提供原仓库链接,最好尝试联系我,至少让我知道。 + +## ⚙️ 基础配置 + +主题的设置面板在 typecho **控制台 - 外观 - 设置外观**中。 + +安装后打开主题的设置面板,开始对主题进行一些个性的更改。 + +### 站点信息 + +这里主要填写你站点的基础信息,与 typecho 的设置不同,这里的设置**仅用于展示**,而不会影响 SEO。 + + + +**站点名称**和**站点介绍**都比较好理解,这里对**站点头像**这一项设置做一些说明:**站点头像**内所指定的图片只会输出在左侧抽屉栏和关于页面,评论区和说说页面的头像都是调用您的 gravatar;若这个设置项为空,则会直接调用 gravatar。 + +**Gravatar - 全球公认的头像**,您可以在[这个网站](http://cn.gravatar.com/)上用您安装 typecho 时填写的邮箱注册账号并上传头像。 + +<details><summary>加速 gravatar 在国内的速度</summary> + +Gravatar 在国内很多地区的访问都十分缓慢,您可以将 gravatar 头像源修改为其他的镜像服务来改善速度,这里推荐 v2ex 的镜像。Typecho 并没有在控制台给出设置项,您需要手动修改代码。 + +Typecho 根目录下的 config.inc.php,在文件最后添加一条: + +```php +/** 定义 Gravatar 头像源 */ +define('__TYPECHO_GRAVATAR_PREFIX__', 'https://cdn.v2ex.com/gravatar/'); +``` + +</details> + +### 导航栏 + +Miracles 内置了两种类型的导航栏供您选择,分别是**左侧抽屉栏**和**顶部导航栏**。 + +**左侧抽屉栏**平时是隐藏的,只有在访问者点击左上角的按钮时才会从左侧抽出,能让访问者更加专注于文章内容;而**顶部导航栏**总是保持在页面顶部,会跟随访问者鼠标滚轮移动,但在访问者向下滑动时会收缩,向上滑动时会再次展开。 + + + +您可以根据自己的喜好来选择这两种导航栏,但他们无法同时使用。 + +**顶部透明**这一项设置只适用于**顶部导航栏**,在使用左侧抽屉栏时启用不会有任何效果。启用后,当访问者的视口置于页面最顶端时,导航栏的背景会变为透明,滚轮向下滑会获得背景色。 + +1.4.3 版本新增了自定义导航栏功能,可以根据需要自定义导航栏的内容,需要按照 json 格式书写,如下: + +```json +[ + { + "title": "关于", + "link": "https://yoursite.com/about.html" + }, + { + "title": "友人", + "link": "https://yoursite.com/link.html" + }, + { + "title": "归档", + "link": "https://yoursite.com/archive" + } +] +``` + +注意,请不要使用相对路径(即使用完整的, 带协议头和域名的网址),不然 Pjax 可能会失效。 + +外部链接会自动在新窗口打开;如果设置项留空则读取所有未被隐藏的独立页面。 + +### 首页大图 + +**首页大图**位于所有页面的顶部,它通常是一张较大的图片,仅展示。首页大图上方会显示你在之前设置的站点名称和站点介绍,靠左展示。 + + + +填入一个**图片 url** 来指定首页大图展示的图片,可以是绝对路径也可以是相对路径。 + +如果您不了解绝对路径和相对路径,填写图片外链就好了。 + +**字体颜色**只有黑色和白色可供选择。通常情况下,在有图片的时候使用白色就好;而不填写**图片 url** 时,背景色会是淡灰色(#f1f1f1),这个时候使用黑色。顺带一提,如果你设置了导航栏的**顶部透明**,这个设置项会影响导航栏透明时的颜色。 + +**高度**的单位是 vh,如果你不理解,可以把这个高度当作百分数,只是没有 % 而已,例如:填写 50 的话,首页大图则会占据一个视口(即浏览器窗口中显示网页的部分)的一半。 + +### Pjax 预加载 + +Pjax 预加载可以加快页面的访问速度,并让访问更加流畅,提升用户体验 + + + +你只需要在 Pjax 预加载 - **是否开启**中开启,就可以启用 Pjax。 + +**完成后执行事件**内写的一般是 Pjax 重载函数,主题的 js 都内置了重载函数所以你不用太操心。如果你安装了一些插件,可能会需要进行重载,不过插件的作者应该都会有说明。 + +一些 js 在切换页面后会出现错误,这时候需要一段 js 在 pjax 完成切换之后将它们重新加载一遍。 + +如果你使用了 Meting 插件,记得在**完成后执行事件**中写入 loadMeting(); + +### 优化 + + + +开启 **CDN 加速加载静态资源**之后,大部分的 js 和 css 静态资源都会通过你选择 CDN 进行加载,主题内置的有 jsDelivr(国内速度快)和 GitHack(国内速度慢)。如果你使用的是**开发版**,请不要使用 jsDelivr,以免出现问题,但是 GitHack 一般不会有问题,除非你用的不是最新开发版,就是速度慢;如果你使用的是**发行版**,推荐使用 jsDelivr。 +如果你选择自定义,则会调用下一条设置内的链接,例如 `[https://cdn.xxxxxx.com/assets/](https://cdn.xxxxxx.com/assets/,这会调用所指向的这个目录下的静态资源,不过需要保证目录结构和主题的`/assets/`)`,这会调用所指向的这个目录下的静态资源,不过需要保证目录结构和主题的 `./assets/` 下的结构相同。 + +**阅读时长提示**会根据文章的字数估计阅读需要的大致时间,并显示在每一篇文章之前。 + +**自动分割中英文**默认是开启的,基于 `pangu.js`,会分割网页中的半角字符和全角字符,会把中文之间的 `.` 替换为 `。` 等等操作,如果不喜欢可以在这里关掉。 + +### 个性化 + +**个性化**设置能让你的博客变得更符合你的品味。 + + + +**哀悼模式**是在京阿尼失火的事故后被加入的,这会让整个网站变成黑白配色。 + +**网站字体**是通过 Google Font 调用的,无衬线字体即为思源黑体,衬线字体即为思源宋体。 + +**随机文章缩略图**通常是使用的主题 images/postbg 目录下的 1-20.jpg 图片,如果你不喜欢或是觉得加载较慢,你可以通过图片外链自定义,通常需要这样写: + +```php +https://image.com/1.png, +https://image.com/2.png, +https://image.com/3.png, +https://image.com/4.png, +https://image.com/5.png +``` + + + +**图片懒加载动画**是在图片加载完成之前显示的图片,目前有 4 种可供选择的懒加载动画,这里不提供预览,如果不喜欢列出的图片,可以选择“自定义”,但需要在 `./images/loading/` 目录下放入一个名为 `custom.gif` 的 GIF 图片。 + +剩下的两个不做过多的解释,设置项下面的文字写得很明白。 + +### 开发者设置 + +这里的设置不是必须的,你可以根据需要写入 js 和 css,或是在 head 和 footer 自定义你想要的内容。例如 Google 统计代码、在网页中嵌入在线客服等等。 + +## 🛒 自定义字段 + +在编辑文章的时候你可能会用到自定义字段,下面介绍主题自带的字段,你只需要根据提示进行设置就可以了。用于关于页面和追番页面的自定义字段不会在这里提及,请查看**页面模板。** + +### 文章头图 + +文章头图会显示在文章列表和文章内页里,作为文章的缩略图和封面。你需要填写一个图片外链,可以是上传自其他图床生成的外链,也可以是本地服务器上的文件。 + +为了保障头图的最佳显示效果,最好使用 1000x600 的图片;更加详细的话,最好是 47:28 大小的图片 + + + +### 文章摘要 + +用于自定义文章摘要,摘要只显示在首页的文章列表里,显示在文章卡片内的文章标题下,让用户提前阅读文章的前一段。如果这个设置项为空,则会自动读取文章前 130 字;如果填写内容,则会用你自定义的内容来代替这 130 字。 + +为了保证显示效果,自定义的摘要不要太长也不要太短,可以用 `<br>` 来使摘要内容在页面中显示更加平衡。 + + + +### 元信息 + +**元信息(Meta)**是显示在文章头图上以及首页文章卡片内的文章概要信息,它通常有文章分类 / 发布日期 / 评论数 / 被浏览数等信息,会被展示在不太起眼的地方,但是也是比较有用的东西。 + +如果你不太喜欢他们,可以用这个设置项替换**显示在文章头图上的元信息**。 + + + +不用担心,替换元信息后,主题仍会统计页面的被浏览数,切换为默认元信息后这些数据会被显示 + +## 🔖 短代码 + +你只需要在文章/页面编辑器内按照相应的语法书写就好了。 + +这些短代码能在你编辑页面或是攥写文章的时候帮助你。 + +### 友情链接 + +首先,所有的友情链接都需要放到 `Link Box` 里,通过下面的语法构造一个 `Link Box`。 + +```markdown +[links] +······ +[/links] +``` + +所有的友链项目都需要按照以下的语法书写。 + +```markdown +<!-- 常规写法 --> +[名字]{链接}(头像链接)+(简介) + +<!-- 如果是 1.3.2 以前的版本,则 --> +[名字]{链接}(头像链接) +``` + +然后放进一个 `Link Box` 里。 + +```markdown +[links] +[名字]{链接}(头像链接)+(简介) +[名字]{链接}(头像链接)+(简介) +[名字]{链接}(头像链接)+(简介) +[/links] +``` + +注意,短代码里所有的链接都需要**转义**! + +```markdown +<!-- 在特殊字符 / 之前加上 \ 进行转义 --> +https:\/\/guhub.cn\/links.html +<!-- Example --> +[名字]{https:\/\/guhub.cn\/}(https:\/\/guhub.cn\/avatar.jpg)+(我是简介。) +``` + +如果你觉得转义比较麻烦,可以用 `!!!` 包裹短代码。 + +```markdown +!!! +[links] +[名字]{https://guhub.cn/}(https://guhub.cn/avatar.jpg)+(我是简介。) +[名字]{https://guhub.cn/}(https://guhub.cn/avatar.jpg)+(我是简介。) +[/links] +!!! +``` + +--- + +在 1.5.0 版本以后,友情链接支持通过 json 传递数据,只不过你需要一个现有的 `.json` 文件,而不能直接书写 json,语法如下。当然,这只是传递友链数据的**一种方式**。 + +```markdown +[links data="https://data.com/links.json"] +``` + +借助这个,你可以把你的友链数据存在 GitHub 然后通过 jsDelivr 调用,这样可以防止友链数据丢失,完全不用备份,在国内的速度也很不错。通常你要在 json 文件内写入 json 数组,如果你不理解,在主题 `./assets/` 目录下有一个名为 `linkData.sample.json` 的文件,是友链数据书写的示例。 + +```json +[ + { + "name": "Eltrac", + "link": "https://guhub.cn/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "暗夜行路,终遇奇迹。" + }, + { + "name": "Example", + "link": "https://example.io/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "这是一个示例。" + }, + { + "name": "Example", + "link": "https://example.io/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "这是一个示例。" + }, + { + "name": "Example", + "link": "https://example.io/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "这是一个示例。" + }, + { + "name": "Example", + "link": "https://example.io/", + "avatar": "https://cdn.jsdelivr.net/gh/BigCoke233/image-hosting/avatars/avatar.jpeg", + "des": "这是一个示例。" + } +] +``` + +### Tip + +Tip 用作明显的提示,可以按照以下的语法书写。 + +```markdown +[tip]最普通的 Tip,颜色为 灰色(在 1.3.2 以前跟随 --theme-color)[/tip] +[tip type="red"]颜色为 红色 的 Tip[/tip] +[tip type="blue"]颜色为 蓝色 的 Tip[/tip] +[tip type="yellow"]颜色为 黄色 的 Tip[/tip] +[tip type="green"]颜色为 绿色 的 Tip[/tip] +``` + +你也可以尝试自定义 Tip 的颜色,在 Miracles 设置面板 - 开发者设置 - 自定义 CSS 中这样书写。 + +```css +.tip.TYPE { + border-left-color: 指定边框颜色; +} +.tip.TYPE .tip-icon { + color: 指定 i 图标颜色; +} + +/* example */ +.tip.black { + border-left-color: #000; +.tip.black .tip-icon { + color: #000; +} +``` + +然后就可以这样使用自定义的 tip。 + +```markdown +[tip type="TYPE"]内容[/tip] +<-- example --> +[tip type="black"]内容[/tip] +``` + +这样可以把多个 Tip 连接起来,使他们排列更紧凑。 + +```markdown +[tip-group] +[tip]最普通的 Tip[/tip] +[tip type="red"]颜色为 红色 的 Tip[/tip] +[tip type="blue"]颜色为 蓝色 的 Tip[/tip] +[tip type="yellow"]颜色为 黄色 的 Tip[/tip] +[tip type="green"]颜色为 绿色 的 Tip[/tip] +[/tip-group] +``` + +### Ruby + +使用以下的语法,可以为文本注音。 + +``` +蚊子的幼虫叫做{{孑孓:jie jue}}。 +``` + +### Text Color + +使用以下的语法,自定义一段文本的前景色和背景色。 + +``` +&{我是一段黑色字体黄色背景的文字|#000|yellow} +&{你看不到我,你看不到我看不到我|#fff|transparent} +&{我是一段天依色背景的大红色文字|rgb(255,0,0)|#66ccff} +``` + +### Keyboard (kbd) + +Markdown 原生语法并不支持 `<kbd>` ,Miracles 主题在 1.5.0 以后对 Markdown 语法进行了拓展,你可以通过以下语法来书写 `<kbd>` 标签,用来表示键盘上的按键。 + +```markdown +<!--现在可用的语法--> +~Ctrl~ +<!--在开发版以及以后的版本中,将会使用以下语法--> +[[Ctrl]] +``` + +### Notice + +用以下语法构建一个 notice 块,让文字更加醒目 + +```markdown +[notice]Make texts stand out.[/notice] +``` + +### Shadow + +在 shadow 容器里的图片会带上阴影 + +```markdown +[shadow][/shadow] +``` + +### Details + +> 目前 Details 仅支持`v20200530A`(开发版)及以后的版本,未在正式版中加入 + +用以下的语法快速写入 details 标签,创造一个下拉框,主题已借助 js 垫片优化了 details 标签的兼容性 + +```markdown +[details sum="标题"]内容[/details] +``` + +## 📖 页面模板 + +在您创建页面的时候,你可以在右侧选择一个模板。 + + + +接下来我会介绍 Miracles 每一个可使用的模板。 + +### 归档页面 + +**归档页面**会在前台列出你博客所有的文章以及标签,它们比起在首页文章列表显示的要更加紧凑,没有分页。无需设置,只需要选择归档页面,并发布,就可以了。 + +### 关于页面 + +选择**关于页面**模板会在页面内容的顶部加上你的头像,你也可以通过一些其他的设置来添加更多有用的东西。 + +在编辑器底部添加自定义字段,按一下的方式命名并填写,就可以在头像后添加你的名字和各种社交链接。 + + + +你并不需要输入所有的字段,添加了哪些字段就会显示哪些。 + +### 说说页面 + +选择说说页面后直接发布,登陆后可以在前台输入内容发布,这样输入的内容就会显示在说说页面里。这是通过 typecho 自带的评论系统进行储存的,所以如果你想要删除一条说说,直接在后台管理评论即可。 + +### 追番页面 + +1. 创建一个 `独立页面` +2. 选择 `自定义模板` 为 `追番界面` +3. 添加 `自定义字段` + - `sessdata` 设置为 bilibili cookie中的sessdata字段 + - `uid` 设置为您的bilibili uid +4. 发布页面就可以了! + +**获取 SessData** + +如果是 Chrome: + +1. 打开**[bilibili.com](https://bilibili.com/)** +2. 按下 `F12` 进入`开发者工具` +3. 选择 `Application` 选项卡 +4. 在左边列表选择 Storage - Cookies - `https://www.bilibili.com` +5. 在右边找到 `SESSDATA`, 复制里面的Value + +  + +如果是 FireFox: + +Firefox大同小异,只是在第三步时选择 `存储` 选项卡 + +如果是 Microsoft Edge: + +目前 Edge 已经更换为 Chromium 内核,和Chrome操作一样 + +**获取 UID** + +在登录状态下打开 **[https://space.bilibili.com](https://space.bilibili.com/)** 页面会跳转到 **[https://space.bilibili.com/你的uid](https://space.bilibili.com/%E4%BD%A0%E7%9A%84uid)** 直接取出即可 + +***若发现追番页面的追番进度显示不正常,请尝试更新你的 SESSDATA** + +## 🚀 高级设置 + +> 注意,以下所有的内容都未在正式版加入 + +未来会加入高级设置的选项,但通常来说,高级设置不能直接通过后台设置,而是修改本地的某个 php 文件中的数组,这样做是为了减少后台的设置项数量,同时也加强 Miracles 主题的自定义性。并且,写在本地而并非数据库中的设置项调用起来会更加方便。 + +### 语言包 + +Miracles 正准备加入「语言包」功能,并已经在`/libs/lang/`目录下内置了简体中文、繁体中文、英语和~~萌语~~四种语言的数据,但目前尚未完善,也没有写入实际的功能。 + +### faviconDark + +在系统夜间模式下,一些浏览器的外观也会变成深色,这个时候一些深色的 favicon 就会显得很违和,你可以在你的网站根目录下创建一个名为 `faviconDark.ico` 的文件来作为深色模式下显示的 favicon + +## 👁🗨 遇到问题 + +如果遇到本文档无法解决的问题,不要着急,进行以下操作: + +1. 清除浏览器缓存和 CDN 缓存,然后再次重复之前的操作 +2. 检查你是否修改过源代码,如果有,还原代码试试 +3. 确认主题版本是否为最新版 +4. 看看在 GitHub 仓库的 issues 是否有类似的提问,作者是否回复 +5. 通过 QQ 或者 Email 联系作者,或者提出 issue diff --git a/favicon.ico b/favicon.ico Binary files differnew file mode 100644 index 0000000..e2187de --- /dev/null +++ b/favicon.ico diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..3903fc3 --- /dev/null +++ b/functions.php @@ -0,0 +1,62 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +/** + * Miracles 核心文件 + */ + +require_once("themeConfig.php"); +require_once("libs/Utils.php"); +require_once("libs/Contents.php"); +require_once("libs/Comments.php"); +require_once("libs/Options.php"); +require_once("libs/Language.php"); +require_once('libs/TableContents.php'); +//引入语言文件 +require_once("libs/lang/".$GLOBALS['miraclesLang'].".php"); + +/** + * 注册文章解析 hook + * From AlanDecode(https://imalan.cn) + */ +Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('Contents','parseContent'); +Typecho_Plugin::factory('Widget_Abstract_Contents')->excerptEx = array('Contents','parseContent'); +Typecho_Plugin::factory('admin/write-post.php')->bottom = array('Utils', 'addButton'); +Typecho_Plugin::factory('admin/write-page.php')->bottom = array('Utils', 'addButton'); + +/** + * 主题启用时执行的方法 + */ +function themeInit($archive) { + if ($archive->hidden) header('HTTP/1.1 200 OK');//暴力解决访问加密文章会被 pjax 刷新页面的问题 + //Helper::options()->commentsAntiSpam = false; 关闭反垃圾 + Helper::options()->commentsHTMLTagAllowed = '<a href=""> <img src=""> <img src="" class=""> <code> <del>'; + Helper::options()->commentsMaxNestingLevels = '9999';//最大嵌套层数 + Helper::options()->commentsPageDisplay = 'first';//强制评论第一页 + Helper::options()->commentsOrder = 'DESC';//将最新的评论展示在前 + Helper::options()->commentsCheckReferer = false;//关闭检查评论来源URL与文章链接是否一致判断(否则会无法评论) + //将设置储存到全局变量以便使用 + $GLOBALS['miraclesOptions_randomBanner'] = Helper::options()->randomBanner; + $GLOBALS['miraclesOptions_CDN'] = Helper::options()->CDN; + $GLOBALS['miraclesOptions_loading_image'] = Helper::options()->loading_image; +} + +/** + * 文章与独立页自定义字段 + */ +function themeFields(Typecho_Widget_Helper_Layout $layout) { + $banner = new Typecho_Widget_Helper_Form_Element_Text('banner', NULL, NULL,_t('文章头图'), _t('输入一个图片 url,作为缩略图显示在文章列表,没有则不显示')); + $layout->addItem($banner); + $excerpt = new Typecho_Widget_Helper_Form_Element_Text('excerpt', NULL, NULL,_t('文章摘要'), _t('输入一段文本来自定义摘要,如果为空则自动提取文章前 130 字。')); + $layout->addItem($excerpt); + $meta = new Typecho_Widget_Helper_Form_Element_Text('meta', NULL, NULL,_t('元信息'), _t('页面/文章内页会显示该页面的评论数和创建日期(元信息),如果你不需要,可以写一段文字来代替这些内容。')); + $layout->addItem($meta); + $commentShow = new Typecho_Widget_Helper_Form_Element_Select('commentShow',array('0'=>'显示','1'=>'隐藏'),'0','是否显示评论列表'); + $layout->addItem($commentShow); +} + +/** + * 获取主题版本号 + */ +function themeVersion() { + $info = Typecho_Plugin::parseInfo(__DIR__ . '/index.php'); + return $info['version']; +}
\ No newline at end of file diff --git a/images/biaoqing/aru/E4B88DE587BAE68980E69699_2x.png b/images/biaoqing/aru/E4B88DE587BAE68980E69699_2x.png Binary files differnew file mode 100644 index 0000000..8959428 --- /dev/null +++ b/images/biaoqing/aru/E4B88DE587BAE68980E69699_2x.png diff --git a/images/biaoqing/aru/E4B88DE8AFB4E8AF9D_2x.png b/images/biaoqing/aru/E4B88DE8AFB4E8AF9D_2x.png Binary files differnew file mode 100644 index 0000000..758fc53 --- /dev/null +++ b/images/biaoqing/aru/E4B88DE8AFB4E8AF9D_2x.png diff --git a/images/biaoqing/aru/E4B88DE9AB98E585B4_2x.png b/images/biaoqing/aru/E4B88DE9AB98E585B4_2x.png Binary files differnew file mode 100644 index 0000000..c11d688 --- /dev/null +++ b/images/biaoqing/aru/E4B88DE9AB98E585B4_2x.png diff --git a/images/biaoqing/aru/E4B8ADE58880_2x.png b/images/biaoqing/aru/E4B8ADE58880_2x.png Binary files differnew file mode 100644 index 0000000..2038f81 --- /dev/null +++ b/images/biaoqing/aru/E4B8ADE58880_2x.png diff --git a/images/biaoqing/aru/E4B8ADE68C87_2x.png b/images/biaoqing/aru/E4B8ADE68C87_2x.png Binary files differnew file mode 100644 index 0000000..bb758bd --- /dev/null +++ b/images/biaoqing/aru/E4B8ADE68C87_2x.png diff --git a/images/biaoqing/aru/E4B8ADE69EAA_2x.png b/images/biaoqing/aru/E4B8ADE69EAA_2x.png Binary files differnew file mode 100644 index 0000000..55c4e3f --- /dev/null +++ b/images/biaoqing/aru/E4B8ADE69EAA_2x.png diff --git a/images/biaoqing/aru/E4BAB2E4BAB2_2x.png b/images/biaoqing/aru/E4BAB2E4BAB2_2x.png Binary files differnew file mode 100644 index 0000000..6c9cf30 --- /dev/null +++ b/images/biaoqing/aru/E4BAB2E4BAB2_2x.png diff --git a/images/biaoqing/aru/E4BEBFE4BEBF_2x.png b/images/biaoqing/aru/E4BEBFE4BEBF_2x.png Binary files differnew file mode 100644 index 0000000..4be59c2 --- /dev/null +++ b/images/biaoqing/aru/E4BEBFE4BEBF_2x.png diff --git a/images/biaoqing/aru/E582BBE7AC91_2x.png b/images/biaoqing/aru/E582BBE7AC91_2x.png Binary files differnew file mode 100644 index 0000000..2efb4d2 --- /dev/null +++ b/images/biaoqing/aru/E582BBE7AC91_2x.png diff --git a/images/biaoqing/aru/E58685E4BCA4_2x.png b/images/biaoqing/aru/E58685E4BCA4_2x.png Binary files differnew file mode 100644 index 0000000..78b3837 --- /dev/null +++ b/images/biaoqing/aru/E58685E4BCA4_2x.png diff --git a/images/biaoqing/aru/E587BBE68E8C_2x.png b/images/biaoqing/aru/E587BBE68E8C_2x.png Binary files differnew file mode 100644 index 0000000..c97e00a --- /dev/null +++ b/images/biaoqing/aru/E587BBE68E8C_2x.png diff --git a/images/biaoqing/aru/E58FA3E6B0B4_2x.png b/images/biaoqing/aru/E58FA3E6B0B4_2x.png Binary files differnew file mode 100644 index 0000000..5b13dbc --- /dev/null +++ b/images/biaoqing/aru/E58FA3E6B0B4_2x.png diff --git a/images/biaoqing/aru/E59090E8888C_2x.png b/images/biaoqing/aru/E59090E8888C_2x.png Binary files differnew file mode 100644 index 0000000..b038f8e --- /dev/null +++ b/images/biaoqing/aru/E59090E8888C_2x.png diff --git a/images/biaoqing/aru/E59090E8A180E58092E59CB0_2x.png b/images/biaoqing/aru/E59090E8A180E58092E59CB0_2x.png Binary files differnew file mode 100644 index 0000000..9e63eee --- /dev/null +++ b/images/biaoqing/aru/E59090E8A180E58092E59CB0_2x.png diff --git a/images/biaoqing/aru/E59090_2x.png b/images/biaoqing/aru/E59090_2x.png Binary files differnew file mode 100644 index 0000000..5ebe288 --- /dev/null +++ b/images/biaoqing/aru/E59090_2x.png diff --git a/images/biaoqing/aru/E591B2E78999_2x.png b/images/biaoqing/aru/E591B2E78999_2x.png Binary files differnew file mode 100644 index 0000000..e1f2d73 --- /dev/null +++ b/images/biaoqing/aru/E591B2E78999_2x.png diff --git a/images/biaoqing/aru/E592BDE6B094_2x.png b/images/biaoqing/aru/E592BDE6B094_2x.png Binary files differnew file mode 100644 index 0000000..c86f180 --- /dev/null +++ b/images/biaoqing/aru/E592BDE6B094_2x.png diff --git a/images/biaoqing/aru/E593ADE6B3A3_2x.png b/images/biaoqing/aru/E593ADE6B3A3_2x.png Binary files differnew file mode 100644 index 0000000..b0c82f2 --- /dev/null +++ b/images/biaoqing/aru/E593ADE6B3A3_2x.png diff --git a/images/biaoqing/aru/E5969CE69E81E8808CE6B3A3_2x.png b/images/biaoqing/aru/E5969CE69E81E8808CE6B3A3_2x.png Binary files differnew file mode 100644 index 0000000..5cb87e8 --- /dev/null +++ b/images/biaoqing/aru/E5969CE69E81E8808CE6B3A3_2x.png diff --git a/images/biaoqing/aru/E596B7E6B0B4_2x.png b/images/biaoqing/aru/E596B7E6B0B4_2x.png Binary files differnew file mode 100644 index 0000000..3f0e213 --- /dev/null +++ b/images/biaoqing/aru/E596B7E6B0B4_2x.png diff --git a/images/biaoqing/aru/E596B7E8A180_2x.png b/images/biaoqing/aru/E596B7E8A180_2x.png Binary files differnew file mode 100644 index 0000000..128b24e --- /dev/null +++ b/images/biaoqing/aru/E596B7E8A180_2x.png diff --git a/images/biaoqing/aru/E59D90E7AD89_2x.png b/images/biaoqing/aru/E59D90E7AD89_2x.png Binary files differnew file mode 100644 index 0000000..881b766 --- /dev/null +++ b/images/biaoqing/aru/E59D90E7AD89_2x.png diff --git a/images/biaoqing/aru/E5A4A7E59BA7_2x.png b/images/biaoqing/aru/E5A4A7E59BA7_2x.png Binary files differnew file mode 100644 index 0000000..3db1529 --- /dev/null +++ b/images/biaoqing/aru/E5A4A7E59BA7_2x.png diff --git a/images/biaoqing/aru/E5AEB3E7BE9E_2x.png b/images/biaoqing/aru/E5AEB3E7BE9E_2x.png Binary files differnew file mode 100644 index 0000000..b2c6e26 --- /dev/null +++ b/images/biaoqing/aru/E5AEB3E7BE9E_2x.png diff --git a/images/biaoqing/aru/E5B08FE68092_2x.png b/images/biaoqing/aru/E5B08FE68092_2x.png Binary files differnew file mode 100644 index 0000000..b1bac01 --- /dev/null +++ b/images/biaoqing/aru/E5B08FE68092_2x.png diff --git a/images/biaoqing/aru/E5B08FE79CBCE79D9B_2x.png b/images/biaoqing/aru/E5B08FE79CBCE79D9B_2x.png Binary files differnew file mode 100644 index 0000000..a65b2dc --- /dev/null +++ b/images/biaoqing/aru/E5B08FE79CBCE79D9B_2x.png diff --git a/images/biaoqing/aru/E5B0B4E5B0AC_2x.png b/images/biaoqing/aru/E5B0B4E5B0AC_2x.png Binary files differnew file mode 100644 index 0000000..c16d282 --- /dev/null +++ b/images/biaoqing/aru/E5B0B4E5B0AC_2x.png diff --git a/images/biaoqing/aru/E5BE97E6848F_2x.png b/images/biaoqing/aru/E5BE97E6848F_2x.png Binary files differnew file mode 100644 index 0000000..116f572 --- /dev/null +++ b/images/biaoqing/aru/E5BE97E6848F_2x.png diff --git a/images/biaoqing/aru/E6838AE5969C_2x.png b/images/biaoqing/aru/E6838AE5969C_2x.png Binary files differnew file mode 100644 index 0000000..7f31ce9 --- /dev/null +++ b/images/biaoqing/aru/E6838AE5969C_2x.png diff --git a/images/biaoqing/aru/E683B3E4B880E683B3_2x.png b/images/biaoqing/aru/E683B3E4B880E683B3_2x.png Binary files differnew file mode 100644 index 0000000..b311f8d --- /dev/null +++ b/images/biaoqing/aru/E683B3E4B880E683B3_2x.png diff --git a/images/biaoqing/aru/E684A4E68092_2x.png b/images/biaoqing/aru/E684A4E68092_2x.png Binary files differnew file mode 100644 index 0000000..a2a3ea2 --- /dev/null +++ b/images/biaoqing/aru/E684A4E68092_2x.png diff --git a/images/biaoqing/aru/E68987E880B3E58589_2x.png b/images/biaoqing/aru/E68987E880B3E58589_2x.png Binary files differnew file mode 100644 index 0000000..8d7e2f2 --- /dev/null +++ b/images/biaoqing/aru/E68987E880B3E58589_2x.png diff --git a/images/biaoqing/aru/E68A95E9998D_2x.png b/images/biaoqing/aru/E68A95E9998D_2x.png Binary files differnew file mode 100644 index 0000000..6eddc06 --- /dev/null +++ b/images/biaoqing/aru/E68A95E9998D_2x.png diff --git a/images/biaoqing/aru/E68AA0E9BCBB_2x.png b/images/biaoqing/aru/E68AA0E9BCBB_2x.png Binary files differnew file mode 100644 index 0000000..912362c --- /dev/null +++ b/images/biaoqing/aru/E68AA0E9BCBB_2x.png diff --git a/images/biaoqing/aru/E68ABDE7839F_2x.png b/images/biaoqing/aru/E68ABDE7839F_2x.png Binary files differnew file mode 100644 index 0000000..8c51858 --- /dev/null +++ b/images/biaoqing/aru/E68ABDE7839F_2x.png diff --git a/images/biaoqing/aru/E697A0E5A588_2x.png b/images/biaoqing/aru/E697A0E5A588_2x.png Binary files differnew file mode 100644 index 0000000..0ef1383 --- /dev/null +++ b/images/biaoqing/aru/E697A0E5A588_2x.png diff --git a/images/biaoqing/aru/E697A0E68980E8B093_2x.png b/images/biaoqing/aru/E697A0E68980E8B093_2x.png Binary files differnew file mode 100644 index 0000000..6b28d93 --- /dev/null +++ b/images/biaoqing/aru/E697A0E68980E8B093_2x.png diff --git a/images/biaoqing/aru/E697A0E8AFAD_2x.png b/images/biaoqing/aru/E697A0E8AFAD_2x.png Binary files differnew file mode 100644 index 0000000..76ff11c --- /dev/null +++ b/images/biaoqing/aru/E697A0E8AFAD_2x.png diff --git a/images/biaoqing/aru/E69A97E59CB0E8A782E5AF9F_2x.png b/images/biaoqing/aru/E69A97E59CB0E8A782E5AF9F_2x.png Binary files differnew file mode 100644 index 0000000..18fd4a8 --- /dev/null +++ b/images/biaoqing/aru/E69A97E59CB0E8A782E5AF9F_2x.png diff --git a/images/biaoqing/aru/E69C9FE5BE85_2x.png b/images/biaoqing/aru/E69C9FE5BE85_2x.png Binary files differnew file mode 100644 index 0000000..3ce37c6 --- /dev/null +++ b/images/biaoqing/aru/E69C9FE5BE85_2x.png diff --git a/images/biaoqing/aru/E6ACA2E591BC_2x.png b/images/biaoqing/aru/E6ACA2E591BC_2x.png Binary files differnew file mode 100644 index 0000000..99eb788 --- /dev/null +++ b/images/biaoqing/aru/E6ACA2E591BC_2x.png diff --git a/images/biaoqing/aru/E6B197_2x.png b/images/biaoqing/aru/E6B197_2x.png Binary files differnew file mode 100644 index 0000000..4a79262 --- /dev/null +++ b/images/biaoqing/aru/E6B197_2x.png diff --git a/images/biaoqing/aru/E6B7B1E6809D_2x.png b/images/biaoqing/aru/E6B7B1E6809D_2x.png Binary files differnew file mode 100644 index 0000000..b7546df --- /dev/null +++ b/images/biaoqing/aru/E6B7B1E6809D_2x.png diff --git a/images/biaoqing/aru/E78B82E6B197_2x.png b/images/biaoqing/aru/E78B82E6B197_2x.png Binary files differnew file mode 100644 index 0000000..1f81eec --- /dev/null +++ b/images/biaoqing/aru/E78B82E6B197_2x.png diff --git a/images/biaoqing/aru/E78CAEE88AB1_2x.png b/images/biaoqing/aru/E78CAEE88AB1_2x.png Binary files differnew file mode 100644 index 0000000..9ab11a2 --- /dev/null +++ b/images/biaoqing/aru/E78CAEE88AB1_2x.png diff --git a/images/biaoqing/aru/E78CAEE9BB84E7939C_2x.png b/images/biaoqing/aru/E78CAEE9BB84E7939C_2x.png Binary files differnew file mode 100644 index 0000000..e741463 --- /dev/null +++ b/images/biaoqing/aru/E78CAEE9BB84E7939C_2x.png diff --git a/images/biaoqing/aru/E79AB1E79C89_2x.png b/images/biaoqing/aru/E79AB1E79C89_2x.png Binary files differnew file mode 100644 index 0000000..8d0bd26 --- /dev/null +++ b/images/biaoqing/aru/E79AB1E79C89_2x.png diff --git a/images/biaoqing/aru/E79C8BE4B88DE8A781_2x.png b/images/biaoqing/aru/E79C8BE4B88DE8A781_2x.png Binary files differnew file mode 100644 index 0000000..a95d997 --- /dev/null +++ b/images/biaoqing/aru/E79C8BE4B88DE8A781_2x.png diff --git a/images/biaoqing/aru/E79C8BE783ADE997B9_2x.png b/images/biaoqing/aru/E79C8BE783ADE997B9_2x.png Binary files differnew file mode 100644 index 0000000..3e9c198 --- /dev/null +++ b/images/biaoqing/aru/E79C8BE783ADE997B9_2x.png diff --git a/images/biaoqing/aru/E882BFE58C85_2x.png b/images/biaoqing/aru/E882BFE58C85_2x.png Binary files differnew file mode 100644 index 0000000..ed208a5 --- /dev/null +++ b/images/biaoqing/aru/E882BFE58C85_2x.png diff --git a/images/biaoqing/aru/E884B8E7BAA2_2x.png b/images/biaoqing/aru/E884B8E7BAA2_2x.png Binary files differnew file mode 100644 index 0000000..6a78a89 --- /dev/null +++ b/images/biaoqing/aru/E884B8E7BAA2_2x.png diff --git a/images/biaoqing/aru/E89CA1E7839B_2x.png b/images/biaoqing/aru/E89CA1E7839B_2x.png Binary files differnew file mode 100644 index 0000000..a3971dd --- /dev/null +++ b/images/biaoqing/aru/E89CA1E7839B_2x.png diff --git a/images/biaoqing/aru/E8A385E5A4A7E6ACBE_2x.png b/images/biaoqing/aru/E8A385E5A4A7E6ACBE_2x.png Binary files differnew file mode 100644 index 0000000..8f2d224 --- /dev/null +++ b/images/biaoqing/aru/E8A385E5A4A7E6ACBE_2x.png diff --git a/images/biaoqing/aru/E8A782E5AF9F_2x.png b/images/biaoqing/aru/E8A782E5AF9F_2x.png Binary files differnew file mode 100644 index 0000000..c2fa07e --- /dev/null +++ b/images/biaoqing/aru/E8A782E5AF9F_2x.png diff --git a/images/biaoqing/aru/E8B59EE4B880E4B8AA_2x.png b/images/biaoqing/aru/E8B59EE4B880E4B8AA_2x.png Binary files differnew file mode 100644 index 0000000..e6b5d02 --- /dev/null +++ b/images/biaoqing/aru/E8B59EE4B880E4B8AA_2x.png diff --git a/images/biaoqing/aru/E982AAE681B6_2x.png b/images/biaoqing/aru/E982AAE681B6_2x.png Binary files differnew file mode 100644 index 0000000..cc98f30 --- /dev/null +++ b/images/biaoqing/aru/E982AAE681B6_2x.png diff --git a/images/biaoqing/aru/E99481E79C89_2x.png b/images/biaoqing/aru/E99481E79C89_2x.png Binary files differnew file mode 100644 index 0000000..8fecdc3 --- /dev/null +++ b/images/biaoqing/aru/E99481E79C89_2x.png diff --git a/images/biaoqing/aru/E99481E79C90_2x.png b/images/biaoqing/aru/E99481E79C90_2x.png Binary files differnew file mode 100644 index 0000000..8fecdc3 --- /dev/null +++ b/images/biaoqing/aru/E99481E79C90_2x.png diff --git a/images/biaoqing/aru/E995BFE88D89_2x.png b/images/biaoqing/aru/E995BFE88D89_2x.png Binary files differnew file mode 100644 index 0000000..ecf8b7c --- /dev/null +++ b/images/biaoqing/aru/E995BFE88D89_2x.png diff --git a/images/biaoqing/aru/E998B4E69A97_2x.png b/images/biaoqing/aru/E998B4E69A97_2x.png Binary files differnew file mode 100644 index 0000000..b0e9517 --- /dev/null +++ b/images/biaoqing/aru/E998B4E69A97_2x.png diff --git a/images/biaoqing/aru/E9AB98E585B4_2x.png b/images/biaoqing/aru/E9AB98E585B4_2x.png Binary files differnew file mode 100644 index 0000000..c87d27d --- /dev/null +++ b/images/biaoqing/aru/E9AB98E585B4_2x.png diff --git a/images/biaoqing/aru/E9BB91E7BABF_2x.png b/images/biaoqing/aru/E9BB91E7BABF_2x.png Binary files differnew file mode 100644 index 0000000..c46d1a6 --- /dev/null +++ b/images/biaoqing/aru/E9BB91E7BABF_2x.png diff --git a/images/biaoqing/aru/E9BC93E68E8C_2x.png b/images/biaoqing/aru/E9BC93E68E8C_2x.png Binary files differnew file mode 100644 index 0000000..15aa10a --- /dev/null +++ b/images/biaoqing/aru/E9BC93E68E8C_2x.png diff --git a/images/biaoqing/paopao/E4B88DE9AB98E585B4_2x.png b/images/biaoqing/paopao/E4B88DE9AB98E585B4_2x.png Binary files differnew file mode 100644 index 0000000..46fb5af --- /dev/null +++ b/images/biaoqing/paopao/E4B88DE9AB98E585B4_2x.png diff --git a/images/biaoqing/paopao/E4B996_2x.png b/images/biaoqing/paopao/E4B996_2x.png Binary files differnew file mode 100644 index 0000000..6d044c2 --- /dev/null +++ b/images/biaoqing/paopao/E4B996_2x.png diff --git a/images/biaoqing/paopao/E4BDA0E68782E79A84_2x.png b/images/biaoqing/paopao/E4BDA0E68782E79A84_2x.png Binary files differnew file mode 100644 index 0000000..55f3ed7 --- /dev/null +++ b/images/biaoqing/paopao/E4BDA0E68782E79A84_2x.png diff --git a/images/biaoqing/paopao/E4BEBFE4BEBF_2x.png b/images/biaoqing/paopao/E4BEBFE4BEBF_2x.png Binary files differnew file mode 100644 index 0000000..130c35c --- /dev/null +++ b/images/biaoqing/paopao/E4BEBFE4BEBF_2x.png diff --git a/images/biaoqing/paopao/E586B7_2x.png b/images/biaoqing/paopao/E586B7_2x.png Binary files differnew file mode 100644 index 0000000..6bc7a39 --- /dev/null +++ b/images/biaoqing/paopao/E586B7_2x.png diff --git a/images/biaoqing/paopao/E58B89E5BCBA_2x.png b/images/biaoqing/paopao/E58B89E5BCBA_2x.png Binary files differnew file mode 100644 index 0000000..e0ebcca --- /dev/null +++ b/images/biaoqing/paopao/E58B89E5BCBA_2x.png diff --git a/images/biaoqing/paopao/E59083E7939C_2x.png b/images/biaoqing/paopao/E59083E7939C_2x.png Binary files differnew file mode 100644 index 0000000..45798d4 --- /dev/null +++ b/images/biaoqing/paopao/E59083E7939C_2x.png diff --git a/images/biaoqing/paopao/E59083E7BF94_2x.png b/images/biaoqing/paopao/E59083E7BF94_2x.png Binary files differnew file mode 100644 index 0000000..6f37231 --- /dev/null +++ b/images/biaoqing/paopao/E59083E7BF94_2x.png diff --git a/images/biaoqing/paopao/E59090E8888C_2x.png b/images/biaoqing/paopao/E59090E8888C_2x.png Binary files differnew file mode 100644 index 0000000..631e7aa --- /dev/null +++ b/images/biaoqing/paopao/E59090E8888C_2x.png diff --git a/images/biaoqing/paopao/E59090_2x.png b/images/biaoqing/paopao/E59090_2x.png Binary files differnew file mode 100644 index 0000000..c3f46c7 --- /dev/null +++ b/images/biaoqing/paopao/E59090_2x.png diff --git a/images/biaoqing/paopao/E59180E592A9E788B9_2x.png b/images/biaoqing/paopao/E59180E592A9E788B9_2x.png Binary files differnew file mode 100644 index 0000000..98a6ad8 --- /dev/null +++ b/images/biaoqing/paopao/E59180E592A9E788B9_2x.png diff --git a/images/biaoqing/paopao/E591B5E591B5_2x.png b/images/biaoqing/paopao/E591B5E591B5_2x.png Binary files differnew file mode 100644 index 0000000..9ef384f --- /dev/null +++ b/images/biaoqing/paopao/E591B5E591B5_2x.png diff --git a/images/biaoqing/paopao/E591BC_2x.png b/images/biaoqing/paopao/E591BC_2x.png Binary files differnew file mode 100644 index 0000000..8a70b89 --- /dev/null +++ b/images/biaoqing/paopao/E591BC_2x.png diff --git a/images/biaoqing/paopao/E592A6_2x.png b/images/biaoqing/paopao/E592A6_2x.png Binary files differnew file mode 100644 index 0000000..e5520d2 --- /dev/null +++ b/images/biaoqing/paopao/E592A6_2x.png diff --git a/images/biaoqing/paopao/E59388E59388_2x.png b/images/biaoqing/paopao/E59388E59388_2x.png Binary files differnew file mode 100644 index 0000000..d20de90 --- /dev/null +++ b/images/biaoqing/paopao/E59388E59388_2x.png diff --git a/images/biaoqing/paopao/E5958A_2x.png b/images/biaoqing/paopao/E5958A_2x.png Binary files differnew file mode 100644 index 0000000..e9e940a --- /dev/null +++ b/images/biaoqing/paopao/E5958A_2x.png diff --git a/images/biaoqing/paopao/E596B7_2x.png b/images/biaoqing/paopao/E596B7_2x.png Binary files differnew file mode 100644 index 0000000..c5273ee --- /dev/null +++ b/images/biaoqing/paopao/E596B7_2x.png diff --git a/images/biaoqing/paopao/E5989AE7919F_2x.png b/images/biaoqing/paopao/E5989AE7919F_2x.png Binary files differnew file mode 100644 index 0000000..1b697d6 --- /dev/null +++ b/images/biaoqing/paopao/E5989AE7919F_2x.png diff --git a/images/biaoqing/paopao/E5A4A7E68B87E68C87_2x.png b/images/biaoqing/paopao/E5A4A7E68B87E68C87_2x.png Binary files differnew file mode 100644 index 0000000..808a165 --- /dev/null +++ b/images/biaoqing/paopao/E5A4A7E68B87E68C87_2x.png diff --git a/images/biaoqing/paopao/E5A4AAE5BC80E5BF83_2x.png b/images/biaoqing/paopao/E5A4AAE5BC80E5BF83_2x.png Binary files differnew file mode 100644 index 0000000..5e644bc --- /dev/null +++ b/images/biaoqing/paopao/E5A4AAE5BC80E5BF83_2x.png diff --git a/images/biaoqing/paopao/E5A4AAE998B3_2x.png b/images/biaoqing/paopao/E5A4AAE998B3_2x.png Binary files differnew file mode 100644 index 0000000..7fefbe1 --- /dev/null +++ b/images/biaoqing/paopao/E5A4AAE998B3_2x.png diff --git a/images/biaoqing/paopao/E5A794E5B188_2x.png b/images/biaoqing/paopao/E5A794E5B188_2x.png Binary files differnew file mode 100644 index 0000000..ec2d0f2 --- /dev/null +++ b/images/biaoqing/paopao/E5A794E5B188_2x.png diff --git a/images/biaoqing/paopao/E5B08FE4B996_2x.png b/images/biaoqing/paopao/E5B08FE4B996_2x.png Binary files differnew file mode 100644 index 0000000..33c632d --- /dev/null +++ b/images/biaoqing/paopao/E5B08FE4B996_2x.png diff --git a/images/biaoqing/paopao/E5B08FE7BAA2E884B8_2x.png b/images/biaoqing/paopao/E5B08FE7BAA2E884B8_2x.png Binary files differnew file mode 100644 index 0000000..aa1358a --- /dev/null +++ b/images/biaoqing/paopao/E5B08FE7BAA2E884B8_2x.png diff --git a/images/biaoqing/paopao/E5BC80E5BF83_2x.png b/images/biaoqing/paopao/E5BC80E5BF83_2x.png Binary files differnew file mode 100644 index 0000000..b5aeb0d --- /dev/null +++ b/images/biaoqing/paopao/E5BC80E5BF83_2x.png diff --git a/images/biaoqing/paopao/E5BCB1_2x.png b/images/biaoqing/paopao/E5BCB1_2x.png Binary files differnew file mode 100644 index 0000000..bf2b3ce --- /dev/null +++ b/images/biaoqing/paopao/E5BCB1_2x.png diff --git a/images/biaoqing/paopao/E5BDA9E899B9_2x.png b/images/biaoqing/paopao/E5BDA9E899B9_2x.png Binary files differnew file mode 100644 index 0000000..4892fdf --- /dev/null +++ b/images/biaoqing/paopao/E5BDA9E899B9_2x.png diff --git a/images/biaoqing/paopao/E5BF83E7A28E_2x.png b/images/biaoqing/paopao/E5BF83E7A28E_2x.png Binary files differnew file mode 100644 index 0000000..6ee132b --- /dev/null +++ b/images/biaoqing/paopao/E5BF83E7A28E_2x.png diff --git a/images/biaoqing/paopao/E68092_2x.png b/images/biaoqing/paopao/E68092_2x.png Binary files differnew file mode 100644 index 0000000..2bdffa4 --- /dev/null +++ b/images/biaoqing/paopao/E68092_2x.png diff --git a/images/biaoqing/paopao/E6838AE593AD_2x.png b/images/biaoqing/paopao/E6838AE593AD_2x.png Binary files differnew file mode 100644 index 0000000..a596e58 --- /dev/null +++ b/images/biaoqing/paopao/E6838AE593AD_2x.png diff --git a/images/biaoqing/paopao/E6838AE68190_2x.png b/images/biaoqing/paopao/E6838AE68190_2x.png Binary files differnew file mode 100644 index 0000000..0c1e20a --- /dev/null +++ b/images/biaoqing/paopao/E6838AE68190_2x.png diff --git a/images/biaoqing/paopao/E6838AE8AEB6_2x.png b/images/biaoqing/paopao/E6838AE8AEB6_2x.png Binary files differnew file mode 100644 index 0000000..81fda5a --- /dev/null +++ b/images/biaoqing/paopao/E6838AE8AEB6_2x.png diff --git a/images/biaoqing/paopao/E68792E5BE97E79086_2x.png b/images/biaoqing/paopao/E68792E5BE97E79086_2x.png Binary files differnew file mode 100644 index 0000000..59fcfdc --- /dev/null +++ b/images/biaoqing/paopao/E68792E5BE97E79086_2x.png diff --git a/images/biaoqing/paopao/E6898BE7BAB8_2x.png b/images/biaoqing/paopao/E6898BE7BAB8_2x.png Binary files differnew file mode 100644 index 0000000..e59e7c5 --- /dev/null +++ b/images/biaoqing/paopao/E6898BE7BAB8_2x.png diff --git a/images/biaoqing/paopao/E68C96E9BCBB_2x.png b/images/biaoqing/paopao/E68C96E9BCBB_2x.png Binary files differnew file mode 100644 index 0000000..17a5335 --- /dev/null +++ b/images/biaoqing/paopao/E68C96E9BCBB_2x.png diff --git a/images/biaoqing/paopao/E68D82E598B4E7AC91_2x.png b/images/biaoqing/paopao/E68D82E598B4E7AC91_2x.png Binary files differnew file mode 100644 index 0000000..57975f7 --- /dev/null +++ b/images/biaoqing/paopao/E68D82E598B4E7AC91_2x.png diff --git a/images/biaoqing/paopao/E6989FE6989FE69C88E4BAAE_2x.png b/images/biaoqing/paopao/E6989FE6989FE69C88E4BAAE_2x.png Binary files differnew file mode 100644 index 0000000..e19bfe7 --- /dev/null +++ b/images/biaoqing/paopao/E6989FE6989FE69C88E4BAAE_2x.png diff --git a/images/biaoqing/paopao/E6B197_2x.png b/images/biaoqing/paopao/E6B197_2x.png Binary files differnew file mode 100644 index 0000000..5f57a18 --- /dev/null +++ b/images/biaoqing/paopao/E6B197_2x.png diff --git a/images/biaoqing/paopao/E6B299E58F91_2x.png b/images/biaoqing/paopao/E6B299E58F91_2x.png Binary files differnew file mode 100644 index 0000000..f663de3 --- /dev/null +++ b/images/biaoqing/paopao/E6B299E58F91_2x.png diff --git a/images/biaoqing/paopao/E6B3AA_2x.png b/images/biaoqing/paopao/E6B3AA_2x.png Binary files differnew file mode 100644 index 0000000..a1caed0 --- /dev/null +++ b/images/biaoqing/paopao/E6B3AA_2x.png diff --git a/images/biaoqing/paopao/E6BB91E7A8BD_2x.png b/images/biaoqing/paopao/E6BB91E7A8BD_2x.png Binary files differnew file mode 100644 index 0000000..8402f16 --- /dev/null +++ b/images/biaoqing/paopao/E6BB91E7A8BD_2x.png diff --git a/images/biaoqing/paopao/E781AFE6B3A1_2x.png b/images/biaoqing/paopao/E781AFE6B3A1_2x.png Binary files differnew file mode 100644 index 0000000..1aa078a --- /dev/null +++ b/images/biaoqing/paopao/E781AFE6B3A1_2x.png diff --git a/images/biaoqing/paopao/E788B1E5BF83_2x.png b/images/biaoqing/paopao/E788B1E5BF83_2x.png Binary files differnew file mode 100644 index 0000000..f6f4c64 --- /dev/null +++ b/images/biaoqing/paopao/E788B1E5BF83_2x.png diff --git a/images/biaoqing/paopao/E78A80E588A9_2x.png b/images/biaoqing/paopao/E78A80E588A9_2x.png Binary files differnew file mode 100644 index 0000000..c828e77 --- /dev/null +++ b/images/biaoqing/paopao/E78A80E588A9_2x.png diff --git a/images/biaoqing/paopao/E78B82E6B197_2x.png b/images/biaoqing/paopao/E78B82E6B197_2x.png Binary files differnew file mode 100644 index 0000000..2aceb02 --- /dev/null +++ b/images/biaoqing/paopao/E78B82E6B197_2x.png diff --git a/images/biaoqing/paopao/E78EABE791B0_2x.png b/images/biaoqing/paopao/E78EABE791B0_2x.png Binary files differnew file mode 100644 index 0000000..c0618cf --- /dev/null +++ b/images/biaoqing/paopao/E78EABE791B0_2x.png diff --git a/images/biaoqing/paopao/E7949FE6B094_2x.png b/images/biaoqing/paopao/E7949FE6B094_2x.png Binary files differnew file mode 100644 index 0000000..9befd26 --- /dev/null +++ b/images/biaoqing/paopao/E7949FE6B094_2x.png diff --git a/images/biaoqing/paopao/E79691E997AE_2x.png b/images/biaoqing/paopao/E79691E997AE_2x.png Binary files differnew file mode 100644 index 0000000..cff4a43 --- /dev/null +++ b/images/biaoqing/paopao/E79691E997AE_2x.png diff --git a/images/biaoqing/paopao/E79C9FE6A392_2x.png b/images/biaoqing/paopao/E79C9FE6A392_2x.png Binary files differnew file mode 100644 index 0000000..97ca30d --- /dev/null +++ b/images/biaoqing/paopao/E79C9FE6A392_2x.png diff --git a/images/biaoqing/paopao/E79DA1E8A789_2x.png b/images/biaoqing/paopao/E79DA1E8A789_2x.png Binary files differnew file mode 100644 index 0000000..21594dd --- /dev/null +++ b/images/biaoqing/paopao/E79DA1E8A789_2x.png diff --git a/images/biaoqing/paopao/E7A4BCE789A9_2x.png b/images/biaoqing/paopao/E7A4BCE789A9_2x.png Binary files differnew file mode 100644 index 0000000..8572a23 --- /dev/null +++ b/images/biaoqing/paopao/E7A4BCE789A9_2x.png diff --git a/images/biaoqing/paopao/E7AC91E5B0BF_2x.png b/images/biaoqing/paopao/E7AC91E5B0BF_2x.png Binary files differnew file mode 100644 index 0000000..a2c29a1 --- /dev/null +++ b/images/biaoqing/paopao/E7AC91E5B0BF_2x.png diff --git a/images/biaoqing/paopao/E7AC91E79CBC_2x.png b/images/biaoqing/paopao/E7AC91E79CBC_2x.png Binary files differnew file mode 100644 index 0000000..0680d43 --- /dev/null +++ b/images/biaoqing/paopao/E7AC91E79CBC_2x.png diff --git a/images/biaoqing/paopao/E7BAA2E9A286E5B7BE_2x.png b/images/biaoqing/paopao/E7BAA2E9A286E5B7BE_2x.png Binary files differnew file mode 100644 index 0000000..7690c2f --- /dev/null +++ b/images/biaoqing/paopao/E7BAA2E9A286E5B7BE_2x.png diff --git a/images/biaoqing/paopao/E8839CE588A9_2x.png b/images/biaoqing/paopao/E8839CE588A9_2x.png Binary files differnew file mode 100644 index 0000000..821abfd --- /dev/null +++ b/images/biaoqing/paopao/E8839CE588A9_2x.png diff --git a/images/biaoqing/paopao/E88AB1E5BF83_2x.png b/images/biaoqing/paopao/E88AB1E5BF83_2x.png Binary files differnew file mode 100644 index 0000000..3e8e915 --- /dev/null +++ b/images/biaoqing/paopao/E88AB1E5BF83_2x.png diff --git a/images/biaoqing/paopao/E88CB6E69DAF_2x.png b/images/biaoqing/paopao/E88CB6E69DAF_2x.png Binary files differnew file mode 100644 index 0000000..fc8ac2c --- /dev/null +++ b/images/biaoqing/paopao/E88CB6E69DAF_2x.png diff --git a/images/biaoqing/paopao/E88DAFE4B8B8_2x.png b/images/biaoqing/paopao/E88DAFE4B8B8_2x.png Binary files differnew file mode 100644 index 0000000..9bd93a0 --- /dev/null +++ b/images/biaoqing/paopao/E88DAFE4B8B8_2x.png diff --git a/images/biaoqing/paopao/E89B8BE7B395_2x.png b/images/biaoqing/paopao/E89B8BE7B395_2x.png Binary files differnew file mode 100644 index 0000000..37ab127 --- /dev/null +++ b/images/biaoqing/paopao/E89B8BE7B395_2x.png diff --git a/images/biaoqing/paopao/E89CA1E7839B_2x.png b/images/biaoqing/paopao/E89CA1E7839B_2x.png Binary files differnew file mode 100644 index 0000000..f3aba29 --- /dev/null +++ b/images/biaoqing/paopao/E89CA1E7839B_2x.png diff --git a/images/biaoqing/paopao/E98499E8A786_2x.png b/images/biaoqing/paopao/E98499E8A786_2x.png Binary files differnew file mode 100644 index 0000000..42d110e --- /dev/null +++ b/images/biaoqing/paopao/E98499E8A786_2x.png diff --git a/images/biaoqing/paopao/E985B7_2x.png b/images/biaoqing/paopao/E985B7_2x.png Binary files differnew file mode 100644 index 0000000..728baff --- /dev/null +++ b/images/biaoqing/paopao/E985B7_2x.png diff --git a/images/biaoqing/paopao/E985B8E788BD_2x.png b/images/biaoqing/paopao/E985B8E788BD_2x.png Binary files differnew file mode 100644 index 0000000..1fff71c --- /dev/null +++ b/images/biaoqing/paopao/E985B8E788BD_2x.png diff --git a/images/biaoqing/paopao/E992B1E5B881_2x.png b/images/biaoqing/paopao/E992B1E5B881_2x.png Binary files differnew file mode 100644 index 0000000..1e89f99 --- /dev/null +++ b/images/biaoqing/paopao/E992B1E5B881_2x.png diff --git a/images/biaoqing/paopao/E992B1_2x.png b/images/biaoqing/paopao/E992B1_2x.png Binary files differnew file mode 100644 index 0000000..3cc877f --- /dev/null +++ b/images/biaoqing/paopao/E992B1_2x.png diff --git a/images/biaoqing/paopao/E998B4E999A9_2x.png b/images/biaoqing/paopao/E998B4E999A9_2x.png Binary files differnew file mode 100644 index 0000000..9fe13b4 --- /dev/null +++ b/images/biaoqing/paopao/E998B4E999A9_2x.png diff --git a/images/biaoqing/paopao/E99FB3E4B990_2x.png b/images/biaoqing/paopao/E99FB3E4B990_2x.png Binary files differnew file mode 100644 index 0000000..38f78c2 --- /dev/null +++ b/images/biaoqing/paopao/E99FB3E4B990_2x.png diff --git a/images/biaoqing/paopao/E9A699E89589_2x.png b/images/biaoqing/paopao/E9A699E89589_2x.png Binary files differnew file mode 100644 index 0000000..eccebc3 --- /dev/null +++ b/images/biaoqing/paopao/E9A699E89589_2x.png diff --git a/images/biaoqing/paopao/E9BB91E7BABF_2x.png b/images/biaoqing/paopao/E9BB91E7BABF_2x.png Binary files differnew file mode 100644 index 0000000..cc3c56a --- /dev/null +++ b/images/biaoqing/paopao/E9BB91E7BABF_2x.png diff --git a/images/biaoqing/paopao/OK_2x.png b/images/biaoqing/paopao/OK_2x.png Binary files differnew file mode 100644 index 0000000..a1e18ab --- /dev/null +++ b/images/biaoqing/paopao/OK_2x.png diff --git a/images/biaoqing/paopao/haha_2x.png b/images/biaoqing/paopao/haha_2x.png Binary files differnew file mode 100644 index 0000000..e847878 --- /dev/null +++ b/images/biaoqing/paopao/haha_2x.png diff --git a/images/biaoqing/paopao/list.txt b/images/biaoqing/paopao/list.txt new file mode 100644 index 0000000..e684ea1 --- /dev/null +++ b/images/biaoqing/paopao/list.txt @@ -0,0 +1,72 @@ +E4B88DE9AB98E585B4_2x.png +E4B996_2x.png +E4BDA0E68782E79A84_2x.png +E4BEBFE4BEBF_2x.png +E586B7_2x.png +E58B89E5BCBA_2x.png +E59083E7939C_2x.png +E59083E7BF94_2x.png +E59090E8888C_2x.png +E59090_2x.png +E59180E592A9E788B9_2x.png +E591B5E591B5_2x.png +E591BC_2x.png +E592A6_2x.png +E59388E59388_2x.png +E5958A_2x.png +E596B7_2x.png +E5989AE7919F_2x.png +E5A4A7E68B87E68C87_2x.png +E5A4AAE5BC80E5BF83_2x.png +E5A4AAE998B3_2x.png +E5A794E5B188_2x.png +E5B08FE4B996_2x.png +E5B08FE7BAA2E884B8_2x.png +E5BC80E5BF83_2x.png +E5BCB1_2x.png +E5BDA9E899B9_2x.png +E5BF83E7A28E_2x.png +E68092_2x.png +E6838AE593AD_2x.png +E6838AE68190_2x.png +E6838AE8AEB6_2x.png +E68792E5BE97E79086_2x.png +E6898BE7BAB8_2x.png +E68C96E9BCBB_2x.png +E68D82E598B4E7AC91_2x.png +E6989FE6989FE69C88E4BAAE_2x.png +E6B197_2x.png +E6B299E58F91_2x.png +E6B3AA_2x.png +E6BB91E7A8BD_2x.png +E781AFE6B3A1_2x.png +E788B1E5BF83_2x.png +E78A80E588A9_2x.png +E78B82E6B197_2x.png +E78EABE791B0_2x.png +E7949FE6B094_2x.png +E79691E997AE_2x.png +E79C9FE6A392_2x.png +E79DA1E8A789_2x.png +E7A4BCE789A9_2x.png +E7AC91E5B0BF_2x.png +E7AC91E79CBC_2x.png +E7BAA2E9A286E5B7BE_2x.png +E8839CE588A9_2x.png +E88AB1E5BF83_2x.png +E88CB6E69DAF_2x.png +E88DAFE4B8B8_2x.png +E89B8BE7B395_2x.png +E89CA1E7839B_2x.png +E98499E8A786_2x.png +E985B7_2x.png +E985B8E788BD_2x.png +E992B1E5B881_2x.png +E992B1_2x.png +E998B4E999A9_2x.png +E99FB3E4B990_2x.png +E9A699E89589_2x.png +E9BB91E7BABF_2x.png +haha_2x.png +OK_2x.png +what_2x.png diff --git a/images/biaoqing/paopao/what_2x.png b/images/biaoqing/paopao/what_2x.png Binary files differnew file mode 100644 index 0000000..7c985c8 --- /dev/null +++ b/images/biaoqing/paopao/what_2x.png diff --git a/images/biaoqing/twemoji/angry.png b/images/biaoqing/twemoji/angry.png Binary files differnew file mode 100644 index 0000000..8f41077 --- /dev/null +++ b/images/biaoqing/twemoji/angry.png diff --git a/images/biaoqing/twemoji/bigsmile.png b/images/biaoqing/twemoji/bigsmile.png Binary files differnew file mode 100644 index 0000000..a2fdb7c --- /dev/null +++ b/images/biaoqing/twemoji/bigsmile.png diff --git a/images/biaoqing/twemoji/congratulate.png b/images/biaoqing/twemoji/congratulate.png Binary files differnew file mode 100644 index 0000000..703ce1b --- /dev/null +++ b/images/biaoqing/twemoji/congratulate.png diff --git a/images/biaoqing/twemoji/cool.png b/images/biaoqing/twemoji/cool.png Binary files differnew file mode 100644 index 0000000..807cf1d --- /dev/null +++ b/images/biaoqing/twemoji/cool.png diff --git a/images/biaoqing/twemoji/cry.png b/images/biaoqing/twemoji/cry.png Binary files differnew file mode 100644 index 0000000..e878c13 --- /dev/null +++ b/images/biaoqing/twemoji/cry.png diff --git a/images/biaoqing/twemoji/dtongue.png b/images/biaoqing/twemoji/dtongue.png Binary files differnew file mode 100644 index 0000000..f8d5851 --- /dev/null +++ b/images/biaoqing/twemoji/dtongue.png diff --git a/images/biaoqing/twemoji/family.png b/images/biaoqing/twemoji/family.png Binary files differnew file mode 100644 index 0000000..d1e899b --- /dev/null +++ b/images/biaoqing/twemoji/family.png diff --git a/images/biaoqing/twemoji/frightened.png b/images/biaoqing/twemoji/frightened.png Binary files differnew file mode 100644 index 0000000..a51a720 --- /dev/null +++ b/images/biaoqing/twemoji/frightened.png diff --git a/images/biaoqing/twemoji/gift.png b/images/biaoqing/twemoji/gift.png Binary files differnew file mode 100644 index 0000000..eef9154 --- /dev/null +++ b/images/biaoqing/twemoji/gift.png diff --git a/images/biaoqing/twemoji/happy.png b/images/biaoqing/twemoji/happy.png Binary files differnew file mode 100644 index 0000000..4983874 --- /dev/null +++ b/images/biaoqing/twemoji/happy.png diff --git a/images/biaoqing/twemoji/kiss.png b/images/biaoqing/twemoji/kiss.png Binary files differnew file mode 100644 index 0000000..576311e --- /dev/null +++ b/images/biaoqing/twemoji/kiss.png diff --git a/images/biaoqing/twemoji/love.png b/images/biaoqing/twemoji/love.png Binary files differnew file mode 100644 index 0000000..d074b6e --- /dev/null +++ b/images/biaoqing/twemoji/love.png diff --git a/images/biaoqing/twemoji/notalk.png b/images/biaoqing/twemoji/notalk.png Binary files differnew file mode 100644 index 0000000..23c509a --- /dev/null +++ b/images/biaoqing/twemoji/notalk.png diff --git a/images/biaoqing/twemoji/ok.png b/images/biaoqing/twemoji/ok.png Binary files differnew file mode 100644 index 0000000..4aade57 --- /dev/null +++ b/images/biaoqing/twemoji/ok.png diff --git a/images/biaoqing/twemoji/prayer.png b/images/biaoqing/twemoji/prayer.png Binary files differnew file mode 100644 index 0000000..cec90ad --- /dev/null +++ b/images/biaoqing/twemoji/prayer.png diff --git a/images/biaoqing/twemoji/proud.png b/images/biaoqing/twemoji/proud.png Binary files differnew file mode 100644 index 0000000..d0cd03d --- /dev/null +++ b/images/biaoqing/twemoji/proud.png diff --git a/images/biaoqing/twemoji/shy.png b/images/biaoqing/twemoji/shy.png Binary files differnew file mode 100644 index 0000000..caba22c --- /dev/null +++ b/images/biaoqing/twemoji/shy.png diff --git a/images/biaoqing/twemoji/smile.png b/images/biaoqing/twemoji/smile.png Binary files differnew file mode 100644 index 0000000..82b5b35 --- /dev/null +++ b/images/biaoqing/twemoji/smile.png diff --git a/images/biaoqing/twemoji/smilecry.png b/images/biaoqing/twemoji/smilecry.png Binary files differnew file mode 100644 index 0000000..89908e0 --- /dev/null +++ b/images/biaoqing/twemoji/smilecry.png diff --git a/images/biaoqing/twemoji/star.png b/images/biaoqing/twemoji/star.png Binary files differnew file mode 100644 index 0000000..f6aa803 --- /dev/null +++ b/images/biaoqing/twemoji/star.png diff --git a/images/biaoqing/twemoji/sweat.png b/images/biaoqing/twemoji/sweat.png Binary files differnew file mode 100644 index 0000000..3ceaa5b --- /dev/null +++ b/images/biaoqing/twemoji/sweat.png diff --git a/images/biaoqing/twemoji/tiaomei.png b/images/biaoqing/twemoji/tiaomei.png Binary files differnew file mode 100644 index 0000000..1866502 --- /dev/null +++ b/images/biaoqing/twemoji/tiaomei.png diff --git a/images/biaoqing/twemoji/tilted.png b/images/biaoqing/twemoji/tilted.png Binary files differnew file mode 100644 index 0000000..ae57cb1 --- /dev/null +++ b/images/biaoqing/twemoji/tilted.png diff --git a/images/biaoqing/twemoji/tongue.png b/images/biaoqing/twemoji/tongue.png Binary files differnew file mode 100644 index 0000000..1c51124 --- /dev/null +++ b/images/biaoqing/twemoji/tongue.png diff --git a/images/biaoqing/twemoji/uncomfort.png b/images/biaoqing/twemoji/uncomfort.png Binary files differnew file mode 100644 index 0000000..5e69c5d --- /dev/null +++ b/images/biaoqing/twemoji/uncomfort.png diff --git a/images/icons/home.png b/images/icons/home.png Binary files differnew file mode 100644 index 0000000..6e967b5 --- /dev/null +++ b/images/icons/home.png diff --git a/images/icons/info.png b/images/icons/info.png Binary files differnew file mode 100644 index 0000000..48bd8e1 --- /dev/null +++ b/images/icons/info.png diff --git a/images/icons/night.png b/images/icons/night.png Binary files differnew file mode 100644 index 0000000..e00898b --- /dev/null +++ b/images/icons/night.png diff --git a/images/icons/remove.png b/images/icons/remove.png Binary files differnew file mode 100644 index 0000000..60a8800 --- /dev/null +++ b/images/icons/remove.png diff --git a/images/icons/skin.png b/images/icons/skin.png Binary files differnew file mode 100644 index 0000000..5f4339d --- /dev/null +++ b/images/icons/skin.png diff --git a/images/loading/avatar.jpg b/images/loading/avatar.jpg Binary files differnew file mode 100644 index 0000000..1239806 --- /dev/null +++ b/images/loading/avatar.jpg diff --git a/images/loading/bilibili.gif b/images/loading/bilibili.gif Binary files differnew file mode 100644 index 0000000..791ac77 --- /dev/null +++ b/images/loading/bilibili.gif diff --git a/images/loading/block.gif b/images/loading/block.gif Binary files differnew file mode 100644 index 0000000..18d956c --- /dev/null +++ b/images/loading/block.gif diff --git a/images/loading/octopus.gif b/images/loading/octopus.gif Binary files differnew file mode 100644 index 0000000..5967221 --- /dev/null +++ b/images/loading/octopus.gif diff --git a/images/loading/owo.png b/images/loading/owo.png Binary files differnew file mode 100644 index 0000000..8b1d909 --- /dev/null +++ b/images/loading/owo.png diff --git a/images/loading/shojo.gif b/images/loading/shojo.gif Binary files differnew file mode 100644 index 0000000..c3d4cf7 --- /dev/null +++ b/images/loading/shojo.gif diff --git a/images/login.png b/images/login.png Binary files differnew file mode 100644 index 0000000..8374afe --- /dev/null +++ b/images/login.png diff --git a/images/postbg/1.jpg b/images/postbg/1.jpg Binary files differnew file mode 100644 index 0000000..1aac9c4 --- /dev/null +++ b/images/postbg/1.jpg diff --git a/images/postbg/10.jpg b/images/postbg/10.jpg Binary files differnew file mode 100644 index 0000000..1eadb5a --- /dev/null +++ b/images/postbg/10.jpg diff --git a/images/postbg/11.jpg b/images/postbg/11.jpg Binary files differnew file mode 100644 index 0000000..d8d030e --- /dev/null +++ b/images/postbg/11.jpg diff --git a/images/postbg/12.jpg b/images/postbg/12.jpg Binary files differnew file mode 100644 index 0000000..70ced1a --- /dev/null +++ b/images/postbg/12.jpg diff --git a/images/postbg/13.jpg b/images/postbg/13.jpg Binary files differnew file mode 100644 index 0000000..d24b77e --- /dev/null +++ b/images/postbg/13.jpg diff --git a/images/postbg/14.jpg b/images/postbg/14.jpg Binary files differnew file mode 100644 index 0000000..89ea502 --- /dev/null +++ b/images/postbg/14.jpg diff --git a/images/postbg/15.jpg b/images/postbg/15.jpg Binary files differnew file mode 100644 index 0000000..0d7a4e2 --- /dev/null +++ b/images/postbg/15.jpg diff --git a/images/postbg/2.jpg b/images/postbg/2.jpg Binary files differnew file mode 100644 index 0000000..2d88780 --- /dev/null +++ b/images/postbg/2.jpg diff --git a/images/postbg/3.jpg b/images/postbg/3.jpg Binary files differnew file mode 100644 index 0000000..7231934 --- /dev/null +++ b/images/postbg/3.jpg diff --git a/images/postbg/4.jpg b/images/postbg/4.jpg Binary files differnew file mode 100644 index 0000000..36d2749 --- /dev/null +++ b/images/postbg/4.jpg diff --git a/images/postbg/5.jpg b/images/postbg/5.jpg Binary files differnew file mode 100644 index 0000000..6d2b907 --- /dev/null +++ b/images/postbg/5.jpg diff --git a/images/postbg/6.jpg b/images/postbg/6.jpg Binary files differnew file mode 100644 index 0000000..5f3664f --- /dev/null +++ b/images/postbg/6.jpg diff --git a/images/postbg/7.jpg b/images/postbg/7.jpg Binary files differnew file mode 100644 index 0000000..defafac --- /dev/null +++ b/images/postbg/7.jpg diff --git a/images/postbg/8.jpg b/images/postbg/8.jpg Binary files differnew file mode 100644 index 0000000..2d10935 --- /dev/null +++ b/images/postbg/8.jpg diff --git a/images/postbg/9.jpg b/images/postbg/9.jpg Binary files differnew file mode 100644 index 0000000..183f4b9 --- /dev/null +++ b/images/postbg/9.jpg diff --git a/images/search.png b/images/search.png Binary files differnew file mode 100644 index 0000000..0ac6ef1 --- /dev/null +++ b/images/search.png diff --git a/includes/comments.php b/includes/comments.php new file mode 100644 index 0000000..c61842d --- /dev/null +++ b/includes/comments.php @@ -0,0 +1,112 @@ +<?php function threadedComments($comments, $options) { + $commentClass = ''; + if ($comments->authorId) { + if ($comments->authorId == $comments->ownerId) { + $commentClass .= ' comment-by-author'; //如果是文章作者的评论添加 .comment-by-author 样式 + } else { + $commentClass .= ' comment-by-user'; //如果是评论作者的添加 .comment-by-user 样式 + } + } + $commentLevelClass = $comments->_levels > 0 ? ' comment-child' : ' comment-parent'; //评论层数大于0为子级,否则是父级 +?> +<div role="comment" id="<?php $comments->theId(); ?>" class="comment-body<?php +if ($comments->_levels > 0) { + echo ' comment-child'; + $comments->levelsAlt(' comment-level-odd', ' comment-level-even'); +} else { + echo ' comment-parent'; +} +$comments->alt(' comment-odd', ' comment-even'); +echo $commentClass; +?>"> + <div class="comment-body-inner"> + <div class="comment-author-avatar"> + <?php $comments->gravatar('100', ''); ?> + </div> + <div class="comment-main comment-author-info"> + <div class="comment-content bubble"> + <span class="comment-reply"> + <?php $comments->reply('<i class="iconfont icon-return"></i>'); ?> + </span> + <?php Comments::getCommentHF($comments->coid); echo Contents::parseEmo($comments->content); ?> + </div> + <p class="comment-meta"> + <span class="comment-author"><a href="<?php echo $comments->url; ?>" target="_blank"><?php echo $comments->author; ?></a></span> + <span class="comment-date"> + <?php if ('waiting' == $comments->status) { ?> + <em class="comment-waiting"><?php gtecho('commentListTexts','commentWaiting'); ?></em> + <?php } else { ?> + <?php $comments->date('Y-m-d H:i'); ?> + <?php } ?> + </span> + </p> + </div> + </div> + <?php if ($comments->children) { ?> + <div class="comment-children"> + <?php $comments->threadedComments($options); ?> + </div> + <?php } ?> +</div> +<?php } ?> + + <div class="comment"> + <?php $this->comments()->to($comments); ?> + <?php if($this->fields->commentShow == 0)://如果显示评论列表 ?> + <?php if ($comments->have())://如果有评论 则显示 ?> + <div class="comment-container" id="comments"> + <h3 class="comment-title" id="response"><?php $this->commentsNum(_t(gt('commentListTexts','commentNumNone')), _t(gta('commentListTexts','commentNum','1')), _t(gta('commentListTexts','commentNum','%d'))); ?></h3> + <?php $comments->listComments(array( + 'before' => '<div class="comment-list" role="list">', + 'after' => '</div>', + 'avatarSize' => 200, + 'dateFormat' => 'Y-m-d H:i' + )); ?> + <div class="comment-pagenav"> + <?php $comments->pageNav('<i class="iconfont icon-chevron-left comment-pagenav-icon"></i>', '<i class="iconfont icon-chevron-right comment-pagenav-icon"></i>'); ?> + </div> + </div> + + <?php endif;//有无评论判断结束?> + <?php else: //如果不显示评论列表 ?> + <?php if($this->allow('comment')): ?><div class="comment-hidden"><?php gtecho('commentListTexts','commentHidden'); ?></div><?php endif; ?> + <?php endif;//是否显示判断结束 ?> + + <div class="comment-form"> + <!-- 判断设置是否允许对当前文章进行评论 --> + <?php if($this->allow('comment')): ?> + <div id="<?php $this->respondId(); ?>" class="respond comment-box-id" data-commentUrl="<?php $this->commentUrl() ?>"> +<!-- 输入表单开始 --> + <form method="post" action="<?php $this->commentUrl() ?>" id="comment-form" role="form"> +<!-- 如果当前用户已经登录 --> + <?php if($this->user->hasLogin()): ?> +<!-- 显示当前登录用户的用户名以及登出连接 --> + <p class="col-md-12 comment-logined-sign"><?php gtecho('commentListTexts','commentStatus'); ?><a href="<?php $this->options->profileUrl(); ?>"><?php $this->user->screenName(); ?></a>. <a href="<?php $this->options->logoutUrl(); ?>" title="Logout"><?php gtecho('commentListTexts','commentLogout'); ?></a></p> +<!-- 若当前用户未登录 --> + <?php else: ?> +<!-- 要求输入名字、邮箱、网址 --> + <div class="comment-input"> + <input type="text" name="author" id="author" class="text" placeholder="<?php gtecho('commentFormTexts','nameInput'); ?>" value="<?php $this->remember('author'); ?>" required /> + <input type="email" name="mail" id="mail" class="text" placeholder="<?php gtecho('commentFormTexts','emailInput'); ?>" value="<?php $this->remember('mail'); ?>"<?php if ($this->options->commentsRequireMail): ?> required<?php endif; ?> /> + <input type="url" name="url" id="url" class="text" placeholder="<?php gtecho('commentFormTexts','urlInput'); ?>" value="<?php $this->remember('url'); ?>"<?php if ($this->options->commentsRequireURL): ?> required<?php endif; ?> /> + </div> + <?php endif; ?> +<!-- 输入要回复的内容 --> + <p> + <textarea rows="8" name="text" id="textarea" class="OwO-textarea comment-textarea textarea" required ><?php $this->remember('text'); ?></textarea> + </p> + <p class="comment-submit-box"> + <div title="OwO" class="OwO"></div> + <div class="cancel-comment-reply"><?php $comments->cancelReply(); ?></div> + <button type="submit" onclick="return MiraclesComment.submitComment();" class="comment-submit submit"><?php gtecho('commentFormTexts','submit'); ?></button> + </p> + </form> + </div> +<!-- 若当前文章不允许进行评论 --> + <?php else: ?> + <div class="comment-hidden"><?php gtecho('commentListTexts','commentClosed'); ?></div> + <?php endif; ?> + </div> + </div> + <?php //兼容 typecho 反垃圾 + if ($this->options->commentsAntiSpam) { Comments::AntiSpam($this->respondId, Typecho_Common::shuffleScriptVar($this->security->getToken(preg_replace('/\??&?_pjax=[^&]+/i','',$this->request->getRequestUrl())))); } ?> diff --git a/includes/footer.php b/includes/footer.php new file mode 100644 index 0000000..197c040 --- /dev/null +++ b/includes/footer.php @@ -0,0 +1,82 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?> + </div><!-- 结束 pjax-container --> + <!-- Footer Information --> + <footer> + <div class="footer-info footer-dark"> + <p id="custom-footer"><?php $this->options->footerEcho(); ?></p> + <p class="copyright"><span id="copyright">Powered by <a href="http://typecho.org">Typecho</a> | Theme <a href="https://github.com/BigCoke233/miracles" id="copyright-name">Miracles</a> by <a href="https://guhub.cn" id="copyright-author">Eltrac</a></span><br> + Copyright © <?php echo date('Y'); ?> <a href="<?php $this->options->SiteUrl(); ?>"><?php $this->options->title(); ?></a>, All rights reserved.<br> + <?php + echo $this->options->build_time; + gtecho('footerTexts','startTime'); + echo " <span id=\"build-time\"></span>"; + if($faces=$this->options->anime_face){ + $faces = explode("&&",$faces); + $faces = "<span class=\"anime-face\">".$faces[mt_rand(0,count($faces)-1)]."</span>"; + } + if($faces && $this->options->build_time) echo $faces; + ?></p> + </div> + </footer> + <!-- Raised Buttons --> + <div class="fixed-tools"> + <button class="fixed-button gotop-button hint--top" data-tooltip="<?php gtecho("otherTexts","goTop"); ?>" id="gotop"><i class="iconfont icon-chevron-up"></i></button> + </div> + <!-- JavaScript Require--> + <?php + $js_files=array("jquery","pjax.jquery","gazeimg","nprogress","OwO.min","highlight","highlight-line-number","pangu","qrcode.min","details-element-polyfill","alertify"); + if($this->options->customCDN): $custom=$this->options->customCDN; else: $custom=Helper::options()->themeUrl("","Miracles"); endif; + Utils::addRequires($js_files,"js",$this->options->CDN,$custom); + ?> + <!-- Options --><!--<nocompress>--> + <script>var navSlide = <?php if($this->options->navSlide==1):?>false<?php else:?>true<?php endif;?>; + var panguLoadAllow = <?php if($this->options->pangu==1):?>false<?php else:?>true<?php endif;?>; + var allowNavAero = <?php if($this->options->navAero==1):?>false<?php else:?>true<?php endif;?>; + var siteurl = '<?php $this->options->SiteUrl() ;?>'; + var owoJson = '<?php Utils::indexTheme('assets/OwO.json'); ?>'; + var faviconUrl = '<?php if($this->options->favicon):$this->options->favicon();else:echo Utils::indexTheme('favicon.ico');endif; ?>'; + var faviconDark = <?php $faviconDarkExist = file_exists('/faviconDark.ico'); + if($faviconDarkExist=true): echo 'true'; else: echo 'false'; endif; ?>; + var commentSubmit = '<?php gtecho('commentFormTexts','submitLoading'); ?>'; + var commentSubmitLoading = '<?php gtecho('commentFormTexts','submit'); ?>'; + var footerTimeDay = '<?php gtecho('footerTexts','startTimeDay'); ?>'; + var footerTimeHour = '<?php gtecho('footerTexts','startTimeHour'); ?>'; + var footerTimeMin = '<?php gtecho('footerTexts','startTimeMin'); ?>'; + var footerTimeSec = '<?php gtecho('footerTexts','startTimeSec'); ?>'; + var footerTimeYear = '<?php gtecho('footerTexts','startTimeYear'); ?>'; + <?php if($this->options->pjax && $this->options->pjax!=0) :?>var loadPjax = true; + beforePjax = function() {NProgress.start();}; + afterPjax = function() {owoLoad();<?php $this->options->pjax_complete(); ?>};<?php endif; ?></script><!--</nocompress>--> + <!-- Script that must be after--> + <?php + $js_files=array("miracles.min","cmt.miracles"); + if($this->options->customCDN): $custom=$this->options->customCDN; else: $custom=Helper::options()->themeUrl("","Miracles"); endif; + Utils::addRequires($js_files,"js",$this->options->CDN,$custom); + ?> + <!-- JavaScript --> + <!--<nocompress>--><script> + <?php if($this->options->build_time)echo "startTime(\"".$this->options->build_time."\");" ?> + </script><!--</nocompress>--> + <!-- Send News and Loaders --> + <script><?php if($this->is('post') || $this->is('page')): ?>owoLoad();<?php endif; ?><?php $this->options->jsEcho(); ?></script> + <!-- Others --> + <?php $this->footer(); ?> + </body> +</html> +<?php if($GLOBALS['miraclesIfCompressHTML']=='on') { + $html_source = ob_get_contents(); //获取 ob 截取内容 + ob_clean(); print Utils::compressHtml($html_source); ob_end_flush(); //完成截取、压缩 HTML +} ?> +<!-- + +Powered by Typecho, +Theme Miracles by + _____ _ _ +| ____| | |_ _ __ __ _ ___ +| _| | | __| '__/ _` |/ __| +| |___| | |_| | | (_| | (__ +|_____|_|\__|_| \__,_|\___| + +Repo: https://github.com/BigCoke233/miracles + +--> diff --git a/includes/head.php b/includes/head.php new file mode 100644 index 0000000..91af310 --- /dev/null +++ b/includes/head.php @@ -0,0 +1,67 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +if($GLOBALS['miraclesIfCompressHTML']=='on') ob_start(); //ob 截取开始 ?> +<!DOCTYPE HTML> +<html<?php if($this->options->grayTheme && $this->options->grayTheme=1): ?> class="html-filter-gray"<?php endif; ?>> + <head> + <meta charset="<?php $this->options->charset(); ?>"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="renderer" content="webkit"> + <meta name="HandheldFriendly" content="true"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> + <?php + $banner = ''; + $description = ''; + if($this->is('post') || $this->is('page')){ + if(isset($this->fields->excerpt)) + $description = $this->fields->excerpt; + }else{ + $description = Helper::options()->description; + }?> + <title><?php Contents::title($this); ?></title> + <meta itemprop="name" content="<?php Contents::title($this); ?>"/> + <meta itemprop="image" content="<?php Utils::indexTheme('favicon.ico'); ?>" /> + <meta name="author" content="<?php $this->author(); ?>" /> + <meta name="description" content="<?php if($description != '') echo $description; else $this->excerpt(50); ?>" /> + <meta property="og:title" content="<?php Contents::title($this); ?>" /> + <meta property="og:description" content="<?php if($description != '') echo $description; else $this->excerpt(50); ?>" /> + <meta property="og:site_name" content="<?php Helper::options()->title(); ?>" /> + <meta property="og:type" content="<?php if($this->is('post') || $this->is('page')) echo 'article'; else echo 'website'; ?>" /> + <meta property="og:url" content="<?php $this->permalink(); ?>" /> + <meta property="og:image" content="<?php echo $banner; ?>" /> + <meta property="article:published_time" content="<?php echo date('c', $this->created); ?>" /> + <meta property="article:modified_time" content="<?php echo date('c', $this->modified); ?>" /> + <meta name="twitter:title" content="<?php Contents::title($this); ?>" /> + <meta name="twitter:description" content="<?php if($description != '') echo $description; else $this->excerpt(50); ?>" /> + <meta name="twitter:card" content="summary" /> + <meta name="twitter:image" content="<?php if($this->is('post') || $this->is('page')){$this->fields->banner();} + else{ + if(empty($this->options->bannerUrl)): + echo Utils::indexTheme('favicon.ico'); + else: + $this->options->bannerUrl(); + endif;}?>" /> + <link rel="icon" id="icon" type="image/png" href="<?php if($this->options->favicon):$this->options->favicon();else:echo Utils::indexTheme('favicon.ico');endif; ?>" /> + <?php $this->header('generator=&pingback=&xmlrpc=&wlw=&commentReply=&description=&antiSpam='); ?> + <?php $this->options->headerEcho(); ?> + <!-- css --> + <?php + $css_files=array("codestyle","owo.min","nprogress","gazeimg","hint.min","main/miracles.min","alertify"); + if($this->options->customCDN): $custom=$this->options->customCDN; else: $custom=Helper::options()->themeUrl("","Miracles"); endif; + Utils::addRequires($css_files,"css",$this->options->CDN,$custom); + ?> + <!-- icon font --> + <link rel="stylesheet" href="//at.alicdn.com/t/font_1165190_1djdjjwge4m.css" /><?php + if($GLOBALS['miraclesFontCDN']['if']=='on'): + if($GLOBALS['miraclesFontCDN']['cdn']=='google_font'): + $theme_font_url = "https://fonts.googleapis.com/css?family=Noto+Sans+SC:300|Noto+Serif+SC&display=swap"; + elseif($GLOBALS['miraclesFontCDN']['cdn']=='font_lolinet'): + $theme_font_url = "https://fonts.loli.net/css?family=Noto+Sans+SC:300|Noto+Serif+SC&display=swap"; + else: + $theme_font_url = $GLOBALS['miraclesFontCDN']['cdn']; + endif; ?> + <!-- Font CDN --> + <link href="<?php echo $theme_font_url; ?>" rel="stylesheet"> + <?php endif; ?><style>.body-dark .pio-action .pio-home{background-image: url(<?php Utils::indexTheme('images/icons/home.png'); ?>);}.body-dark .pio-action .pio-close{background-image: url(<?php Utils::indexTheme('images/icons/remove.png'); ?>);}.body-dark .pio-action .pio-skin{background-image: url(<?php Utils::indexTheme('images/icons/skin.png'); ?>);}.body-dark .pio-action .pio-info{background-image: url(<?php Utils::indexTheme('images/icons/info.png'); ?>);}.body-dark .pio-action .pio-night{background-image: url(<?php Utils::indexTheme('images/icons/night.png'); ?>);}@media (min-width:992px) {.search{background-image:url(<?php Utils::indexTheme('images/search.png'); ?>);}.login{background-image:url(<?php Utils::indexTheme('images/login.png'); ?>)}}.search {background-position: bottom right;background-repeat: no-repeat}.login {background-position: bottom left;background-repeat:no-repeat} + .comment-by-author > .comment-body-inner > .comment-main > .comment-meta > .comment-date:before {content: '<?php gtecho('commentListTexts','byAuthor'); ?>'!important}<?php $this->options->cssEcho(); ?></style> + </head> + <body class="<?php if($this->options->bodyFonts && $this->options->bodyFonts=1): ?>body-serif<?php endif; ?>">
\ No newline at end of file diff --git a/includes/header.php b/includes/header.php new file mode 100644 index 0000000..a35fdc9 --- /dev/null +++ b/includes/header.php @@ -0,0 +1,184 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?> + <?php if($this->options->navStyle==1): ?><div class="mask" id="full-mask"></div><?php endif; ?> + <!-- 搜索 --> + <div class="search ready"> + <button class="search-close ready" id="search-close-button"><i class="iconfont icon-x"></i></button> + <form method="post" action=""> + <div class="search-form"> + <input type="text" name="s" class="text" size="32" /> + <button type="submit" class="submit"><i class="iconfont" style="font-size:30px"></i></button> + </div> + </form> + </div> + <!-- 登录面板 --> + <div class="login ready"> + <button class="login-close ready" id="login-close"><i class="iconfont icon-x"></i></button> + <?php if($this->user->hasLogin()): ?> + <h1><?php gtecho('headerTexts','loginAlready'); ?></h1> + <p class="large-screen" style="margin-top:0"> <?php gtaecho('headerTexts','loginAlreadyInfo',$this->user->screenName); ?></p> + <p class="login-enter-admin"><a href="/admin" class="col-md-3"><?php gtecho('headerTexts','loginAdminEntrance');?></a></p> + <?php else: ?> + <form action="<?php $this->options->loginAction(); ?>" id="login-form" method="post" name="login" role="form" class="login-form"> + <h1><?php gtecho('headerTexts','loginTitle');?></h1> + <input type="text" name="name" autocomplete="username" placeholder="<?php gtecho('headerTexts','loginUsername');?>" required /> + <input type="password" name="password" autocomplete="current-password" placeholder="<?php gtecho('headerTexts','loginPassword');?>" required /> + <input type="hidden" name="referer" value="<?php + if($this->is('index')) $this->options->siteUrl(); + else $this->permalink(); + ?>"> + <button class="btn btn-normal" type="submit"><?php gtecho('headerTexts','loginSubmit');?></button> + </form> + <?php endif; ?> + </div> + + <!-- Nav Starts --> + <?php if($this->options->navStyle==0): ?> + <!-- 移动端导航面板 --> + <div class="mobile-menu ready"> + <button class="mobile-menu-close ready" id="toggle-mobile-menu-close"><i class="iconfont icon-x"></i></button> + <h2 class="mobile-menu-title"><?php gtecho('headerTexts','navTitle'); ?></h2> + <div class="mobile-menu-pagelist" role="navigation"><div class="container-fluid"><div class="row"> + <?php + if($this->options->customNav=='') { + $this->widget('Widget_Contents_Page_List') + ->parse('<div class="col-6"><a href="{permalink}">{title}</a></div>'); + } + else { + echo Contents::parseNav($this->options->customNav, "mobile"); + }?> + </div></div></div> + <div class="mobile-menu-footer"> + <p>© <?php echo date('Y'); ?> <a href="<?php $this->options->SiteUrl(); ?>"><?php $this->options->title(); ?></a> | Theme <a href="https://github.com/BigCoke233/miracles">Miracles</a></p> + </div> + </div> + + <!-- -小屏幕导航 --> + <nav class="small-screen nav nav-mobile nav-fixed"<?php if($this->options->navStyle==1): ?> style="display:none!important"<?php endif; ?> id="navBarMobile"> + <div class="nav-mobile-content" role="navigation"> + <a href="<?php $this->options->SiteUrl(); ?>" style="float:left"><i class="iconfont icon-xuanzhongshangcheng"></i></a> + <?php if(!$this->options->customNavIcon)://如果没有自定义图标 ?> + <a id="search-open-mobile" style="float:left"><i class="iconfont icon-chaxun"></i></a> + <a id="login-open-mobile" style="float:left"><i class="iconfont icon-user"></i></a> + <a id="toggle-dark-mobile" style="float:left"><i class="iconfont icon-sun"></i></a> + <?php else://如果有自定义图标 + echo Contents::parseNavIcon($this->options->customNavIcon, "mobile"); + endif; ?> + <a id="toggle-mobile-menu-button" style="float:right">MENU <i class="iconfont icon-list"></i></a> + </div> + </nav> + <?php endif; ?> + + <!-- 导航 --> + <?php if($this->options->navStyle==0): ?> + <!-- -大屏幕导航 --> + <nav class="large-screen nav nav-fixed" id="navBar"> + <div class="container"> + <p class="nav-content" role="navigation"> + <a href="<?php $this->options->SiteUrl(); ?>" class="nav-title"><?php $this->options->title(); ?></a> + <span class="nav-content-item"> + <?php + if($this->options->customNav=='') { + $this->widget('Widget_Contents_Page_List') + ->parse('<a href="{permalink}">{title}</a>'); + } + else { + echo Contents::parseNav($this->options->customNav, "top-nav"); + }?> + </span> + </p> + <?php if(!$this->options->customNavIcon)://如果没有自定义图标 ?> + <button class="nav-icon-button search-button" id="search-open-button"><i class="iconfont icon-chaxun"></i></button> + <button class="nav-icon-button login-button" id="login-open"><i class="iconfont icon-user"></i></button> + <button class="nav-icon-button setting-button" id="toggle-dark-button"><i class="iconfont icon-sun"></i></button> + <?php else://如果有自定义图标 + echo Contents::parseNavIcon($this->options->customNavIcon, "top-nav"); + endif; ?> + </div> + </nav> + <?php elseif($this->options->navStyle==1): ?> + <!-- 抽屉栏 --> + <nav class="drawer"><div class="drawer-relative"> + <div class="drawer-main"> + <button class="drawer-button" id="drawer-button"><i class="iconfont icon-list"></i></button> + <div class="drawer-header"> + <div class="drawer-avatar"> + <?php if($this->options->avatar==''): echo $this->author->gravatar(500); + else: ?><img src="<?php $this->options->avatar(); ?>"><?php endif; ?> + </div> + </div> + <div class="drawer-content"> + <a href="<?php $this->options->SiteUrl(); ?>" onclick="toggleDrawer()"><?php gtecho('headerTexts','drawerHome'); ?></a> + <?php + if($this->options->customNav=='') { + $this->widget('Widget_Contents_Page_List') + ->parse('<a href="{permalink}" onclick="toggleDrawer()">{title}</a>'); + } + else { + echo Contents::parseNav($this->options->customNav, "drawer"); + }?> + </div> + </div> + <div class="drawer-footer"> + <?php if(!$this->options->customNavIcon)://如果没有自定义图标 ?> + <button class="drawer-icon" id="search-open-button"><i class="iconfont icon-chaxun"></i></button> + <button class="drawer-icon" id="login-open"><i class="iconfont icon-user"></i></button> + <button class="drawer-icon" id="toggle-dark-button"><i class="iconfont icon-sun"></i></button> + <?php else://如果有自定义图标 + echo Contents::parseNavIcon($this->options->customNavIcon, "drawer"); + endif; ?> + </div> + </div></nav> + <?php endif;?> + <!-- /Nac Ends --> + + <!-- pjax-container Starts --> + <div id="pjax-container"> + <header> + <!-- Banner --> + <?php if($this->is('post') || $this->is('page')): ?> + <div role="banner" class="index-banner" style="<?php if($this->fields->banner && $this->fields->banner=!''): ?>background:url('<?php $this->fields->banner(); ?>') no-repeat;<?php else: ?>background-color:#f1f1f1;<?php endif; ?>height:<?php $this->options->bannerHeight(); ?>vh;background-size:cover;background-position:center;"> + <?php elseif($this->is('archive')): ?> + <div role="banner" class="index-banner" style="height:<?php $this->options->bannerHeight(); ?>vh;<?php if($this->options->bannerUrl!=''): echo $this->options->bannerUrl(); endif; ?>"> + <?php else: ?> + <div role="banner" class="index-banner" style="background:url('<?php $this->options->bannerUrl(); ?>') no-repeat;height:<?php $this->options->bannerHeight(); ?>vh;background-size:cover;background-position:center;"> + <?php endif; ?> + <!-- 遮罩 --> + <div class="banner-mask"<?php if($this->is('post') || $this->is('page')):?><?php if($this->fields->banner==''):?> style="background:rgba(0,0,0,0)!important"<?php endif;?><?php endif; ?><?php if($this->is('index')):?><?php if($this->options->bannerUrl && $this->options->bannerUrl=!''): ?><?php else:?> style="background:rgba(0,0,0,0)!important"<?php endif;?><?php endif;?>> + <div class="main-container container"> + <div class="banner-content<?php if($this->is('index') && $this->options->bannerFont==1): ?> banner-font-black<?php endif; ?><?php if($this->is('page') || $this->is('post')): if($this->fields->banner==''): ?> banner-font-black<?php endif; endif; ?>" id="banner-content"> + <?php if($this->is('index')): ?> + <h1><?php $this->options->bannerTitle(); ?></h1> + <p><?php $this->options->bannerIntro(); ?></p> + <?php elseif($this->is('post') || $this->is('page')): ?> + <h1><?php $this->title(); ?></h1> + <div class="header-meta"> + <?php if($this->fields->meta==''): + if(!$_SESSION["isPageArchive"]){ ?> + <div class="header-meta-line-one"> + <?php if($this->is('post')): ?><span class="hint--bottom" data-tooltip="<?php gtaecho('postTexts','sort_title',$this->category) ?>"><i class="iconfont"></i> <?php $this->category(','); ?></span> <?php endif; ?> + <?php if($this->fields->commentShow=='0'):?><span class="hint--bottom" data-tooltip="<?php if($this->commentsNum=='0'): gtecho('commentListTexts', 'commentNumNone'); else:gtaecho('commentListTexts', 'commentNum', $this->commentsNum);endif; ?>"><i class="iconfont"></i> <?php $this->commentsNum('0', '1', '%d'); ?></span> <?php endif;?> + </div> + <div class="header-meta-line-two"> + <span class="hint--bottom" data-tooltip="<?php gtaecho('postTexts', 'post_time', date('Y-m-d',$this->created)); ?>"><i class="iconfont"></i> <?php $this->date(); ?></span>  + <span class="hint--bottom" data-tooltip="<?php gtaecho('postTexts', 'post_views', Contents::postViews($this)) ?>"><i class="iconfont"></i> <?php echo Contents::postViews($this) ?></span> + </div> + <?php }else{ ?> + <div class="header-meta-line-one"> + <i class="iconfont"></i> <?php gtaecho('archivePageTexts', 'archiveStart', Contents::getOldestPostDate());?>  + </div> + <div class="header-meta-line-two"> + <span class="hint--bottom" data-tooltip="<?php gtaecho('postTexts', 'post_views', Contents::postViews($this)) ?>"><i class="iconfont"></i> <?php echo Contents::postViews($this) ?></span> + </div> + <?php } + else: ?> + <?php $this->fields->meta(); ?><div style="display:none"><?php Contents::postViews($this) ?></div> + <?php endif; + $_SESSION["isPageArchive"]=false; //clear ?> + </div> + <?php elseif($this->is('archive')): ?> + <h1><?php $this->archiveTitle($GLOBALS['archivesTitles'], '', '');?></h1><?php else: endif; ?> + </div> + </div> + </div> + </div> + </header> diff --git a/index.php b/index.php new file mode 100644 index 0000000..f811747 --- /dev/null +++ b/index.php @@ -0,0 +1,55 @@ +<?php +/** + * Born to be the Miracles. 生为奇迹 + * 作者:<a href="https://guhub.cn">Eltrac</a> | 帮助文档:<a href="https://github.com/BigCoke233/miracles/blob/master/docs/wiki.md">Wiki</a> + * + * @package Miracles + * @author Eltrac + * @version 1.5.5 + * @link https://guhub.cn + */ +if (!defined('__TYPECHO_ROOT_DIR__')) exit; +$this->need('includes/head.php'); +$this->need('includes/header.php'); +?> + <main class="main-container container" role="main"> + <div class="post-list"><!-- 文章循环开始 --> + <?php while($this->next()): ?> + <br /> + <!-- 文章卡片 --> + <div class="post-item" role="article"> + <div class="container-fluid"><div class="row"> + <div class="col-md-6 post-banner-box"> + <a href="<?php $this->permalink(); ?>" class="post-link"> + <div class="post-banner"> + <img src="<?php echo Utils::addLoadingImages($this->options->CDN, $this->options->loading_image, 'normal'); ?>" data-gisrc="<?php Utils::postBanner($this); ?>"> + </div> + </a> + </div> + <div class="col-md-6 post-item-content"> + <a href="<?php $this->permalink(); ?>" class="post-link" title="<?php $this->title(); ?>"> + <h1 class="post-title"><?php $this->sticky(); ?><?php $this->title(); ?></h1> + </a> + <p class="post-excerpt"> + <?php if($this->fields->excerpt && $this->fields->excerpt!='') { + echo $this->fields->excerpt; + }else{ + echo $this->excerpt(130); + } + ?> + </p> + <p class="post-meta"><i class="iconfont icon-block"></i> <?php $this->category(','); ?> <i class="iconfont icon-comments"></i> <?php $this->commentsNum('0', '1', '%d'); ?> <i class="iconfont icon-clock"></i> <?php $this->date(); ?></p> + <p class="post-button-box large-screen"><a href="<?php $this->permalink(); ?>" class="button post-button"><?php gtecho('postTexts','read_more'); ?></a></p> + </div> + </div></div> + </div> + <br /> + <?php endwhile; ?> + <!-- 文章分页 --> + <div class="post-pagenav"> + <span class="post-pagenav-left"><?php $this->pageLink('<i class="iconfont icon-chevron-left"></i>'); ?></span> + <span class="post-pagenav-right"><?php $this->pageLink('<i class="iconfont icon-chevron-right"></i>','next'); ?></span> + </div> + <!-- 文章循环结束 --></div> + </main> +<?php $this->need('includes/footer.php'); ?> diff --git a/libs/Comments.php b/libs/Comments.php new file mode 100644 index 0000000..1e4cb7e --- /dev/null +++ b/libs/Comments.php @@ -0,0 +1,51 @@ +<?php +/** + * Comments.php + * 评论处理 + * + * Author: Eltrac(BigCoke233) + * License: MIT + */ +if (!defined('__TYPECHO_ROOT_DIR__')) exit; +class Comments +{ + /** + * 评论反垃圾 + * from ohmyga233/castle-Typecho-Theme + * + * @access public + */ + public static function AntiSpam($id, $value) { + echo '<!--<nocompress>-->'; + echo '<script>(function(){var a=document.addEventListener?{add:"addEventListener",focus:"focus",load:"DOMContentLoaded"}:{add:"attachEvent",focus:"onfocus",load:"onload"};var c,d,e,f,b=document.getElementById("'.$id.'");null!=b&&(c=b.getElementsByTagName("form"),c.length>0&&(d=c[0],e=d.getElementsByTagName("textarea")[0],f=!1,null!=e&&"text"==e.name&&e[a.add](a.focus,function(){if(!f){var a=document.createElement("input");a.type="hidden",a.name="_",d.appendChild(a),f=!0,a.value='.$value.'}})))})();</script>'; + echo '<!--</nocompress>-->'; + } + + /** + * 获取上级评论人 + */ + public static function getCommentHF($coid){ + $db = Typecho_Db::get(); + $prow = $db->fetchRow($db->select('parent') + ->from('table.comments') + ->where('coid = ? AND status = ?', $coid, 'approved')); + $parent = $prow['parent']; + if ($parent != "0") { + $arow = $db->fetchRow($db->select('text','author','status') + ->from('table.comments') + ->where('coid = ?', $parent)); + $author = $arow['author']; + $status = $arow['status']; + if($author){ + if($status=='approved'){ + $href = '<a class="at" uid="'.$parent.'" href="#li-comment-'.$parent.'">@'.$author.'</a>';; + }else if($status=='waiting'){ + $href = '<a>评论审核中···</a>'; + } + } + echo $href; + } else { + echo ""; + } + } +} diff --git a/libs/Contents.php b/libs/Contents.php new file mode 100644 index 0000000..b1b8db9 --- /dev/null +++ b/libs/Contents.php @@ -0,0 +1,448 @@ +<?php +/** + * Contents.php + * 内容处理 + * + * Author: Eltrac(BigCoke233) + * License: MIT + * Notice: Parts of codes are from AlanDecode/Typecho-Theme-VOID + */ + +if (!defined('__TYPECHO_ROOT_DIR__')) exit; +class Contents +{ + /* == 解析文章内容 == */ + + /** + * 内容解析器入口 + * 传入的是经过 Markdown 解析后的文本 + */ + static public function parseContent($data, $widget, $last){ + $db=Typecho_Db::get(); + $load_image = $db->fetchAll($db->select('value')->from('table.options')->where('name = %s', "theme:Miracles")->limit(1)); + $load_image = explode("\";",explode("\"",explode("\"loading_image\";",$load_image[0]["value"],2)[1],2)[1],2)[0]; + $text = empty($last) ? $data : $last; + if ($widget instanceof Widget_Archive) { + //ParseOther + $text = Contents::parseDetails(Contents::parsePicShadow(Contents::parseNotice(Contents::parseKbd(Contents::parseCode(Contents::parseImages(Contents::parseHeadings(Contents::parseTextColor(Contents::parseRuby(Contents::parseTip($text)))))))))); + //LazyLoad + $text = preg_replace('/<img (.*?)src(.*?)(\/)?>/','<img $1src="'.Utils::addLoadingImages($GLOBALS['miraclesOptions_CDN'], $GLOBALS['miraclesOptions_loading_image'], 'normal').'" data-gisrc$2 data-gazeimg />',$text); + //owo + $text = Contents::parseEmo($text); + //Links + $text = Contents::parseLink($text); + //toc + $text = preg_replace('/{:toc:}/s', '<div class="toc-box">'.Contents::tableOfContents($text).'</div>', $text); + } + return $text; + } + + /** + * 解析图片 + */ + static public function parseImages($text){ + //FancyBox & 图题 + $text = preg_replace('/<img(.*?)src="(.*?)"(.*?)alt="(.*?)"(.*?)>/s','<center><img${1}src="${2}"${3}><span class="post-img-alt">${4}</span></center>',$text); + + return $text; + } + + /** + * 解析 Text-Color + */ + static public function parseTextColor($text){ + $text = preg_replace('/\&\{(.*?)\|(.*?)\|(.*?)\}/s','<span style="color:${2};background:${3}">${1}</span>',$text); + return $text; + } + + /** + * 解析 Ruby + */ + static public function parseRuby($text){ + $reg = '/\{\{(.*?):(.*?)\}\}/s'; + $rp = '<ruby>${1}<rp>(</rp><rt>${2}</rt><rp>)</rp></ruby>'; + $text = preg_replace($reg,$rp,$text); + + return $text; + } + + /** + * 解析 Tip + */ + static public function parseTip($text){ + //Tip without var + $text = preg_replace('/\[tip\](.*?)\[\/tip\]/s','<div class="tip"><div class="container-fluid"><div class="row"><div class="col-1 tip-icon"><i class="iconfont icon-info"></i></div><div class="col-11 tip-content">${1}</div></div></div></div>',$text); + //Tip + $text = preg_replace('/\[tip type="(.*?)"\](.*?)\[\/tip\]/s','<div class="tip ${1}"><div class="container-fluid"><div class="row"><div class="col-1 tip-icon"><i class="iconfont icon-info"></i></div><div class="col-11 tip-content">${2}</div></div></div></div>',$text); + //Tip Group + $text = preg_replace('/\[tip\-group\](.*?)\[\/tip\-group\]/s','<div class="tip-group">${1}</div>',$text); + + return $text; + } + + /** + * 解析 Notice + */ + static public function parseNotice($text){ + $text = preg_replace('/\[notice\](.*?)\[\/notice\]/s','<div class="notice" role="note">${1}</div>',$text); + return $text; + } + + /** + * 图片加阴影 + */ + static public function parsePicShadow($text){ + $text = preg_replace('/\[shadow\](.*?)\[\/shadow\]/s','<div class="post-img-shadow">${1}</div>',$text); + return $text; + } + + /** + * 解析友链 + */ + static public function parseLink($text) + { + //解析友链盒子 + $reg = '/\[links\](.*?)\[\/links\]/s'; + $rp = '<div class="links-box container-fluid"><div class="row">${1}</div></div>'; + $text = preg_replace($reg, $rp, $text); + //解析友链项目 + $reg = '/\[(.*?)\]\{(.*?)\}\((.*?)\)\+\((.*?)\)/s'; + $rp = '<div class="col-lg-2 col-6 col-md-3 links-container"> + <a href="${2}" title="${4}" target="_blank" class="links-link"> + <div class="links-item"> + <div class="links-img"><img src="'.Utils::addLoadingImages($GLOBALS['miraclesOptions_CDN'], $GLOBALS['miraclesOptions_loading_image'], 'link').'" data-gisrc=\'${3}\'></div> + <div class="links-title"> + <h4>${1}</h4> + </div> + </div> + </a> + </div>'; + $text = preg_replace($reg, $rp, $text); + //解析外部友链 + $reg = '/\[links data="(.*?)"\]/'; + $dataLink = preg_match_all($reg, $text, $matches); + if (!$dataLink) return $text; //普通文章别匹配! + $http = Typecho_Http_Client::get(); + if (false == $http) { + $text = str_replace($matches[0][0], '<br>对不起, 您的主机不支持 php-curl 扩展而且没有打开 allow_url_fopen 功能, 无法正常使 json 友链功能', $text); + return $text; + } + for ($j = 0; $j <= $dataLink; $j++) { + $match = $matches[1][$j]; + try { + $result = $http->send($match); + } catch (Typecho_Http_Client_Exception $ex) { + $text = str_replace($matches[0][$j], '对不起,json外链请求失败! 错误信息:' . $ex->getMessage(), $text); + continue; + } + $data = json_decode($result, true); + if ($data == false) {//没获取到数据就别走了!赶紧返回免得搞出事情 + $text = str_replace($matches[0][$j], '对不起,json外链解析失败!', $text); + continue; + } + $linkItemNum = count($data); + $linksList = '';//先Define一下,IDE在报错QAQ + for ($i = 0; $i < $linkItemNum; $i++) { + $name = $data[$i]['name']; + $link = $data[$i]['link']; + $avatar = $data[$i]['avatar']; + $des = $data[$i]['des']; + //嵌入列表 + $linksList .= '<div class="col-lg-2 col-6 col-md-3 links-container"> + <a href="' . $link . '" title="' . $des . '" target="_blank" class="links-link"> + <div class="links-item"> + <div class="links-img"><img src="/usr/themes/Miracles/images/loading/avatar.jpg" data-gisrc=\''.$avatar.'\'></div> + <div class="links-title"> + <h4>' . $name . '</h4> + </div> + </div> + </a> + </div>'; + } + $text = str_replace($matches[0][$j], '<div class="links-box container-fluid"><div class="row">' . $linksList . '</div></div>', $text); + } + return $text; + } + + /** + * 解析 owo 表情 + */ + static public function parseEmo($content) { + $content = preg_replace_callback('/\:\:\(\s*(呵呵|哈哈|吐舌|太开心|笑眼|花心|小乖|乖|捂嘴笑|滑稽|你懂的|不高兴|怒|汗|黑线|泪|真棒|喷|惊哭|阴险|鄙视|酷|啊|狂汗|what|疑问|酸爽|呀咩爹|委屈|惊讶|睡觉|笑尿|挖鼻|吐|犀利|小红脸|懒得理|勉强|爱心|心碎|玫瑰|礼物|彩虹|太阳|星星月亮|钱币|茶杯|蛋糕|大拇指|胜利|haha|OK|沙发|手纸|香蕉|便便|药丸|红领巾|蜡烛|音乐|灯泡|开心|钱|咦|呼|冷|生气|弱|吐血)\s*\)/is', + array('Contents', 'parsePaopaoBiaoqingCallback'), $content); + $content = preg_replace_callback('/\:\@\(\s*(高兴|小怒|脸红|内伤|装大款|赞一个|害羞|汗|吐血倒地|深思|不高兴|无语|亲亲|口水|尴尬|中指|想一想|哭泣|便便|献花|皱眉|傻笑|狂汗|吐|喷水|看不见|鼓掌|阴暗|长草|献黄瓜|邪恶|期待|得意|吐舌|喷血|无所谓|观察|暗地观察|肿包|中枪|大囧|呲牙|抠鼻|不说话|咽气|欢呼|锁眉|蜡烛|坐等|击掌|惊喜|喜极而泣|抽烟|不出所料|愤怒|无奈|黑线|投降|看热闹|扇耳光|小眼睛|中刀)\s*\)/is', + array('Contents', 'parseAruBiaoqingCallback'), $content); + $content = preg_replace_callback('/\:\&\(\s*(.*?)\s*\)/is', + array('Contents', 'parseTweBiaoqingCallback'), $content); + + return $content; + } + + /** + * 泡泡表情回调函数 + * + * @return string + */ + private static function parsePaopaoBiaoqingCallback($match) + { + return '<img class="owo-img" src="'.Utils::addLoadingImages($GLOBALS['miraclesOptions_CDN'], $GLOBALS['miraclesOptions_loading_image'], 'owo').'" data-gisrc="/usr/themes/Miracles/images/biaoqing/paopao/'. str_replace('%', '', urlencode($match[1])) . '_2x.png">'; + } + + /** + * 阿鲁表情回调函数 + * + * @return string + */ + private static function parseAruBiaoqingCallback($match) + { + return '<img class="owo-img" src="'.Utils::addLoadingImages($GLOBALS['miraclesOptions_CDN'], $GLOBALS['miraclesOptions_loading_image'], 'owo').'" data-gisrc="/usr/themes/Miracles/images/biaoqing/aru/'. str_replace('%', '', urlencode($match[1])) . '_2x.png">'; + } + + /** + * 推特表情回调函数 + * + * @return string + */ + private static function parseTweBiaoqingCallback($match) + { + return '<img class="owo-img" src="'.Utils::addLoadingImages($GLOBALS['miraclesOptions_CDN'], $GLOBALS['miraclesOptions_loading_image'], 'owo').'" data-gisrc="/usr/themes/Miracles/images/biaoqing/twemoji/'. str_replace('%', '', $match[1]) . '.png">'; + } + + /** + * 解析代码块 + */ + static public function parseCode($text) { + $text = preg_replace('/<pre><code>/s','<pre><code class="language-html">',$text); + return $text; + } + + /** + * 解析键盘按键 + */ + static public function parseKbd($text) { + $text = preg_replace('/\[\[(.*?)\]\]/s','<kbd>${1}</kbd>',$text); + return $text; + } + + /** + * 解析 <details> + */ + static public function parseDetails($text) { + $text = preg_replace('/\[details sum="(.*?)"\](.*?)\[\/details\]/s','<details><summary>${1}</summary>${2}</details>',$text); + return $text; + } + + /* == 文章目录 == */ + + /** + * 解析章节链接 + */ + static public function parseHeadings($text){ + $reg='/\<h([2-3])(.*?)\>(.*?)\<\/h.*?\>/s'; + $text = preg_replace_callback($reg, array('Contents', 'parseHeaderCallback'), $text); + + return $text; + } + + /** + * 为内容中的标题编号 + */ + static private $CurrentTocID = 0; + static public function parseHeaderCallback($matchs) + { + $id = trim($matchs[3]); + return '<h'.$matchs[1].$matchs[2].' id="'.$id.'">'.$matchs[3].'<a href="#'.$id.'" title="'.$GLOBALS['postTexts']['post_anchor'].'" class="post-toc-link no-line"><i class="iconfont icon-paragraph"></i></a></h'.$matchs[1].'>'; + } + + /** + * 文章目录 + */ + public static function tableOfContents($html) { + $pattern = '/<h([2-5]) id=["\'](.*?)["\'].*?>(.*?)<\/h\1>/'; + preg_match_all($pattern, $html, $matches, PREG_SET_ORDER); + $output = ""; + foreach ($matches as $item) { + $output .= ' + <li class="toc-level-' . $item[1] . '"> + <a href="#' . $item[2] . '">' . $item[3] . '</a> + </li>'; + } + return (!empty($output)) ? + "<ul class='toc'>" . $output . "</ul>" : + ""; + } + + /* == 其他内容 == */ + + /** + * 解析自定义导航栏 + */ + static public function parseNav($data, $type) { + $de_json = json_decode($data, true); + $count_json = count($de_json); + for ($i = 0; $i < $count_json; $i++) { + $title = $de_json[$i]['title']; + $link = $de_json[$i]['link']; + //输出导航 + if($type=="top-nav") { + echo '<a href="'. $link .'">'. $title .'</a>'; + } + elseif($type=="mobile") { + echo '<div class="col-6"><a href="'. $link .'">'. $title .'</a></div>'; + } + elseif($type=="drawer") { + echo '<a href="'. $link .'" onclick="toggleDrawer()">'. $title .'</a>'; + } + } + } + + static public function parseNavIcon($data, $type) { + $de_json = json_decode($data, true); + $count_json = count($de_json); + for ($i = 0; $i < $count_json; $i++) { + $icon = $de_json[$i]['icon']; + $link = $de_json[$i]['link']; + $action = $de_json[$i]['action']; + //定义 class + if($type=="top-nav"){ + $class = 'nav-icon-button'; + } + elseif($type=="drawer"){ + $class = 'drawer-icon'; + } + elseif($type=="mobile"){ + $class = 'nav-mobile-icon'; + } + else{ + $class= 'unknown'; + } + if($de_json[$i]['class']) $class.= ' '.$de_json[$i]['class'];//自定义 class + //计算 right 距离 + $right_more=$i*45; + $right=20+$right_more; + //添加 $other + if($type=="top-nav") $other=' style="right: '.$right.'px"'; + //输出导航图标按钮 + if($type=="top-nav"||$type=="drawer"){ + if(!$action): echo '<a href="'.$link.'" class="'.$class.'"'.$other.'><i class="iconfont icon-'.$icon.'"></i></a>'; + else: echo '<button class="'.$class.'" onclick="'.$action.'"'.$other.'><i class="iconfont icon-'.$icon.'"></i></button>'; + endif; + } + elseif($type=="mobile"){ + if(!$action): echo '<a style="float:left" href="'.$link.'"'.$other.'><i class="iconfont icon-'.$icon.'"></i></a>'; + else: echo '<a style="float:left" onclick="'.$action.'"'.$other.'><i class="iconfont icon-'.$icon.'"></i></a>'; + endif; + } + } + } + + /** + * 根据 id 返回对应的对象 + * 此方法在 Typecho 1.2 以上可以直接调用 Helper::widgetById(); + * 但是 1.1 版本尚有 bug,因此单独提出放在这里 + * + * @param string $table 表名, 支持 contents, comments, metas, users + * @return Widget_Abstract + */ + public static function widgetById($table, $pkId) { + $table = ucfirst($table); + if (!in_array($table, array('Contents', 'Comments', 'Metas', 'Users'))) { + return NULL; + } + $keys = array( + 'Contents' => 'cid', + 'Comments' => 'coid', + 'Metas' => 'mid', + 'Users' => 'uid' + ); + $className = "Widget_Abstract_{$table}"; + $key = $keys[$table]; + $db = Typecho_Db::get(); + $widget = new $className(Typecho_Request::getInstance(), Typecho_Widget_Helper_Empty::getInstance()); + + $db->fetchRow( + $widget->select()->where("{$key} = ?", $pkId)->limit(1), + array($widget, 'push')); + return $widget; + } + + /** + * 输出完备的标题 + */ + public static function title(Widget_Archive $archive) { + $archive->archiveTitle(array( + 'category' => '分类 %s 下的文章', + 'search' => '包含关键字 %s 的文章', + 'tag' => '标签 %s 下的文章', + 'author' => '%s 发布的文章' + ), '', ' - '); + Helper::options()->title(); + } + + /** + * 内容归档 + */ + public static function archives($widget) { + $db = Typecho_Db::get(); + $rows = $db->fetchAll($db->select() + ->from('table.contents') + ->order('table.contents.created', Typecho_Db::SORT_DESC) + ->where('table.contents.type = ?', 'post') + ->where('table.contents.status = ?', 'publish')); + + $stat = array(); + foreach ($rows as $row) { + $row = $widget->filter($row); + $arr = array( + 'title' => $row['title'], + 'permalink' => $row['permalink'] + ); + $stat[date('Y', $row['created'])][$row['created']] = $arr; + } + return $stat; + } + + /** + * 统计文章浏览数 + * from:http://docs.qqdie.com/ + */ + public static function postViews($archive) { + $cid = $archive->cid; + $db = Typecho_Db::get(); + $prefix = $db->getPrefix(); + if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) { + $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;'); + echo 0; + return; + } + $row = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid)); + if ($archive->is('single')) { + $views = Typecho_Cookie::get('extend_contents_views'); + if(empty($views)){ + $views = array(); + }else{ + $views = explode(',', $views); + } + if(!in_array($cid,$views)){ + $db->query($db->update('table.contents')->rows(array('views' => (int) $row['views'] + 1))->where('cid = ?', $cid)); + array_push($views, $cid); + $views = implode(',', $views); + Typecho_Cookie::set('extend_contents_views', $views); //记录查看cookie + } + } + return $row['views']; + } + + /** + * 获取最早文章创建时间 + */ + public static function getOldestPostDate() { + $db = Typecho_Db::get(); + $content = $db->fetchRow($db->select()->from('table.contents') + ->where('table.contents.status = ?', 'publish') + ->where('table.contents.password IS NULL') + ->order('table.contents.created', Typecho_Db::SORT_ASC) + ->limit(1)); + return date('Y-m-d', $content['created']); + } +}
\ No newline at end of file diff --git a/libs/Language.php b/libs/Language.php new file mode 100644 index 0000000..d24ae77 --- /dev/null +++ b/libs/Language.php @@ -0,0 +1,41 @@ +<?php +if (!defined('__TYPECHO_ROOT_DIR__')) exit; + +/** + * Language.php + * 多语言 / 多語言 / Multi-Languages + * + * Author: Eltrac(BigCoke233) + * License: MIT + */ + +class Lang +{ + public static function getLang() { + $provided_lang = glob(Helper::options()->themeFile("lang/*.php")); + if(in_array($GLOBALS['miraclesLang'].'.php', $provided_lang)){ + require_once("lang/"+$GLOBALS['miraclesLang'].".php"); + $GLOBALS['miraclesLangError']=false; + }else{ + require_once("lang/zh-cn.php"); + $GLOBALS['miraclesLangError']=true; + } + } +} + +//快速获取对应语言文本 +function gt($a, $b) { + return $GLOBALS[$a][$b]; +} +function gtecho($a, $b) { + echo $GLOBALS[$a][$b]; +} +//有参数的文本获取 +function gta($a, $b, $c) { + $content = str_replace('%s', $c, $GLOBALS[$a][$b]); + return $content; +} +function gtaecho($a, $b, $c) { + $content = str_replace('%s', $c, $GLOBALS[$a][$b]); + echo $content; +}
\ No newline at end of file diff --git a/libs/Options.php b/libs/Options.php new file mode 100644 index 0000000..aaf6695 --- /dev/null +++ b/libs/Options.php @@ -0,0 +1,213 @@ +<?php +/** + * Options.php + * 主题后台设置 + * + * Author: Eltrac(BigCoke233) + * License: MIT + */ +function themeConfig($form) { + + /** + * 主题设置备份 + * From https://qqdie.com/archives/typecho-templates-backup-and-restore.html + */ + $str1 = explode('/themes/', Helper::options()->themeUrl); + $str2 = explode('/', $str1[1]); + $name=$str2[0]; + $db = Typecho_Db::get(); + $sjdq=$db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name)); + $ysj = $sjdq['value']; + if(isset($_POST['type'])){ + if($_POST["type"]=="备份模板设置数据"){ + if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){ + $update = $db->update('table.options')->rows(array('value'=>$ysj))->where('name = ?', 'theme:'.$name.'bf'); + $updateRows= $db->query($update); + }else{ + if($ysj){ + $insert = $db->insert('table.options') + ->rows(array('name' => 'theme:'.$name.'bf','user' => '0','value' => $ysj)); + $insertId = $db->query($insert); + } + } + } + if($_POST["type"]=="还原模板设置数据"){ + if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){ + $sjdub=$db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf')); + $bsj = $sjdub['value']; + $update = $db->update('table.options')->rows(array('value'=>$bsj))->where('name = ?', 'theme:'.$name); + $updateRows= $db->query($update); + } + } + if($_POST["type"]=="删除备份数据"){ + if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){ + $delete = $db->delete('table.options')->where ('name = ?', 'theme:'.$name.'bf'); + $deletedRows = $db->query($delete); + } + } + } + + /** + * 设置样式+面板 + */ + $ver = themeVersion(); + $themeDir = "/usr/themes/Miracles/"; + echo '<link rel="stylesheet" href="'.$themeDir.'assets/css/setting.miracles.css"> + <link href="https://fonts.googleapis.com/css?family=Noto+Sans+SC:300|Noto+Serif+SC:300&display=swap" rel="stylesheet"> + <script>var version = "'. $ver .'";</script> + <script src="'.$themeDir.'assets/js/jquery.js"></script> + <script src="'.$themeDir.'assets/js/update.miracles.js"></script>'; + echo '<div class="miracles-pannel"> + <h1>Miracles 主题设置面板</h1> + <p>欢迎使用 Miracles 主题,目前版本是:'. $ver .'<span id="miracles-update" class="waiting">,正在获取最新版本号......</span><br> + 作者博客:<a href="https://guhub.cn">Eltrac\'s</a> | + 帮助文档:<a href="https://www.notion.so/thememiracles/c7c631e21b3345caa2a09bd2fb5dd4b2">WIKI</a> | + 问题反馈:<a href="https://github.com/BigCoke233/miracles/issues">issues</a></p> + <form class="protected miracles-backup-div" action="?'.$name.'bf" method="post"> + <input type="submit" name="type" class="miracles-backup-button" value="备份模板设置数据" /> + <input type="submit" name="type" class="miracles-backup-button" value="还原模板设置数据" /> + <input type="submit" name="type" class="miracles-backup-button" value="删除备份数据" /> + </form>'; + if(isset($_POST['type'])){ + //备份数据提示 + if($_POST["type"]=="备份模板设置数据"){ + if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){ + echo '<div class="tongzhi col-mb-12 home">备份已更新,请等待自动刷新!如果等不到请点击'; + ?><a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div> + <script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 1500);</script><?php + }else{ + echo '<div class="tongzhi col-mb-12 home">备份完成,请等待自动刷新!如果等不到请点击'; + ?> <a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div> + <script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 1500);</script><?php + } + } + //还原数据提示 + if($_POST["type"]=="还原模板设置数据"){ + if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){ + echo '<div class="tongzhi col-mb-12 home">检测到模板备份数据,恢复完成,请等待自动刷新!如果等不到请点击'; + ?> <a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div> + <script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 1500);</script> + <?php + }else{ + echo '<div class="tongzhi col-mb-12 home">没有模板备份数据,恢复不了哦!</div>'; + } + } + //删除数据提示 + if($_POST["type"]=="删除备份数据"){ + if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){ + echo '<div class="tongzhi col-mb-12 home">删除成功,请等待自动刷新,如果等不到请点击'; + ?> + <a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div> + <script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 1500);</script> + <?php + }else{ + echo '<div class="tongzhi col-mb-12 home">备份已经被删除了</div>'; + ?><script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 1500);</script><?php + } + } + } + echo '<br></div>'; + + + /** + * 设置项 + */ + //Info + $bannerTitle = new Typecho_Widget_Helper_Form_Element_Text('bannerTitle', NULL, NULL, _t('<h2>站点信息 Information</h2>站点名称'), _t('输入你站点的名称,会显示在首页大图上')); + $form->addInput($bannerTitle); + $bannerIntro = new Typecho_Widget_Helper_Form_Element_Text('bannerIntro', NULL, NULL, _t('站点介绍'), _t('用一句话介绍你的站点,会显示在首页大图上')); + $form->addInput($bannerIntro); + $avatar = new Typecho_Widget_Helper_Form_Element_Text('avatar', NULL, NULL, _t('站长头像'), _t('输入一个图片 url 作为头像,若为空则调用 gravatar')); + $form->addInput($avatar); + $favicon = new Typecho_Widget_Helper_Form_Element_Text('favicon', NULL, NULL, _t('Favicon'), _t('输入一个图片 url 作为 Favicon,显示在浏览器标签页上,为空则调用主题目录下的 favicon.ico<hr>')); + $form->addInput($favicon); + + //nav + $navStyle = new Typecho_Widget_Helper_Form_Element_Select('navStyle',array('0'=>'顶部导航栏','1'=>'左侧抽屉栏'),'0','<h2>导航栏 Nav</h2>类型','选择导航栏的类型(若选择左侧抽屉蓝,则下一条设置失效)'); + $form->addInput($navStyle); + $navAero = new Typecho_Widget_Helper_Form_Element_Select('navAero',array('0'=>'是','1'=>'否'),'1','顶部透明','视口处于最顶部时,顶部导航栏是否变为透明(BUG 比较多,不推荐)'); + $form->addInput($navAero); + $navSlide = new Typecho_Widget_Helper_Form_Element_Select('navSlide',array('0'=>'是','1'=>'否'),'0','Headroom','开启后,访客向下滚动页面时导航栏收起,向上滚动时导航栏展示'); + $form->addInput($navSlide); + $customNav = new Typecho_Widget_Helper_Form_Element_Textarea('customNav', NULL, NULL, _t('自定义导航栏'), _t('按照格式书写,自定义导航栏内容,留空则读取所有的独立页面,书写的格式请查看 wiki')); + $form->addInput($customNav); + $customNavIcon = new Typecho_Widget_Helper_Form_Element_Textarea('customNavIcon', NULL, NULL, _t('自定义导航小图标'), _t('按照格式书写,自定义内导航栏右侧的小图标,留空则展示默认的图标按钮,书写的格式请查看 wiki<hr>')); + $form->addInput($customNavIcon); + + //index-banner + $bannerUrl = new Typecho_Widget_Helper_Form_Element_Text('bannerUrl', NULL, NULL, _t('<h2>首页大图 Banner</h2>图片 Url'), _t('首页大图的图片地址')); + $form->addInput($bannerUrl); + $bannerFont = new Typecho_Widget_Helper_Form_Element_Select('bannerFont',array('0'=>'白色','1'=>'黑色'),'0','字体颜色','为了兼容不同的底色和背景色'); + $form->addInput($bannerFont); + $bannerHeight = new Typecho_Widget_Helper_Form_Element_Text('bannerHeight', NULL, '60', _t('高度'), _t('首页大图所占屏幕的高度,100为最大,填入纯数字,如"35"<hr>')); + $form->addInput($bannerHeight); + + //pjax + $pjax = new Typecho_Widget_Helper_Form_Element_Select('pjax',array( + '0'=>'关闭', + '1'=>'开启' + ),'1','<h2>Pjax 预加载</h2>是否开启','Pjax 预加载功能的开关'); + $form->addInput($pjax); + $pjax_complete = new Typecho_Widget_Helper_Form_Element_Textarea('pjax_complete', NULL, NULL, _t('Pjax 回调函数'), _t('Pjax 跳转页面后执行的事件,写入 js 代码,一般将 Pjax 重载(回调)函数写在这里。<hr>')); + $form->addInput($pjax_complete); + + //improve + $CDN = new Typecho_Widget_Helper_Form_Element_Select('CDN',array( + '0'=>'关闭', + '1'=>'jsDelivr', + '6'=>'jsDelivr(仅图片)', + '5'=>'9jojo CDN', + '2'=>'GitHack(实时更新)', + '4'=>'GitHack CDN(较慢)', + '3'=>'自定义'),'0','<h2>优化</h2>CDN 加速加载静态资源(Beta)', + '开启后静态资源文件通过选择的 CDN 进行调用,加快网页加载速度。如果选择自定义则需要填写下一个设置项。<br>* 如果你使用开发版,请不要选择 jsDelivr/9jojo 作为 CDN<br>* GitHack 是实时更新的,如果你不是随时更新开发版,最好不要选用<br>* GitHack CDN 速度较慢,国内不建议使用,<del>就是拿来凑数的</del><br>在这里感谢<a href="https://github.com/SatoSouta/9jojo">小太</a>为 Miracles 提供 9jojo CDN'); + $form->addInput($CDN); + $customCDN = new Typecho_Widget_Helper_Form_Element_Text('customCDN', NULL, '', _t('自定义 CDN'), _t('输入 CDN 的链接,要保证写入的路径下,目录结构和主题的 assets 目录下一致')); + $form->addInput($customCDN); + $ifShowRTA = new Typecho_Widget_Helper_Form_Element_Select('ifShowRTA',array('0'=>'不显示','1'=>'显示'),'0','阅读时长提示 RTA','在文章前加入阅读时长提示,增进用户体验'); + $form->addInput($ifShowRTA); + $pangu = new Typecho_Widget_Helper_Form_Element_Select('pangu',array('0'=>'启用','1'=>'关闭'),'0','自动分割中英文(pangu.js)','自动分割网页中的中英文,在全角字符和半角字符之间加上空格,也会修复一些标点符号的错误(.=>。),可能会有误判或是有人不喜欢,所以在这里加个按钮<hr>'); + $form->addInput($pangu); + + //custom style + $grayTheme = new Typecho_Widget_Helper_Form_Element_Select('grayTheme',array( + '0'=>'关闭', + '1'=>'开启' + ),'0','<h2>个性化</h2>哀悼模式','打开后网站变为黑白'); + $form->addInput($grayTheme); + $bodyFonts = new Typecho_Widget_Helper_Form_Element_Select('bodyFonts',array( + '0'=>'无衬线字体', + '1'=>'衬线字体' + ),'0','网站字体','选择网站的字体,无衬线字体即“思源黑体”,衬线字体即“思源宋体”'); + $form->addInput($bodyFonts); + $randomBanner = new Typecho_Widget_Helper_Form_Element_Textarea('randomBanner', NULL, NULL, _t('随机文章缩略图'), _t('文章没有独立设置头图时调用,写入图片链接,用半角逗号分割')); + $form->addInput($randomBanner); + + //LoadingImage + $LoadingOptions = [ + 'block' => "交错方块", + 'octopus' => "旋转章鱼", + 'bilibili' => "哔哩哔哩", + 'shojo' => "少女祈祷", + 'custom' => "自定义" + ]; + $LoadingImage = new Typecho_Widget_Helper_Form_Element_Radio('loading_image', $LoadingOptions, 'block', _t('图片懒加载动画'),_t("选择懒加载动画的图片,若选择自定义,则需要在 images/loading 目录下添加名为 custom.gif 的文件")); + $form->addInput($LoadingImage); + + //SiteBuildTime + $buildTime = new Typecho_Widget_Helper_Form_Element_Text('build_time', NULL, NULL, _t('在页脚输出建站至今时间'), _t('填写格式如 2020-01-01 的时间,将输出在站点信息之前,不想开启请留空。')); + $form->addInput($buildTime); + //AnimeFace + $AnimeFace = new Typecho_Widget_Helper_Form_Element_Text('anime_face', NULL, NULL, _t('在其之后输出一个蹦跶的颜文字'), _t('如果开启了建站时间将会输出在其之后,反之会输出在站点信息之后。在此写上你想展示的颜文字,多个颜文字用"&&"分割,每次刷新更换。如不想开启请留空。<hr>')); + $form->addInput($AnimeFace); + + //developer + $headerEcho = new Typecho_Widget_Helper_Form_Element_Textarea('headerEcho', NULL, NULL, _t('<h2>开发者设置</h2>自定义头部信息'), _t('填写 html 代码,将输出在 <head> 标签中,可以在这里写上统计代码')); + $form->addInput($headerEcho); + $footerEcho = new Typecho_Widget_Helper_Form_Element_Textarea('footerEcho', NULL, NULL, _t('自定义页脚部信息'), _t('填写 html 代码,将输出在页脚的版权信息之前')); + $form->addInput($footerEcho); + $cssEcho = new Typecho_Widget_Helper_Form_Element_Textarea('cssEcho', NULL, NULL, _t('自定义 CSS'), _t('填写 CSS 代码,输出在 head 标签结束之前的 style 标签内')); + $form->addInput($cssEcho); + $jsEcho = new Typecho_Widget_Helper_Form_Element_Textarea('jsEcho', NULL, NULL, _t('自定义 JavaScript'), _t('填写 JavaScript代码,输出在 body 标签结束之前')); + $form->addInput($jsEcho); +} diff --git a/libs/TableContents.php b/libs/TableContents.php new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/libs/TableContents.php diff --git a/libs/TimThumb.php b/libs/TimThumb.php new file mode 100644 index 0000000..c51e866 --- /dev/null +++ b/libs/TimThumb.php @@ -0,0 +1,1251 @@ +<?php +/** + * TimThumb by Ben Gillbanks and Mark Maunder + * Based on work done by Tim McDaniels and Darren Hoyt + * http://code.google.com/p/timthumb/ + * + * GNU General Public License, version 2 + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + * Examples and documentation available on the project homepage + * http://www.binarymoon.co.uk/projects/timthumb/ + * + * $Rev$ + */ + +/* + * --- TimThumb CONFIGURATION --- + * To edit the configs it is best to create a file called timthumb-config.php + * and define variables you want to customize in there. It will automatically be + * loaded by timthumb. This will save you having to re-edit these variables + * everytime you download a new version +*/ +define ('VERSION', '2.8.14'); // Version of this script +//Load a config file if it exists. Otherwise, use the values below +if( file_exists(dirname(__FILE__) . '/timthumb-config.php')) require_once('timthumb-config.php'); +if(! defined('DEBUG_ON') ) define ('DEBUG_ON', false); // Enable debug logging to web server error log (STDERR) +if(! defined('DEBUG_LEVEL') ) define ('DEBUG_LEVEL', 1); // Debug level 1 is less noisy and 3 is the most noisy +if(! defined('MEMORY_LIMIT') ) define ('MEMORY_LIMIT', '30M'); // Set PHP memory limit +if(! defined('BLOCK_EXTERNAL_LEECHERS') ) define ('BLOCK_EXTERNAL_LEECHERS', false); // If the image or webshot is being loaded on an external site, display a red "No Hotlinking" gif. +if(! defined('DISPLAYALLOW_ALL_EXTERNAL_SITES_ERROR_MESSAGES') ) define ('DISPLAY_ERROR_MESSAGES', true); // Display error messages. Set to false to turn off errors (good for production websites) +//Image fetching and caching +if(! defined('ALLOW_EXTERNAL') ) define ('ALLOW_EXTERNAL', TRUE); // Allow image fetching from external websites. Will check against ALLOWED_SITES if ALLOW_ALL_EXTERNAL_SITES is false +if(! defined('ALLOW_ALL_EXTERNAL_SITES') ) define ('ALLOW_ALL_EXTERNAL_SITES', false); // Less secure. +if(! defined('FILE_CACHE_ENABLED') ) define ('FILE_CACHE_ENABLED', TRUE); // Should we store resized/modified images on disk to speed things up? +if(! defined('FILE_CACHE_TIME_BETWEEN_CLEANS')) define ('FILE_CACHE_TIME_BETWEEN_CLEANS', 86400); // How often the cache is cleaned + +if(! defined('FILE_CACHE_MAX_FILE_AGE') ) define ('FILE_CACHE_MAX_FILE_AGE', 86400); // How old does a file have to be to be deleted from the cache +if(! defined('FILE_CACHE_SUFFIX') ) define ('FILE_CACHE_SUFFIX', '.timthumb.txt'); // What to put at the end of all files in the cache directory so we can identify them +if(! defined('FILE_CACHE_PREFIX') ) define ('FILE_CACHE_PREFIX', 'timthumb'); // What to put at the beg of all files in the cache directory so we can identify them +if(! defined('FILE_CACHE_DIRECTORY') ) define ('FILE_CACHE_DIRECTORY', './cache'); // Directory where images are cached. Left blank it will use the system temporary directory (which is better for security) +if(! defined('MAX_FILE_SIZE') ) define ('MAX_FILE_SIZE', 10485760); // 10 Megs is 10485760. This is the max internal or external file size that we'll process. +if(! defined('CURL_TIMEOUT') ) define ('CURL_TIMEOUT', 20); // Timeout duration for Curl. This only applies if you have Curl installed and aren't using PHP's default URL fetching mechanism. +if(! defined('WAIT_BETWEEN_FETCH_ERRORS') ) define ('WAIT_BETWEEN_FETCH_ERRORS', 3600); // Time to wait between errors fetching remote file + +//Browser caching +if(! defined('BROWSER_CACHE_MAX_AGE') ) define ('BROWSER_CACHE_MAX_AGE', 864000); // Time to cache in the browser +if(! defined('BROWSER_CACHE_DISABLE') ) define ('BROWSER_CACHE_DISABLE', false); // Use for testing if you want to disable all browser caching + +//Image size and defaults +if(! defined('MAX_WIDTH') ) define ('MAX_WIDTH', 1500); // Maximum image width +if(! defined('MAX_HEIGHT') ) define ('MAX_HEIGHT', 1500); // Maximum image height +if(! defined('NOT_FOUND_IMAGE') ) define ('NOT_FOUND_IMAGE', ''); // Image to serve if any 404 occurs +if(! defined('ERROR_IMAGE') ) define ('ERROR_IMAGE', ''); // Image to serve if an error occurs instead of showing error message +if(! defined('PNG_IS_TRANSPARENT') ) define ('PNG_IS_TRANSPARENT', FALSE); // Define if a png image should have a transparent background color. Use False value if you want to display a custom coloured canvas_colour +if(! defined('DEFAULT_Q') ) define ('DEFAULT_Q', 90); // Default image quality. Allows overrid in timthumb-config.php +if(! defined('DEFAULT_ZC') ) define ('DEFAULT_ZC', 1); // Default zoom/crop setting. Allows overrid in timthumb-config.php +if(! defined('DEFAULT_F') ) define ('DEFAULT_F', ''); // Default image filters. Allows overrid in timthumb-config.php +if(! defined('DEFAULT_S') ) define ('DEFAULT_S', 0); // Default sharpen value. Allows overrid in timthumb-config.php +if(! defined('DEFAULT_CC') ) define ('DEFAULT_CC', 'ffffff'); // Default canvas colour. Allows overrid in timthumb-config.php +if(! defined('DEFAULT_WIDTH') ) define ('DEFAULT_WIDTH', 100); // Default thumbnail width. Allows overrid in timthumb-config.php +if(! defined('DEFAULT_HEIGHT') ) define ('DEFAULT_HEIGHT', 100); // Default thumbnail height. Allows overrid in timthumb-config.php + +/** + * Additional Parameters: + * LOCAL_FILE_BASE_DIRECTORY = Override the DOCUMENT_ROOT. This is best used in timthumb-config.php + */ + +//Image compression is enabled if either of these point to valid paths + +//These are now disabled by default because the file sizes of PNGs (and GIFs) are much smaller than we used to generate. +//They only work for PNGs. GIFs and JPEGs are not affected. +if(! defined('OPTIPNG_ENABLED') ) define ('OPTIPNG_ENABLED', false); +if(! defined('OPTIPNG_PATH') ) define ('OPTIPNG_PATH', '/usr/bin/optipng'); //This will run first because it gives better compression than pngcrush. +if(! defined('PNGCRUSH_ENABLED') ) define ('PNGCRUSH_ENABLED', false); +if(! defined('PNGCRUSH_PATH') ) define ('PNGCRUSH_PATH', '/usr/bin/pngcrush'); //This will only run if OPTIPNG_PATH is not set or is not valid + +/* + -------====Website Screenshots configuration - BETA====------- + + If you just want image thumbnails and don't want website screenshots, you can safely leave this as is. + + If you would like to get website screenshots set up, you will need root access to your own server. + Enable ALLOW_ALL_EXTERNAL_SITES so you can fetch any external web page. This is more secure now that we're using a non-web folder for cache. + Enable BLOCK_EXTERNAL_LEECHERS so that your site doesn't generate thumbnails for the whole Internet. + Instructions to get website screenshots enabled on Ubuntu Linux: + 1. Install Xvfb with the following command: sudo apt-get install subversion libqt4-webkit libqt4-dev g++ xvfb + 2. Go to a directory where you can download some code + 3. Check-out the latest version of CutyCapt with the following command: svn co https://cutycapt.svn.sourceforge.net/svnroot/cutycapt + 4. Compile CutyCapt by doing: cd cutycapt/CutyCapt + 5. qmake + 6. make + 7. cp CutyCapt /usr/local/bin/ + 8. Test it by running: xvfb-run --server-args="-screen 0, 1024x768x24" CutyCapt --url="http://markmaunder.com/" --out=test.png + 9. If you get a file called test.png with something in it, it probably worked. Now test the script by accessing it as follows: + 10. http://yoursite.com/path/to/timthumb.php?src=http://markmaunder.com/&webshot=1 + Notes on performance: + The first time a webshot loads, it will take a few seconds. + From then on it uses the regular timthumb caching mechanism with the configurable options above + and loading will be very fast. + --ADVANCED USERS ONLY-- + If you'd like a slight speedup (about 25%) and you know Linux, you can run the following command which will keep Xvfb running in the background. + nohup Xvfb :100 -ac -nolisten tcp -screen 0, 1024x768x24 > /dev/null 2>&1 & + Then set WEBSHOT_XVFB_RUNNING = true below. This will save your server having to fire off a new Xvfb server and shut it down every time a new shot is generated. + You will need to take responsibility for keeping Xvfb running in case it crashes. (It seems pretty stable) + You will also need to take responsibility for server security if you're running Xvfb as root. +*/ +if(! defined('WEBSHOT_ENABLED') ) define ('WEBSHOT_ENABLED', false); //Beta feature. Adding webshot=1 to your query string will cause the script to return a browser screenshot rather than try to fetch an image. +if(! defined('WEBSHOT_CUTYCAPT') ) define ('WEBSHOT_CUTYCAPT', '/usr/local/bin/CutyCapt'); //The path to CutyCapt. +if(! defined('WEBSHOT_XVFB') ) define ('WEBSHOT_XVFB', '/usr/bin/xvfb-run'); //The path to the Xvfb server +if(! defined('WEBSHOT_SCREEN_X') ) define ('WEBSHOT_SCREEN_X', '1024'); //1024 works ok +if(! defined('WEBSHOT_SCREEN_Y') ) define ('WEBSHOT_SCREEN_Y', '768'); //768 works ok +if(! defined('WEBSHOT_COLOR_DEPTH') ) define ('WEBSHOT_COLOR_DEPTH', '24'); //I haven't tested anything besides 24 +if(! defined('WEBSHOT_IMAGE_FORMAT') ) define ('WEBSHOT_IMAGE_FORMAT', 'png'); //png is about 2.5 times the size of jpg but is a LOT better quality +if(! defined('WEBSHOT_TIMEOUT') ) define ('WEBSHOT_TIMEOUT', '20'); //Seconds to wait for a webshot +if(! defined('WEBSHOT_USER_AGENT') ) define ('WEBSHOT_USER_AGENT', "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18"); //I hate to do this, but a non-browser robot user agent might not show what humans see. So we pretend to be Firefox +if(! defined('WEBSHOT_JAVASCRIPT_ON') ) define ('WEBSHOT_JAVASCRIPT_ON', true); //Setting to false might give you a slight speedup and block ads. But it could cause other issues. +if(! defined('WEBSHOT_JAVA_ON') ) define ('WEBSHOT_JAVA_ON', false); //Have only tested this as fase +if(! defined('WEBSHOT_PLUGINS_ON') ) define ('WEBSHOT_PLUGINS_ON', true); //Enable flash and other plugins +if(! defined('WEBSHOT_PROXY') ) define ('WEBSHOT_PROXY', ''); //In case you're behind a proxy server. +if(! defined('WEBSHOT_XVFB_RUNNING') ) define ('WEBSHOT_XVFB_RUNNING', false); //ADVANCED: Enable this if you've got Xvfb running in the background. + + +// If ALLOW_EXTERNAL is true and ALLOW_ALL_EXTERNAL_SITES is false, then external images will only be fetched from these domains and their subdomains. +if(! isset($ALLOWED_SITES)){ + require_once("../themeConfig.php"); + $ALLOWED_SITES = $GLOBALS['miraclesTimThumbAllowList']; +} +// ------------------------------------------------------------- +// -------------- STOP EDITING CONFIGURATION HERE -------------- +// ------------------------------------------------------------- + +timthumb::start(); + +class timthumb { + protected $src = ""; + protected $is404 = false; + protected $docRoot = ""; + protected $lastURLError = false; + protected $localImage = ""; + protected $localImageMTime = 0; + protected $url = false; + protected $myHost = ""; + protected $isURL = false; + protected $cachefile = ''; + protected $errors = array(); + protected $toDeletes = array(); + protected $cacheDirectory = ''; + protected $startTime = 0; + protected $lastBenchTime = 0; + protected $cropTop = false; + protected $salt = ""; + protected $fileCacheVersion = 1; //Generally if timthumb.php is modifed (upgraded) then the salt changes and all cache files are recreated. This is a backup mechanism to force regen. + protected $filePrependSecurityBlock = "<?php die('Execution denied!'); //"; //Designed to have three letter mime type, space, question mark and greater than symbol appended. 6 bytes total. + protected static $curlDataWritten = 0; + protected static $curlFH = false; + public static function start(){ + $tim = new timthumb(); + $tim->handleErrors(); + $tim->securityChecks(); + if($tim->tryBrowserCache()){ + exit(0); + } + $tim->handleErrors(); + if(FILE_CACHE_ENABLED && $tim->tryServerCache()){ + exit(0); + } + $tim->handleErrors(); + $tim->run(); + $tim->handleErrors(); + exit(0); + } + public function __construct(){ + global $ALLOWED_SITES; + $this->startTime = microtime(true); + date_default_timezone_set('UTC'); + $this->debug(1, "Starting new request from " . $this->getIP() . " to " . $_SERVER['REQUEST_URI']); + $this->calcDocRoot(); + //On windows systems I'm assuming fileinode returns an empty string or a number that doesn't change. Check this. + $this->salt = @filemtime(__FILE__) . '-' . @fileinode(__FILE__); + $this->debug(3, "Salt is: " . $this->salt); + if(FILE_CACHE_DIRECTORY){ + if(! is_dir(FILE_CACHE_DIRECTORY)){ + @mkdir(FILE_CACHE_DIRECTORY); + if(! is_dir(FILE_CACHE_DIRECTORY)){ + $this->error("Could not create the file cache directory."); + return false; + } + } + $this->cacheDirectory = FILE_CACHE_DIRECTORY; + if (!touch($this->cacheDirectory . '/index.html')) { + $this->error("Could not create the index.html file - to fix this create an empty file named index.html file in the cache directory."); + } + } else { + $this->cacheDirectory = sys_get_temp_dir(); + } + //Clean the cache before we do anything because we don't want the first visitor after FILE_CACHE_TIME_BETWEEN_CLEANS expires to get a stale image. + $this->cleanCache(); + + $this->myHost = preg_replace('/^www\./i', '', $_SERVER['HTTP_HOST']); + $this->src = $this->param('src'); + $this->url = parse_url($this->src); + $this->src = preg_replace('/https?:\/\/(?:www\.)?' . $this->myHost . '/i', '', $this->src); + + if(strlen($this->src) <= 3){ + $this->error("No image specified"); + return false; + } + if(BLOCK_EXTERNAL_LEECHERS && array_key_exists('HTTP_REFERER', $_SERVER) && (! preg_match('/^https?:\/\/(?:www\.)?' . $this->myHost . '(?:$|\/)/i', $_SERVER['HTTP_REFERER']))){ + // base64 encoded red image that says 'no hotlinkers' + // nothing to worry about! :) + $imgData = base64_decode("R0lGODlhUAAMAIAAAP8AAP///yH5BAAHAP8ALAAAAABQAAwAAAJpjI+py+0Po5y0OgAMjjv01YUZ\nOGplhWXfNa6JCLnWkXplrcBmW+spbwvaVr/cDyg7IoFC2KbYVC2NQ5MQ4ZNao9Ynzjl9ScNYpneb\nDULB3RP6JuPuaGfuuV4fumf8PuvqFyhYtjdoeFgAADs="); + header('Content-Type: image/gif'); + header('Content-Length: ' . strlen($imgData)); + header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); + header("Pragma: no-cache"); + header('Expires: ' . gmdate ('D, d M Y H:i:s', time())); + echo $imgData; + return false; + exit(0); + } + if(preg_match('/^https?:\/\/[^\/]+/i', $this->src)){ + $this->debug(2, "Is a request for an external URL: " . $this->src); + $this->isURL = true; + } else { + $this->debug(2, "Is a request for an internal file: " . $this->src); + } + if($this->isURL && (! ALLOW_EXTERNAL)){ + $this->error("You are not allowed to fetch images from an external website."); + return false; + } + if($this->isURL){ + if(ALLOW_ALL_EXTERNAL_SITES){ + $this->debug(2, "Fetching from all external sites is enabled."); + } else { + $this->debug(2, "Fetching only from selected external sites is enabled."); + $allowed = false; + foreach($ALLOWED_SITES as $site){ + if ((strtolower(substr($this->url['host'],-strlen($site)-1)) === strtolower(".$site")) || (strtolower($this->url['host'])===strtolower($site))) { + $this->debug(3, "URL hostname {$this->url['host']} matches $site so allowing."); + $allowed = true; + } + } + if(! $allowed){ + return $this->error("You may not fetch images from that site. To enable this site in timthumb, you can either add it to \$ALLOWED_SITES and set ALLOW_EXTERNAL=true. Or you can set ALLOW_ALL_EXTERNAL_SITES=true, depending on your security needs."); + } + } + } + + $cachePrefix = ($this->isURL ? '_ext_' : '_int_'); + if($this->isURL){ + $arr = explode('&', $_SERVER ['QUERY_STRING']); + asort($arr); + $this->cachefile = $this->cacheDirectory . '/' . FILE_CACHE_PREFIX . $cachePrefix . md5($this->salt . implode('', $arr) . $this->fileCacheVersion) . FILE_CACHE_SUFFIX; + } else { + $this->localImage = $this->getLocalImagePath($this->src); + if(! $this->localImage){ + $this->debug(1, "Could not find the local image: {$this->localImage}"); + $this->error("Could not find the internal image you specified."); + $this->set404(); + return false; + } + $this->debug(1, "Local image path is {$this->localImage}"); + $this->localImageMTime = @filemtime($this->localImage); + //We include the mtime of the local file in case in changes on disk. + $this->cachefile = $this->cacheDirectory . '/' . FILE_CACHE_PREFIX . $cachePrefix . md5($this->salt . $this->localImageMTime . $_SERVER ['QUERY_STRING'] . $this->fileCacheVersion) . FILE_CACHE_SUFFIX; + } + $this->debug(2, "Cache file is: " . $this->cachefile); + + return true; + } + public function __destruct(){ + foreach($this->toDeletes as $del){ + $this->debug(2, "Deleting temp file $del"); + @unlink($del); + } + } + public function run(){ + if($this->isURL){ + if(! ALLOW_EXTERNAL){ + $this->debug(1, "Got a request for an external image but ALLOW_EXTERNAL is disabled so returning error msg."); + $this->error("You are not allowed to fetch images from an external website."); + return false; + } + $this->debug(3, "Got request for external image. Starting serveExternalImage."); + if($this->param('webshot')){ + if(WEBSHOT_ENABLED){ + $this->debug(3, "webshot param is set, so we're going to take a webshot."); + $this->serveWebshot(); + } else { + $this->error("You added the webshot parameter but webshots are disabled on this server. You need to set WEBSHOT_ENABLED == true to enable webshots."); + } + } else { + $this->debug(3, "webshot is NOT set so we're going to try to fetch a regular image."); + $this->serveExternalImage(); + + } + } else { + $this->debug(3, "Got request for internal image. Starting serveInternalImage()"); + $this->serveInternalImage(); + } + return true; + } + protected function handleErrors(){ + if($this->haveErrors()){ + if(NOT_FOUND_IMAGE && $this->is404()){ + if($this->serveImg(NOT_FOUND_IMAGE)){ + exit(0); + } else { + $this->error("Additionally, the 404 image that is configured could not be found or there was an error serving it."); + } + } + if(ERROR_IMAGE){ + if($this->serveImg(ERROR_IMAGE)){ + exit(0); + } else { + $this->error("Additionally, the error image that is configured could not be found or there was an error serving it."); + } + } + $this->serveErrors(); + exit(0); + } + return false; + } + protected function tryBrowserCache(){ + if(BROWSER_CACHE_DISABLE){ $this->debug(3, "Browser caching is disabled"); return false; } + if(!empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) ){ + $this->debug(3, "Got a conditional get"); + $mtime = false; + //We've already checked if the real file exists in the constructor + if(! is_file($this->cachefile)){ + //If we don't have something cached, regenerate the cached image. + return false; + } + if($this->localImageMTime){ + $mtime = $this->localImageMTime; + $this->debug(3, "Local real file's modification time is $mtime"); + } else if(is_file($this->cachefile)){ //If it's not a local request then use the mtime of the cached file to determine the 304 + $mtime = @filemtime($this->cachefile); + $this->debug(3, "Cached file's modification time is $mtime"); + } + if(! $mtime){ return false; } + + $iftime = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']); + $this->debug(3, "The conditional get's if-modified-since unixtime is $iftime"); + if($iftime < 1){ + $this->debug(3, "Got an invalid conditional get modified since time. Returning false."); + return false; + } + if($iftime < $mtime){ //Real file or cache file has been modified since last request, so force refetch. + $this->debug(3, "File has been modified since last fetch."); + return false; + } else { //Otherwise serve a 304 + $this->debug(3, "File has not been modified since last get, so serving a 304."); + header ($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified'); + $this->debug(1, "Returning 304 not modified"); + return true; + } + } + return false; + } + protected function tryServerCache(){ + $this->debug(3, "Trying server cache"); + if(file_exists($this->cachefile)){ + $this->debug(3, "Cachefile {$this->cachefile} exists"); + if($this->isURL){ + $this->debug(3, "This is an external request, so checking if the cachefile is empty which means the request failed previously."); + if(filesize($this->cachefile) < 1){ + $this->debug(3, "Found an empty cachefile indicating a failed earlier request. Checking how old it is."); + //Fetching error occured previously + if(time() - @filemtime($this->cachefile) > WAIT_BETWEEN_FETCH_ERRORS){ + $this->debug(3, "File is older than " . WAIT_BETWEEN_FETCH_ERRORS . " seconds. Deleting and returning false so app can try and load file."); + @unlink($this->cachefile); + return false; //to indicate we didn't serve from cache and app should try and load + } else { + $this->debug(3, "Empty cachefile is still fresh so returning message saying we had an error fetching this image from remote host."); + $this->set404(); + $this->error("An error occured fetching image."); + return false; + } + } + } else { + $this->debug(3, "Trying to serve cachefile {$this->cachefile}"); + } + if($this->serveCacheFile()){ + $this->debug(3, "Succesfully served cachefile {$this->cachefile}"); + return true; + } else { + $this->debug(3, "Failed to serve cachefile {$this->cachefile} - Deleting it from cache."); + //Image serving failed. We can't retry at this point, but lets remove it from cache so the next request recreates it + @unlink($this->cachefile); + return true; + } + } + } + protected function error($err){ + $this->debug(3, "Adding error message: $err"); + $this->errors[] = $err; + return false; + + } + protected function haveErrors(){ + if(sizeof($this->errors) > 0){ + return true; + } + return false; + } + protected function serveErrors(){ + header ($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request'); + if ( ! DISPLAY_ERROR_MESSAGES ) { + return; + } + $html = '<ul>'; + foreach($this->errors as $err){ + $html .= '<li>' . htmlentities($err) . '</li>'; + } + $html .= '</ul>'; + echo '<h1>A TimThumb error has occured</h1>The following error(s) occured:<br />' . $html . '<br />'; + echo '<br />Query String : ' . htmlentities( $_SERVER['QUERY_STRING'], ENT_QUOTES ); + echo '<br />TimThumb version : ' . VERSION . '</pre>'; + } + protected function serveInternalImage(){ + $this->debug(3, "Local image path is $this->localImage"); + if(! $this->localImage){ + $this->sanityFail("localImage not set after verifying it earlier in the code."); + return false; + } + $fileSize = filesize($this->localImage); + if($fileSize > MAX_FILE_SIZE){ + $this->error("The file you specified is greater than the maximum allowed file size."); + return false; + } + if($fileSize <= 0){ + $this->error("The file you specified is <= 0 bytes."); + return false; + } + $this->debug(3, "Calling processImageAndWriteToCache() for local image."); + if($this->processImageAndWriteToCache($this->localImage)){ + $this->serveCacheFile(); + return true; + } else { + return false; + } + } + protected function cleanCache(){ + if (FILE_CACHE_TIME_BETWEEN_CLEANS < 0) { + return; + } + $this->debug(3, "cleanCache() called"); + $lastCleanFile = $this->cacheDirectory . '/timthumb_cacheLastCleanTime.touch'; + + //If this is a new timthumb installation we need to create the file + if(! is_file($lastCleanFile)){ + $this->debug(1, "File tracking last clean doesn't exist. Creating $lastCleanFile"); + if (!touch($lastCleanFile)) { + $this->error("Could not create cache clean timestamp file."); + } + return; + } + if(@filemtime($lastCleanFile) < (time() - FILE_CACHE_TIME_BETWEEN_CLEANS) ){ //Cache was last cleaned more than 1 day ago + $this->debug(1, "Cache was last cleaned more than " . FILE_CACHE_TIME_BETWEEN_CLEANS . " seconds ago. Cleaning now."); + // Very slight race condition here, but worst case we'll have 2 or 3 servers cleaning the cache simultaneously once a day. + if (!touch($lastCleanFile)) { + $this->error("Could not create cache clean timestamp file."); + } + $files = glob($this->cacheDirectory . '/*' . FILE_CACHE_SUFFIX); + if ($files) { + $timeAgo = time() - FILE_CACHE_MAX_FILE_AGE; + foreach($files as $file){ + if(@filemtime($file) < $timeAgo){ + $this->debug(3, "Deleting cache file $file older than max age: " . FILE_CACHE_MAX_FILE_AGE . " seconds"); + @unlink($file); + } + } + } + return true; + } else { + $this->debug(3, "Cache was cleaned less than " . FILE_CACHE_TIME_BETWEEN_CLEANS . " seconds ago so no cleaning needed."); + } + return false; + } + protected function processImageAndWriteToCache($localImage){ + $sData = getimagesize($localImage); + $origType = $sData[2]; + $mimeType = $sData['mime']; + + $this->debug(3, "Mime type of image is $mimeType"); + if(! preg_match('/^image\/(?:gif|jpg|jpeg|png)$/i', $mimeType)){ + return $this->error("The image being resized is not a valid gif, jpg or png."); + } + + if (!function_exists ('imagecreatetruecolor')) { + return $this->error('GD Library Error: imagecreatetruecolor does not exist - please contact your webhost and ask them to install the GD library'); + } + + if (function_exists ('imagefilter') && defined ('IMG_FILTER_NEGATE')) { + $imageFilters = array ( + 1 => array (IMG_FILTER_NEGATE, 0), + 2 => array (IMG_FILTER_GRAYSCALE, 0), + 3 => array (IMG_FILTER_BRIGHTNESS, 1), + 4 => array (IMG_FILTER_CONTRAST, 1), + 5 => array (IMG_FILTER_COLORIZE, 4), + 6 => array (IMG_FILTER_EDGEDETECT, 0), + 7 => array (IMG_FILTER_EMBOSS, 0), + 8 => array (IMG_FILTER_GAUSSIAN_BLUR, 0), + 9 => array (IMG_FILTER_SELECTIVE_BLUR, 0), + 10 => array (IMG_FILTER_MEAN_REMOVAL, 0), + 11 => array (IMG_FILTER_SMOOTH, 0), + ); + } + + // get standard input properties + $new_width = (int) abs ($this->param('w', 0)); + $new_height = (int) abs ($this->param('h', 0)); + $zoom_crop = (int) $this->param('zc', DEFAULT_ZC); + $quality = (int) abs ($this->param('q', DEFAULT_Q)); + $align = $this->cropTop ? 't' : $this->param('a', 'c'); + $filters = $this->param('f', DEFAULT_F); + $sharpen = (bool) $this->param('s', DEFAULT_S); + $canvas_color = $this->param('cc', DEFAULT_CC); + $canvas_trans = (bool) $this->param('ct', '1'); + + // set default width and height if neither are set already + if ($new_width == 0 && $new_height == 0) { + $new_width = (int) DEFAULT_WIDTH; + $new_height = (int) DEFAULT_HEIGHT; + } + + // ensure size limits can not be abused + $new_width = min ($new_width, MAX_WIDTH); + $new_height = min ($new_height, MAX_HEIGHT); + + // set memory limit to be able to have enough space to resize larger images + $this->setMemoryLimit(); + + // open the existing image + $image = $this->openImage ($mimeType, $localImage); + if ($image === false) { + return $this->error('Unable to open image.'); + } + + // Get original width and height + $width = imagesx ($image); + $height = imagesy ($image); + $origin_x = 0; + $origin_y = 0; + + // generate new w/h if not provided + if ($new_width && !$new_height) { + $new_height = floor ($height * ($new_width / $width)); + } else if ($new_height && !$new_width) { + $new_width = floor ($width * ($new_height / $height)); + } + + // scale down and add borders + if ($zoom_crop == 3) { + + $final_height = $height * ($new_width / $width); + + if ($final_height > $new_height) { + $new_width = $width * ($new_height / $height); + } else { + $new_height = $final_height; + } + + } + + // create a new true color image + $canvas = imagecreatetruecolor ($new_width, $new_height); + imagealphablending ($canvas, false); + + if (strlen($canvas_color) == 3) { //if is 3-char notation, edit string into 6-char notation + $canvas_color = str_repeat(substr($canvas_color, 0, 1), 2) . str_repeat(substr($canvas_color, 1, 1), 2) . str_repeat(substr($canvas_color, 2, 1), 2); + } else if (strlen($canvas_color) != 6) { + $canvas_color = DEFAULT_CC; // on error return default canvas color + } + + $canvas_color_R = hexdec (substr ($canvas_color, 0, 2)); + $canvas_color_G = hexdec (substr ($canvas_color, 2, 2)); + $canvas_color_B = hexdec (substr ($canvas_color, 4, 2)); + + // Create a new transparent color for image + // If is a png and PNG_IS_TRANSPARENT is false then remove the alpha transparency + // (and if is set a canvas color show it in the background) + if(preg_match('/^image\/png$/i', $mimeType) && !PNG_IS_TRANSPARENT && $canvas_trans){ + $color = imagecolorallocatealpha ($canvas, $canvas_color_R, $canvas_color_G, $canvas_color_B, 127); + }else{ + $color = imagecolorallocatealpha ($canvas, $canvas_color_R, $canvas_color_G, $canvas_color_B, 0); + } + + + // Completely fill the background of the new image with allocated color. + imagefill ($canvas, 0, 0, $color); + + // scale down and add borders + if ($zoom_crop == 2) { + + $final_height = $height * ($new_width / $width); + + if ($final_height > $new_height) { + + $origin_x = $new_width / 2; + $new_width = $width * ($new_height / $height); + $origin_x = round ($origin_x - ($new_width / 2)); + + } else { + + $origin_y = $new_height / 2; + $new_height = $final_height; + $origin_y = round ($origin_y - ($new_height / 2)); + + } + + } + + // Restore transparency blending + imagesavealpha ($canvas, true); + + if ($zoom_crop > 0) { + + $src_x = $src_y = 0; + $src_w = $width; + $src_h = $height; + + $cmp_x = $width / $new_width; + $cmp_y = $height / $new_height; + + // calculate x or y coordinate and width or height of source + if ($cmp_x > $cmp_y) { + + $src_w = round ($width / $cmp_x * $cmp_y); + $src_x = round (($width - ($width / $cmp_x * $cmp_y)) / 2); + + } else if ($cmp_y > $cmp_x) { + + $src_h = round ($height / $cmp_y * $cmp_x); + $src_y = round (($height - ($height / $cmp_y * $cmp_x)) / 2); + + } + + // positional cropping! + if ($align) { + if (strpos ($align, 't') !== false) { + $src_y = 0; + } + if (strpos ($align, 'b') !== false) { + $src_y = $height - $src_h; + } + if (strpos ($align, 'l') !== false) { + $src_x = 0; + } + if (strpos ($align, 'r') !== false) { + $src_x = $width - $src_w; + } + } + + imagecopyresampled ($canvas, $image, $origin_x, $origin_y, $src_x, $src_y, $new_width, $new_height, $src_w, $src_h); + + } else { + + // copy and resize part of an image with resampling + imagecopyresampled ($canvas, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); + + } + + if ($filters != '' && function_exists ('imagefilter') && defined ('IMG_FILTER_NEGATE')) { + // apply filters to image + $filterList = explode ('|', $filters); + foreach ($filterList as $fl) { + + $filterSettings = explode (',', $fl); + if (isset ($imageFilters[$filterSettings[0]])) { + + for ($i = 0; $i < 4; $i ++) { + if (!isset ($filterSettings[$i])) { + $filterSettings[$i] = null; + } else { + $filterSettings[$i] = (int) $filterSettings[$i]; + } + } + + switch ($imageFilters[$filterSettings[0]][1]) { + + case 1: + + imagefilter ($canvas, $imageFilters[$filterSettings[0]][0], $filterSettings[1]); + break; + + case 2: + + imagefilter ($canvas, $imageFilters[$filterSettings[0]][0], $filterSettings[1], $filterSettings[2]); + break; + + case 3: + + imagefilter ($canvas, $imageFilters[$filterSettings[0]][0], $filterSettings[1], $filterSettings[2], $filterSettings[3]); + break; + + case 4: + + imagefilter ($canvas, $imageFilters[$filterSettings[0]][0], $filterSettings[1], $filterSettings[2], $filterSettings[3], $filterSettings[4]); + break; + + default: + + imagefilter ($canvas, $imageFilters[$filterSettings[0]][0]); + break; + + } + } + } + } + + // sharpen image + if ($sharpen && function_exists ('imageconvolution')) { + + $sharpenMatrix = array ( + array (-1,-1,-1), + array (-1,16,-1), + array (-1,-1,-1), + ); + + $divisor = 8; + $offset = 0; + + imageconvolution ($canvas, $sharpenMatrix, $divisor, $offset); + + } + //Straight from Wordpress core code. Reduces filesize by up to 70% for PNG's + if ( (IMAGETYPE_PNG == $origType || IMAGETYPE_GIF == $origType) && function_exists('imageistruecolor') && !imageistruecolor( $image ) && imagecolortransparent( $image ) > 0 ){ + imagetruecolortopalette( $canvas, false, imagecolorstotal( $image ) ); + } + + $imgType = ""; + $tempfile = tempnam($this->cacheDirectory, 'timthumb_tmpimg_'); + if(preg_match('/^image\/(?:jpg|jpeg)$/i', $mimeType)){ + $imgType = 'jpg'; + imagejpeg($canvas, $tempfile, $quality); + } else if(preg_match('/^image\/png$/i', $mimeType)){ + $imgType = 'png'; + imagepng($canvas, $tempfile, floor($quality * 0.09)); + } else if(preg_match('/^image\/gif$/i', $mimeType)){ + $imgType = 'gif'; + imagegif($canvas, $tempfile); + } else { + return $this->sanityFail("Could not match mime type after verifying it previously."); + } + + if($imgType == 'png' && OPTIPNG_ENABLED && OPTIPNG_PATH && @is_file(OPTIPNG_PATH)){ + $exec = OPTIPNG_PATH; + $this->debug(3, "optipng'ing $tempfile"); + $presize = filesize($tempfile); + $out = `$exec -o1 $tempfile`; //you can use up to -o7 but it really slows things down + clearstatcache(); + $aftersize = filesize($tempfile); + $sizeDrop = $presize - $aftersize; + if($sizeDrop > 0){ + $this->debug(1, "optipng reduced size by $sizeDrop"); + } else if($sizeDrop < 0){ + $this->debug(1, "optipng increased size! Difference was: $sizeDrop"); + } else { + $this->debug(1, "optipng did not change image size."); + } + } else if($imgType == 'png' && PNGCRUSH_ENABLED && PNGCRUSH_PATH && @is_file(PNGCRUSH_PATH)){ + $exec = PNGCRUSH_PATH; + $tempfile2 = tempnam($this->cacheDirectory, 'timthumb_tmpimg_'); + $this->debug(3, "pngcrush'ing $tempfile to $tempfile2"); + $out = `$exec $tempfile $tempfile2`; + $todel = ""; + if(is_file($tempfile2)){ + $sizeDrop = filesize($tempfile) - filesize($tempfile2); + if($sizeDrop > 0){ + $this->debug(1, "pngcrush was succesful and gave a $sizeDrop byte size reduction"); + $todel = $tempfile; + $tempfile = $tempfile2; + } else { + $this->debug(1, "pngcrush did not reduce file size. Difference was $sizeDrop bytes."); + $todel = $tempfile2; + } + } else { + $this->debug(3, "pngcrush failed with output: $out"); + $todel = $tempfile2; + } + @unlink($todel); + } + + $this->debug(3, "Rewriting image with security header."); + $tempfile4 = tempnam($this->cacheDirectory, 'timthumb_tmpimg_'); + $context = stream_context_create (); + $fp = fopen($tempfile,'r',0,$context); + file_put_contents($tempfile4, $this->filePrependSecurityBlock . $imgType . ' ?' . '>'); //6 extra bytes, first 3 being image type + file_put_contents($tempfile4, $fp, FILE_APPEND); + fclose($fp); + @unlink($tempfile); + $this->debug(3, "Locking and replacing cache file."); + $lockFile = $this->cachefile . '.lock'; + $fh = fopen($lockFile, 'w'); + if(! $fh){ + return $this->error("Could not open the lockfile for writing an image."); + } + if(flock($fh, LOCK_EX)){ + @unlink($this->cachefile); //rename generally overwrites, but doing this in case of platform specific quirks. File might not exist yet. + rename($tempfile4, $this->cachefile); + flock($fh, LOCK_UN); + fclose($fh); + @unlink($lockFile); + } else { + fclose($fh); + @unlink($lockFile); + @unlink($tempfile4); + return $this->error("Could not get a lock for writing."); + } + $this->debug(3, "Done image replace with security header. Cleaning up and running cleanCache()"); + imagedestroy($canvas); + imagedestroy($image); + return true; + } + protected function calcDocRoot(){ + $docRoot = @$_SERVER['DOCUMENT_ROOT']; + if (defined('LOCAL_FILE_BASE_DIRECTORY')) { + $docRoot = LOCAL_FILE_BASE_DIRECTORY; + } + if(!isset($docRoot)){ + $this->debug(3, "DOCUMENT_ROOT is not set. This is probably windows. Starting search 1."); + if(isset($_SERVER['SCRIPT_FILENAME'])){ + $docRoot = str_replace( '\\', '/', substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF']))); + $this->debug(3, "Generated docRoot using SCRIPT_FILENAME and PHP_SELF as: $docRoot"); + } + } + if(!isset($docRoot)){ + $this->debug(3, "DOCUMENT_ROOT still is not set. Starting search 2."); + if(isset($_SERVER['PATH_TRANSLATED'])){ + $docRoot = str_replace( '\\', '/', substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']), 0, 0-strlen($_SERVER['PHP_SELF']))); + $this->debug(3, "Generated docRoot using PATH_TRANSLATED and PHP_SELF as: $docRoot"); + } + } + if($docRoot && $_SERVER['DOCUMENT_ROOT'] != '/'){ $docRoot = preg_replace('/\/$/', '', $docRoot); } + $this->debug(3, "Doc root is: " . $docRoot); + $this->docRoot = $docRoot; + + } + protected function getLocalImagePath($src){ + $src = ltrim($src, '/'); //strip off the leading '/' + if(! $this->docRoot){ + $this->debug(3, "We have no document root set, so as a last resort, lets check if the image is in the current dir and serve that."); + //We don't support serving images outside the current dir if we don't have a doc root for security reasons. + $file = preg_replace('/^.*?([^\/\\\\]+)$/', '$1', $src); //strip off any path info and just leave the filename. + if(is_file($file)){ + return $this->realpath($file); + } + return $this->error("Could not find your website document root and the file specified doesn't exist in timthumbs directory. We don't support serving files outside timthumb's directory without a document root for security reasons."); + } else if ( ! is_dir( $this->docRoot ) ) { + $this->error("Server path does not exist. Ensure variable \$_SERVER['DOCUMENT_ROOT'] is set correctly"); + } + + //Do not go past this point without docRoot set + + //Try src under docRoot + if(file_exists ($this->docRoot . '/' . $src)) { + $this->debug(3, "Found file as " . $this->docRoot . '/' . $src); + $real = $this->realpath($this->docRoot . '/' . $src); + if(stripos($real, $this->docRoot) === 0){ + return $real; + } else { + $this->debug(1, "Security block: The file specified occurs outside the document root."); + //allow search to continue + } + } + //Check absolute paths and then verify the real path is under doc root + $absolute = $this->realpath('/' . $src); + if($absolute && file_exists($absolute)){ //realpath does file_exists check, so can probably skip the exists check here + $this->debug(3, "Found absolute path: $absolute"); + if(! $this->docRoot){ $this->sanityFail("docRoot not set when checking absolute path."); } + if(stripos($absolute, $this->docRoot) === 0){ + return $absolute; + } else { + $this->debug(1, "Security block: The file specified occurs outside the document root."); + //and continue search + } + } + + $base = $this->docRoot; + + // account for Windows directory structure + if (strstr($_SERVER['SCRIPT_FILENAME'],':')) { + $sub_directories = explode('\\', str_replace($this->docRoot, '', $_SERVER['SCRIPT_FILENAME'])); + } else { + $sub_directories = explode('/', str_replace($this->docRoot, '', $_SERVER['SCRIPT_FILENAME'])); + } + + foreach ($sub_directories as $sub){ + $base .= $sub . '/'; + $this->debug(3, "Trying file as: " . $base . $src); + if(file_exists($base . $src)){ + $this->debug(3, "Found file as: " . $base . $src); + $real = $this->realpath($base . $src); + if(stripos($real, $this->realpath($this->docRoot)) === 0){ + return $real; + } else { + $this->debug(1, "Security block: The file specified occurs outside the document root."); + //And continue search + } + } + } + return false; + } + protected function realpath($path){ + //try to remove any relative paths + $remove_relatives = '/\w+\/\.\.\//'; + while(preg_match($remove_relatives,$path)){ + $path = preg_replace($remove_relatives, '', $path); + } + //if any remain use PHP realpath to strip them out, otherwise return $path + //if using realpath, any symlinks will also be resolved + return preg_match('#^\.\./|/\.\./#', $path) ? realpath($path) : $path; + } + protected function toDelete($name){ + $this->debug(3, "Scheduling file $name to delete on destruct."); + $this->toDeletes[] = $name; + } + protected function serveWebshot(){ + $this->debug(3, "Starting serveWebshot"); + $instr = "Please follow the instructions at http://code.google.com/p/timthumb/ to set your server up for taking website screenshots."; + if(! is_file(WEBSHOT_CUTYCAPT)){ + return $this->error("CutyCapt is not installed. $instr"); + } + if(! is_file(WEBSHOT_XVFB)){ + return $this->Error("Xvfb is not installed. $instr"); + } + $cuty = WEBSHOT_CUTYCAPT; + $xv = WEBSHOT_XVFB; + $screenX = WEBSHOT_SCREEN_X; + $screenY = WEBSHOT_SCREEN_Y; + $colDepth = WEBSHOT_COLOR_DEPTH; + $format = WEBSHOT_IMAGE_FORMAT; + $timeout = WEBSHOT_TIMEOUT * 1000; + $ua = WEBSHOT_USER_AGENT; + $jsOn = WEBSHOT_JAVASCRIPT_ON ? 'on' : 'off'; + $javaOn = WEBSHOT_JAVA_ON ? 'on' : 'off'; + $pluginsOn = WEBSHOT_PLUGINS_ON ? 'on' : 'off'; + $proxy = WEBSHOT_PROXY ? ' --http-proxy=' . WEBSHOT_PROXY : ''; + $tempfile = tempnam($this->cacheDirectory, 'timthumb_webshot'); + $url = $this->src; + if(! preg_match('/^https?:\/\/[a-zA-Z0-9\.\-]+/i', $url)){ + return $this->error("Invalid URL supplied."); + } + $url = preg_replace('/[^A-Za-z0-9\-\.\_:\/\?\&\+\;\=]+/', '', $url); //RFC 3986 plus ()$ chars to prevent exploit below. Plus the following are also removed: @*!~#[]', + // 2014 update by Mark Maunder: This exploit: http://cxsecurity.com/issue/WLB-2014060134 + // uses the $(command) shell execution syntax to execute arbitrary shell commands as the web server user. + // So we're now filtering out the characters: '$', '(' and ')' in the above regex to avoid this. + // We are also filtering out chars rarely used in URLs but legal accoring to the URL RFC which might be exploitable. These include: @*!~#[]', + // We're doing this because we're passing this URL to the shell and need to make very sure it's not going to execute arbitrary commands. + if(WEBSHOT_XVFB_RUNNING){ + putenv('DISPLAY=:100.0'); + $command = "$cuty $proxy --max-wait=$timeout --user-agent=\"$ua\" --javascript=$jsOn --java=$javaOn --plugins=$pluginsOn --js-can-open-windows=off --url=\"$url\" --out-format=$format --out=$tempfile"; + } else { + $command = "$xv --server-args=\"-screen 0, {$screenX}x{$screenY}x{$colDepth}\" $cuty $proxy --max-wait=$timeout --user-agent=\"$ua\" --javascript=$jsOn --java=$javaOn --plugins=$pluginsOn --js-can-open-windows=off --url=\"$url\" --out-format=$format --out=$tempfile"; + } + $this->debug(3, "Executing command: $command"); + $out = `$command`; + $this->debug(3, "Received output: $out"); + if(! is_file($tempfile)){ + $this->set404(); + return $this->error("The command to create a thumbnail failed."); + } + $this->cropTop = true; + if($this->processImageAndWriteToCache($tempfile)){ + $this->debug(3, "Image processed succesfully. Serving from cache"); + return $this->serveCacheFile(); + } else { + return false; + } + } + protected function serveExternalImage(){ + if(! preg_match('/^https?:\/\/[a-zA-Z0-9\-\.]+/i', $this->src)){ + $this->error("Invalid URL supplied."); + return false; + } + $tempfile = tempnam($this->cacheDirectory, 'timthumb'); + $this->debug(3, "Fetching external image into temporary file $tempfile"); + $this->toDelete($tempfile); + #fetch file here + if(! $this->getURL($this->src, $tempfile)){ + @unlink($this->cachefile); + touch($this->cachefile); + $this->debug(3, "Error fetching URL: " . $this->lastURLError); + $this->error("Error reading the URL you specified from remote host." . $this->lastURLError); + return false; + } + + $mimeType = $this->getMimeType($tempfile); + if(! preg_match("/^image\/(?:jpg|jpeg|gif|png)$/i", $mimeType)){ + $this->debug(3, "Remote file has invalid mime type: $mimeType"); + @unlink($this->cachefile); + touch($this->cachefile); + $this->error("The remote file is not a valid image. Mimetype = '" . $mimeType . "'" . $tempfile); + return false; + } + if($this->processImageAndWriteToCache($tempfile)){ + $this->debug(3, "Image processed succesfully. Serving from cache"); + return $this->serveCacheFile(); + } else { + return false; + } + } + public static function curlWrite($h, $d){ + fwrite(self::$curlFH, $d); + self::$curlDataWritten += strlen($d); + if(self::$curlDataWritten > MAX_FILE_SIZE){ + return 0; + } else { + return strlen($d); + } + } + protected function serveCacheFile(){ + $this->debug(3, "Serving {$this->cachefile}"); + if(! is_file($this->cachefile)){ + $this->error("serveCacheFile called in timthumb but we couldn't find the cached file."); + return false; + } + $fp = fopen($this->cachefile, 'rb'); + if(! $fp){ return $this->error("Could not open cachefile."); } + fseek($fp, strlen($this->filePrependSecurityBlock), SEEK_SET); + $imgType = fread($fp, 3); + fseek($fp, 3, SEEK_CUR); + if(ftell($fp) != strlen($this->filePrependSecurityBlock) + 6){ + @unlink($this->cachefile); + return $this->error("The cached image file seems to be corrupt."); + } + $imageDataSize = filesize($this->cachefile) - (strlen($this->filePrependSecurityBlock) + 6); + $this->sendImageHeaders($imgType, $imageDataSize); + $bytesSent = @fpassthru($fp); + fclose($fp); + if($bytesSent > 0){ + return true; + } + $content = file_get_contents ($this->cachefile); + if ($content != FALSE) { + $content = substr($content, strlen($this->filePrependSecurityBlock) + 6); + echo $content; + $this->debug(3, "Served using file_get_contents and echo"); + return true; + } else { + $this->error("Cache file could not be loaded."); + return false; + } + } + protected function sendImageHeaders($mimeType, $dataSize){ + if(! preg_match('/^image\//i', $mimeType)){ + $mimeType = 'image/' . $mimeType; + } + if(strtolower($mimeType) == 'image/jpg'){ + $mimeType = 'image/jpeg'; + } + $gmdate_expires = gmdate ('D, d M Y H:i:s', strtotime ('now +10 days')) . ' GMT'; + $gmdate_modified = gmdate ('D, d M Y H:i:s') . ' GMT'; + // send content headers then display image + header ('Content-Type: ' . $mimeType); + header ('Accept-Ranges: none'); //Changed this because we don't accept range requests + header ('Last-Modified: ' . $gmdate_modified); + header ('Content-Length: ' . $dataSize); + if(BROWSER_CACHE_DISABLE){ + $this->debug(3, "Browser cache is disabled so setting non-caching headers."); + header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); + header("Pragma: no-cache"); + header('Expires: ' . gmdate ('D, d M Y H:i:s', time())); + } else { + $this->debug(3, "Browser caching is enabled"); + header('Cache-Control: max-age=' . BROWSER_CACHE_MAX_AGE . ', must-revalidate'); + header('Expires: ' . $gmdate_expires); + } + return true; + } + protected function securityChecks(){ + } + protected function param($property, $default = ''){ + if (isset ($_GET[$property])) { + return $_GET[$property]; + } else { + return $default; + } + } + protected function openImage($mimeType, $src){ + switch ($mimeType) { + case 'image/jpeg': + $image = imagecreatefromjpeg ($src); + break; + + case 'image/png': + $image = imagecreatefrompng ($src); + imagealphablending( $image, true ); + imagesavealpha( $image, true ); + break; + + case 'image/gif': + $image = imagecreatefromgif ($src); + break; + + default: + $this->error("Unrecognised mimeType"); + } + + return $image; + } + protected function getIP(){ + $rem = @$_SERVER["REMOTE_ADDR"]; + $ff = @$_SERVER["HTTP_X_FORWARDED_FOR"]; + $ci = @$_SERVER["HTTP_CLIENT_IP"]; + if(preg_match('/^(?:192\.168|172\.16|10\.|127\.)/', $rem)){ + if($ff){ return $ff; } + if($ci){ return $ci; } + return $rem; + } else { + if($rem){ return $rem; } + if($ff){ return $ff; } + if($ci){ return $ci; } + return "UNKNOWN"; + } + } + protected function debug($level, $msg){ + if(DEBUG_ON && $level <= DEBUG_LEVEL){ + $execTime = sprintf('%.6f', microtime(true) - $this->startTime); + $tick = sprintf('%.6f', 0); + if($this->lastBenchTime > 0){ + $tick = sprintf('%.6f', microtime(true) - $this->lastBenchTime); + } + $this->lastBenchTime = microtime(true); + error_log("TimThumb Debug line " . __LINE__ . " [$execTime : $tick]: $msg"); + } + } + protected function sanityFail($msg){ + return $this->error("There is a problem in the timthumb code. Message: Please report this error at <a href='http://code.google.com/p/timthumb/issues/list'>timthumb's bug tracking page</a>: $msg"); + } + protected function getMimeType($file){ + $info = getimagesize($file); + if(is_array($info) && $info['mime']){ + return $info['mime']; + } + return ''; + } + protected function setMemoryLimit(){ + $inimem = ini_get('memory_limit'); + $inibytes = timthumb::returnBytes($inimem); + $ourbytes = timthumb::returnBytes(MEMORY_LIMIT); + if($inibytes < $ourbytes){ + ini_set ('memory_limit', MEMORY_LIMIT); + $this->debug(3, "Increased memory from $inimem to " . MEMORY_LIMIT); + } else { + $this->debug(3, "Not adjusting memory size because the current setting is " . $inimem . " and our size of " . MEMORY_LIMIT . " is smaller."); + } + } + protected static function returnBytes($size_str){ + switch (substr ($size_str, -1)) + { + case 'M': case 'm': return (int)$size_str * 1048576; + case 'K': case 'k': return (int)$size_str * 1024; + case 'G': case 'g': return (int)$size_str * 1073741824; + default: return $size_str; + } + } + + protected function getURL($url, $tempfile){ + $this->lastURLError = false; + $url = preg_replace('/ /', '%20', $url); + if(function_exists('curl_init')){ + $this->debug(3, "Curl is installed so using it to fetch URL."); + self::$curlFH = fopen($tempfile, 'w'); + if(! self::$curlFH){ + $this->error("Could not open $tempfile for writing."); + return false; + } + self::$curlDataWritten = 0; + $this->debug(3, "Fetching url with curl: $url"); + $curl = curl_init($url); + curl_setopt ($curl, CURLOPT_TIMEOUT, CURL_TIMEOUT); + curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"); + curl_setopt ($curl, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt ($curl, CURLOPT_HEADER, 0); + curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt ($curl, CURLOPT_WRITEFUNCTION, 'timthumb::curlWrite'); + @curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, true); + @curl_setopt ($curl, CURLOPT_MAXREDIRS, 10); + + $curlResult = curl_exec($curl); + fclose(self::$curlFH); + $httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE); + if($httpStatus == 404){ + $this->set404(); + } + if($httpStatus == 302){ + $this->error("External Image is Redirecting. Try alternate image url"); + return false; + } + if($curlResult){ + curl_close($curl); + return true; + } else { + $this->lastURLError = curl_error($curl); + curl_close($curl); + return false; + } + } else { + $img = @file_get_contents ($url); + if($img === false){ + $err = error_get_last(); + if(is_array($err) && $err['message']){ + $this->lastURLError = $err['message']; + } else { + $this->lastURLError = $err; + } + if(preg_match('/404/', $this->lastURLError)){ + $this->set404(); + } + + return false; + } + if(! file_put_contents($tempfile, $img)){ + $this->error("Could not write to $tempfile."); + return false; + } + return true; + } + + } + protected function serveImg($file){ + $s = getimagesize($file); + if(! ($s && $s['mime'])){ + return false; + } + header ('Content-Type: ' . $s['mime']); + header ('Content-Length: ' . filesize($file) ); + header ('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); + header ("Pragma: no-cache"); + $bytes = @readfile($file); + if($bytes > 0){ + return true; + } + $content = @file_get_contents ($file); + if ($content != FALSE){ + echo $content; + return true; + } + return false; + + } + protected function set404(){ + $this->is404 = true; + } + protected function is404(){ + return $this->is404; + } +}
\ No newline at end of file diff --git a/libs/Utils.php b/libs/Utils.php new file mode 100644 index 0000000..397448c --- /dev/null +++ b/libs/Utils.php @@ -0,0 +1,281 @@ +<?php +if (!defined('__TYPECHO_ROOT_DIR__')) exit; + +/** + * Utils.php + * 辅助工具 + * + * Author: Eltrac(BigCoke233) + * License: MIT + */ + +class Utils +{ + + /** + * 输出相对首页路由,本方法会自适应伪静态,用于动态文件 + */ + public static function index($path = '') + { + Helper::options()->index($path); + } + + /** + * 输出相对首页路径,本方法用于静态文件 + */ + public static function indexHome($path = '') + { + Helper::options()->siteUrl($path); + } + + /** + * 输出相对主题目录路径,用于静态文件 + */ + public static function indexTheme($path = '') + { + Helper::options()->themeUrl($path); + } + + /** + * 判断插件是否可用(存在且已激活) + */ + public static function hasPlugin($name) + { + $plugins = Typecho_Plugin::export(); + $plugins = $plugins['activated']; + return is_array($plugins) && array_key_exists($name, $plugins); + } + + /** + * 判断移动端请求 + */ + public static function isMobile() + { + if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])){ + return TRUE; + } + + if (isset ($_SERVER['HTTP_USER_AGENT'])) { + $clientkeywords = array ('mobile','nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap' + ); + if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))){ + return TRUE; + } + } + if (isset ($_SERVER['HTTP_ACCEPT'])){ + if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== FALSE) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === FALSE || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))){ + return TRUE; + } + } + return FALSE; + } + + /** + * 判定内容是否过时 + * + * @return array + */ + public static function isOutdated($archive) + { + date_default_timezone_set("Asia/Shanghai"); + $created = round((time()- $archive->created) / 3600 / 24); + $updated = round((time()- $archive->modified) / 3600 / 24); + return array("is" => $created > 90, + "created" => $created, + "updated" => $updated); + } + + /** + * 编辑界面添加内容 + */ + public static function addButton(){ + echo '<link rel="stylesheet" href="/usr/themes/Miracles/assets/css/setting.miracles.css" />'; + echo '<link rel="stylesheet" href="/usr/themes/Miracles/assets/css/owo.min.css" />'; + echo '<script src="/usr/themes/Miracles/assets/js/OwO.min.js"></script>'; + echo '<script src="/usr/themes/Miracles/assets/js/editor.js"></script>'; + echo '<style>#custom-field textarea{width:100%} + .OwO span{background:none!important;width:unset!important;height:unset!important} + .OwO .OwO-logo{ + z-index: unset!important; + } + .OwO .OwO-body .OwO-items{ + -webkit-overflow-scrolling: touch; + overflow-x: hidden; + } + .OwO .OwO-body .OwO-items-image .OwO-item{ + max-width:-moz-calc(20% - 10px); + max-width:-webkit-calc(20% - 10px); + max-width:calc(20% - 10px) + } + #wmd-owo-button:hover{ + background:transparent!important} + @media screen and (max-width:760px){ + .OwO .OwO-body .OwO-items-image .OwO-item{ + max-width:-moz-calc(25% - 10px); + max-width:-webkit-calc(25% - 10px); + max-width:calc(25% - 10px) + } + }</style>'; + } + + /** + * 自动生成引用 + */ + public static function addRequires($files,$type,$cdn,$custom) { + if ($cdn=='1'){ + $path = 'https://cdn.jsdelivr.net/gh/BigCoke233/miracles@'.themeVersion()."/assets/"; + } + elseif ($cdn=='2'){ + $path = 'https://raw.githack.com/BigCoke233/miracles/master/assets/'; + } + elseif ($cdn=='4'){ + $path = 'https://rawcdn.githack.com/BigCoke233/miracles/master/assets/'; + } + elseif ($cdn=='5'){ + $path = 'https://cdn.9jojo.cn/Miracles/'.themeVersion().'/'; + } + elseif ($cdn=='3'){ + $path = $custom; + }else{ + $path = Helper::options()->themeUrl("","Miracles/assets"); + } + foreach ($files as $file) { + if ($type == "js"){ + echo "<script src=".$path. $type."/".$file.".".$type."></script>"; + } + elseif ($type == "css"){ + echo "<link rel=\"stylesheet\" href=".$path. $type."/".$file.".".$type." />"; + } + } + } + + /** + * 自动生成懒加载图片 url + */ + public static function addLoadingImages($cdn, $loading_image, $type){ + if ($type=='normal'): + $loading = $loading_image; + elseif($type=='link'): + $loading = 'avatar'; + elseif($type=='owo'): + $loading = 'owo'; + endif; + + if ($cdn=='1' || $cdn=='6'){ + $path = 'https://cdn.jsdelivr.net/gh/BigCoke233/miracles@'.themeVersion()."/images/loading/".$loading.'.gif'; + } + elseif ($cdn=='2'){ + $path = 'https://raw.githack.com/BigCoke233/miracles/master/images/loading/'.$loading.'.gif'; + } + elseif ($cdn=='4'){ + $path = 'https://rawcdn.githack.com/BigCoke233/miracles/master/images/loading/'.$loading.'.gif'; + } + elseif ($cdn=='5'){ + //9jojo CDN 并未提供图片缓存 则换用 jsDelivr + $path = 'https://cdn.jsdelivr.net/gh/BigCoke233/miracles@'.themeVersion()."/images/loading/".$loading.'.gif'; + } + elseif ($cdn=='3'){ + $path = $custom; + }else{ + $path = Helper::options()->themeUrl("","Miracles/images/loading").$loading.'.gif'; + } + return $path; + } + + /** + * 缩略图 + */ + public static function postBanner($post){ + if($post->fields->banner && $post->fields->banner=!''): + $banner = $post->fields->banner; + else: + if($GLOBALS['miraclesOptions_randomBanner']==''){ + $banner = '/usr/themes/Miracles/images/postbg/'; + $banner .= srand(mb_strlen($post->title)); + $banner .= mt_rand(1,15).'.jpg'; + } + else{ + $banner_url = explode(',', $GLOBALS['miraclesOptions_randomBanner']); + $banner = $banner_url[mt_rand(0,count($banner_url)-1)]; + } + endif; + //使用 TimThumb 剪裁 + if($GLOBALS['miraclesIfTimThumb']=='on') { + if($GLOBALS['miraclesIfTimThumbSize']=='regular'){ + $banner_size = '&h=336&w=564'; + } + elseif($GLOBALS['miraclesIfTimThumbSize']=='big'){ + $banner_size = '&h=420&w=705'; + } + elseif($GLOBALS['miraclesIfTimThumbSize']=='large'){ + $banner_size = '&h=504&w=846'; + } + elseif($GLOBALS['miraclesIfTimThumbSize']=='huge'){ + $banner_size = '&h=560&w=940'; + } + else{ + //避免有憨憨打错单词,当成 big 来算 + $banner_size = '&h=420&w=705'; + } + $banner_url = '/usr/themes/Miracles/libs/TimThumb.php'; + $banner = $banner_url.'?src='.$banner.$banner_size; + } + //不知道为什么会有奇怪的空格,所以这里用暴力的方法去掉 + $banner = trim($banner); + + echo $banner; + } + + /** + * 压缩 HTML + * thanks https://www.jiangxu.site/concerning-how-to-typecho-integrated-html-compression.html + */ + public static function compressHtml($html_source) { + $chunks = preg_split('/(<!--<nocompress>-->.*?<!--<\/nocompress>-->|<nocompress>.*?<\/nocompress>|<pre.*?\/pre>|<textarea.*?\/textarea>|<script.*?\/script>)/msi', $html_source, -1, PREG_SPLIT_DELIM_CAPTURE); + $compress = ''; + foreach ($chunks as $c) { + if (strtolower(substr($c, 0, 19)) == '<!--<nocompress>-->') { + $c = substr($c, 19, strlen($c) - 19 - 20); + $compress .= $c; + continue; + } else if (strtolower(substr($c, 0, 12)) == '<nocompress>') { + $c = substr($c, 12, strlen($c) - 12 - 13); + $compress .= $c; + continue; + } else if (strtolower(substr($c, 0, 4)) == '<pre' || strtolower(substr($c, 0, 9)) == '<textarea') { + $compress .= $c; + continue; + } else if (strtolower(substr($c, 0, 7)) == '<script' && strpos($c, '//') != false && (strpos($c, "\r") !== false || strpos($c, "\n") !== false)) { + $tmps = preg_split('/(\r|\n)/ms', $c, -1, PREG_SPLIT_NO_EMPTY); + $c = ''; + foreach ($tmps as $tmp) { + if (strpos($tmp, '//') !== false) { + if (substr(trim($tmp), 0, 2) == '//') { + continue; + } + $chars = preg_split('//', $tmp, -1, PREG_SPLIT_NO_EMPTY); + $is_quot = $is_apos = false; + foreach ($chars as $key => $char) { + if ($char == '"' && $chars[$key - 1] != '\\' && !$is_apos) { + $is_quot = !$is_quot; + } else if ($char == '\'' && $chars[$key - 1] != '\\' && !$is_quot) { + $is_apos = !$is_apos; + } else if ($char == '/' && $chars[$key + 1] == '/' && !$is_quot && !$is_apos) { + $tmp = substr($tmp, 0, $key); + break; + } + } + } + $c .= $tmp; + } + } + $c = preg_replace('/[\\n\\r\\t]+/', ' ', $c); + $c = preg_replace('/\\s{2,}/', ' ', $c); + $c = preg_replace('/>\\s</', '> <', $c); + $c = preg_replace('/\\/\\*.*?\\*\\//i', '', $c); + $c = preg_replace('/<!--[^!]*-->/', '', $c); + $compress .= $c; + } + return $compress; + } +}
\ No newline at end of file diff --git a/libs/lang/en-us.php b/libs/lang/en-us.php new file mode 100644 index 0000000..e908ff4 --- /dev/null +++ b/libs/lang/en-us.php @@ -0,0 +1,82 @@ +<?php +$GLOBALS['langInfo'] = array( + "name" => "English", + "author" => "Eltrac", + "last_update" => "2020\/5\/3" +); +$GLOBALS['postTexts'] = array( + "read_more" => "Read More", + "sort_title" => "Category: %s", + "post_time" => "Published on %s", + "post_views" => "Viewd by %s people", + "post_anchor" => "Paragraph Link", + "post_share" => "Share by: ", + "post_tag" => "None.", + "post_timeAlert_1" => "This articles is published %s days ago and ", + "post_timeAlert_2" => "last updated %s days ago, some information may be out of date." +); +$GLOBALS['commentFormTexts'] = array( + "nameInput" => "Name*", + "emailInput" => "Email*", + "urlInput" => "http(s):\/\/", + "submit" => "Comment", + "submitLoading" => "Posting..." +); +$GLOBALS['commentListTexts'] = array( + "byAuthor" => "Author", + "commentNum" => "There're %s comments", + "commentNumNone" => "Not any comments", + "commentHidden" => "The author has hidden the comment list, you won't see your comment, either.", + "commentClosed" => "The author has turned the comment function off.", + "commentWaiting" => "Your comment is awaiting moderation!", + "commentStatus" => "Hello, ", + "commentLogout" => "Sign out" +); +$GLOBALS['footerTexts'] = array( + "startTime" => "The site has built for", + "startTimeDay" => " days ", + "startTimeHour" => "h ", + "startTimeMin" => "min ", + "startTimeSec" => "s ", + "startTimeYear" => " years " +); +$GLOBALS['headerTexts'] = array( + "loginAlready" => "You've already loged in", + "loginAlreadyInfo" => "But still nice to see you, %s~", + "loginAdminEntrance" => "Enter the Dashboard", + "loginTitle" => "Login", + "loginUsername" => "Username", + "loginPassword" => "Password", + "loginSubmit" => "login", + "navTitle" => "Navigation", + "drawerHome" => "Home" +); +$GLOBALS['archivePageTexts'] = array( + "archiveTagTitle" => "Tags", + "archivePostTitle" => "Posts", + "archiveCategoryTitle" => "Category", + "archiveTimeYear" => "", + "archiveYearTotal" => "%s articles in total", + "archiveStart" => "Everything started on %s" +); +$GLOBALS['archivesTitles'] = array( + 'category' => _t('Posts with category %s'), + 'search' => _t('Posts with keyword %s'), + 'tag' => _t('Posts with tag %s'), + 'author' => _t('Posts by %s') +); +$GLOBALS['aboutPageTexts'] = array( + "aboutShareGithub" => "GitHub", + "aboutShareQQ" => "QQ", + "aboutShareB" => "Bilibili", + "aboutShareEmail" => "E-mail" +); +$GLOBALS['sayingPageTexts'] = array( + "sayingPlaceholder" => "Anything interesting happening?", + "sayingSubmit" => "Publish" +); +$GLOBALS['otherTexts'] = array( + "copyrightAlertTitle" => "Copyright", + "copyrightAlert" => "The content of the article is original unless otherwise stated. If you need to reproduce this article, remember to link to the original document (%s).The reproduction of any content is not allowed for modification, interpretation or commercial use, please respect the copyright.", + "goTop" => "Go Top" +);
\ No newline at end of file diff --git a/libs/lang/moe.php b/libs/lang/moe.php new file mode 100644 index 0000000..fbbc5a2 --- /dev/null +++ b/libs/lang/moe.php @@ -0,0 +1,93 @@ +<?php +//语言包信息 +$GLOBALS['langInfo'] = array( + "name" => "萌语", + "author" => "Eltrac", + "last_update" => "2020\/5\/3" +); +//文章 +$GLOBALS['postTexts'] = array( + "read_more" => "戳进去康", + "sort_title" => "垃圾分类:这是 %s 垃圾", + "post_time" => "在 %s 的时候粗生的", + "post_views" => "被偷窥 %s 次惹", + "post_anchor" => "戳我!戳我!", + "post_share" => "种草给:", + "post_tag" => "这个人好懒哦,连标签都不写的", + "post_timeAlert_1" => "这篇文是在 %s 天前水的,", + "post_timeAlert_2" => "憨憨作者 %s 天前改了下,估计不能看了。" +); +//评论表单 +$GLOBALS['commentFormTexts'] = array( + "nameInput" => "你叫啥名啊*", + "emailInput" => "你的邮箱在哪哇*", + "urlInput" => "http(s):\/\/", + "submit" => "发粗去", + "submitLoading" => "在发了在发了" +); +//评论列表 +$GLOBALS['commentListTexts'] = array( + "byAuthor" => "傻子", + "commentNum" => "%s 条咸鱼躺在这", + "commentNumNone" => "连一条咸鱼都没有", + "commentHidden" => "评论列表被博主吃了!你看不到评论了!", + "commentClosed" => "评论功能被博主吃了!你不能评论了!", + "commentWaiting" => "博主正在检查你有没有 ghs", + "commentStatus" => "你素 ", + "commentLogout" => "我不做人了!" +); +//页脚 +$GLOBALS['footerTexts'] = array( + "startTime" => "苟延残喘了", + "startTimeDay" => " 天 ", + "startTimeHour" => " 小时 ", + "startTimeMin" => " 分 ", + "startTimeSec" => " 秒 ", + "startTimeYear" => " 年 " +); +//页眉 +$GLOBALS['headerTexts'] = array( + "loginAlready" => "登陆了,快爪巴", + "loginAlreadyInfo" => "你素 %s!奶思吐蜜特由", + "loginAdminEntrance" => "去后宫", + "loginTitle" => "快点进来", + "loginUsername" => "你哒名字", + "loginPassword" => "密码!我不会看的 qwq", + "loginSubmit" => "爪巴进去", + "navTitle" => "要去哪里", + "drawerHome" => "回家" +); +//归档页面 +$GLOBALS['archivePageTexts'] = array( + "archiveTagTitle" => "博主贴的标签", + "archiveCategoryTitle" => "乱分的类", + "archivePostTitle" => "博主写的水文", + "archiveTimeYear" => "年的水", + "archiveYearTotal" => "这年水了 %s 篇文", + "archiveStart" => "从 %s 开始水文" +); +//检索 +$GLOBALS['archivesTitles'] = array( + 'category' => _t('分类 %s 下的水文'), + 'search' => _t('搜 %s 粗来的水文'), + 'tag' => _t('标签 %s 下的水文'), + 'author' => _t('%s 这个憨憨水的文章') +); +//关于页面 +$GLOBALS['aboutPageTexts'] = array( + "aboutShareGithub" => "GayHub", + "aboutShareQQ" => "疼讯扣扣", + "aboutShareB" => "某破站", + "aboutShareEmail" => "是邮箱呢!" +); +//说说页面 +$GLOBALS['sayingPageTexts'] = array( + "sayingPlaceholder" => "嘤嘤嘤 QAQ", + "sayingSubmit" => "发粗去" +); +//其他 +$GLOBALS['otherTexts'] = array( + "copyrightAlertTitle" => "水文也有版权!", + "copyrightAlert" => "文章内容若未经过特别声明均为原创内容,转载需要注明原文作者和本文的链接:%s。原文中的任何内容不允许转载者进行修改、演绎以及一些商业用途,不尊重版权的憨憨会被大灰狼次掉。", + "goTop" => "爬到上面" +);
\ No newline at end of file diff --git a/libs/lang/zh-cn.php b/libs/lang/zh-cn.php new file mode 100644 index 0000000..c4d4220 --- /dev/null +++ b/libs/lang/zh-cn.php @@ -0,0 +1,92 @@ +<?php +//语言包信息 +$GLOBALS['langInfo'] = array( + "name" => "简体中文", + "author" => "Eltrac", + "last_update" => "2020\/7\/14" +); +//文章 +$GLOBALS['postTexts'] = array( + "read_more" => "阅读全文", + "sort_title" => "文章分类:%s", + "post_time" => "该文章发布于 %s", + "post_views" => "该文章被浏览 %s 次", + "post_anchor" => "章节链接", + "post_share" => "分享至:", + "post_tag" => "这人还没有写标签哦~", + "post_timeAlert_1" => "本文编写于 %s 天前,", + "post_timeAlert_2" => "最后修改于 %s 天前,其中某些信息可能已经过时。" +); +//评论表单 +$GLOBALS['commentFormTexts'] = array( + "nameInput" => "称呼*", + "emailInput" => "邮箱*", + "urlInput" => "http(s):\/\/", + "submit" => "评论", + "submitLoading" => "提交中..." +); +//评论列表 +$GLOBALS['commentListTexts'] = array( + "byAuthor" => "博主", + "commentNum" => "已有 %s 条评论", + "commentNumNone" => "暂无评论", + "commentHidden" => "博主已关闭本页面的评论显示,您评论后将不会看到您的评论内容", + "commentClosed" => "博主已关闭本页面的评论功能", + "commentWaiting" => "您的评论正在等待审核!", + "commentStatus" => "登陆身份:", + "commentLogout" => "登出" +); +//页脚 +$GLOBALS['footerTexts'] = array( + "startTime" => "记录已延续了", + "startTimeDay" => " 天 ", + "startTimeHour" => " 小时 ", + "startTimeMin" => " 分 ", + "startTimeSec" => " 秒 ", + "startTimeYear" => " 年 " +); +//页眉 +$GLOBALS['headerTexts'] = array( + "loginAlready" => "你已经登陆了", + "loginAlreadyInfo" => "不过康纳很乐意再次见到 %s 呢~", + "loginAdminEntrance" => "进入后台", + "loginTitle" => "登录后台", + "loginUsername" => "请输入用户名", + "loginPassword" => "请输入密码", + "loginSubmit" => "登录", + "navTitle" => "页面导航", + "drawerHome" => "首页" +); +//归档页面 +$GLOBALS['archivePageTexts'] = array( + "archiveTagTitle" => "文章标签", + "archivePostTitle" => "文章归档", + "archiveCategoryTitle" => "文章分类", + "archiveTimeYear" => "年", + "archiveYearTotal" => "共 %s 篇文章", + "archiveStart" => "一切开始于 %s" +); +//检索 +$GLOBALS['archivesTitles'] = array( + 'category' => _t('分类 %s 下的文章'), + 'search' => _t('包含关键字 %s 的文章'), + 'tag' => _t('标签 %s 下的文章'), + 'author' => _t('%s 发布的文章') +); +//关于页面 +$GLOBALS['aboutPageTexts'] = array( + "aboutShareGithub" => "GitHub", + "aboutShareQQ" => "QQ", + "aboutShareB" => "哔哩哔哩", + "aboutShareEmail" => "电子邮件" +); +//说说页面 +$GLOBALS['sayingPageTexts'] = array( + "sayingPlaceholder" => "有什么有趣的事情吗?", + "sayingSubmit" => "发表新鲜事" +); +//其他 +$GLOBALS['otherTexts'] = array( + "copyrightAlert" => "文章内容若未经过特别声明均为原创内容,转载需要注明原文作者和本文的链接:%s。原文中的任何内容不允许转载者进行修改、演绎以及一些商业用途,请尊重版权。", + "goTop" => "返回顶部" +);
\ No newline at end of file diff --git a/libs/lang/zh-tw.php b/libs/lang/zh-tw.php new file mode 100644 index 0000000..f23580c --- /dev/null +++ b/libs/lang/zh-tw.php @@ -0,0 +1,93 @@ +<?php +//語言包信息 +$GLOBALS['langInfo'] = array( + "name" => "簡體中文", + "author" => "Eltrac", + "last_update" => "2020\/5\/3" +); +//文章 +$GLOBALS['postTexts'] = array( + "read_more" => "閱讀全文", + "sort_title" => "文章分類:%s", + "post_time" => "該文章發佈於 %s", + "post_views" => "該文章被瀏覽 %s 次", + "post_anchor" => "章節鏈接", + "post_share" => "分享至:", + "post_tag" => "這人還沒有寫標籤哦~", + "post_timeAlert_1" => "本文編寫於 %s 天前,", + "post_timeAlert_2" => "最後修改於 %s 天前,其中某些信息可能已經過時。" +); +//評論表單 +$GLOBALS['commentFormTexts'] = array( + "nameInput" => "稱呼 *", + "emailInput" => "郵箱 *", + "urlInput" => "http(s):\/\/", + "submit" => "評論", + "submitLoading" => "提交中..." +); +//評論列表 +$GLOBALS['commentListTexts'] = array( + "byAuthor" => "博主", + "commentNum" => "已有 %s 條評論", + "commentNumNone" => "暫無評論", + "commentHidden" => "博主已關閉本頁面的評論顯示,您評論後將不會看到您的評論內容", + "commentClosed" => "博主已關閉本頁面的評論功能", + "commentWaiting" => "您的評論正在等待審核!", + "commentStatus" => "登陸身份:", + "commentLogout" => "登出" +); +//頁腳 +$GLOBALS['footerTexts'] = array( + "startTime" => "記錄已延續了", + "startTimeDay" => " 天 ", + "startTimeHour" => " 小時 ", + "startTimeMin" => " 分 ", + "startTimeSec" => " 秒 ", + "startTimeYear" => " 年 " +); +//頁眉 +$GLOBALS['headerTexts'] = array( + "loginAlready" => "你已經登陸了", + "loginAlreadyInfo" => "不過康納很樂意再次見到 %s 呢~", + "loginAdminEntrance" => "進入後台", + "loginTitle" => "登錄後台", + "loginUsername" => "請輸入用戶名", + "loginPassword" => "請輸入密碼", + "loginSubmit" => "登錄", + "navTitle" => "頁面導航", + "drawerHome" => "首頁" +); +//歸檔頁面 +$GLOBALS['archivePageTexts'] = array( + "archiveTagTitle" => "文章標籤", + "archivePostTitle" => "文章歸檔", + "archiveCategoryTitle" => "文章分類", + "archiveTimeYear" => "年", + "archiveYearTotal" => "共 %s 篇文章", + "archiveStart" => "壹切開始於 %s" +); +//检索 +$GLOBALS['archivesTitles'] = array( + 'category' => _t('分類 %s 下的文章'), + 'search' => _t('包含關鍵字 %s 的文章'), + 'tag' => _t('標簽 %s 下的文章'), + 'author' => _t('%s 發布的文章') +); +//關於頁面 +$GLOBALS['aboutPageTexts'] = array( + "aboutShareGithub" => "GitHub", + "aboutShareQQ" => "QQ", + "aboutShareB" => "Bilibili", + "aboutShareEmail" => "E-mail" +); +//說說頁面 +$GLOBALS['sayingPageTexts'] = array( + "sayingPlaceholder" => "Anything interesting happening?", + "sayingSubmit" => "發表新鮮事" +); +//其他 +$GLOBALS['otherTexts'] = array( + "copyrightAlertTitle" => "版權", + "copyrightAlert" => "文章內容若未經過特別聲明均為原創內容,轉載需要註明原文作者和本文的鏈接:%s。原文中的任何內容不允許轉載者進行修改、演繹以及壹些商業用途,請尊重版權。", + "goTop" => "返回頂部" +);
\ No newline at end of file diff --git a/page.php b/page.php new file mode 100644 index 0000000..147cd46 --- /dev/null +++ b/page.php @@ -0,0 +1,13 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +$this->need('includes/head.php'); +$this->need('includes/header.php'); +?> + <main class="main-container container" role="main"> + <div class="post-body"><!-- 页面内容 --> + <div class="post-content page-content"> + <?php $this->content(); ?> + </div> + </div> +<?php $this->need('includes/comments.php'); ?> + </main> +<?php $this->need('includes/footer.php'); ?>
\ No newline at end of file diff --git a/pagefile.php b/pagefile.php new file mode 100644 index 0000000..86d3401 --- /dev/null +++ b/pagefile.php @@ -0,0 +1,54 @@ +<?php +/** + * 归档页面 + * + * @package custom + */ +if (!defined('__TYPECHO_ROOT_DIR__')) exit; +$this->need('includes/head.php'); +$_SESSION["isPageArchive"] = true; //归档页面标识 +$this->need('includes/header.php'); +?> + <main class="main-container container" role="main"> + <div class="post-body"> + <div class="post-content page-content"> + <?php $this->widget('Widget_Metas_Tag_Cloud', 'sort=mid&ignoreZeroCount=1&desc=0&limit=30')->to($tags); ?> + <h2><?php gtecho('archivePageTexts','archiveTagTitle'); ?></h2> + <?php if($tags->have()): ?> + <ul class="tags-list"> + <?php while ($tags->next()): ?> + <li class="tags-item"><a href="<?php $tags->permalink(); ?>" rel="tag" class="no-line" title="有 <?php $tags->count(); ?> 篇文章在这个标签下"><?php $tags->name(); ?></a></li> + <?php endwhile; ?> + </ul> + <?php endif; ?> + + <h2><?php gtecho('archivePageTexts','archiveCategoryTitle'); ?></h2> + <?php $this->widget('Widget_Metas_Category_List')->to($category); ?> + <ul class="tags-list category"> + <?php while($category->next()): ?> + <li class="tags-item"><a class="no-line" href="<?php $category->permalink(); ?>" title="<?php $category->name(); ?>"><?php $category->name(); ?></a></li> + <?php endwhile; ?> + </ul> + + <h2><?php gtecho('archivePageTexts','archivePostTitle'); ?></h2> + <ul class="archives-list"><?php + $archives = Contents::archives($this); + $number = 0; + foreach($archives as $year => $posts) { + $detailsOpen = ($number === 0) ? ' open' : NULL; + echo '<details'.$detailsOpen.'>'; + echo '<summary>'.$year.' '.gt('archivePageTexts','archiveTimeYear').'<small class="archives-count">'.gta('archivePageTexts','archiveYearTotal',count($posts)).'</small></summary>'; + foreach($posts as $created => $post) { + echo '<li><a href="'.$post['permalink'].'" class="no-line"> + <span class="archives-date">'.date('m-d', $created).'</span> + '.$post['title'].' + </a></li>'; + } + echo '</details>'; + $number++; + }?> + </ul> + </div> + </div> + </main> +<?php $this->need('includes/footer.php'); ?>
\ No newline at end of file diff --git a/post.php b/post.php new file mode 100644 index 0000000..69a56b7 --- /dev/null +++ b/post.php @@ -0,0 +1,42 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +$this->need('includes/head.php'); +$this->need('includes/header.php'); +?> + <main class="main-container container" role="main"> + <div class="post-body"> + <div class="post-content" role="article" id="post-content"><!-- Post Content --> + <?php $postCheck = Utils::isOutdated($this); if($postCheck["is"] && $this->is('post')): ?> + <div class="tip red" id="out-date-alert"> + <div class="container-fluid"><div class="row"> + <div class="col-1 tip-icon"><i class="iconfont icon-info"></i></div> + <div class="col-11 tip-content"><?php gtaecho('postTexts','post_timeAlert_1',$postCheck["created"]); gtaecho('postTexts','post_timeAlert_2',$postCheck["updated"]); ?></div> + </div></div> + </div> + <?php endif; ?> + <?php if($this->options->ifShowRTA!=0): ?> + <div class="tip blue" id="reading-time-alert"> + <div class="container-fluid"> + <div class="row"> + <div class="col-1 tip-icon"><i class="iconfont icon-info"></i></div> + <div class="col-11 tip-content" id="readTip"></div> + </div></div> + </div> + <?php endif;?> + <?php $this->content(); ?> + </div> + <div class="post-qr" id="post-qr"> + </div> + <div class="post-footer"><!-- Post Footer --> + <div class="post-share"><?php gtecho('postTexts','post_share'); ?> + <button class="social-share qrcode" id="post-qrcode-btn"><i class="iconfont icon-qr_code"></i></button> + <a class="social-share qq hint--bottom" target="_blank" href="https://connect.qq.com/widget/shareqq/index.html?url=<?php $this->permalink() ?>&title=<?php $this->title() ?>&summary=<?php $this->excerpt(100); ?>" data-tooltip="QQ"><i class="iconfont icon-qq1-copy"></i></a> + <a class="social-share weibo hint--bottom" target="_blank" href="http://service.weibo.com/share/share.php?url=<?php $this->permalink() ?>/&appkey=<?php $this->options->title(); ?>/&title=<?php $this->title() ?>" data-tooltip="Weibo"><i class="iconfont icon-weibo-copy"></i></a> + <a class="social-share twitter hint--bottom" target="_blank" href="https://twitter.com/intent/tweet?text=<?php $this->excerpt(100); ?>&url=<?php $this->permalink() ?>" data-tooltip="Twitter"><i class="iconfont icon-twitter-copy"></i></a> + <a class="social-share copyright" onclick="alertify.alert('<?php gtecho('otherTexts','copyrightAlertTitle'); ?>', '<?php gtaecho('otherTexts','copyrightAlert', $this->permalink); ?>')"><i class="iconfont icon-info1"></i></a> + </div> + <span class="post-tags"><i class="iconfont icon-tags"></i> <?php $this->tags(' ', true, gt('postTexts','post_tag')); ?></span> + </div> + </div> +<?php $this->need('includes/comments.php'); ?> + </main> +<?php $this->need('includes/footer.php'); ?> diff --git a/saying.php b/saying.php new file mode 100644 index 0000000..3fcf651 --- /dev/null +++ b/saying.php @@ -0,0 +1,69 @@ +<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; +/** + * 说说页面 + * + * @package custom + */ +$this->need('includes/head.php'); +$this->need('includes/header.php'); +function threadedComments($comments, $options) { + $commentClass = ''; + if ($comments->authorId) { + if ($comments->authorId == $comments->ownerId) { + $commentClass .= ' comment-by-author'; //如果是文章作者的评论添加 .comment-by-author 样式 + } else { + $commentClass .= ' comment-by-user'; //如果是评论作者的添加 .comment-by-user 样式 + } + } + $commentLevelClass = $comments->_levels > 0 ? ' comment-child' : ' comment-parent'; //评论层数大于0为子级,否则是父级 +?> +<div id="li-<?php $comments->theId(); ?>" class="comment-body<?php +if ($comments->_levels > 0) { + echo ' comment-child'; + $comments->levelsAlt(' comment-level-odd', ' comment-level-even'); +} else { + echo ' comment-parent'; +} +$comments->alt(' comment-odd', ' comment-even'); +echo $commentClass; +?>"> + <div class="saying-item"> + <div class="saying-inner saying-header"> + <p class="saying-meta"> + <?php $comments->gravatar('100', ''); ?><span class="saying-author"><?php $comments->author(); ?></span><br> + <?php $comments->date('Y-m-d H:i'); ?> + </p> + </div> + <div class="saying-hr"></div> + <div class="saying-inner saying-middle"> + <?php echo Contents::parseEmo($comments->content); ?> + </div> + </div> +</div> +<?php } ?> + <main class="main-container container"> + <div class="saying-body"> + <?php if($this->user->hasLogin()): ?> + <form method="post" action="<?php $this->commentUrl() ?>" id="comment-form" class="saying-form" role="form"> + <p> + <textarea rows="8" cols="50" name="text" id="textarea" placeholder="<?php gtecho('sayingPageTexts','sayingPlaceholder'); ?>" class="OwO-textarea comment-textarea textarea" required ><?php $this->remember('text'); ?></textarea> + </p> + <p> + <button type="submit" class="comment-submit submit"><?php gtecho('sayingPageTexts','sayingSubmit'); ?></button> + </p> + </form> + <br> + <?php endif; ?> + <?php $this->comments()->to($comments); ?> + <?php $comments->listComments(array( + 'before' => '<div class="comment-list">', + 'after' => '</div>', + 'avatarSize' => 200, + 'dateFormat' => 'Y-m-d H:i' + )); ?> + <div class="comment-pagenav"> + <?php $comments->pageNav('<i class="iconfont icon-chevron-left comment-pagenav-icon"></i>', '<i class="iconfont icon-chevron-right comment-pagenav-icon"></i>'); ?> + </div> + </div> + </main> +<?php $this->need('includes/footer.php'); ?>
\ No newline at end of file diff --git a/screenshot.png b/screenshot.png Binary files differnew file mode 100644 index 0000000..d8697bc --- /dev/null +++ b/screenshot.png diff --git a/themeConfig.php b/themeConfig.php new file mode 100644 index 0000000..bb0285e --- /dev/null +++ b/themeConfig.php @@ -0,0 +1,56 @@ +<?php +/** + * ThemeConfig.php + * 主题高级设置 + * + * Notice: 这些都是普通用户不常用的设置项,故单独放在这里 + * 通常 'on' 表示开启;'off' 则表示关闭 + */ + +/* 语言 */ +$GLOBALS['miraclesLang'] = 'zh-cn'; //在这里写入语言文件的名字(如 zh-cn.php 就是 zh-cn) + +/* 字体 */ + +//主题字体 CDN +$GLOBALS['miraclesFontCDN'] = array( + 'if' => 'on', //是否开启字体 CDN(使用思源宋体/黑体) + 'cdn' => 'google_font' //默认 Google Font,可选项:google_font / font_lolinet,或者直接输入字体文件 url +); + +/* 文章缩略图 */ + +//是否剪裁文章缩略图 +//使用 TimThumb 剪裁文章缩略图能达到最好效果,但会消耗服务器资源 +$GLOBALS['miraclesIfTimThumb'] = 'off'; + +//图片剪裁大小(开启上一条才会有效) +$GLOBALS['miraclesIfTimThumbSize'] = 'regular';//可选:regular / big / large / huge + +//TimThumb 允许的外部链接 +//如果你使用的外部图床或者 CDN 被 TimThumb 屏蔽,请将其域名加入到下面的数组 +$GLOBALS['miraclesTimThumbAllowList'] = array ( + 'flickr.com', + 'staticflickr.com', + 'picasa.com', + 'img.youtube.com', + 'upload.wikimedia.org', + 'photobucket.com', + 'imgur.com', + 'imageshack.us', + 'tinypic.com', + 'jsdelivr.net' +); + +/* 页面压缩 */ + +//是否压缩 HTML 源代码 +//压缩能优化页面传输速度,但可能会给服务器增加一定负担(不过也还好 +$GLOBALS['miraclesIfCompressHTML'] = 'off'; + +/** ========= NOTICE ========== * + * 每次更新前都请备份您的 themeConfig.php 文件 + * 新 release 发布时会提示此文件是否有变动 + * 若无,则无需更新 themeConfig.php,覆盖其他文件即可; + * 若有,则会在更新内容之前用注释分割, + * 请复制源文件的所有内容并覆盖新文件注释之前的内容 */
\ No newline at end of file |
