├── .DS_Store ├── .gitignore ├── .nojekyll ├── README.md ├── _coverpage.md ├── _navbar.md ├── _sidebar.md ├── about ├── README.md ├── _sidebar.md ├── quesion.md ├── team.md ├── version.md └── video.md ├── application ├── README.md ├── _sidebar.md ├── code.md ├── ete.md ├── example.md ├── plugin.md └── ui.md ├── build.jpeg ├── docs ├── _config.yml └── index.md ├── google490069ebac017973.html ├── img ├── .DS_Store ├── build.jpeg ├── chrome.png ├── chrome │ ├── .DS_Store │ ├── chrome01.png │ ├── chrome02.png │ ├── chrome03.png │ ├── chrome04.jpeg │ └── chrome05.jpeg ├── dingding │ ├── ding01.jpeg │ ├── ding02.jpeg │ ├── ding03.jpeg │ ├── ding04.jpeg │ ├── ding05.jpeg │ ├── ding06.jpeg │ ├── ding07.jpeg │ ├── ding08.jpeg │ └── ding09.jpeg ├── ete │ ├── .DS_Store │ ├── ete01.jpeg │ ├── ete02.jpeg │ ├── ete03.jpeg │ ├── ete04.jpeg │ ├── ete06.jpeg │ ├── ete07.jpeg │ ├── ete08.jpeg │ ├── ete09.jpeg │ ├── ete10.jpeg │ ├── ete11.jpeg │ ├── ete13.png │ ├── ete14.jpeg │ ├── ete15.jpeg │ ├── ete16.jpeg │ ├── ete17.jpeg │ ├── ete18.jpeg │ ├── ete19.jpeg │ ├── ete20.jpeg │ ├── ete21.png │ ├── ete22.jpeg │ ├── ete23.jpeg │ ├── ete24.jpeg │ ├── ete25.jpeg │ ├── ete25.jpg │ ├── ete26.jpeg │ ├── ete27.jpeg │ ├── ete28.jpeg │ ├── ete29.jpeg │ ├── ete30.jpeg │ ├── ete30.jpg │ ├── ete31.jpeg │ ├── ete32.jpeg │ ├── ete33.jpeg │ ├── ete34.jpeg │ ├── ete35.jpeg │ ├── ete36.jpeg │ ├── ete37.jpeg │ └── ete38.jpeg ├── etereport.jpeg ├── etereslist.jpeg ├── etest.png ├── etetest.png ├── feishu │ ├── 001.jpeg │ ├── 002.jpeg │ └── 003.jpeg ├── group │ ├── group01.jpeg │ ├── group02.jpeg │ └── group03.jpeg ├── home.jpeg ├── icon.ico ├── logo.jpg ├── logo.png ├── logo1.jpg ├── logo3.png ├── plugin │ ├── .DS_Store │ ├── ab.png │ ├── api.jpeg │ └── ete.jpeg ├── sgbfyxr.png ├── task.jpeg ├── task │ ├── task01.jpeg │ └── task02.jpeg ├── ui.png ├── ui │ ├── .DS_Store │ ├── 01.png │ ├── 02.png │ ├── 03.png │ ├── 04.png │ ├── 05.png │ ├── 06.png │ ├── 07.png │ ├── 08.png │ ├── 09.png │ ├── 10.png │ ├── 11.png │ └── 12.png ├── uires.png ├── wx.jpg └── 截屏2021-08-13 下午10.53.16.png ├── index.css ├── index.html ├── lib ├── docsify-copy-code.min.js ├── docsify-pagination.min.js ├── docsify.min.js ├── emoji.js ├── gitalk.css ├── gitalk.min.js ├── index.js ├── prism-bash.js ├── search.js ├── version.json └── vue.css └── package.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io/api/node 2 | # Edit at https://www.gitignore.io/?templates=node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | 13 | # Diagnostic reports (https://nodejs.org/api/report.html) 14 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 15 | 16 | # Runtime data 17 | pids 18 | *.pid 19 | *.seed 20 | *.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | lib-cov 24 | 25 | # Coverage directory used by tools like istanbul 26 | coverage 27 | *.lcov 28 | 29 | # nyc test coverage 30 | .nyc_output 31 | 32 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 33 | .grunt 34 | 35 | # Bower dependency directory (https://bower.io/) 36 | bower_components 37 | 38 | # node-waf configuration 39 | .lock-wscript 40 | 41 | # Compiled binary addons (https://nodejs.org/api/addons.html) 42 | build/Release 43 | 44 | # Dependency directories 45 | node_modules/ 46 | jspm_packages/ 47 | 48 | # TypeScript v1 declaration files 49 | typings/ 50 | 51 | # TypeScript cache 52 | *.tsbuildinfo 53 | 54 | # Optional npm cache directory 55 | .npm 56 | 57 | # Optional eslint cache 58 | .eslintcache 59 | 60 | # Optional REPL history 61 | .node_repl_history 62 | 63 | # Output of 'npm pack' 64 | *.tgz 65 | 66 | # Yarn Integrity file 67 | .yarn-integrity 68 | 69 | # parcel-bundler cache (https://parceljs.org/) 70 | .cache 71 | 72 | # next.js build output 73 | .next 74 | 75 | # nuxt.js build output 76 | .nuxt 77 | 78 | # vuepress build output 79 | .vuepress/dist 80 | 81 | # Serverless directories 82 | .serverless/ 83 | 84 | # FuseBox cache 85 | .fusebox/ 86 | 87 | # DynamoDB Local files 88 | .dynamodb/ 89 | 90 | # End of https://www.gitignore.io/api/node 91 | /.idea/.gitignore 92 | /.idea/inspectionProfiles/Project_Default.xml 93 | /.idea/its-cmp-web.iml 94 | /.idea/misc.xml 95 | /.idea/modules.xml 96 | /.idea/vcs.xml 97 | /src/its-cmp/package-lock.json 98 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/.nojekyll -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | # eTestV1.2.1 5 | 6 | > 一个简单易用的集成测试框架 7 | 8 | - **0 代码,自动化测试** 9 | - **完善的测试报告** 10 | - **强大的扩展能力** 11 | - **自动化运行定时任务以及测试结果推送机制** 12 | 13 | 14 | 1. [下载链接 🔗](https://github.com/alltheblue/docs/releases) 15 | 2. [官网链接 🔗](https://alltheblue.github.io/docs/#/application/example) 16 | 3. [视频链接 🔗](https://www.bilibili.com/video/BV13P411f7pk/?vd_source=6b8d8a92f183f64ff070132f852c206f) 17 | 4. [国内镜像 gitree 🔗 ](https://xflihaibo.gitee.io/e-test/#/) 18 | 19 | 20 | 加开发者微信,进群和小伙伴一起探索eTest,学习不在孤单 21 | 22 | 联系我们 23 | -------------------------------------------------------------------------------- /_coverpage.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # eTestV_1.2.0 4 | 5 | > 一个简单易用的集成测试框架 6 | 7 | [下载](https://github.com/alltheblue/docs/releases) 8 | [Get Started](https://alltheblue.github.io/docs/#/application/example) 9 | -------------------------------------------------------------------------------- /_navbar.md: -------------------------------------------------------------------------------- 1 | - [文档](/application/) 2 | - [版本](/about/) 3 | - [视频教程](/about/video.md) 4 | - [社区](/about/quesion.md) 5 | - [国内镜像](https://xflihaibo.gitee.io/e-test/#/) 6 | - [GitHub](https://github.com/alltheblue/docs) 7 | -------------------------------------------------------------------------------- /_sidebar.md: -------------------------------------------------------------------------------- 1 | - [eTest](README.md) 2 | - [快速开始](./application/example.md) 3 | - [UI](./application/ui.md) 4 | - [ETE](./application/ete.md) 5 | - [扩展管理](./application/plugin.md) 6 | - [错误信息列表](./application/code.md) -------------------------------------------------------------------------------- /about/README.md: -------------------------------------------------------------------------------- 1 | # 系统更新信息 2 | 3 | ### eTest自动化测试工具(v1.2.1) &chrome-plugin(v1.3.6) 4 | 5 | 1. 解决无外网访问的情况下,工具按钮图标不显示问题 6 | 2. 优化修改已知问题 7 | 8 | ### eTest自动化测试工具v1.2.0 大版本迭代更新 &chrome-plugin(v1.3.6) 9 | 10 | 1. 支持git 版本管理 ,支持团队维护测试用例 11 | 2. 修复已知bug 12 | 13 | **注意**: 本次版本迭代不支持老版本项目,如果安装新版本,需要把老版本的项目导出迁移到新版本,新老版本相互独立,不受影响,请大家尽量切换到新版本,体验新功能,测试脚本,结构也不受影响 14 | 15 | ### eTest自动化测试工具v1.1.29 &chrome-plugin(v1.3.6) 16 | 17 | 1. 支持文件上传功能 18 | 2. 支持mock请求返回值 19 | 20 | ### eTest自动化测试工具v1.1.28 &chrome-plugin(v1.3.6) 21 | 22 | 1. 修改windows 导入问题 23 | 2. 部分图标不显示问题 24 | 3. 环境变量不生效问题 25 | 4. 支持接口返回值校验 26 | 5. 暴露文件路径 27 | 28 | ### eTest自动化测试工具v1.1.27 &chrome-plugin(v1.3.6) 29 | 30 | 1. 支持 Microsoft Edge 浏览器自动化测试 31 | 2. 优化测试结果点击图片放大 32 | 3. 优化eTest交互 33 | 34 | 35 | ### eTest自动化测试工具(v1.1.26) &chrome-plugin(v1.3.6) 36 | 37 | 1. windows 上传脚本优化显示名称 38 | 2. 支持断言失败停止任务执行依旧生成测试报告 39 | 3. 修复定时任务执行ete任务 40 | 4. 完善内置缓存脚本维护方式,缓存第一个分组内的脚本参数 41 | 5. 优化交互 新建项目、ete新建分组支持回车快捷键 42 | 43 | 44 | ### eTest自动化测试工具(v1.1.25) &chrome-plugin(v1.3.6) 45 | 46 | 1. 支持断言失败,停止任务执行 47 | 2. 完善内置缓存脚本维护方式,只缓存第一个分组的第一个脚本文件的 48 | 3. 修复iframe嵌套操作元素问题 49 | 4. 修复截图用例异常情况问题 50 | 5. 修复录制脚本拖拽元素不全问题 51 | 6. 断言脚本支持延迟等待(秒) 52 | 7. 修复已知bug 53 | 54 | ### 2023-10-14 eTest 自动化测试工具v1.1.24 55 | 56 | 1. 修复变量配置编辑问题 57 | 2. 修复已知bug 优化页面交互 58 | 3. windows 版本升级最新添加demo演示 59 | 60 | 61 | ### 2023-08-29 eTest 自动化测试工具v1.1.23 62 | 63 | 1. 添加eTest 回放拖拽功能 64 | 2. 修复页面iframe嵌套bug 65 | 3. 添加 chrome插件录制拖拽脚本的功能 66 | 67 | 68 | ### 2023-08-16 eTest 自动化测试工具v1.1.22 69 | 70 | 1. 首次使用 没有获取到chome 运行出错,并且系统未检测到chrome浏览器 提示检测本地是否按转 chrome 浏览器 71 | 2. 支持配置痕迹查询,对测试过程的网络请求状态 72 | 3. ete自动化测试报告,断言错误 支持视频回放查看结果 73 | 4. 修复滚动操作获取dom 元素失败 74 | 75 | 76 | ### 2023-07-28 eTest 自动化测试工具v1.1.21 77 | 78 | 1. 优化ete 全局配置,支持小保存,删除大保存 79 | 2. 支持开发检测本地chrome 80 | 3. 完成性能优化,支持鉴权、登录请求下收集网站性能信息 81 | 82 | 83 | ### 2023-07-14 eTest 自动化测试工具v1.1.20 84 | 85 | 1. 添加新手引导Demo项目 86 | 2. 添加菜单 加载Demo 87 | 3. 修复已知bug 88 | 89 | ### 2023-07-03 eTest 自动化测试工具v1.1.19 90 | 1. eTest 支持性能收集报告 91 | 2. 修复已知bug 92 | 3. chrome-plugin 支持性能采集 93 | 94 | 95 | ### 2023-05-18 eTest 自动化测试工具v1.1.18 96 | 1. 添加查看日志 97 | 2. 修复多滚动条问题 98 | 3. 修复已知bug 99 | 4. 修复windows打包问题 100 | 101 | ### 2023-05-18 eTest 自动化测试工具v1.1.17 102 | 1. 兜底浏览器异常关闭退出 103 | 2. 优化debug调试功能打印信息 104 | 3. 支持快捷键调试 105 | 4. 修复已知bug 106 | 107 | ### 2023-05-12 eTest 自动化测试工具v1.1.16 108 | 1. 添加创建测试文件的兜底 109 | 2. 优化ete调试功能 110 | 3. 优化消息通知 111 | 4. 修复已知bug 112 | 113 | ### 2023-05-09 eTest 自动化测试工具v1.1.15&eTest-plugin V_1.3.4 114 | 1. 修复eTest-plugin插件录制脚本bug 115 | 2. eTest 修复网络鉴定 116 | 3. 修改消息通知 117 | 118 | ### 2023-05-04 eTest更新版本更新v1.1.14 119 | 1. 兜底页面滚动 xpath 问题 120 | 2. 修改断言问题脚本问题 121 | 122 | ### 2023-05-03 eTest更新版本更新v1.1.13 123 | 1. chrome-plugin 支持截图 124 | 2. etest支持ocr识别是否和录制网址状态是否一致 125 | 3. 修复获取dom元素点击抖动问题 126 | 4. 修复已知bug 127 | 128 | ### 2023-04-11 eTest更新版本更新 129 | 1. eTest 添加启动测试塞入缓存功能 🆕 130 | 2. eTest 添加断网运行提示 🆕 131 | 3. eTest 添加dom 查找功能的兜底逻辑 🆕 132 | 4. chrome-plugin 支持收集网站 缓存数据 🆕 133 | 5. 修复已知问题bug 🐛 134 | 135 | ### 2023-03-08 优化更新第一版 136 | 137 | 1. etest 上线第一个稳定版本 支持(mac、 windows) 138 | 2. etest-chrome插件修复已知问题 139 | -------------------------------------------------------------------------------- /about/_sidebar.md: -------------------------------------------------------------------------------- 1 | - [版本记录](about/) 2 | - [视频教程](about/video.md) 3 | - [社区](about/quesion.md) 4 | - [团队](about/team.md) 5 | 6 | -------------------------------------------------------------------------------- /about/quesion.md: -------------------------------------------------------------------------------- 1 | # 社区文章 2 | 3 | #### 脚本录制调试方法 4 | 5 | [eTest自动化测试在团队协作的三步探索](https://juejin.cn/post/7357194991338651648): 团队协作的最优方案,团队协作更加方便 6 | 7 | [etest 高级变量支持Mock数据](https://juejin.cn/post/7345379864739266579) : mock数据,支持特定场景,让测试场景随心所欲 8 | 9 | [eTest自动化测试支持录制文件上传用例](https://juejin.cn/post/7343883765539782707) : 新功能扩展,支持更多测试场景 10 | 11 | [eTest 自动化测试关于团队协作问题](https://juejin.cn/post/7287768247889412155) : 简化团队内部协作,提升开发效率 12 | 13 | [eTest_v1.1.23版本 支持拖拽功能](https://juejin.cn/post/7273026558402052096) : 完善录制脚本更多功能,开发eTest 无限遐想 14 | 15 | [eTest 更新引入Playwright Trace &视频回放](https://juejin.cn/post/7267927742797152291) : 完善自动化测试报告,提升使用体验 16 | 17 | [使用 eTest 5分钟搭建一个性能收集平台](https://juejin.cn/post/7262894998785179703): 开启鉴权,带你了解网站的性能瓶颈 18 | 19 | [eTest 喊你来探索自动化测试](https://juejin.cn/post/7255605810453381175): 内置Demo,提升开发者首次探索eTest的乐趣 20 | 21 | [掘金!eTest 喊你做优化性能优化了](https://juejin.cn/post/7251501890559033401):在运行自动化测试时,开启性能收集,收集网站性能,持续提升体验 22 | 23 | [ eTest 帮你每日打卡掘金签到](https://juejin.cn/post/7236295340630409274): 通过定时任务触发运行自动化任务,执行一些自动化任务 24 | 25 | [ eTest 自动化工具调试](https://juejin.cn/post/7234342980156162105):试用eTest工具的小伙伴遇到问题反馈,做了一个优化功能,帮助大家快速定位问题 26 | 27 | [呀!不经意间帮小米做了一个自动化线上巡检](https://juejin.cn/post/7231080269502169147):通过定时任务触发运行自动化任务,为线上项目保驾护航 28 | 29 | [不务正业的前端写了一个自动化测试工具](https://juejin.cn/post/7229587772217327671): 筑梦的开始,值得被记忆 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /about/team.md: -------------------------------------------------------------------------------- 1 | # 团队信息 2 | 3 | 星光不问赶路人,时光不负有心人 4 | 5 | 方案落地只是一个开始,我们只是完成了从 0 到 1,从 1 到 100 我们还有很长的路要走,打造一款优秀的产品就离不开从 1 到 100 的过程,可能需要更多的时间,修复问题,改善用户交互体验,提升性能优化...,同时我们也需要大家的意见,测试应用的更好,离不开大家的支持,同时请大家再给我们多一点时间,让我们有更多的时间,更好的交互来完善应用。为了某一个细节,可能会花费我们很多时间 ,远比我们第一版实现出来的成本高出很多,但是我们愿意花费更多时间去打磨它。过程虽然枯燥,我们愿意去做,我们做的不只是一个创意,也不是因为一时兴起,而是一款经得起大家检验的测试应用,希望大家跟我们一起见证集成测试的成长。🙏🙏🙏🙏 6 | 7 | 很幸运身边有一群志同道合的伙伴,一起为一个想法奋斗!如果说从 0 到 1 是靠的是兴趣,那么从 1 到 100 一定是耐得住寂寞的坚持,我们很开心做了自己喜欢做的事,但我们同样对从 1 到 100 充满期待! 8 | 9 | 最终还想用那句座右铭来激励自己:**路虽远·行者必至!** 10 | 11 | #### 联系我们 12 | 如果大家对工具有其他的建议,和改进方案,也可以联系我们,我们会第一时间支持,欢迎大家骚扰 13 | 14 | 联系我们 15 | -------------------------------------------------------------------------------- /about/version.md: -------------------------------------------------------------------------------- 1 | # 系统更新信息 2 | 3 | 4 | ### eTest 自动化测试工具v1.1.18 5 | 1. 添加查看日志 6 | 2. 修复多滚动条问题 7 | 3. 修复已知bug 8 | 9 | ### eTest 自动化测试工具v1.1.17 10 | 1. 兜底浏览器异常关闭退出 11 | 2. 优化debug调试功能打印信息 12 | 3. 支持快捷键调试 13 | 4. 修复已知bug 14 | 15 | ### 2023-05-12 eTest 自动化测试工具v1.1.16 16 | 1. 添加创建测试文件的兜底 17 | 2. 优化ete调试功能 18 | 3. 优化消息通知 19 | 4. 修复已知bug 20 | 21 | ### 2023-05-09 eTest 自动化测试工具v1.1.15&eTest-plugin V_1.3.4 22 | 1. 修复eTest-plugin插件录制脚本bug 23 | 2. eTest 修复网络鉴定 24 | 3. 修改消息通知 25 | 26 | ### 2023-05-04 eTest更新版本更新v1.1.14 27 | 1. 兜底页面滚动 xpath 问题 28 | 2. 修改断言问题脚本问题 29 | 30 | ### 2023-05-03 eTest更新版本更新v1.1.13 31 | 1. chrome-plugin 支持截图 32 | 2. etest支持ocr识别是否和录制网址状态是否一致 33 | 3. 修复获取dom元素点击抖动问题 34 | 4. 修复已知bug 35 | 36 | ### 2023-04-11 eTest更新版本更新 37 | 1. eTest 添加启动测试塞入缓存功能 🆕 38 | 2. eTest 添加断网运行提示 🆕 39 | 3. eTest 添加dom 查找功能的兜底逻辑 🆕 40 | 4. chrome-plugin 支持收集网站 缓存数据 🆕 41 | 5. 修复已知问题bug 🐛 42 | 43 | ### 2023-03-08 优化更新第一版 44 | 45 | 1. etest 上线第一个稳定版本 支持(mac、 windows) 46 | 2. etest-chrome插件修复已知问题 47 | -------------------------------------------------------------------------------- /about/video.md: -------------------------------------------------------------------------------- 1 | # 社区视频课程 2 | 3 | 1. 认识 & 安装 4 | 5 | 1. [01 etest 简介](https://www.bilibili.com/video/BV13P411f7pk/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 6 | 7 | 2. [02 eTest安装谷歌插件&mac桌面应用](https://www.bilibili.com/video/BV1kP411f7XV/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 8 | 9 | 3. [03 eTest 自动化测试 菜单功能](https://www.bilibili.com/video/BV17B4y1d7wz/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 10 | 11 | 2. UI自动化 12 | 1. [04 eTest UI自动化快速上手](https://www.bilibili.com/video/BV1kc411Z7Gg/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 13 | 14 | 3. eTe自动化 15 | 16 | 1. [05 eTest自动化测试,ete快速开始](https://www.bilibili.com/video/BV1qe411979R/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 17 | 18 | 2. [06 eTest自动化测试 设置消息推送 & 定时任务](https://www.bilibili.com/video/BV1uj411v7Cq/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 19 | 20 | 3. [07 eTest 自动化测试 无头模式调试功能](https://www.bilibili.com/video/BV1Cc411f7J8/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 21 | 4. [08 eTest自动化测试 eTe查看行为设置缓存](https://www.bilibili.com/video/BV1c94y1L79N/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 22 | 5. [09 eTest自动化测试 环境配置&变量配置](https://www.bilibili.com/video/BV1Ww411M7BM/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 23 | 24 | 4. eTe 结合 ant design pro实战 25 | 26 | 1. [10 eTest自动化测试工具实战 Ant Design项目实战](https://www.bilibili.com/video/BV1KQ4y1n72B/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 27 | 2. [11 eTest自动化测试 antd项目实战](https://www.bilibili.com/video/BV1Gz4y1P7bu/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 28 | 3. [12 eTest自动化测试 antd 实战监控&工作台](https://www.bilibili.com/video/BV1LN4y1U79r/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 29 | 4. [13 eTest自动化测试 实战antd 表单录入](https://www.bilibili.com/video/BV12M411o7Ly/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 30 | 5. [14 eTest自动化测试遇到ant design 列表断言&添加列表数据](https://www.bilibili.com/video/BV1d34y1F785/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 31 | 5. [15 eTest自动化测试 antd实战详情页测试](https://www.bilibili.com/video/BV1Pj411L7Lp/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 32 | 6. [16 eTest自动化测试 antd 实战个人中心](https://www.bilibili.com/video/BV1GC411z7uJ/?share_source=copy_web&vd_source=fad10b7f790d78a120e75cc03658f97b) 33 | -------------------------------------------------------------------------------- /application/README.md: -------------------------------------------------------------------------------- 1 | ![home](../img/home.jpeg '::etest-col-8') 2 | 3 | - **0 代码,自动化测试** 4 | - **完善的测试报告** 5 | - **强大的扩展能力** 6 | - **自动化运行定时任务以及测试结果推送机制** 7 | -------------------------------------------------------------------------------- /application/_sidebar.md: -------------------------------------------------------------------------------- 1 | - [快速开始](application/example.md) 2 | - [UI](application/ui.md) 3 | - [ETE](application/ete.md) 4 | - [扩展管理](application/plugin.md) 5 | - [错误信息列表](application/code.md) 6 | -------------------------------------------------------------------------------- /application/code.md: -------------------------------------------------------------------------------- 1 | # 错误信息列表 2 | 3 | 为了方便使用者对错误的判断定位,我们引入了自定义的错误状态码信息,方便错误信息的定位. 4 | 5 | | code | 描述 | 6 | | ---- | --------------------------------------- | 7 | | 1000 | 全局系统性错误 | 8 | | 2000 | UI 还原性错误 | 9 | | 3000 | ete 测试错误 | 10 | | 3001 | ete 上传错误文件错误 | 11 | | 3002 | 请先上传文件 | 12 | | 3003 | 无法连接互联网,请检查网络! | 13 | | 3004 | 请先勾选需要运行的文件 | 14 | | 3005 | 文件已被破坏!请重新上传 | 15 | | 3006 | 拖拽保存文件失败 | 16 | | 3007 | 初始化外部插件错误 | 17 | | 3008 | 初外部执行插件返回错误 | 18 | | 3009 | 参数初始化失败 | 19 | | 3010 | 性能优化方案失败 | 20 | | 3011 | 浏览器执行失败 | 21 | | 3012 | 执行 ete 语法错误 | 22 | | 3013 | 接口请求 request 失败 | 23 | | 3014 | page 页面监听报错 | 24 | | 3015 | Load 等待网络请求加载超时 | 25 | | 3016 | 自执行函数错误 | 26 | | 3017 | 页面生成变量落后与当前配置位置 | 27 | | 3018 | 写入文件错误 | 28 | | 4000 | api 测试错误 | 29 | | 4001 | 测试脚本文件数据结构错误没有 dataSource | 30 | | 4002 | 导入文件错误 | 31 | | 4002 | 导入 postman 文件错误 | 32 | | 4003 | 初始化外部插件错误 | 33 | | 4004 | 接口请求错误,请检查请求服务器 | 34 | | 4005 | 外部执行插件返回错误 | 35 | | 4006 | 执行 api 语法错误 | 36 | | 4007 | 自执行函数报错 | 37 | | 5000 | 接口测试错误 | 38 | | 5001 | 没有配置压测参数,请先配置 | 39 | | 5002 | 没有配置压测参数,请先配置 | 40 | | 5003 | 请完善 url 信息 | 41 | | 5004 | 执行压力结果错误 | 42 | | 6000 | 插件错误 | 43 | -------------------------------------------------------------------------------- /application/ete.md: -------------------------------------------------------------------------------- 1 | # ETE 2 | 3 | ?> 为页面测试而生, 彻底解决页面测试的繁琐操作,提升测试乐趣! 4 | 5 | 6 | 7 | ## 优势 8 | 9 | 1. 测试脚本通过录制实现,上手简单,效率高 10 | 2. 上手方便,不需要额外的编码能力,使用多种方式定位dom 11 | 3. 测试文件管理复用方便,维护成本低 12 | 13 | ## 解决痛点 14 | 15 | 市面上的 ete 测试框架很多,但对许多测试人员的编码能力有一定的要求,而且随着业务复杂度的提高,每一次迭代都可能导致重新编写测试脚本修改,可维护性很差,迁移能力较弱,测试成本高,结合以上问题,我们对 ete 测试框架做了二次封装,尽可能减少对测试人员编码的要求,满足日常多场景的测试,需要测试人员在 chrome 浏览器在开启 eTest 脚本录制工具,进行操作,便可生成测试人员想要的测试脚本,解放测试人员的臃肿烦躁的重复测试场景,让 ete 测试变的充满乐趣。使测试人员有更多的精力做更深层次的测试。 16 | 17 | ## 流程设计图 18 | 19 | #### 浏览器录制脚本流程图 20 | 21 | ![logo](../img/chrome.png) 22 | 23 | ete 测试,需要依赖操作者操作,收集录制脚本信息,所以需要安装 chrome 插件,通过启用插件,收集用户操作信息,生成 ete 测试需要的脚本文件。 24 | 25 | !> Chrome 插件下载方式 [eTest github 下载](https://github.com/alltheblue/docs/releases) 26 | 27 | #### ETE 执行脚本流程图 28 | 29 | ![logo](../img/etetest.png) 30 | 31 | ## 支持功能 32 | 33 | 1. 支持 iframe 多嵌套操作 , 支持动态 iframe 插入问题 :heavy_check_mark: 34 | 2. 支持关闭 alert 提示 :heavy_check_mark: 35 | 3. 支持等待 dom 元素显示 :heavy_check_mark: 36 | 4. 支持页面断言操作,数字类型的大于小于等于操作 :heavy_check_mark: 37 | 5. 支持生成测试报告 :heavy_check_mark: 38 | 6. 支持运行时页面请求错误收集 :heavy_check_mark: 39 | 7. 支持延时操作处理 :heavy_check_mark: 40 | 8. 支持运行自动化无头模式 :heavy_check_mark: 41 | 9. 支持自动等待网络加载完成后操作 :heavy_check_mark: 42 | 10. 支持阻止默认事件后,依然可以获取事件操作 :heavy_check_mark: 43 | 11. 支持事件被阻止依旧可以收集 :heavy_check_mark: 44 | 12. 支持断言错误自动截图 :heavy_check_mark: 45 | 13. 支持在线修改 json 数据 :heavy_check_mark: 46 | 14. 支持用例拖拽排序 :heavy_check_mark: 47 | 15. 支持导出性能优化报告(lighthouse) :heavy_check_mark: 48 | 16. 支持收集浏览器的前进后退刷新操作 :heavy_check_mark: 49 | 17. 支持多 tab 页间的切换 :heavy_check_mark: 50 | 18. 支持测试用例每一步的操作截图 :heavy_check_mark: 51 | 19. 支持高级配置自定义对输入、断言修改 :heavy_check_mark: 52 | 20. 支持获取页面的文本设置当前执行的变量 :heavy_check_mark: 53 | 21. 支持自动收集页面滚动数据 :heavy_check_mark: 54 | 22. 支持页面快捷键操作 :heavy_check_mark: 55 | 23. 支持测试用例分组维护 :heavy_check_mark: 56 | 24. 支持测试文件重命名修改 :heavy_check_mark: 57 | 25. 支持导入导出文件信息 :heavy_check_mark: 58 | 26. 支持设置缓存信息 :heavy_check_mark: 59 | 27. 支持可视区域生成图片对比生成测试结果 :heavy_check_mark: 60 | 28. 支持测试脚本按步骤调试 :heavy_check_mark: 61 | 29. ete自动化测试报告,断言错误 支持视频回放查看结果 :heavy_check_mark: 62 | 30. 支持在鉴权、登录请求下收集网站性能信息 :heavy_check_mark: 63 | 31. 支持测试用例拖拽功能 :heavy_check_mark: 64 | 32. 支持自定义函数、自定义插件扩展:heavy_check_mark: 65 | 33. 支持多浏览器切换运行自动化测试 Chrome\Edge :heavy_check_mark: 66 | 34. 支持测试报告图片放大预览:heavy_check_mark: 67 | 35. 支持接口返回自定义请求值校验:heavy_check_mark: 68 | 35. 支持mock请求返回值:heavy_check_mark: 69 | 36. 支持文件上传:heavy_check_mark: 70 | 71 | ## 快速开始 72 | 73 | ### 下载 chrome 插件 74 | 75 | !> Chrome 插件下载方式 [eTestv1.3.6 github 下载](https://github.com/alltheblue/docs/releases) 76 | 77 | ### 设置插件开启无痕模式 78 | 79 | ![录制脚本文件](../img/ete/ete22.jpeg '::etest-col-5') 80 | 81 | 打开浏览器`管理扩展程序`选择`eTest`插件,点击`详情`,打开`在无痕模式下启用`,即可。 82 | 83 | ![录制脚本文件](../img/ete/ete23.jpeg '::etest-col-8') 84 | ![录制脚本文件](../img/ete/ete21.png '::etest-col-8') 85 | 86 | ### 录制脚本文件 87 | 88 | ![录制脚本文件](../img/chrome/chrome01.png '::etest-col-8') 89 | 90 | 打开右上角的 chrome 插件 点击小图标出现 `start` 状态,表示已启动测试脚本录制 91 | 92 | ?> 由于在脚本回放打开的是无痕浏览模式,所以在录制脚本的时候请先清除历史记录和缓存数据,以保证回放的时候的正确性,或者开启无痕模式录制脚本信息 93 | 94 | ![录制脚本文件](../img/chrome/chrome02.png '::etest-col-8') 95 | 96 | 点击网页操作,eTest 插件提示 `添加一条操作事件` ,说明 eTest 插件正在记录用户在页面的操作。 97 | 98 | !> 点击时间, 文本框,下拉框改变 都会触发该动作 99 | 100 | ![录制脚本文件](../img/chrome/chrome03.png '::etest-col-8') 101 | 102 | 选中文本,鼠标右键,选择期望的断言结果 103 | 104 | #### 断言值 105 | 106 | 根据用户选中的文本自动判断 `string`或者 `number`类型,然后自动生成需要的测试用例菜单列表, 107 | 108 | **注意** 109 | 110 | - 选择文本时,会自动选择当前标签内的全部内容。 111 | - 如果选中的文本是含有两个相邻标签的内容,则会默认选中第一个标签的全部内容。 112 | - 如果选中的文本内部包含多个标签 则会判断满足一定条件 最多 3 个子标签并且小于 200 字以内。 113 | 114 | ##### 事件 115 | 116 | 1. load: 刷新 117 | 1. click:单击事件 118 | 1. dbclick:双击事件 119 | 1. hover:鼠标 hover 120 | 1. scroll:滚动至此 121 | 1. 生成全局变量 122 | 123 | !> 高级用法 `生成全局变量` 在需要的一些场景需要对页面的值做输入处理 124 | 125 | ##### 文本断言 126 | 127 | 1. include:包含当前值 128 | 1. exclude:不包含当前值 129 | 130 | ##### 数字断言 131 | 132 | 1. greater:大于当前值 133 | 1. equal:等于 当前值 134 | 1. less:小于当前值 135 | 136 | ##### 属性值断言(class、id、data、 type....) 137 | 138 | 1. include:包含当前值 139 | 1. exclude:不包含当前值 140 | 141 | ![属性值断言](../img/chrome/chrome05.jpeg '::etest-col-8') 142 | 143 | 点击右上 eTest 图标,结束测试脚本录制,并且生成测试脚本文件,下载到本地 144 | 145 | !> 如果测试脚本用例小于 2 条,则不会生成脚本信息 146 | 147 | ### 生成脚本文件 148 | 149 | 通过`chrome`插件生成的脚本文件如下格式: 150 | 151 | ```json 152 | [ 153 | { 154 | "active": true, 155 | "audible": false, 156 | "autoDiscardable": true, 157 | "discarded": false, 158 | "favIconUrl": "https://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg", 159 | "groupId": -1, 160 | "height": 882, 161 | "highlighted": true, 162 | "id": 83891737, 163 | "incognito": false, 164 | "index": 64, 165 | "mutedInfo": { "muted": false }, 166 | "openerTabId": 83891734, 167 | "pinned": false, 168 | "selected": true, 169 | "status": "complete", 170 | "title": "百度一下,你就知道", 171 | "url": "https://www.baidu.com/", 172 | "width": 1680, 173 | "windowId": 83891251, 174 | "action": "start", 175 | "indexNum": 0, 176 | "date": 1678243527820, 177 | "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36", 178 | "cookies": [ 179 | { 180 | "domain": "www.baidu.com", 181 | "expirationDate": 1711066469, 182 | "hostOnly": true, 183 | "httpOnly": false, 184 | "name": "MSA_WH", 185 | "path": "/", 186 | "sameSite": "unspecified", 187 | "secure": false, 188 | "session": false, 189 | "storeId": "0", 190 | "value": "3901244" 191 | } 192 | ], 193 | "localStorage": { 194 | "BAIDU_PRIVATE": "16ww496207", 195 | "squarePop": "1", 196 | "___ds_storage__eqid": "xxx|1679995377511", 197 | "index_ls_qid": "xxx" 198 | }, 199 | "sessionStorage": { 200 | "BAIDU_PRIVATE": "xxx" 201 | }, 202 | 203 | "isMobile": false, 204 | "hasTouch": false, 205 | "deviceScaleFactor": 1, 206 | "type": "start" 207 | }, 208 | { 209 | "x": 505.5, 210 | "y": 211.671875, 211 | "url": "https://www.baidu.com/", 212 | "date": 1678243529332, 213 | "height": 44, 214 | "xpath": "//*[@id=\"kw\"]", 215 | "width": 550, 216 | "value": "", 217 | "clientX": 695, 218 | "clientY": 234, 219 | "selector": "document > html > body > div > div > div > div > div > form > span > input", 220 | "iframe": "", 221 | "indexNum": 1, 222 | "innerHtml": "", 223 | "localName": "input", 224 | "localNameType": "text", 225 | "type": "click" 226 | }, 227 | { 228 | "x": 505.5, 229 | "y": 211.671875, 230 | "url": "https://www.baidu.com/", 231 | "date": 1678243539976, 232 | "height": 38, 233 | "xpath": "//*[@id=\"kw\"]", 234 | "width": 471, 235 | "value": "你好", 236 | "clientX": 695, 237 | "clientY": 234, 238 | "selector": "document > html > body > div > div > div > div > div > form > span > input", 239 | "iframe": "", 240 | "indexNum": 2, 241 | "innerHtml": "", 242 | "localName": "input", 243 | "localNameType": "text", 244 | "type": "change" 245 | }, 246 | { 247 | "x": 725, 248 | "y": 15, 249 | "url": "https://www.baidu.com/", 250 | "date": 1678243540156, 251 | "height": 40, 252 | "xpath": "//*[@id=\"su\"]", 253 | "width": 112, 254 | "value": "百度一下", 255 | "clientX": 783, 256 | "clientY": 36, 257 | "selector": "document > html > body > div > div > div > div > div > form > span > input", 258 | "iframe": "", 259 | "indexNum": 3, 260 | "innerHtml": "", 261 | "localName": "input", 262 | "localNameType": "submit", 263 | "type": "click" 264 | }, 265 | { 266 | "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36", 267 | "isMobile": false, 268 | "hasTouch": false, 269 | "deviceScaleFactor": 1, 270 | "type": "start", 271 | "active": true, 272 | "audible": false, 273 | "autoDiscardable": true, 274 | "discarded": false, 275 | "favIconUrl": "https://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg", 276 | "groupId": -1, 277 | "height": 882, 278 | "highlighted": true, 279 | "id": 83891737, 280 | "incognito": false, 281 | "index": 64, 282 | "mutedInfo": { "muted": false }, 283 | "openerTabId": 83891734, 284 | "pinned": false, 285 | "selected": true, 286 | "status": "complete", 287 | "title": "百度一下,你就知道", 288 | "url": "https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD&rsv_spt=1&rsv_iqid=0xece676f10009f696&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&rsv_sug3=10&rsv_sug1=10&rsv_sug7=101&sug=%25E4%25BD%25A0%25E5%25A5%25BD%2520%25E6%259D%258E%25E7%2584%2595%25E8%258B%25B1&rsv_n=1&rsv_btype=i&prefixsug=%25E4%25BD%25A0%25E5%25A5%25BD&rsp=0&inputT=9238&rsv_sug4=10826", 289 | "width": 1680, 290 | "windowId": 83891251, 291 | "action": "replacePage", 292 | "indexNum": 4, 293 | "date": 1678243540180 294 | }, 295 | { 296 | "xpath": "//html", 297 | "iframe": "", 298 | "selector": "document", 299 | "scrollTop": 594, 300 | "scrollLeft": 0, 301 | "type": "scrollWin", 302 | "url": "https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD&rsv_spt=1&rsv_iqid=0xece676f10009f696&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&rsv_sug3=10&rsv_sug1=10&rsv_sug7=101&sug=%25E4%25BD%25A0%25E5%25A5%25BD%2520%25E6%259D%258E%25E7%2584%2595%25E8%258B%25B1&rsv_n=1&rsv_btype=i&prefixsug=%25E4%25BD%25A0%25E5%25A5%25BD&rsp=0&inputT=9238&rsv_sug4=10826", 303 | "indexNum": 5, 304 | "date": 1678243545352 305 | } 306 | ] 307 | ``` 308 | 309 | #### 关键 key 310 | 311 | | key | 描述 | 312 | | ---------- | ------------------------------------------------------------------- | 313 | | url | 当前打开的 URL 地址信息 | 314 | | x | 获取当前操作的 dom 位置 X 轴坐标 | 315 | | y | 获取当前操作的 dom 位置 Y 轴坐标 | 316 | | width | 当前录制的浏览器的宽度或者 获取当前操作的 dom 的宽度 | 317 | | height | 当前录制的浏览器的高度或者 获取当前操作的 dom 的高度 | 318 | | xpath | 获取当前操作的 dom 的唯一地址 | 319 | | selector | 获取当前操作的 dom 的路径信息 | 320 | | clientX | 获取当前操作的 dom 距离浏览器视口的 X 轴距离 | 321 | | clientY | 获取当前操作的 dom 距离浏览器视口的 Y 轴距离 | 322 | | type | 获取当前操作的 dom 操作类型 click、change、scrollWin、load、dbclick | 323 | | date | 当前操作的 dom 操作录入的时间 | 324 | | iframe | 当前网页是否嵌有 iframe 地址 | 325 | | indexNum | 当前测试用例的索引 | 326 | | scrollTop | 如果触发了 `type`为`scrollWin`需要记录滚动的上下位置 | 327 | | scrollLeft | 如果触发了 `type`为`scrollWin`需要记录滚动的左右位置 | 328 | 329 | ### ete 录入脚本&启动 330 | 331 | ![ete 设置](../img/ete/ete26.jpeg '::etest-col-8') 332 | 333 | 打开集成测试 `创建项目`然后`点击项目 进入ETE`,可以通过点击新增 导入文件或者创建分组 334 | 335 | !> **注意**:导入文件会覆盖项目下的 ete 之前维护的脚本文件,请谨慎操作 336 | 337 | ![ete 设置](../img/ete/ete27.jpeg '::etest-col-8') 338 | 339 | 新建分组,有利于分类归纳维护测试脚本文件, 340 | 341 | ![ete 设置](../img/ete/ete28.jpeg '::etest-col-8') 342 | 343 | 上传测试脚本文件后可以按照分组归纳,如果需要调整分组,文件排序 按住 `分组`, `文件` 拖动即可实现排序, 344 | 345 | !> 注意:测试的文件需按顺序执行,如果出现断层则会影响测试结果。 346 | 347 | ![ete 设置](../img/ete/ete24.jpeg '::etest-col-8') 348 | 349 | 测试文件上传时默认 `选中`; 如果没有勾选选中,在执行测试用例的过程中,则不被执行当前测试文件 支持 `分组`、`单个脚本`勾选 350 | 351 | ![ete 设置](../img/ete/ete29.jpeg '::etest-col-8') 352 | 353 | 对`分组`、`脚本`的 `删除` 、`重命名` 操作,对后续的展示测试报告的时,更加友好 354 | 355 | ![ete 设置](../img/ete/ete04.jpeg '::etest-col-8') 356 | 357 | 运行 ete 测试过程中,如果需要停止任务,可点击 `停止运行`,结束此次运行,运行结束后,生成测试报告`报告名称` 是项目名称加当前时间拼接成的,模式分为`自动`和`手动` 两种模式,自动:是定时任务运行的;手动:是用户自己运行的用例; 358 | 359 | !> 注意:首次运行自动化前,请检查本地是否按装chrome 浏览器 360 | 361 | ### 测试结果 362 | 363 | ![ete 设置](../img/ete/ete04.jpeg '::etest-col-8') 364 | 365 | 测试报告列表,会展示一些关键信息 ,`断言结果`,`请求错误`,`页面错误`,`用时` 汇总信息 366 | 367 | ![ete 设置](../img/ete/ete30.jpg '::etest-col-8') 368 | 369 | 展示测试报告详情,解析也页面 `断言结果`、 `请求接口错误` 、`页面错误` ,如果断言结果发生; 错误,则会**截图**展示错误结果,方便开发者查看断言错误原因;断言结果通过分组+ 脚本名称+ 脚本索引,可以更加快速的定位到测试脚本信息,页面在执行的过程中,出现了请求错误,则会抓取请求地址以及错误类型,展现在页面上; 页面错误:在运行 ete 过程中出现的错误,加载超时、找不到元素等,都会被列举出来。 370 | 371 | ### 全局配置 372 | 373 | 设置`性能分析`后,ete 在测试结束时也会导出页面性能的分析报告,开发人员可以通过分析报告,参考[web.dev](https://web.dev/performance-scoring/?utm_source=lighthouse&utm_medium=node)完成对页面的性能优化,提升了页面的加载性能的优化。 374 | 375 | ![ete 设置](../img/ete/ete08.jpeg '::etest-col-8') 376 | 377 | 点击 `文件名称`,弹出测试用例详细信息,可以对 测试用例文件进行简单的编辑操作,如`assertions` 表示断言信息,`assertions.action`表示断言结果, 如果熟悉[**断言** ](#断言值)可直接修改断言信息,保存运行提高测试的执行效率 378 | 379 | ```json 380 | { 381 | "editable": false, 382 | "frameId": 0, 383 | "linkUrl": "http://news.baidu.com/", 384 | "menuItemId": "include", 385 | "pageUrl": "https://www.baidu.com/", 386 | "selectionText": "新闻", 387 | "type": "assert", 388 | "xpath": "//*[@id=\"s-top-left\"]", 389 | "iframe": "", 390 | "assertions": { 391 | "value": "新闻", 392 | "action": "include" 393 | }, 394 | "indexNum": 12 395 | } 396 | ``` 397 | 398 | ### 录制文件上传 399 | 400 | 测试用例中有些测试场景需要支持文件上传,针对这个测试用例,可能需要开发者code代码 401 | 402 | ```javascript 403 | { 404 | "xpath": "//*[@id="page-content"]/div/div/div[1]/div/div[1]/div[1]/div/div[1]/input", 405 | "filePath": "/Users/xxx/Desktop/desktop/myproject/load.png", 406 | "type": "upload", 407 | "iframe": "", 408 | "selector": "document", 409 | "url": "https://www.xiaomiyoupin.com/", 410 | } 411 | ``` 412 | 413 | #### 关键 key 414 | 415 | | key | 描述 |是否必填| 416 | | ---------- | ------------------------------------------------------------------- |--------| 417 | | url | 当前打开的 URL 地址信息 | Y | 418 | | filePath | 上传文件路径地址,支持绝对路径,或者默认桌面文件 |Y | 419 | | type | 获取当前操作的 dom 操作类型 upload |Y | 420 | | xpath | 获取当前操作的 dom 的唯一地址 |Y | 421 | | selector | 获取当前操作的 dom 的路径信息 |N | 422 | | iframe | 当前网页是否嵌有 iframe 地址 |N | 423 | 424 | 425 | 426 | !> 如果修改的测试用例信息过多,建议重新录制脚本信息,防止文件执行过程报错,影响测试结果。 427 | 428 | ![ete 添加全局配置](../img/ete/ete25.jpg '::etest-col-8') 429 | 430 | 1. 无头模式:配置启动测试是否自动在无头模式下运行 默认是 `fasle` 431 | 2. 开启调试:配置开启调试模式后,仅在手动执行下生效,需要通过快捷键`ctrl+f`执行下一步默认是 `fasle` 432 | 3. 性能分析: 浏览器测试时,是否收集性能分析报告,**定时任务不会开启性能分析** 默认是 `fasle` 433 | 4. 行为快照: 对于页面的每一步操作都会生成快照,待用力执行完毕后,会自动导出到桌面,**定时任务不会开启行为快照** ,默认是 `fasle` 434 | 5. 设置缓存:`cookies`、`localStorage`中,这种情况只要开启此功能,会在开启页面的时候将数据塞进浏览器中,对 `sessionStorage`缓存无效,并且多个脚本同一个 `key`不同的`value`有优先使用第一个, 435 | `cookies`、`localStorage`中,这种情况只要开启此功能,会在开启页面的时候将数据塞进浏览器中,对 `sessionStorage`缓存无效,并且多个脚本同一个 `key`不同的`value`有优先使用第一个, 436 | 6. 开启高级配置:`开启高级配置` 需要再`高级配置`中,配置环境变量,不开启`高级配置 `中的配置的变量不被生效 437 | 7. 开启插件配置:`开启插件配置` 需要再`高级配置`中,配置插件配置,不开启`高级配置 `中的插件配置不被生效 438 | 8. 开启环境配置: :`开启环境配置:` 需要再`高级配置`中,配置环境配置,不开启`高级配置 `中的插件配置不被生效 439 | 9. 超时时间:浏览器在操作时,等待下一个操作的最长时间 默认是 `60s` 440 | 10. 延迟时间:由于一些特色场景需要设置长时间等待,最大不得超过`60s`, `延迟时间`与 `超时时间`同时设置延迟时间不得超过超时时间 441 | 442 | ![添加全局配置](../img/ete/ete19.jpeg '::etest-col-8') 443 | 444 | ### 高级配置 445 | 446 | #### 环境配置 447 | 448 | 对于多环境的测试问题,可以通过配置环境域名来实现在不同的环境下执行测试用例,但是需要保证在执行的测试用例的数据是一致的 449 | 450 | ![高级配置](../img/ete/ete31.jpeg '::etest-col-8') 451 | 452 | 首先配置需要区分的环境变量 453 | 454 | ![高级配置](../img/ete/ete32.jpeg '::etest-col-8') 455 | 456 | 添加需要配置的替换的环境名称 457 | 458 | ![高级配置](../img/ete/ete33.jpeg '::etest-col-8') 459 | 460 | 启用环境变量 461 | 462 | #### 变量配置 463 | 464 | 再执行自动化测试任务中有些入参是不能重复提交的,这就导致了我们录入的脚本信息,再跑定时任务的过程中,需要自定义配置入参 465 | 466 | ![高级配置](../img/ete/ete34.jpeg '::etest-col-8') 467 | 468 | 1. 手动新增环境变量 469 | 2. 来源分为`手动设置`(可以自定义配置环境变量)、 `页面取值`(通过录制脚本,获取需要取值的文本作为环境变量使用,可以修改) 470 | 3. 测试可以对于生成的环境变量取值是否符合预期 471 | 472 | 变量名称: 必填 唯一长度不能超过 20 位 473 | 取值方式:非必填 测试工具提前内置的函数 474 | 固定值:非必填 `取值方式` 为`固定值`时显示该文本,可录入该值 475 | 合并方式: 分为 `前缀`、`后缀`、`替换` ,默认后缀; 476 | 477 | ##### 取值方式 478 | 479 | 1. 固定值:自定义一个固定的值 480 | 2. 页面取值: 脚本录制生成的变量(页面取值),自定义不可设置, 481 | 3. 随机字母 2 位, 482 | 4. 随机字母 4 位, 483 | 5. 随机字母 6 位, 484 | 6. 随机字母 8 位', 485 | 7. 随机数 2 位', 486 | 8. 随机数 4 位', 487 | 9. 随机数 6 位', 488 | 10. 随机数 8 位', 489 | 11. 日期:分秒 490 | 12. 日期:时分 491 | 13. 日期:月日时 492 | 14. 日期:月日时分 493 | 15. 日期:年月日时分 494 | 16. 日期:年月日时分秒 495 | 496 | ![高级配置](../img/ete/ete35.jpeg '::etest-col-8') 497 | 498 | 系统可设置环境变量的值为`value`,点击`value`既可以设置变量,选择需要设置的变量名称 保存即可 499 | 500 | #### 插件配置 501 | 502 | 为了增强 ETE 测试功能,满足更多的测试场景,我们引入了扩展功能,方便测试自身设定的场景,我们提供自定义插件来满足需求;通过可插拔的使用方式,提升 ete 的扩展能力,全方位覆盖测试场景 可以参考[plugin](/application/plugin)。 503 | 504 | ![高级配置](../img/ete/ete36.jpeg '::etest-col-8') 505 | 506 | ![高级配置](../img/ete/ete37.jpeg '::etest-col-8') 507 | 508 | 选择 插件需要执行的生命周期 509 | 510 | ![高级配置](../img/ete/ete38.jpeg '::etest-col-8') 511 | 512 | ?> 配置完成高级配置后,必须在全局配置开启 `开启高级配置`、`开启插件配置`、`开启环境配置` 总开关,否则高就配置就不会生效, 513 | -------------------------------------------------------------------------------- /application/example.md: -------------------------------------------------------------------------------- 1 | # 快速开始 2 | 3 | ## 新建项目 4 | 5 | ![新建项目](../img/group/group03.jpeg '::etest-col-8') 6 | 7 | 点击 **新建项目** 创建需要测试的项目名称,如果对 [**定时任务** ](#定时任务配置)配置了定时任务,如果需要及时收到测试结果,可以配置[**钉钉推送**](#设置钉钉推送) 8 | 9 | !> 目前支持钉钉消息推送,后续计划引入企业微信 10 | 11 | ## 设置钉钉推送 12 | 13 | ### 创建钉钉项目群 14 | 15 | ![创建钉钉项目群](../img/dingding/ding01.jpeg '::etest-col-8') 16 | ![创建钉钉项目群](../img/dingding/ding02.jpeg '::etest-col-8') 17 | 18 | ### 引入项目只能助手 19 | 20 | ![引入项目只能助手](../img/dingding/ding04.jpeg '::etest-col-8') 21 | ![引入项目只能助手](../img/dingding/ding05.jpeg '::etest-col-8') 22 | ![引入项目只能助手](../img/dingding/ding06.jpeg '::etest-col-8') 23 | ![引入项目只能助手](../img/dingding/ding07.jpeg '::etest-col-8') 24 | ![引入项目只能助手](../img/dingding/ding08.jpeg '::etest-col-8') 25 | 26 | 安全配置勾选 `加签` ,然后妥善保存密钥, [**新建项目** ](#新建项目)中的 钉钉消息推送需要该值 27 | 28 | ![引入项目只能助手](../img/dingding/ding09.jpeg '::etest-col-8') 29 | 30 | 复制 url 连接,获取 url 的参数 token 31 | 32 | ## 创建飞书项目群 33 | 34 | ![创建飞书项目群](../img/feishu/001.jpeg '::etest-col-8') 35 | ![创建飞书项目群](../img/feishu/002.jpeg '::etest-col-8') 36 | 37 | ![创建飞书项目群](../img/feishu/003.jpeg '::etest-col-8') 38 | 39 | 复制 url 连接,获取 url 的参数 token,安全设置勾选 `签名校验` ,然后妥善保存密钥 40 | 41 | ## 定时任务配置 42 | 43 | ![定时任务配置](../img/task/task01.jpeg '::etest-col-8') 44 | ![定时任务配置](../img/task/task02.jpeg '::etest-col-8') 45 | 46 | 支持 ete、api、压力三种功能;项目支持多选;可以配置重复执行(每周一、每周二、04 时、23 时),或者仅当前的某一时刻执行(16 时),如果没有勾选,说明当天的指定时间内运行定时任务 47 | 48 | !> 如果定时任务执行过程中,网络错误或者服务器问题,导致的错误,自动间隔 30 分钟在执行一次 49 | 50 | ## 支持功能 51 | 52 | 1. 支持获取当前网络状态 :heavy_check_mark: 53 | 2. 支持请求错误数据收集汇总 :heavy_check_mark: 54 | 3. 支持定时测试任务 :heavy_check_mark: 55 | 4. 设置定时任务错误阀值 80% :heavy_check_mark: 56 | 5. 旧版本提示更新 :heavy_check_mark: 57 | 6. 导出测试报告 :heavy_check_mark: 58 | 7. 飞书消息推送 :heavy_check_mark: 59 | 8. 导出项目 :heavy_check_mark: 60 | -------------------------------------------------------------------------------- /application/plugin.md: -------------------------------------------------------------------------------- 1 | # 扩展管理 2 | 3 | 为了增强 ETE、API、UI 测试功能,满足更多的测试场景,我们引入了扩展功能,为方便测试自身特定的场景,可以自定义一些测试函数、插件来满足需求;通过可插拔的使用方式,强大的扩展能力,全方位覆盖测试场景。 4 | 5 | ## 函数管理 6 | 7 | 我们在系统内置了一些常见的函数,这些函数是不能修改的,如果还是满足不了用户需求,我们开放了自定义函数功能,开发者只需要按照要求编写自己需要的函数即可 8 | 9 | ```javascript 10 | /** 11 | * [myselfFun 自定义取值函数] 12 | * @version 1.0 13 | * @param {[object]} config [需要修改变量的参数] 14 | * @return {[string||number]} [必须有返回值返回值会作为当前执行参数信息] 15 | */ 16 | function myselfFun(config) { 17 | //todo something 18 | return item; 19 | } 20 | ``` 21 | 22 | ## 自定义插件 23 | 24 | 插件功能我们为了开发者可以对每一步测试都可以做操作,特地引入了`webpack`使用的`tapable`来管理每一步测试,向外暴露了大量的生命周期,开发者可以根据自身需要自定义自己的插件,以满足测试场景,增强测试功能。 25 | 26 | ### ETE 27 | 28 | #### ETE 插件执行流程图 29 | 30 | ![ETE](../img/plugin/ete.jpeg) 31 | 32 | #### 生命周期钩子 33 | 34 | 1. 初始化参数前(initBefore):自定义是否需要执行、 自定义 api、 修改配置参数(设置 无头模式,性能分析,行为快照,开启调试,高就配置,插件,超时时间)。 35 | 2. 初始化参数后(initAfter):自定义是否需要执行、 自定义 api、修改配置参数(设置 无头模式,性能分析,行为快照,开启调试,高就配置,插件,超时时间)。 36 | 3. 单步执行前(stepBefore):单个定义过滤执行用例(满足条件)、单个修改参数(在文件中查找)、链接数据库断言、单个自定义断言、自定义 api。 37 | 4. 单步执行后(stepAfter):单个修改断言、单个替换断言、链接数据库断言、自定义 api。 38 | 5. 报告&推送消息前(resultBefore):批量修改测试报告、批量修改推送信息、定义推送规则、自定义推送 api 39 | 6. 报告&推送消息后(resultAfter):自定义 api 40 | 41 | ### example 42 | 43 | ```javascript 44 | function myselfPlugin(config, callBack) { 45 | const itemInfor = { 46 | config: config.config, 47 | params: config.item, 48 | sendNotice: false, 49 | report: '', 50 | isEllipsis: false, 51 | isReplace: false 52 | }; 53 | callBack(null, itemInfor); 54 | } 55 | ``` 56 | 57 | #### 参数 58 | 59 | ##### config 60 | 61 | | 参数 | 说明 | 类型 | 默认值 | 有效使用周期 | 62 | | ---------- | ---------------------------------- | ------- | ------ | ------------------------------------------------ | 63 | | config | 项目配置信息和项目信息 | object | - | ALL | 64 | | params | 单个执行参数信息 | object | - | stepBefore、stepAfter | 65 | | content | 每一次执行用例测试的 html 页面内容 | string | - | stepBefore、stepAfter | 66 | | report | 测试报告结果 | Array | - | stepBefore、stepAfter、resultBefore、resultAfter | 67 | | lifeCycle | 周期名称 | string | - | ALL | 68 | | sendNotice | 是否在执行完毕后发生消息 | boolean | - | resultBefore、resultAfter | 69 | 70 | #### callBack(param1,param2) `tapable`暴露的周期函数 71 | 72 | ##### param1 73 | 74 | | 参数 | 说明 | 类型 | 默认值 | 有效使用周期 | 75 | | ------ | ------------------------------------------------ | ----------- | ------ | ------------ | 76 | | param1 | 如果参数不为 null,则返回执行错误并且停止执行测试 | null string | - | ALL | 77 | 78 | ##### param2(插件修改返回值) 79 | 80 | | 参数 | 说明 | 类型 | 默认值 | 有效使用周期 | 81 | | ---------- | ------------------------ | ------- | ------ | ----------------------------------- | 82 | | config | 项目配置信息和项目信息 | object | - | initBefore、initAfter | 83 | | params | 单个执行参数 | object | - | stepBefore、stepAfter | 84 | | report | 测试报告结果 | Array | - | stepBefore、stepAfter、resultBefore | 85 | | sendNotice | 是否在执行完毕后发生消息 | boolean | - | resultBefore | 86 | | isEllipsis | 是否省略执行本次测试用例 | boolean | false | stepBefore | 87 | | isReplace | 是否是替换测试报告 | boolean | false | stepBefore、stepAfter | 88 | 89 | ### API 90 | 91 | #### API 插件执行流程图 92 | 93 | ![api](../img/plugin/api.jpeg) 94 | 95 | #### 生命周期钩子 96 | 97 | 1. 初始化参数前(initBefore):自定义是否需要执行、 自定义 api、 修改配置参数(设置 无头模式,性能分析,行为快照,开启调试,高就配置,插件,超时时间)。 98 | 2. 单步执行前(stepBefore):单个定义过滤执行用例(满足条件)、单个修改参数(在文件中查找)、链接数据库断言、单个自定义断言、自定义 api。 99 | 3. 完成参数初始化且请求前(requesBefore):修改请求头,请求体,或终止操作 100 | 4. 请求返回后(requestAfter):修改返回值 101 | 5. 单步执行后(stepAfter):单个修改断言、单个替换断言、链接数据库断言、自定义 api。 102 | 6. 生成报告&发送消息前(resultBefore):批量修改测试报告、批量修改推送信息、定义推送规则、自定义推送 api 103 | 7. 生成报告&发送消息后(resultAfter):自定义 api 104 | 105 | ##### config 106 | 107 | | 参数 | 说明 | 类型 | 默认值 | 有效使用周期 | 108 | | ----------- | -------------------------- | ------- | ------ | ---------------------------------------------------------------------------- | 109 | | config | 项目配置信息和项目信息 | object | - | ALL | 110 | | itemInfo | 当前单个执行参数信息 | object | - | stepBefore、stepAfter | 111 | | groupConfig | 分组配置 | object | - | stepBefore、stepAfter | 112 | | headers | 单个请求头 信息 | object | - | requesBefore | 113 | | params | 单个请求参数信息 | object | - | requesBefore | 114 | | temporary | 全局变量信息参数,动态添加 | object | - | ALL | 115 | | response | 接口返回值 | object | - | requestAfter | 116 | | interface | 接口类型 | Array | - | requestAfter | 117 | | report | 测试报告结果 | Array | - | stepBefore、requesBefore、requestAfter、stepAfter、resultBefore、resultAfter | 118 | | lifeCycle | 周期名称 | string | - | ALL | 119 | | sendNotice | 是否在执行完毕后发生消息 | boolean | - | resultBefore、resultAfter | 120 | 121 | #### callBack(param1,param2) `tapable`暴露的周期函数 122 | 123 | ##### param1 124 | 125 | | 参数 | 说明 | 类型 | 默认值 | 有效使用周期 | 126 | | ------ | ------------------------------------------------ | ----------- | ------ | ------------ | 127 | | param1 | 如果参数不为 null,则返回执行错误并且停止执行测试 | null string | - | ALL | 128 | 129 | ##### param2(插件修改返回值) 130 | 131 | | 参数 | 说明 | 类型 | 默认值 | 有效使用周期 | 132 | | ----------- | -------------------------- | ------- | ------ | --------------------------------------------------- | 133 | | config | 项目配置信息和项目信息 | object | - | initBefore | 134 | | temporary | 全局变量信息参数,动态添加 | object | - | stepBefore、requesBefore 、requestAfter , stepAfter | 135 | | headers | 单个请求头 信息 | object | - | requesBefore | 136 | | params | 单个执行参数 | object | - | requesBefore | 137 | | itemInfo | 当前单个执行参数信息 | object | - | stepBefore | 138 | | groupConfig | 分组配置 | object | - | stepBefore | 139 | | response | 接口返回值 | object | - | requestAfter | 140 | | report | 测试报告结果 | Array | - | stepBefore、stepAfter、resultBefore | 141 | | sendNotice | 是否在执行完毕后发生消息 | boolean | - | resultBefore | 142 | | isEllipsis | 是否省略执行本次测试用例 | boolean | false | stepBefore | 143 | | isReplace | 是否是替换测试报告 | boolean | false | stepBefore、stepAfter | 144 | 145 | ### 压力 146 | 147 | #### 压力测试插件执行流程图 148 | 149 | ![stress](../img/plugin/ab.png) 150 | 151 | #### 生命周期钩子 152 | 153 | 1. 初始化参数前(initBefore):自定义是否需要执行、 自定义 api、 修改配置参数(设置 无头模式,性能分析,行为快照,开启调试,高就配置,插件,超时时间)。 154 | 2. 单步执行前(stepBefore):单个定义过滤执行用例(满足条件)、单个修改参数(在文件中查找)、链接数据库断言、单个自定义断言、自定义 api。 155 | 3. 完成参数初始化且请求前(requesBefore):修改请求头,请求体,或终止操作 156 | 4. 压力测试单步请求前(stepAbBefore): 157 | 5. 压力测试单步请求后(stepAbAfter): 158 | 6. 请求返回后(requestAfter):修改返回值 159 | 7. 单步执行后(stepAfter):单个修改断言、单个替换断言、链接数据库断言、自定义 api。 160 | 8. 生成报告&发送消息前(resultBefore):批量修改测试报告、批量修改推送信息、定义推送规则、自定义推送 api 161 | 9. 生成报告&发送消息后(resultAfter):自定义 api 162 | 163 | 171 | -------------------------------------------------------------------------------- /application/ui.md: -------------------------------------------------------------------------------- 1 | # UI 2 | 3 | 4 | 5 | 6 | ## 解决痛点 7 | 8 | 对于 ui 设计稿的还原度,是 C 端开发人员的一个工作重点,设计稿还原的好坏对一个项目要求至关重要。而且在页面还原度的问题上,我们经常看到开发经常找 UI 设计师沟通,这就大大提高了沟通成本,导致后续的开发时间压缩;集成测试的 UI 还原功能可以减少开发与 UI 设计师的沟通成本,只需设计把 UI 设计稿与开发的页面按要求,导入集成测试中,然后就会生成测试报告,开发只要根据测试结果修改,就可以修改,节约沟通成本,大大提高了开发人员的效率。 9 | 10 | ## UI 还原测试流程图 11 | 12 | ![logo](../img/ui.png) 13 | 14 | ## 功能列表 15 | 16 | 1. 支持 UI 设计图和网页 url 比较 :heavy_check_mark: 17 | 2. 支持 UI 设计图和截图比较 :heavy_check_mark: 18 | 3. 支持运行还原测试时,排除掉某些项目 :heavy_check_mark: 19 | 4. 支持批量新增 :heavy_check_mark: 20 | 5. 支持设备类型设置,区分 PC 和 Mobile :heavy_check_mark: 21 | 6. 支持自定义对比颜色 :heavy_check_mark: 22 | 7. 支持生成测试报告 :heavy_check_mark: 23 | 8. 支持自定义配置颜色 :heavy_check_mark: 24 | 9. 支持自定义截图设置 cookie :heavy_check_mark: 25 | 10. 支持在线对生成的对比图片做备注 :heavy_check_mark: 26 | 11. 支持在线批量下载对比图片 :heavy_check_mark: 27 | 28 | ## 快速开始 29 | 30 | ### 设置全局对比参数 31 | 32 | - 选择设备类型,设置 dpr 33 | - 设置差异对比时的颜色标注等 34 | 35 | ![ui比对](../img/ui/01.png '::etest-col-8') 36 | 37 | 如果有页面传参需求,可点击`参数配置`进行设置 38 | 39 | ![ui比对](../img/ui/02.png '::etest-col-8') 40 | 41 | ### 新增配置 42 | 43 | 切换至 UI 配置,点击新增,可选单个新增和批量新增 44 | 45 | ![ui比对](../img/ui/03.png '::etest-col-8') 46 | 47 | #### 单个新增 48 | 49 | - 新增 url 与 ui 图比对,上传 ui 设计图,输入网址 50 | 51 | ![ui比对](../img/ui/04.png '::etest-col-8') 52 | 53 | - 新增截图与 ui 图比对,点击右下角`使用图片对比`,上传 ui 设计图,上传开发完成的截图 54 | 55 | ![ui比对](../img/ui/05.png '::etest-col-8') 56 | 57 | #### 批量新增 58 | 59 | - 将需要对比的图片批量上传 60 | - 自行拖动到对应的区域,其中等待或者废弃区会在保存时丢弃 61 | 62 | ![ui比对](../img/ui/06.png '::etest-col-8') 63 | 64 | ![ui比对](../img/ui/07.png '::etest-col-8') 65 | 66 | ### 运行测试 67 | 68 | 对比设置完毕,点击`开始运行UI还原测试`,即可生成对应的测试报告 69 | 70 | ![ui比对](../img/ui/08.png '::etest-col-8') 71 | 72 | !> 注意: 首次运行自动化前,请检查本地是否按装chrome 浏览器 73 | 74 | ### 报告列表 75 | 76 | 测试报告列表,操作栏从左到右分别是 查看报告详情 | 图片备注 | 下载 | 删除 77 | 78 | ![ui比对](../img/ui/09.png '::etest-col-8') 79 | 80 | 点击`查看报告详情`,即可看到还原度信息,原型图、网页截图、差异对比图的展示 81 | 82 | ![ui比对](../img/ui/10.png '::etest-col-8') 83 | 84 | 点击`图片备注`, 即可对每张图片进行备注,方便开发人员和测试人员直接在图片上沟通 85 | 86 | ![ui比对](../img/ui/11.png '::etest-col-8') 87 | 88 | 点击`下载`, 即可将所有图片下载打包 89 | 90 | ![ui比对](../img/ui/12.png '::etest-col-8') 91 | 92 | 点击`删除`, 即可删除当前生成的报告 93 | -------------------------------------------------------------------------------- /build.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/build.jpeg -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/docs/index.md -------------------------------------------------------------------------------- /google490069ebac017973.html: -------------------------------------------------------------------------------- 1 | google-site-verification: google490069ebac017973.html -------------------------------------------------------------------------------- /img/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/.DS_Store -------------------------------------------------------------------------------- /img/build.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/build.jpeg -------------------------------------------------------------------------------- /img/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/chrome.png -------------------------------------------------------------------------------- /img/chrome/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/chrome/.DS_Store -------------------------------------------------------------------------------- /img/chrome/chrome01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/chrome/chrome01.png -------------------------------------------------------------------------------- /img/chrome/chrome02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/chrome/chrome02.png -------------------------------------------------------------------------------- /img/chrome/chrome03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/chrome/chrome03.png -------------------------------------------------------------------------------- /img/chrome/chrome04.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/chrome/chrome04.jpeg -------------------------------------------------------------------------------- /img/chrome/chrome05.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/chrome/chrome05.jpeg -------------------------------------------------------------------------------- /img/dingding/ding01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding01.jpeg -------------------------------------------------------------------------------- /img/dingding/ding02.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding02.jpeg -------------------------------------------------------------------------------- /img/dingding/ding03.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding03.jpeg -------------------------------------------------------------------------------- /img/dingding/ding04.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding04.jpeg -------------------------------------------------------------------------------- /img/dingding/ding05.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding05.jpeg -------------------------------------------------------------------------------- /img/dingding/ding06.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding06.jpeg -------------------------------------------------------------------------------- /img/dingding/ding07.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding07.jpeg -------------------------------------------------------------------------------- /img/dingding/ding08.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding08.jpeg -------------------------------------------------------------------------------- /img/dingding/ding09.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/dingding/ding09.jpeg -------------------------------------------------------------------------------- /img/ete/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/.DS_Store -------------------------------------------------------------------------------- /img/ete/ete01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete01.jpeg -------------------------------------------------------------------------------- /img/ete/ete02.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete02.jpeg -------------------------------------------------------------------------------- /img/ete/ete03.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete03.jpeg -------------------------------------------------------------------------------- /img/ete/ete04.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete04.jpeg -------------------------------------------------------------------------------- /img/ete/ete06.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete06.jpeg -------------------------------------------------------------------------------- /img/ete/ete07.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete07.jpeg -------------------------------------------------------------------------------- /img/ete/ete08.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete08.jpeg -------------------------------------------------------------------------------- /img/ete/ete09.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete09.jpeg -------------------------------------------------------------------------------- /img/ete/ete10.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete10.jpeg -------------------------------------------------------------------------------- /img/ete/ete11.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete11.jpeg -------------------------------------------------------------------------------- /img/ete/ete13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete13.png -------------------------------------------------------------------------------- /img/ete/ete14.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete14.jpeg -------------------------------------------------------------------------------- /img/ete/ete15.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete15.jpeg -------------------------------------------------------------------------------- /img/ete/ete16.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete16.jpeg -------------------------------------------------------------------------------- /img/ete/ete17.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete17.jpeg -------------------------------------------------------------------------------- /img/ete/ete18.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete18.jpeg -------------------------------------------------------------------------------- /img/ete/ete19.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete19.jpeg -------------------------------------------------------------------------------- /img/ete/ete20.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete20.jpeg -------------------------------------------------------------------------------- /img/ete/ete21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete21.png -------------------------------------------------------------------------------- /img/ete/ete22.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete22.jpeg -------------------------------------------------------------------------------- /img/ete/ete23.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete23.jpeg -------------------------------------------------------------------------------- /img/ete/ete24.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete24.jpeg -------------------------------------------------------------------------------- /img/ete/ete25.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete25.jpeg -------------------------------------------------------------------------------- /img/ete/ete25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete25.jpg -------------------------------------------------------------------------------- /img/ete/ete26.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete26.jpeg -------------------------------------------------------------------------------- /img/ete/ete27.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete27.jpeg -------------------------------------------------------------------------------- /img/ete/ete28.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete28.jpeg -------------------------------------------------------------------------------- /img/ete/ete29.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete29.jpeg -------------------------------------------------------------------------------- /img/ete/ete30.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete30.jpeg -------------------------------------------------------------------------------- /img/ete/ete30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete30.jpg -------------------------------------------------------------------------------- /img/ete/ete31.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete31.jpeg -------------------------------------------------------------------------------- /img/ete/ete32.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete32.jpeg -------------------------------------------------------------------------------- /img/ete/ete33.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete33.jpeg -------------------------------------------------------------------------------- /img/ete/ete34.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete34.jpeg -------------------------------------------------------------------------------- /img/ete/ete35.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete35.jpeg -------------------------------------------------------------------------------- /img/ete/ete36.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete36.jpeg -------------------------------------------------------------------------------- /img/ete/ete37.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete37.jpeg -------------------------------------------------------------------------------- /img/ete/ete38.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ete/ete38.jpeg -------------------------------------------------------------------------------- /img/etereport.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/etereport.jpeg -------------------------------------------------------------------------------- /img/etereslist.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/etereslist.jpeg -------------------------------------------------------------------------------- /img/etest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/etest.png -------------------------------------------------------------------------------- /img/etetest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/etetest.png -------------------------------------------------------------------------------- /img/feishu/001.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/feishu/001.jpeg -------------------------------------------------------------------------------- /img/feishu/002.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/feishu/002.jpeg -------------------------------------------------------------------------------- /img/feishu/003.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/feishu/003.jpeg -------------------------------------------------------------------------------- /img/group/group01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/group/group01.jpeg -------------------------------------------------------------------------------- /img/group/group02.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/group/group02.jpeg -------------------------------------------------------------------------------- /img/group/group03.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/group/group03.jpeg -------------------------------------------------------------------------------- /img/home.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/home.jpeg -------------------------------------------------------------------------------- /img/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/icon.ico -------------------------------------------------------------------------------- /img/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/logo.jpg -------------------------------------------------------------------------------- /img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/logo.png -------------------------------------------------------------------------------- /img/logo1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/logo1.jpg -------------------------------------------------------------------------------- /img/logo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/logo3.png -------------------------------------------------------------------------------- /img/plugin/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/plugin/.DS_Store -------------------------------------------------------------------------------- /img/plugin/ab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/plugin/ab.png -------------------------------------------------------------------------------- /img/plugin/api.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/plugin/api.jpeg -------------------------------------------------------------------------------- /img/plugin/ete.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/plugin/ete.jpeg -------------------------------------------------------------------------------- /img/sgbfyxr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/sgbfyxr.png -------------------------------------------------------------------------------- /img/task.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/task.jpeg -------------------------------------------------------------------------------- /img/task/task01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/task/task01.jpeg -------------------------------------------------------------------------------- /img/task/task02.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/task/task02.jpeg -------------------------------------------------------------------------------- /img/ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui.png -------------------------------------------------------------------------------- /img/ui/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/.DS_Store -------------------------------------------------------------------------------- /img/ui/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/01.png -------------------------------------------------------------------------------- /img/ui/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/02.png -------------------------------------------------------------------------------- /img/ui/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/03.png -------------------------------------------------------------------------------- /img/ui/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/04.png -------------------------------------------------------------------------------- /img/ui/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/05.png -------------------------------------------------------------------------------- /img/ui/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/06.png -------------------------------------------------------------------------------- /img/ui/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/07.png -------------------------------------------------------------------------------- /img/ui/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/08.png -------------------------------------------------------------------------------- /img/ui/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/09.png -------------------------------------------------------------------------------- /img/ui/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/10.png -------------------------------------------------------------------------------- /img/ui/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/11.png -------------------------------------------------------------------------------- /img/ui/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/ui/12.png -------------------------------------------------------------------------------- /img/uires.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/uires.png -------------------------------------------------------------------------------- /img/wx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/wx.jpg -------------------------------------------------------------------------------- /img/截屏2021-08-13 下午10.53.16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alltheblue/docs/672761f3506e131d1f09a2de1a5d6c3b86c9f159/img/截屏2021-08-13 下午10.53.16.png -------------------------------------------------------------------------------- /index.css: -------------------------------------------------------------------------------- 1 | .app-name-link img { 2 | width: 200px; 3 | } 4 | img { 5 | margin: 4px; 6 | } 7 | 8 | .etest-img { 9 | display: none; 10 | } 11 | 12 | .etest-col-2 { 13 | width: 20%; 14 | box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.05); 15 | } 16 | .etest-col-3 { 17 | width: 30%; 18 | box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.05); 19 | } 20 | .etest-col-4 { 21 | width: 40%; 22 | box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.05); 23 | } 24 | .etest-col-5 { 25 | width: 50%; 26 | } 27 | .etest-col-6 { 28 | width: 60%; 29 | } 30 | .etest-col-7 { 31 | width: 70%; 32 | box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.05); 33 | } 34 | 35 | .etest-col-3, 36 | img[title='::etest-col-3'] { 37 | width: 30%; 38 | box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.05); 39 | } 40 | 41 | .etest-col-5, 42 | img[title='::etest-col-5'] { 43 | width: 50%; 44 | box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.05); 45 | } 46 | 47 | .etest-col-8, 48 | img[title='::etest-col-8'] { 49 | width: 80%; 50 | box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.05); 51 | } 52 | 53 | .etest-col-9 { 54 | width: 90%; 55 | } 56 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | eTest-集成测试 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 29 | 30 | 31 | 32 |
⏰ 加载中...
33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /lib/docsify-copy-code.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * docsify-copy-code 3 | * v2.1.0 4 | * https://github.com/jperasmus/docsify-copy-code 5 | * (c) 2017-2019 JP Erasmus 6 | * MIT license 7 | */ 8 | !function(){"use strict";function r(o){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o})(o)}!function(o,e){void 0===e&&(e={});var t=e.insertAt;if(o&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===t&&n.firstChild?n.insertBefore(c,n.firstChild):n.appendChild(c),c.styleSheet?c.styleSheet.cssText=o:c.appendChild(document.createTextNode(o))}}(".docsify-copy-code-button,.docsify-copy-code-button span{cursor:pointer;transition:all .25s ease}.docsify-copy-code-button{position:absolute;z-index:1;top:0;right:0;overflow:visible;padding:.65em .8em;border:0;border-radius:0;outline:0;font-size:1em;background:grey;background:var(--theme-color,grey);color:#fff;opacity:0}.docsify-copy-code-button span{border-radius:3px;background:inherit;pointer-events:none}.docsify-copy-code-button .error,.docsify-copy-code-button .success{position:absolute;z-index:-100;top:50%;left:0;padding:.5em .65em;font-size:.825em;opacity:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.docsify-copy-code-button.error .error,.docsify-copy-code-button.success .success{opacity:1;-webkit-transform:translate(-115%,-50%);transform:translate(-115%,-50%)}.docsify-copy-code-button:focus,pre:hover .docsify-copy-code-button{opacity:1}"),document.querySelector('link[href*="docsify-copy-code"]')&&console.warn("[Deprecation] Link to external docsify-copy-code stylesheet is no longer necessary."),window.DocsifyCopyCodePlugin={init:function(){return function(o,e){o.ready(function(){console.warn("[Deprecation] Manually initializing docsify-copy-code using window.DocsifyCopyCodePlugin.init() is no longer necessary.")})}}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(o,s){o.doneEach(function(){var o=Array.apply(null,document.querySelectorAll("pre[data-lang]")),c={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};s.config.copyCode&&Object.keys(c).forEach(function(t){var n=s.config.copyCode[t];"string"==typeof n?c[t]=n:"object"===r(n)&&Object.keys(n).some(function(o){var e=-1',''.concat(c.buttonText,""),''.concat(c.errorText,""),''.concat(c.successText,""),""].join("");o.forEach(function(o){o.insertAdjacentHTML("beforeend",e)})}),o.mounted(function(){document.querySelector(".content").addEventListener("click",function(o){if(o.target.classList.contains("docsify-copy-code-button")){var e="BUTTON"===o.target.tagName?o.target:o.target.parentNode,t=document.createRange(),n=e.parentNode.querySelector("code"),c=window.getSelection();t.selectNode(n),c.removeAllRanges(),c.addRange(t);try{document.execCommand("copy")&&(e.classList.add("success"),setTimeout(function(){e.classList.remove("success")},1e3))}catch(o){console.error("docsify-copy-code: ".concat(o)),e.classList.add("error"),setTimeout(function(){e.classList.remove("error")},1e3)}"function"==typeof(c=window.getSelection()).removeRange?c.removeRange(t):"function"==typeof c.removeAllRanges&&c.removeAllRanges()}})})}].concat(window.$docsify.plugins||[])}(); 9 | //# sourceMappingURL=docsify-copy-code.min.js.map -------------------------------------------------------------------------------- /lib/docsify-pagination.min.js: -------------------------------------------------------------------------------- 1 | !function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e():"function"==typeof define&&define.amd?define(e):e()}(0,function(){"use strict";var n,c=(function(n,e){function t(n,e){return e.querySelector(n)}(e=n.exports=function(n,e){return t(n,e=e||document)}).all=function(n,e){return(e=e||document).querySelectorAll(n)},e.engine=function(n){if(!n.one)throw new Error(".one callback required");if(!n.all)throw new Error(".all callback required");return t=n.one,e.all=n.all,e}}(n={exports:{}},n.exports),n.exports);c.all,c.engine;try{var o=c}catch(n){o=c}var e=Element.prototype,a=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector,s=function(n,e){if(!n||1!==n.nodeType)return!1;if(a)return a.call(n,e);for(var t=o.all(e,n.parentNode),i=0;i*{line-height:1;vertical-align:middle}.pagination-item-label svg{height:.8em;width:auto;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1px}.pagination-item--next{margin-left:auto;text-align:right}.pagination-item--next svg{margin-left:.5em}.pagination-item--previous svg{margin-right:.5em}.pagination-item-title{font-size:1.6em}");var t=function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")},r=function(){function i(n,e){for(var t=0;t'},inner:function(n,e){return[n.prev&&'\n \n ",n.next&&'\n \n "].filter(Boolean).join("")}};window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(n,e){var t=l({},u,e.config.pagination||{});function i(){var n=c("."+f);n&&(n.innerHTML=v.inner(function(n,e){try{var t=n.route.path,i=d(c.all(".sidebar li a")).filter(function(n){return!s(n,".section-link")}),o=i.find(m(t)),a=d((p(o,"ul")||{}).children).filter(function(n){return"LI"===n.tagName.toUpperCase()}),r=e?i.findIndex(m(t)):a.findIndex(function(n){var e=g(n);return e&&m(t,e)}),l=e?i:a;return{prev:new h(l[r-1]).toJSON(),next:new h(l[r+1]).toJSON()}}catch(n){return{}}}(e,t.crossChapter),t))}n.afterEach(function(n){return n+v.container()}),n.doneEach(function(){return i()})}].concat(window.$docsify.plugins||[])}); -------------------------------------------------------------------------------- /lib/emoji.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var AllGithubEmoji = [ 3 | '+1', 4 | '100', 5 | '1234', 6 | '8ball', 7 | 'a', 8 | 'ab', 9 | 'abc', 10 | 'abcd', 11 | 'accept', 12 | 'aerial_tramway', 13 | 'airplane', 14 | 'alarm_clock', 15 | 'alien', 16 | 'ambulance', 17 | 'anchor', 18 | 'angel', 19 | 'anger', 20 | 'angry', 21 | 'anguished', 22 | 'ant', 23 | 'apple', 24 | 'aquarius', 25 | 'aries', 26 | 'arrow_backward', 27 | 'arrow_double_down', 28 | 'arrow_double_up', 29 | 'arrow_down', 30 | 'arrow_down_small', 31 | 'arrow_forward', 32 | 'arrow_heading_down', 33 | 'arrow_heading_up', 34 | 'arrow_left', 35 | 'arrow_lower_left', 36 | 'arrow_lower_right', 37 | 'arrow_right', 38 | 'arrow_right_hook', 39 | 'arrow_up', 40 | 'arrow_up_down', 41 | 'arrow_up_small', 42 | 'arrow_upper_left', 43 | 'arrow_upper_right', 44 | 'arrows_clockwise', 45 | 'arrows_counterclockwise', 46 | 'art', 47 | 'articulated_lorry', 48 | 'astonished', 49 | 'athletic_shoe', 50 | 'atm', 51 | 'b', 52 | 'baby', 53 | 'baby_bottle', 54 | 'baby_chick', 55 | 'baby_symbol', 56 | 'back', 57 | 'baggage_claim', 58 | 'balloon', 59 | 'ballot_box_with_check', 60 | 'bamboo', 61 | 'banana', 62 | 'bangbang', 63 | 'bank', 64 | 'bar_chart', 65 | 'barber', 66 | 'baseball', 67 | 'basketball', 68 | 'bath', 69 | 'bathtub', 70 | 'battery', 71 | 'bear', 72 | 'bee', 73 | 'beer', 74 | 'beers', 75 | 'beetle', 76 | 'beginner', 77 | 'bell', 78 | 'bento', 79 | 'bicyclist', 80 | 'bike', 81 | 'bikini', 82 | 'bird', 83 | 'birthday', 84 | 'black_circle', 85 | 'black_joker', 86 | 'black_large_square', 87 | 'black_medium_small_square', 88 | 'black_medium_square', 89 | 'black_nib', 90 | 'black_small_square', 91 | 'black_square_button', 92 | 'blossom', 93 | 'blowfish', 94 | 'blue_book', 95 | 'blue_car', 96 | 'blue_heart', 97 | 'blush', 98 | 'boar', 99 | 'boat', 100 | 'bomb', 101 | 'book', 102 | 'bookmark', 103 | 'bookmark_tabs', 104 | 'books', 105 | 'boom', 106 | 'boot', 107 | 'bouquet', 108 | 'bow', 109 | 'bowling', 110 | 'bowtie', 111 | 'boy', 112 | 'bread', 113 | 'bride_with_veil', 114 | 'bridge_at_night', 115 | 'briefcase', 116 | 'broken_heart', 117 | 'bug', 118 | 'bulb', 119 | 'bullettrain_front', 120 | 'bullettrain_side', 121 | 'bus', 122 | 'busstop', 123 | 'bust_in_silhouette', 124 | 'busts_in_silhouette', 125 | 'cactus', 126 | 'cake', 127 | 'calendar', 128 | 'calling', 129 | 'camel', 130 | 'camera', 131 | 'cancer', 132 | 'candy', 133 | 'capital_abcd', 134 | 'capricorn', 135 | 'car', 136 | 'card_index', 137 | 'carousel_horse', 138 | 'cat', 139 | 'cat2', 140 | 'cd', 141 | 'chart', 142 | 'chart_with_downwards_trend', 143 | 'chart_with_upwards_trend', 144 | 'checkered_flag', 145 | 'cherries', 146 | 'cherry_blossom', 147 | 'chestnut', 148 | 'chicken', 149 | 'children_crossing', 150 | 'chocolate_bar', 151 | 'christmas_tree', 152 | 'church', 153 | 'cinema', 154 | 'circus_tent', 155 | 'city_sunrise', 156 | 'city_sunset', 157 | 'cl', 158 | 'clap', 159 | 'clapper', 160 | 'clipboard', 161 | 'clock1', 162 | 'clock10', 163 | 'clock1030', 164 | 'clock11', 165 | 'clock1130', 166 | 'clock12', 167 | 'clock1230', 168 | 'clock130', 169 | 'clock2', 170 | 'clock230', 171 | 'clock3', 172 | 'clock330', 173 | 'clock4', 174 | 'clock430', 175 | 'clock5', 176 | 'clock530', 177 | 'clock6', 178 | 'clock630', 179 | 'clock7', 180 | 'clock730', 181 | 'clock8', 182 | 'clock830', 183 | 'clock9', 184 | 'clock930', 185 | 'closed_book', 186 | 'closed_lock_with_key', 187 | 'closed_umbrella', 188 | 'cloud', 189 | 'clubs', 190 | 'cn', 191 | 'cocktail', 192 | 'coffee', 193 | 'cold_sweat', 194 | 'collision', 195 | 'computer', 196 | 'confetti_ball', 197 | 'confounded', 198 | 'confused', 199 | 'congratulations', 200 | 'construction', 201 | 'construction_worker', 202 | 'convenience_store', 203 | 'cookie', 204 | 'cool', 205 | 'cop', 206 | 'copyright', 207 | 'corn', 208 | 'couple', 209 | 'couple_with_heart', 210 | 'couplekiss', 211 | 'cow', 212 | 'cow2', 213 | 'credit_card', 214 | 'crescent_moon', 215 | 'crocodile', 216 | 'crossed_flags', 217 | 'crown', 218 | 'cry', 219 | 'crying_cat_face', 220 | 'crystal_ball', 221 | 'cupid', 222 | 'curly_loop', 223 | 'currency_exchange', 224 | 'curry', 225 | 'custard', 226 | 'customs', 227 | 'cyclone', 228 | 'dancer', 229 | 'dancers', 230 | 'dango', 231 | 'dart', 232 | 'dash', 233 | 'date', 234 | 'de', 235 | 'deciduous_tree', 236 | 'department_store', 237 | 'diamond_shape_with_a_dot_inside', 238 | 'diamonds', 239 | 'disappointed', 240 | 'disappointed_relieved', 241 | 'dizzy', 242 | 'dizzy_face', 243 | 'do_not_litter', 244 | 'dog', 245 | 'dog2', 246 | 'dollar', 247 | 'dolls', 248 | 'dolphin', 249 | 'door', 250 | 'doughnut', 251 | 'dragon', 252 | 'dragon_face', 253 | 'dress', 254 | 'dromedary_camel', 255 | 'droplet', 256 | 'dvd', 257 | 'e-mail', 258 | 'ear', 259 | 'ear_of_rice', 260 | 'earth_africa', 261 | 'earth_americas', 262 | 'earth_asia', 263 | 'egg', 264 | 'eggplant', 265 | 'eight', 266 | 'eight_pointed_black_star', 267 | 'eight_spoked_asterisk', 268 | 'electric_plug', 269 | 'elephant', 270 | 'email', 271 | 'end', 272 | 'envelope', 273 | 'envelope_with_arrow', 274 | 'es', 275 | 'euro', 276 | 'european_castle', 277 | 'european_post_office', 278 | 'evergreen_tree', 279 | 'exclamation', 280 | 'expressionless', 281 | 'eyeglasses', 282 | 'eyes', 283 | 'facepunch', 284 | 'factory', 285 | 'fallen_leaf', 286 | 'family', 287 | 'fast_forward', 288 | 'fax', 289 | 'fearful', 290 | 'feelsgood', 291 | 'feet', 292 | 'ferris_wheel', 293 | 'file_folder', 294 | 'finnadie', 295 | 'fire', 296 | 'fire_engine', 297 | 'fireworks', 298 | 'first_quarter_moon', 299 | 'first_quarter_moon_with_face', 300 | 'fish', 301 | 'fish_cake', 302 | 'fishing_pole_and_fish', 303 | 'fist', 304 | 'five', 305 | 'flags', 306 | 'flashlight', 307 | 'flipper', 308 | 'floppy_disk', 309 | 'flower_playing_cards', 310 | 'flushed', 311 | 'foggy', 312 | 'football', 313 | 'footprints', 314 | 'fork_and_knife', 315 | 'fountain', 316 | 'four', 317 | 'four_leaf_clover', 318 | 'fr', 319 | 'free', 320 | 'fried_shrimp', 321 | 'fries', 322 | 'frog', 323 | 'frowning', 324 | 'fu', 325 | 'fuelpump', 326 | 'full_moon', 327 | 'full_moon_with_face', 328 | 'game_die', 329 | 'gb', 330 | 'gem', 331 | 'gemini', 332 | 'ghost', 333 | 'gift', 334 | 'gift_heart', 335 | 'girl', 336 | 'globe_with_meridians', 337 | 'goat', 338 | 'goberserk', 339 | 'godmode', 340 | 'golf', 341 | 'grapes', 342 | 'green_apple', 343 | 'green_book', 344 | 'green_heart', 345 | 'grey_exclamation', 346 | 'grey_question', 347 | 'grimacing', 348 | 'grin', 349 | 'grinning', 350 | 'guardsman', 351 | 'guitar', 352 | 'gun', 353 | 'haircut', 354 | 'hamburger', 355 | 'hammer', 356 | 'hamster', 357 | 'hand', 358 | 'handbag', 359 | 'hankey', 360 | 'hash', 361 | 'hatched_chick', 362 | 'hatching_chick', 363 | 'headphones', 364 | 'hear_no_evil', 365 | 'heart', 366 | 'heart_decoration', 367 | 'heart_eyes', 368 | 'heart_eyes_cat', 369 | 'heartbeat', 370 | 'heartpulse', 371 | 'hearts', 372 | 'heavy_check_mark', 373 | 'heavy_division_sign', 374 | 'heavy_dollar_sign', 375 | 'heavy_exclamation_mark', 376 | 'heavy_minus_sign', 377 | 'heavy_multiplication_x', 378 | 'heavy_plus_sign', 379 | 'helicopter', 380 | 'herb', 381 | 'hibiscus', 382 | 'high_brightness', 383 | 'high_heel', 384 | 'hocho', 385 | 'honey_pot', 386 | 'honeybee', 387 | 'horse', 388 | 'horse_racing', 389 | 'hospital', 390 | 'hotel', 391 | 'hotsprings', 392 | 'hourglass', 393 | 'hourglass_flowing_sand', 394 | 'house', 395 | 'house_with_garden', 396 | 'hurtrealbad', 397 | 'hushed', 398 | 'ice_cream', 399 | 'icecream', 400 | 'id', 401 | 'ideograph_advantage', 402 | 'imp', 403 | 'inbox_tray', 404 | 'incoming_envelope', 405 | 'information_desk_person', 406 | 'information_source', 407 | 'innocent', 408 | 'interrobang', 409 | 'iphone', 410 | 'it', 411 | 'izakaya_lantern', 412 | 'jack_o_lantern', 413 | 'japan', 414 | 'japanese_castle', 415 | 'japanese_goblin', 416 | 'japanese_ogre', 417 | 'jeans', 418 | 'joy', 419 | 'joy_cat', 420 | 'jp', 421 | 'key', 422 | 'keycap_ten', 423 | 'kimono', 424 | 'kiss', 425 | 'kissing', 426 | 'kissing_cat', 427 | 'kissing_closed_eyes', 428 | 'kissing_heart', 429 | 'kissing_smiling_eyes', 430 | 'koala', 431 | 'koko', 432 | 'kr', 433 | 'lantern', 434 | 'large_blue_circle', 435 | 'large_blue_diamond', 436 | 'large_orange_diamond', 437 | 'last_quarter_moon', 438 | 'last_quarter_moon_with_face', 439 | 'laughing', 440 | 'leaves', 441 | 'ledger', 442 | 'left_luggage', 443 | 'left_right_arrow', 444 | 'leftwards_arrow_with_hook', 445 | 'lemon', 446 | 'leo', 447 | 'leopard', 448 | 'libra', 449 | 'light_rail', 450 | 'link', 451 | 'lips', 452 | 'lipstick', 453 | 'lock', 454 | 'lock_with_ink_pen', 455 | 'lollipop', 456 | 'loop', 457 | 'loud_sound', 458 | 'loudspeaker', 459 | 'love_hotel', 460 | 'love_letter', 461 | 'low_brightness', 462 | 'm', 463 | 'mag', 464 | 'mag_right', 465 | 'mahjong', 466 | 'mailbox', 467 | 'mailbox_closed', 468 | 'mailbox_with_mail', 469 | 'mailbox_with_no_mail', 470 | 'man', 471 | 'man_with_gua_pi_mao', 472 | 'man_with_turban', 473 | 'mans_shoe', 474 | 'maple_leaf', 475 | 'mask', 476 | 'massage', 477 | 'meat_on_bone', 478 | 'mega', 479 | 'melon', 480 | 'memo', 481 | 'mens', 482 | 'metal', 483 | 'metro', 484 | 'microphone', 485 | 'microscope', 486 | 'milky_way', 487 | 'minibus', 488 | 'minidisc', 489 | 'mobile_phone_off', 490 | 'money_with_wings', 491 | 'moneybag', 492 | 'monkey', 493 | 'monkey_face', 494 | 'monorail', 495 | 'moon', 496 | 'mortar_board', 497 | 'mount_fuji', 498 | 'mountain_bicyclist', 499 | 'mountain_cableway', 500 | 'mountain_railway', 501 | 'mouse', 502 | 'mouse2', 503 | 'movie_camera', 504 | 'moyai', 505 | 'muscle', 506 | 'mushroom', 507 | 'musical_keyboard', 508 | 'musical_note', 509 | 'musical_score', 510 | 'mute', 511 | 'nail_care', 512 | 'name_badge', 513 | 'neckbeard', 514 | 'necktie', 515 | 'negative_squared_cross_mark', 516 | 'neutral_face', 517 | 'new', 518 | 'new_moon', 519 | 'new_moon_with_face', 520 | 'newspaper', 521 | 'ng', 522 | 'night_with_stars', 523 | 'nine', 524 | 'no_bell', 525 | 'no_bicycles', 526 | 'no_entry', 527 | 'no_entry_sign', 528 | 'no_good', 529 | 'no_mobile_phones', 530 | 'no_mouth', 531 | 'no_pedestrians', 532 | 'no_smoking', 533 | 'non-potable_water', 534 | 'nose', 535 | 'notebook', 536 | 'notebook_with_decorative_cover', 537 | 'notes', 538 | 'nut_and_bolt', 539 | 'o', 540 | 'o2', 541 | 'ocean', 542 | 'octocat', 543 | 'octopus', 544 | 'oden', 545 | 'office', 546 | 'ok', 547 | 'ok_hand', 548 | 'ok_woman', 549 | 'older_man', 550 | 'older_woman', 551 | 'on', 552 | 'oncoming_automobile', 553 | 'oncoming_bus', 554 | 'oncoming_police_car', 555 | 'oncoming_taxi', 556 | 'one', 557 | 'open_book', 558 | 'open_file_folder', 559 | 'open_hands', 560 | 'open_mouth', 561 | 'ophiuchus', 562 | 'orange_book', 563 | 'outbox_tray', 564 | 'ox', 565 | 'package', 566 | 'page_facing_up', 567 | 'page_with_curl', 568 | 'pager', 569 | 'palm_tree', 570 | 'panda_face', 571 | 'paperclip', 572 | 'parking', 573 | 'part_alternation_mark', 574 | 'partly_sunny', 575 | 'passport_control', 576 | 'paw_prints', 577 | 'peach', 578 | 'pear', 579 | 'pencil', 580 | 'pencil2', 581 | 'penguin', 582 | 'pensive', 583 | 'performing_arts', 584 | 'persevere', 585 | 'person_frowning', 586 | 'person_with_blond_hair', 587 | 'person_with_pouting_face', 588 | 'phone', 589 | 'pig', 590 | 'pig2', 591 | 'pig_nose', 592 | 'pill', 593 | 'pineapple', 594 | 'pisces', 595 | 'pizza', 596 | 'point_down', 597 | 'point_left', 598 | 'point_right', 599 | 'point_up', 600 | 'point_up_2', 601 | 'police_car', 602 | 'poodle', 603 | 'poop', 604 | 'post_office', 605 | 'postal_horn', 606 | 'postbox', 607 | 'potable_water', 608 | 'pouch', 609 | 'poultry_leg', 610 | 'pound', 611 | 'pouting_cat', 612 | 'pray', 613 | 'princess', 614 | 'punch', 615 | 'purple_heart', 616 | 'purse', 617 | 'pushpin', 618 | 'put_litter_in_its_place', 619 | 'question', 620 | 'rabbit', 621 | 'rabbit2', 622 | 'racehorse', 623 | 'radio', 624 | 'radio_button', 625 | 'rage', 626 | 'rage1', 627 | 'rage2', 628 | 'rage3', 629 | 'rage4', 630 | 'railway_car', 631 | 'rainbow', 632 | 'raised_hand', 633 | 'raised_hands', 634 | 'raising_hand', 635 | 'ram', 636 | 'ramen', 637 | 'rat', 638 | 'recycle', 639 | 'red_car', 640 | 'red_circle', 641 | 'registered', 642 | 'relaxed', 643 | 'relieved', 644 | 'repeat', 645 | 'repeat_one', 646 | 'restroom', 647 | 'revolving_hearts', 648 | 'rewind', 649 | 'ribbon', 650 | 'rice', 651 | 'rice_ball', 652 | 'rice_cracker', 653 | 'rice_scene', 654 | 'ring', 655 | 'rocket', 656 | 'roller_coaster', 657 | 'rooster', 658 | 'rose', 659 | 'rotating_light', 660 | 'round_pushpin', 661 | 'rowboat', 662 | 'ru', 663 | 'rugby_football', 664 | 'runner', 665 | 'running', 666 | 'running_shirt_with_sash', 667 | 'sa', 668 | 'sagittarius', 669 | 'sailboat', 670 | 'sake', 671 | 'sandal', 672 | 'santa', 673 | 'satellite', 674 | 'satisfied', 675 | 'saxophone', 676 | 'school', 677 | 'school_satchel', 678 | 'scissors', 679 | 'scorpius', 680 | 'scream', 681 | 'scream_cat', 682 | 'scroll', 683 | 'seat', 684 | 'secret', 685 | 'see_no_evil', 686 | 'seedling', 687 | 'seven', 688 | 'shaved_ice', 689 | 'sheep', 690 | 'shell', 691 | 'ship', 692 | 'shipit', 693 | 'shirt', 694 | 'shit', 695 | 'shoe', 696 | 'shower', 697 | 'signal_strength', 698 | 'six', 699 | 'six_pointed_star', 700 | 'ski', 701 | 'skull', 702 | 'sleeping', 703 | 'sleepy', 704 | 'slot_machine', 705 | 'small_blue_diamond', 706 | 'small_orange_diamond', 707 | 'small_red_triangle', 708 | 'small_red_triangle_down', 709 | 'smile', 710 | 'smile_cat', 711 | 'smiley', 712 | 'smiley_cat', 713 | 'smiling_imp', 714 | 'smirk', 715 | 'smirk_cat', 716 | 'smoking', 717 | 'snail', 718 | 'snake', 719 | 'snowboarder', 720 | 'snowflake', 721 | 'snowman', 722 | 'sob', 723 | 'soccer', 724 | 'soon', 725 | 'sos', 726 | 'sound', 727 | 'space_invader', 728 | 'spades', 729 | 'spaghetti', 730 | 'sparkle', 731 | 'sparkler', 732 | 'sparkles', 733 | 'sparkling_heart', 734 | 'speak_no_evil', 735 | 'speaker', 736 | 'speech_balloon', 737 | 'speedboat', 738 | 'squirrel', 739 | 'star', 740 | 'star2', 741 | 'stars', 742 | 'station', 743 | 'statue_of_liberty', 744 | 'steam_locomotive', 745 | 'stew', 746 | 'straight_ruler', 747 | 'strawberry', 748 | 'stuck_out_tongue', 749 | 'stuck_out_tongue_closed_eyes', 750 | 'stuck_out_tongue_winking_eye', 751 | 'sun_with_face', 752 | 'sunflower', 753 | 'sunglasses', 754 | 'sunny', 755 | 'sunrise', 756 | 'sunrise_over_mountains', 757 | 'surfer', 758 | 'sushi', 759 | 'suspect', 760 | 'suspension_railway', 761 | 'sweat', 762 | 'sweat_drops', 763 | 'sweat_smile', 764 | 'sweet_potato', 765 | 'swimmer', 766 | 'symbols', 767 | 'syringe', 768 | 'tada', 769 | 'tanabata_tree', 770 | 'tangerine', 771 | 'taurus', 772 | 'taxi', 773 | 'tea', 774 | 'telephone', 775 | 'telephone_receiver', 776 | 'telescope', 777 | 'tennis', 778 | 'tent', 779 | 'thought_balloon', 780 | 'three', 781 | 'thumbsdown', 782 | 'thumbsup', 783 | 'ticket', 784 | 'tiger', 785 | 'tiger2', 786 | 'tired_face', 787 | 'tm', 788 | 'toilet', 789 | 'tokyo_tower', 790 | 'tomato', 791 | 'tongue', 792 | 'top', 793 | 'tophat', 794 | 'tractor', 795 | 'traffic_light', 796 | 'train', 797 | 'train2', 798 | 'tram', 799 | 'triangular_flag_on_post', 800 | 'triangular_ruler', 801 | 'trident', 802 | 'triumph', 803 | 'trolleybus', 804 | 'trollface', 805 | 'trophy', 806 | 'tropical_drink', 807 | 'tropical_fish', 808 | 'truck', 809 | 'trumpet', 810 | 'tshirt', 811 | 'tulip', 812 | 'turtle', 813 | 'tv', 814 | 'twisted_rightwards_arrows', 815 | 'two', 816 | 'two_hearts', 817 | 'two_men_holding_hands', 818 | 'two_women_holding_hands', 819 | 'u5272', 820 | 'u5408', 821 | 'u55b6', 822 | 'u6307', 823 | 'u6708', 824 | 'u6709', 825 | 'u6e80', 826 | 'u7121', 827 | 'u7533', 828 | 'u7981', 829 | 'u7a7a', 830 | 'uk', 831 | 'umbrella', 832 | 'unamused', 833 | 'underage', 834 | 'unlock', 835 | 'up', 836 | 'us', 837 | 'v', 838 | 'vertical_traffic_light', 839 | 'vhs', 840 | 'vibration_mode', 841 | 'video_camera', 842 | 'video_game', 843 | 'violin', 844 | 'virgo', 845 | 'volcano', 846 | 'vs', 847 | 'walking', 848 | 'waning_crescent_moon', 849 | 'waning_gibbous_moon', 850 | 'warning', 851 | 'watch', 852 | 'water_buffalo', 853 | 'watermelon', 854 | 'wave', 855 | 'wavy_dash', 856 | 'waxing_crescent_moon', 857 | 'waxing_gibbous_moon', 858 | 'wc', 859 | 'weary', 860 | 'wedding', 861 | 'whale', 862 | 'whale2', 863 | 'wheelchair', 864 | 'white_check_mark', 865 | 'white_circle', 866 | 'white_flower', 867 | 'white_large_square', 868 | 'white_medium_small_square', 869 | 'white_medium_square', 870 | 'white_small_square', 871 | 'white_square_button', 872 | 'wind_chime', 873 | 'wine_glass', 874 | 'wink', 875 | 'wolf', 876 | 'woman', 877 | 'womans_clothes', 878 | 'womans_hat', 879 | 'womens', 880 | 'worried', 881 | 'wrench', 882 | 'x', 883 | 'yellow_heart', 884 | 'yen', 885 | 'yum', 886 | 'zap', 887 | 'zero', 888 | 'zzz' 889 | ]; 890 | 891 | // Emoji from All-Github-Emoji-Icons 892 | // https://github.com/scotch-io/All-Github-Emoji-Icons 893 | window.emojify = function (match, $1) { 894 | return AllGithubEmoji.indexOf($1) === -1 895 | ? match 896 | : '' + $1 + ''; 897 | }; 898 | })(); 899 | -------------------------------------------------------------------------------- /lib/gitalk.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: octicons-link; 3 | src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff'); 4 | } 5 | 6 | .markdown-body { 7 | -ms-text-size-adjust: 100%; 8 | -webkit-text-size-adjust: 100%; 9 | line-height: 1.5; 10 | color: #24292e; 11 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 12 | font-size: 16px; 13 | line-height: 1.5; 14 | word-wrap: break-word; 15 | } 16 | 17 | .markdown-body .pl-c { 18 | color: #6a737d; 19 | } 20 | 21 | .markdown-body .pl-c1, 22 | .markdown-body .pl-s .pl-v { 23 | color: #005cc5; 24 | } 25 | 26 | .markdown-body .pl-e, 27 | .markdown-body .pl-en { 28 | color: #6f42c1; 29 | } 30 | 31 | .markdown-body .pl-smi, 32 | .markdown-body .pl-s .pl-s1 { 33 | color: #24292e; 34 | } 35 | 36 | .markdown-body .pl-ent { 37 | color: #22863a; 38 | } 39 | 40 | .markdown-body .pl-k { 41 | color: #d73a49; 42 | } 43 | 44 | .markdown-body .pl-s, 45 | .markdown-body .pl-pds, 46 | .markdown-body .pl-s .pl-pse .pl-s1, 47 | .markdown-body .pl-sr, 48 | .markdown-body .pl-sr .pl-cce, 49 | .markdown-body .pl-sr .pl-sre, 50 | .markdown-body .pl-sr .pl-sra { 51 | color: #032f62; 52 | } 53 | 54 | .markdown-body .pl-v, 55 | .markdown-body .pl-smw { 56 | color: #e36209; 57 | } 58 | 59 | .markdown-body .pl-bu { 60 | color: #b31d28; 61 | } 62 | 63 | .markdown-body .pl-ii { 64 | color: #fafbfc; 65 | background-color: #b31d28; 66 | } 67 | 68 | .markdown-body .pl-c2 { 69 | color: #fafbfc; 70 | background-color: #d73a49; 71 | } 72 | 73 | .markdown-body .pl-c2::before { 74 | content: "^M"; 75 | } 76 | 77 | .markdown-body .pl-sr .pl-cce { 78 | font-weight: bold; 79 | color: #22863a; 80 | } 81 | 82 | .markdown-body .pl-ml { 83 | color: #735c0f; 84 | } 85 | 86 | .markdown-body .pl-mh, 87 | .markdown-body .pl-mh .pl-en, 88 | .markdown-body .pl-ms { 89 | font-weight: bold; 90 | color: #005cc5; 91 | } 92 | 93 | .markdown-body .pl-mi { 94 | font-style: italic; 95 | color: #24292e; 96 | } 97 | 98 | .markdown-body .pl-mb { 99 | font-weight: bold; 100 | color: #24292e; 101 | } 102 | 103 | .markdown-body .pl-md { 104 | color: #b31d28; 105 | background-color: #ffeef0; 106 | } 107 | 108 | .markdown-body .pl-mi1 { 109 | color: #22863a; 110 | background-color: #f0fff4; 111 | } 112 | 113 | .markdown-body .pl-mc { 114 | color: #e36209; 115 | background-color: #ffebda; 116 | } 117 | 118 | .markdown-body .pl-mi2 { 119 | color: #f6f8fa; 120 | background-color: #005cc5; 121 | } 122 | 123 | .markdown-body .pl-mdr { 124 | font-weight: bold; 125 | color: #6f42c1; 126 | } 127 | 128 | .markdown-body .pl-ba { 129 | color: #586069; 130 | } 131 | 132 | .markdown-body .pl-sg { 133 | color: #959da5; 134 | } 135 | 136 | .markdown-body .pl-corl { 137 | text-decoration: underline; 138 | color: #032f62; 139 | } 140 | 141 | .markdown-body .octicon { 142 | display: inline-block; 143 | vertical-align: text-top; 144 | fill: currentColor; 145 | } 146 | 147 | .markdown-body a { 148 | background-color: transparent; 149 | -webkit-text-decoration-skip: objects; 150 | } 151 | 152 | .markdown-body a:active, 153 | .markdown-body a:hover { 154 | outline-width: 0; 155 | } 156 | 157 | .markdown-body strong { 158 | font-weight: inherit; 159 | } 160 | 161 | .markdown-body strong { 162 | font-weight: bolder; 163 | } 164 | 165 | .markdown-body h1 { 166 | font-size: 2em; 167 | margin: 0.67em 0; 168 | } 169 | 170 | .markdown-body img { 171 | border-style: none; 172 | } 173 | 174 | .markdown-body svg:not(:root) { 175 | overflow: hidden; 176 | } 177 | 178 | .markdown-body code, 179 | .markdown-body kbd, 180 | .markdown-body pre { 181 | font-family: monospace, monospace; 182 | font-size: 1em; 183 | } 184 | 185 | .markdown-body hr { 186 | -webkit-box-sizing: content-box; 187 | box-sizing: content-box; 188 | height: 0; 189 | overflow: visible; 190 | } 191 | 192 | .markdown-body input { 193 | font: inherit; 194 | margin: 0; 195 | } 196 | 197 | .markdown-body input { 198 | overflow: visible; 199 | } 200 | 201 | .markdown-body [type="checkbox"] { 202 | -webkit-box-sizing: border-box; 203 | box-sizing: border-box; 204 | padding: 0; 205 | } 206 | 207 | .markdown-body * { 208 | -webkit-box-sizing: border-box; 209 | box-sizing: border-box; 210 | } 211 | 212 | .markdown-body input { 213 | font-family: inherit; 214 | font-size: inherit; 215 | line-height: inherit; 216 | } 217 | 218 | .markdown-body a { 219 | color: #0366d6; 220 | text-decoration: none; 221 | } 222 | 223 | .markdown-body a:hover { 224 | text-decoration: underline; 225 | } 226 | 227 | .markdown-body strong { 228 | font-weight: 600; 229 | } 230 | 231 | .markdown-body hr { 232 | height: 0; 233 | margin: 15px 0; 234 | overflow: hidden; 235 | background: transparent; 236 | border: 0; 237 | border-bottom: 1px solid #dfe2e5; 238 | } 239 | 240 | .markdown-body hr::before { 241 | display: table; 242 | content: ""; 243 | } 244 | 245 | .markdown-body hr::after { 246 | display: table; 247 | clear: both; 248 | content: ""; 249 | } 250 | 251 | .markdown-body table { 252 | border-spacing: 0; 253 | border-collapse: collapse; 254 | } 255 | 256 | .markdown-body td, 257 | .markdown-body th { 258 | padding: 0; 259 | } 260 | 261 | .markdown-body h1, 262 | .markdown-body h2, 263 | .markdown-body h3, 264 | .markdown-body h4, 265 | .markdown-body h5, 266 | .markdown-body h6 { 267 | margin-top: 0; 268 | margin-bottom: 0; 269 | } 270 | 271 | .markdown-body h1 { 272 | font-size: 32px; 273 | font-weight: 600; 274 | } 275 | 276 | .markdown-body h2 { 277 | font-size: 24px; 278 | font-weight: 600; 279 | } 280 | 281 | .markdown-body h3 { 282 | font-size: 20px; 283 | font-weight: 600; 284 | } 285 | 286 | .markdown-body h4 { 287 | font-size: 16px; 288 | font-weight: 600; 289 | } 290 | 291 | .markdown-body h5 { 292 | font-size: 14px; 293 | font-weight: 600; 294 | } 295 | 296 | .markdown-body h6 { 297 | font-size: 12px; 298 | font-weight: 600; 299 | } 300 | 301 | .markdown-body p { 302 | margin-top: 0; 303 | margin-bottom: 10px; 304 | } 305 | 306 | .markdown-body blockquote { 307 | margin: 0; 308 | } 309 | 310 | .markdown-body ul, 311 | .markdown-body ol { 312 | padding-left: 0; 313 | margin-top: 0; 314 | margin-bottom: 0; 315 | } 316 | 317 | .markdown-body ol ol, 318 | .markdown-body ul ol { 319 | list-style-type: lower-roman; 320 | } 321 | 322 | .markdown-body ul ul ol, 323 | .markdown-body ul ol ol, 324 | .markdown-body ol ul ol, 325 | .markdown-body ol ol ol { 326 | list-style-type: lower-alpha; 327 | } 328 | 329 | .markdown-body dd { 330 | margin-left: 0; 331 | } 332 | 333 | .markdown-body code { 334 | font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; 335 | font-size: 12px; 336 | } 337 | 338 | .markdown-body pre { 339 | margin-top: 0; 340 | margin-bottom: 0; 341 | font: 12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; 342 | } 343 | 344 | .markdown-body .octicon { 345 | vertical-align: text-bottom; 346 | } 347 | 348 | .markdown-body .pl-0 { 349 | padding-left: 0 !important; 350 | } 351 | 352 | .markdown-body .pl-1 { 353 | padding-left: 4px !important; 354 | } 355 | 356 | .markdown-body .pl-2 { 357 | padding-left: 8px !important; 358 | } 359 | 360 | .markdown-body .pl-3 { 361 | padding-left: 16px !important; 362 | } 363 | 364 | .markdown-body .pl-4 { 365 | padding-left: 24px !important; 366 | } 367 | 368 | .markdown-body .pl-5 { 369 | padding-left: 32px !important; 370 | } 371 | 372 | .markdown-body .pl-6 { 373 | padding-left: 40px !important; 374 | } 375 | 376 | .markdown-body::before { 377 | display: table; 378 | content: ""; 379 | } 380 | 381 | .markdown-body::after { 382 | display: table; 383 | clear: both; 384 | content: ""; 385 | } 386 | 387 | .markdown-body>*:first-child { 388 | margin-top: 0 !important; 389 | } 390 | 391 | .markdown-body>*:last-child { 392 | margin-bottom: 0 !important; 393 | } 394 | 395 | .markdown-body a:not([href]) { 396 | color: inherit; 397 | text-decoration: none; 398 | } 399 | 400 | .markdown-body .anchor { 401 | float: left; 402 | padding-right: 4px; 403 | margin-left: -20px; 404 | line-height: 1; 405 | } 406 | 407 | .markdown-body .anchor:focus { 408 | outline: none; 409 | } 410 | 411 | .markdown-body p, 412 | .markdown-body blockquote, 413 | .markdown-body ul, 414 | .markdown-body ol, 415 | .markdown-body dl, 416 | .markdown-body table, 417 | .markdown-body pre { 418 | margin-top: 0; 419 | margin-bottom: 16px; 420 | } 421 | 422 | .markdown-body hr { 423 | height: 0.25em; 424 | padding: 0; 425 | margin: 24px 0; 426 | background-color: #e1e4e8; 427 | border: 0; 428 | } 429 | 430 | .markdown-body blockquote { 431 | padding: 0 1em; 432 | color: #6a737d; 433 | border-left: 0.25em solid #dfe2e5; 434 | } 435 | 436 | .markdown-body blockquote>:first-child { 437 | margin-top: 0; 438 | } 439 | 440 | .markdown-body blockquote>:last-child { 441 | margin-bottom: 0; 442 | } 443 | 444 | .markdown-body kbd { 445 | display: inline-block; 446 | padding: 3px 5px; 447 | font-size: 11px; 448 | line-height: 10px; 449 | color: #444d56; 450 | vertical-align: middle; 451 | background-color: #fafbfc; 452 | border: solid 1px #c6cbd1; 453 | border-bottom-color: #959da5; 454 | border-radius: 3px; 455 | -webkit-box-shadow: inset 0 -1px 0 #959da5; 456 | box-shadow: inset 0 -1px 0 #959da5; 457 | } 458 | 459 | .markdown-body h1, 460 | .markdown-body h2, 461 | .markdown-body h3, 462 | .markdown-body h4, 463 | .markdown-body h5, 464 | .markdown-body h6 { 465 | margin-top: 24px; 466 | margin-bottom: 16px; 467 | font-weight: 600; 468 | line-height: 1.25; 469 | } 470 | 471 | .markdown-body h1 .octicon-link, 472 | .markdown-body h2 .octicon-link, 473 | .markdown-body h3 .octicon-link, 474 | .markdown-body h4 .octicon-link, 475 | .markdown-body h5 .octicon-link, 476 | .markdown-body h6 .octicon-link { 477 | color: #1b1f23; 478 | vertical-align: middle; 479 | visibility: hidden; 480 | } 481 | 482 | .markdown-body h1:hover .anchor, 483 | .markdown-body h2:hover .anchor, 484 | .markdown-body h3:hover .anchor, 485 | .markdown-body h4:hover .anchor, 486 | .markdown-body h5:hover .anchor, 487 | .markdown-body h6:hover .anchor { 488 | text-decoration: none; 489 | } 490 | 491 | .markdown-body h1:hover .anchor .octicon-link, 492 | .markdown-body h2:hover .anchor .octicon-link, 493 | .markdown-body h3:hover .anchor .octicon-link, 494 | .markdown-body h4:hover .anchor .octicon-link, 495 | .markdown-body h5:hover .anchor .octicon-link, 496 | .markdown-body h6:hover .anchor .octicon-link { 497 | visibility: visible; 498 | } 499 | 500 | .markdown-body h1 { 501 | padding-bottom: 0.3em; 502 | font-size: 2em; 503 | border-bottom: 1px solid #eaecef; 504 | } 505 | 506 | .markdown-body h2 { 507 | padding-bottom: 0.3em; 508 | font-size: 1.5em; 509 | border-bottom: 1px solid #eaecef; 510 | } 511 | 512 | .markdown-body h3 { 513 | font-size: 1.25em; 514 | } 515 | 516 | .markdown-body h4 { 517 | font-size: 1em; 518 | } 519 | 520 | .markdown-body h5 { 521 | font-size: 0.875em; 522 | } 523 | 524 | .markdown-body h6 { 525 | font-size: 0.85em; 526 | color: #6a737d; 527 | } 528 | 529 | .markdown-body ul, 530 | .markdown-body ol { 531 | padding-left: 2em; 532 | } 533 | 534 | .markdown-body ul ul, 535 | .markdown-body ul ol, 536 | .markdown-body ol ol, 537 | .markdown-body ol ul { 538 | margin-top: 0; 539 | margin-bottom: 0; 540 | } 541 | 542 | .markdown-body li>p { 543 | margin-top: 16px; 544 | } 545 | 546 | .markdown-body li+li { 547 | margin-top: 0.25em; 548 | } 549 | 550 | .markdown-body dl { 551 | padding: 0; 552 | } 553 | 554 | .markdown-body dl dt { 555 | padding: 0; 556 | margin-top: 16px; 557 | font-size: 1em; 558 | font-style: italic; 559 | font-weight: 600; 560 | } 561 | 562 | .markdown-body dl dd { 563 | padding: 0 16px; 564 | margin-bottom: 16px; 565 | } 566 | 567 | .markdown-body table { 568 | display: block; 569 | width: 100%; 570 | overflow: auto; 571 | } 572 | 573 | .markdown-body table th { 574 | font-weight: 600; 575 | } 576 | 577 | .markdown-body table th, 578 | .markdown-body table td { 579 | padding: 6px 13px; 580 | border: 1px solid #dfe2e5; 581 | } 582 | 583 | .markdown-body table tr { 584 | background-color: #fff; 585 | border-top: 1px solid #c6cbd1; 586 | } 587 | 588 | .markdown-body table tr:nth-child(2n) { 589 | background-color: #f6f8fa; 590 | } 591 | 592 | .markdown-body img { 593 | max-width: 100%; 594 | -webkit-box-sizing: content-box; 595 | box-sizing: content-box; 596 | background-color: #fff; 597 | } 598 | 599 | .markdown-body code { 600 | padding: 0; 601 | padding-top: 0.2em; 602 | padding-bottom: 0.2em; 603 | margin: 0; 604 | font-size: 85%; 605 | background-color: rgba(27,31,35,0.05); 606 | border-radius: 3px; 607 | } 608 | 609 | .markdown-body code::before, 610 | .markdown-body code::after { 611 | letter-spacing: -0.2em; 612 | content: "\A0"; 613 | } 614 | 615 | .markdown-body pre { 616 | word-wrap: normal; 617 | } 618 | 619 | .markdown-body pre>code { 620 | padding: 0; 621 | margin: 0; 622 | font-size: 100%; 623 | word-break: normal; 624 | white-space: pre; 625 | background: transparent; 626 | border: 0; 627 | } 628 | 629 | .markdown-body .highlight { 630 | margin-bottom: 16px; 631 | } 632 | 633 | .markdown-body .highlight pre { 634 | margin-bottom: 0; 635 | word-break: normal; 636 | } 637 | 638 | .markdown-body .highlight pre, 639 | .markdown-body pre { 640 | padding: 16px; 641 | overflow: auto; 642 | font-size: 85%; 643 | line-height: 1.45; 644 | background-color: #f6f8fa; 645 | border-radius: 3px; 646 | } 647 | 648 | .markdown-body pre code { 649 | display: inline; 650 | max-width: auto; 651 | padding: 0; 652 | margin: 0; 653 | overflow: visible; 654 | line-height: inherit; 655 | word-wrap: normal; 656 | background-color: transparent; 657 | border: 0; 658 | } 659 | 660 | .markdown-body pre code::before, 661 | .markdown-body pre code::after { 662 | content: normal; 663 | } 664 | 665 | .markdown-body .full-commit .btn-outline:not(:disabled):hover { 666 | color: #005cc5; 667 | border-color: #005cc5; 668 | } 669 | 670 | .markdown-body kbd { 671 | display: inline-block; 672 | padding: 3px 5px; 673 | font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; 674 | line-height: 10px; 675 | color: #444d56; 676 | vertical-align: middle; 677 | background-color: #fafbfc; 678 | border: solid 1px #d1d5da; 679 | border-bottom-color: #c6cbd1; 680 | border-radius: 3px; 681 | -webkit-box-shadow: inset 0 -1px 0 #c6cbd1; 682 | box-shadow: inset 0 -1px 0 #c6cbd1; 683 | } 684 | 685 | .markdown-body :checked+.radio-label { 686 | position: relative; 687 | z-index: 1; 688 | border-color: #0366d6; 689 | } 690 | 691 | .markdown-body .task-list-item { 692 | list-style-type: none; 693 | } 694 | 695 | .markdown-body .task-list-item+.task-list-item { 696 | margin-top: 3px; 697 | } 698 | 699 | .markdown-body .task-list-item input { 700 | margin: 0 0.2em 0.25em -1.6em; 701 | vertical-align: middle; 702 | } 703 | 704 | .markdown-body hr { 705 | border-bottom-color: #eee; 706 | } 707 | /* variables */ 708 | /* functions & mixins */ 709 | /* variables - calculated */ 710 | /* styles */ 711 | .gt-container { 712 | -webkit-box-sizing: border-box; 713 | box-sizing: border-box; 714 | font-size: 16px; 715 | /* loader */ 716 | /* error */ 717 | /* initing */ 718 | /* no int */ 719 | /* link */ 720 | /* meta */ 721 | /* popup */ 722 | /* header */ 723 | /* comments */ 724 | /* comment */ 725 | } 726 | .gt-container * { 727 | -webkit-box-sizing: border-box; 728 | box-sizing: border-box; 729 | } 730 | .gt-container a { 731 | color: #6190e8; 732 | } 733 | .gt-container a:hover { 734 | color: #81a6ed; 735 | border-color: #81a6ed; 736 | } 737 | .gt-container a.is--active { 738 | color: #333; 739 | cursor: default !important; 740 | } 741 | .gt-container a.is--active:hover { 742 | color: #333; 743 | } 744 | .gt-container .hide { 745 | display: none !important; 746 | } 747 | .gt-container .gt-svg { 748 | display: inline-block; 749 | width: 1em; 750 | height: 1em; 751 | vertical-align: sub; 752 | } 753 | .gt-container .gt-svg svg { 754 | width: 100%; 755 | height: 100%; 756 | fill: #6190e8; 757 | } 758 | .gt-container .gt-ico { 759 | display: inline-block; 760 | } 761 | .gt-container .gt-ico-text { 762 | margin-left: 0.3125em; 763 | } 764 | .gt-container .gt-ico-github { 765 | width: 100%; 766 | height: 100%; 767 | } 768 | .gt-container .gt-ico-github .gt-svg { 769 | width: 100%; 770 | height: 100%; 771 | } 772 | .gt-container .gt-ico-github svg { 773 | fill: inherit; 774 | } 775 | .gt-container .gt-spinner { 776 | position: relative; 777 | } 778 | .gt-container .gt-spinner::before { 779 | content: ''; 780 | -webkit-box-sizing: border-box; 781 | box-sizing: border-box; 782 | position: absolute; 783 | top: 3px; 784 | width: 0.75em; 785 | height: 0.75em; 786 | margin-top: -0.1875em; 787 | margin-left: -0.375em; 788 | border-radius: 50%; 789 | border: 1px solid #fff; 790 | border-top-color: #6190e8; 791 | -webkit-animation: gt-kf-rotate 0.6s linear infinite; 792 | animation: gt-kf-rotate 0.6s linear infinite; 793 | } 794 | .gt-container .gt-loader { 795 | position: relative; 796 | border: 1px solid #999; 797 | -webkit-animation: ease gt-kf-rotate 1.5s infinite; 798 | animation: ease gt-kf-rotate 1.5s infinite; 799 | display: inline-block; 800 | font-style: normal; 801 | width: 1.75em; 802 | height: 1.75em; 803 | line-height: 1.75em; 804 | border-radius: 50%; 805 | } 806 | .gt-container .gt-loader:before { 807 | content: ''; 808 | position: absolute; 809 | display: block; 810 | top: 0; 811 | left: 50%; 812 | margin-top: -0.1875em; 813 | margin-left: -0.1875em; 814 | width: 0.375em; 815 | height: 0.375em; 816 | background-color: #999; 817 | border-radius: 50%; 818 | } 819 | .gt-container .gt-avatar { 820 | display: inline-block; 821 | width: 3.125em; 822 | height: 3.125em; 823 | } 824 | @media (max-width: 479px) { 825 | .gt-container .gt-avatar { 826 | width: 2em; 827 | height: 2em; 828 | } 829 | } 830 | .gt-container .gt-avatar img { 831 | width: 100%; 832 | height: auto; 833 | border-radius: 3px; 834 | } 835 | .gt-container .gt-avatar-github { 836 | width: 3em; 837 | height: 3em; 838 | cursor: pointer; 839 | } 840 | @media (max-width: 479px) { 841 | .gt-container .gt-avatar-github { 842 | width: 1.875em; 843 | height: 1.875em; 844 | } 845 | } 846 | .gt-container .gt-btn { 847 | padding: 0.75em 1.25em; 848 | display: inline-block; 849 | line-height: 1; 850 | text-decoration: none; 851 | white-space: nowrap; 852 | cursor: pointer; 853 | border: 1px solid #6190e8; 854 | border-radius: 5px; 855 | background-color: #6190e8; 856 | color: #fff; 857 | outline: none; 858 | font-size: 0.75em; 859 | } 860 | .gt-container .gt-btn-text { 861 | font-weight: 400; 862 | } 863 | .gt-container .gt-btn-loading { 864 | position: relative; 865 | margin-left: 0.5em; 866 | display: inline-block; 867 | width: 0.75em; 868 | height: 1em; 869 | vertical-align: top; 870 | } 871 | .gt-container .gt-btn.is--disable { 872 | cursor: not-allowed; 873 | opacity: 0.5; 874 | } 875 | .gt-container .gt-btn-login { 876 | margin-right: 0; 877 | } 878 | .gt-container .gt-btn-preview { 879 | background-color: #fff; 880 | color: #6190e8; 881 | } 882 | .gt-container .gt-btn-preview:hover { 883 | background-color: #f2f2f2; 884 | border-color: #81a6ed; 885 | } 886 | .gt-container .gt-btn-public:hover { 887 | background-color: #81a6ed; 888 | border-color: #81a6ed; 889 | } 890 | .gt-container .gt-error { 891 | text-align: center; 892 | margin: 0.625em; 893 | color: #ff3860; 894 | } 895 | .gt-container .gt-initing { 896 | padding: 1.25em 0; 897 | text-align: center; 898 | } 899 | .gt-container .gt-initing-text { 900 | margin: 0.625em auto; 901 | font-size: 92%; 902 | } 903 | .gt-container .gt-no-init { 904 | padding: 1.25em 0; 905 | text-align: center; 906 | } 907 | .gt-container .gt-link { 908 | border-bottom: 1px dotted #6190e8; 909 | } 910 | .gt-container .gt-link-counts, 911 | .gt-container .gt-link-project { 912 | text-decoration: none; 913 | } 914 | .gt-container .gt-meta { 915 | margin: 1.25em 0; 916 | padding: 1em 0; 917 | position: relative; 918 | border-bottom: 1px solid #e9e9e9; 919 | font-size: 1em; 920 | position: relative; 921 | z-index: 10; 922 | } 923 | .gt-container .gt-meta:before, 924 | .gt-container .gt-meta:after { 925 | content: " "; 926 | display: table; 927 | } 928 | .gt-container .gt-meta:after { 929 | clear: both; 930 | } 931 | .gt-container .gt-counts { 932 | margin: 0 0.625em 0 0; 933 | } 934 | .gt-container .gt-user { 935 | float: right; 936 | margin: 0; 937 | font-size: 92%; 938 | } 939 | .gt-container .gt-user-pic { 940 | width: 16px; 941 | height: 16px; 942 | vertical-align: top; 943 | margin-right: 0.5em; 944 | } 945 | .gt-container .gt-user-inner { 946 | display: inline-block; 947 | cursor: pointer; 948 | } 949 | .gt-container .gt-user .gt-ico { 950 | margin: 0 0 0 0.3125em; 951 | } 952 | .gt-container .gt-user .gt-ico svg { 953 | fill: inherit; 954 | } 955 | .gt-container .gt-user .is--poping .gt-ico svg { 956 | fill: #6190e8; 957 | } 958 | .gt-container .gt-version { 959 | color: #a1a1a1; 960 | margin-left: 0.375em; 961 | } 962 | .gt-container .gt-copyright { 963 | margin: 0 0.9375em 0.5em; 964 | border-top: 1px solid #e9e9e9; 965 | padding-top: 0.5em; 966 | } 967 | .gt-container .gt-popup { 968 | position: absolute; 969 | right: 0; 970 | top: 2.375em; 971 | background: #fff; 972 | display: inline-block; 973 | border: 1px solid #e9e9e9; 974 | padding: 0.625em 0; 975 | font-size: 0.875em; 976 | letter-spacing: 0.5px; 977 | } 978 | .gt-container .gt-popup .gt-action { 979 | cursor: pointer; 980 | display: block; 981 | margin: 0.5em 0; 982 | padding: 0 1.125em; 983 | position: relative; 984 | text-decoration: none; 985 | } 986 | .gt-container .gt-popup .gt-action.is--active:before { 987 | content: ''; 988 | width: 0.25em; 989 | height: 0.25em; 990 | background: #6190e8; 991 | position: absolute; 992 | left: 0.5em; 993 | top: 0.4375em; 994 | } 995 | .gt-container .gt-header { 996 | position: relative; 997 | display: -webkit-box; 998 | display: -ms-flexbox; 999 | display: flex; 1000 | } 1001 | .gt-container .gt-header-comment { 1002 | -webkit-box-flex: 1; 1003 | -ms-flex: 1; 1004 | flex: 1; 1005 | margin-left: 1.25em; 1006 | } 1007 | @media (max-width: 479px) { 1008 | .gt-container .gt-header-comment { 1009 | margin-left: 0.875em; 1010 | } 1011 | } 1012 | .gt-container .gt-header-textarea { 1013 | padding: 0.75em; 1014 | display: block; 1015 | -webkit-box-sizing: border-box; 1016 | box-sizing: border-box; 1017 | width: 100%; 1018 | min-height: 5.125em; 1019 | max-height: 15em; 1020 | border-radius: 5px; 1021 | border: 1px solid rgba(0,0,0,0.1); 1022 | font-size: 0.875em; 1023 | word-wrap: break-word; 1024 | resize: vertical; 1025 | background-color: #f6f6f6; 1026 | outline: none; 1027 | -webkit-transition: all 0.25s ease; 1028 | transition: all 0.25s ease; 1029 | } 1030 | .gt-container .gt-header-textarea:hover { 1031 | background-color: #fbfbfb; 1032 | } 1033 | .gt-container .gt-header-preview { 1034 | padding: 0.75em; 1035 | border-radius: 5px; 1036 | border: 1px solid rgba(0,0,0,0.1); 1037 | background-color: #f6f6f6; 1038 | } 1039 | .gt-container .gt-header-controls { 1040 | position: relative; 1041 | margin: 0.75em 0 0; 1042 | } 1043 | .gt-container .gt-header-controls:before, 1044 | .gt-container .gt-header-controls:after { 1045 | content: " "; 1046 | display: table; 1047 | } 1048 | .gt-container .gt-header-controls:after { 1049 | clear: both; 1050 | } 1051 | @media (max-width: 479px) { 1052 | .gt-container .gt-header-controls { 1053 | margin: 0; 1054 | } 1055 | } 1056 | .gt-container .gt-header-controls-tip { 1057 | font-size: 0.875em; 1058 | color: #6190e8; 1059 | text-decoration: none; 1060 | vertical-align: sub; 1061 | } 1062 | @media (max-width: 479px) { 1063 | .gt-container .gt-header-controls-tip { 1064 | display: none; 1065 | } 1066 | } 1067 | .gt-container .gt-header-controls .gt-btn { 1068 | float: right; 1069 | margin-left: 1.25em; 1070 | } 1071 | @media (max-width: 479px) { 1072 | .gt-container .gt-header-controls .gt-btn { 1073 | float: none; 1074 | width: 100%; 1075 | margin: 0.75em 0 0; 1076 | } 1077 | } 1078 | .gt-container:after { 1079 | content: ''; 1080 | position: fixed; 1081 | bottom: 100%; 1082 | left: 0; 1083 | right: 0; 1084 | top: 0; 1085 | opacity: 0; 1086 | } 1087 | .gt-container.gt-input-focused { 1088 | position: relative; 1089 | } 1090 | .gt-container.gt-input-focused:after { 1091 | content: ''; 1092 | position: fixed; 1093 | bottom: 0%; 1094 | left: 0; 1095 | right: 0; 1096 | top: 0; 1097 | background: #000; 1098 | opacity: 0.6; 1099 | -webkit-transition: opacity 0.3s, bottom 0s; 1100 | transition: opacity 0.3s, bottom 0s; 1101 | z-index: 9999; 1102 | } 1103 | .gt-container.gt-input-focused .gt-header-comment { 1104 | z-index: 10000; 1105 | } 1106 | .gt-container .gt-comments { 1107 | padding-top: 1.25em; 1108 | } 1109 | .gt-container .gt-comments-null { 1110 | text-align: center; 1111 | } 1112 | .gt-container .gt-comments-controls { 1113 | margin: 1.25em 0; 1114 | text-align: center; 1115 | } 1116 | .gt-container .gt-comment { 1117 | position: relative; 1118 | padding: 0.625em 0; 1119 | display: -webkit-box; 1120 | display: -ms-flexbox; 1121 | display: flex; 1122 | } 1123 | .gt-container .gt-comment-content { 1124 | -webkit-box-flex: 1; 1125 | -ms-flex: 1; 1126 | flex: 1; 1127 | margin-left: 1.25em; 1128 | padding: 0.75em 1em; 1129 | background-color: #f9f9f9; 1130 | overflow: auto; 1131 | -webkit-transition: all ease 0.25s; 1132 | transition: all ease 0.25s; 1133 | } 1134 | .gt-container .gt-comment-content:hover { 1135 | -webkit-box-shadow: 0 0.625em 3.75em 0 #f4f4f4; 1136 | box-shadow: 0 0.625em 3.75em 0 #f4f4f4; 1137 | } 1138 | @media (max-width: 479px) { 1139 | .gt-container .gt-comment-content { 1140 | margin-left: 0.875em; 1141 | padding: 0.625em 0.75em; 1142 | } 1143 | } 1144 | .gt-container .gt-comment-header { 1145 | margin-bottom: 0.5em; 1146 | font-size: 0.875em; 1147 | position: relative; 1148 | } 1149 | .gt-container .gt-comment-block-1 { 1150 | float: right; 1151 | height: 1.375em; 1152 | width: 2em; 1153 | } 1154 | .gt-container .gt-comment-block-2 { 1155 | float: right; 1156 | height: 1.375em; 1157 | width: 4em; 1158 | } 1159 | .gt-container .gt-comment-username { 1160 | font-weight: 500; 1161 | color: #6190e8; 1162 | text-decoration: none; 1163 | } 1164 | .gt-container .gt-comment-username:hover { 1165 | text-decoration: underline; 1166 | } 1167 | .gt-container .gt-comment-text { 1168 | margin-left: 0.5em; 1169 | color: #a1a1a1; 1170 | } 1171 | .gt-container .gt-comment-date { 1172 | margin-left: 0.5em; 1173 | color: #a1a1a1; 1174 | } 1175 | .gt-container .gt-comment-like, 1176 | .gt-container .gt-comment-edit, 1177 | .gt-container .gt-comment-reply { 1178 | position: absolute; 1179 | height: 1.375em; 1180 | } 1181 | .gt-container .gt-comment-like:hover, 1182 | .gt-container .gt-comment-edit:hover, 1183 | .gt-container .gt-comment-reply:hover { 1184 | cursor: pointer; 1185 | } 1186 | .gt-container .gt-comment-like { 1187 | top: 0; 1188 | right: 2em; 1189 | } 1190 | .gt-container .gt-comment-edit, 1191 | .gt-container .gt-comment-reply { 1192 | top: 0; 1193 | right: 0; 1194 | } 1195 | .gt-container .gt-comment-body { 1196 | color: #333 !important; 1197 | } 1198 | .gt-container .gt-comment-body .email-hidden-toggle a { 1199 | display: inline-block; 1200 | height: 12px; 1201 | padding: 0 9px; 1202 | font-size: 12px; 1203 | font-weight: 600; 1204 | line-height: 6px; 1205 | color: #444d56; 1206 | text-decoration: none; 1207 | vertical-align: middle; 1208 | background: #dfe2e5; 1209 | border-radius: 1px; 1210 | } 1211 | .gt-container .gt-comment-body .email-hidden-toggle a:hover { 1212 | background-color: #c6cbd1; 1213 | } 1214 | .gt-container .gt-comment-body .email-hidden-reply { 1215 | display: none; 1216 | white-space: pre-wrap; 1217 | } 1218 | .gt-container .gt-comment-body .email-hidden-reply .email-signature-reply { 1219 | padding: 0 15px; 1220 | margin: 15px 0; 1221 | color: #586069; 1222 | border-left: 4px solid #dfe2e5; 1223 | } 1224 | .gt-container .gt-comment-body .email-hidden-reply.expanded { 1225 | display: block; 1226 | } 1227 | .gt-container .gt-comment-admin .gt-comment-content { 1228 | background-color: #f6f9fe; 1229 | } 1230 | @-webkit-keyframes gt-kf-rotate { 1231 | 0% { 1232 | -webkit-transform: rotate(0); 1233 | transform: rotate(0); 1234 | } 1235 | 100% { 1236 | -webkit-transform: rotate(360deg); 1237 | transform: rotate(360deg); 1238 | } 1239 | } 1240 | @keyframes gt-kf-rotate { 1241 | 0% { 1242 | -webkit-transform: rotate(0); 1243 | transform: rotate(0); 1244 | } 1245 | 100% { 1246 | -webkit-transform: rotate(360deg); 1247 | transform: rotate(360deg); 1248 | } 1249 | } 1250 | 1251 | /*# sourceMappingURL=gitalk.css.map*/ -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | window.$docsify = { 2 | el: '#app', 3 | themeColor: '#39BAE8', 4 | name: 'eTest', 5 | logo: './img/logo1.jpg', 6 | auto2top: true, //切换页面后是否自动跳转到页面顶部 7 | coverpage: true, //封面图 8 | maxLevel: 3, //配置最大支持渲染的标题层级 9 | onlyCover: false, // 主页仅加载封面,不能滚动到其他页 10 | loadSidebar: true, //加载自定义侧边栏 11 | loadNavbar: true, //加载自定义导航栏 12 | mergeNavbar: true, // Navbar将在较小的屏幕上与侧边栏合并 13 | subMaxLevel: 3, //自定义侧边栏同时也可以开启目录功能 14 | // repo: 'https://github.com/onepiece-smile/docs', // 右上角小部件 15 | formatUpdated: '{YYYY}-{MM}-{DD} {HH}:{mm}', //变量显示文档更新日期 16 | notFoundPage: 'error.md', 17 | search: { 18 | placeholder: ' 🔍 搜索试试', 19 | noData: '抱歉!找不到对应的结果' 20 | }, 21 | pagination: { 22 | previousText: '上一节', 23 | nextText: '下一节', 24 | crossChapter: true 25 | }, 26 | plugins: [ 27 | // DocsifyCodefund.create('xxxx-xxx-xxx'), // change to your codefund id 28 | function (hook, vm) { 29 | hook.beforeEach(function (html) { 30 | return html + '\n' + ':alarm_clock: 更新于: {docsify-updated} '; 31 | }); 32 | } 33 | ] 34 | }; 35 | -------------------------------------------------------------------------------- /lib/prism-bash.js: -------------------------------------------------------------------------------- 1 | (function(Prism) { 2 | // $ set | grep '^[A-Z][^[:space:]]*=' | cut -d= -f1 | tr '\n' '|' 3 | // + LC_ALL, RANDOM, REPLY, SECONDS. 4 | // + make sure PS1..4 are here as they are not always set, 5 | // - some useless things. 6 | var envVars = '\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b'; 7 | var insideString = { 8 | 'environment': { 9 | pattern: RegExp("\\$" + envVars), 10 | alias: 'constant' 11 | }, 12 | 'variable': [ 13 | // [0]: Arithmetic Environment 14 | { 15 | pattern: /\$?\(\([\s\S]+?\)\)/, 16 | greedy: true, 17 | inside: { 18 | // If there is a $ sign at the beginning highlight $(( and )) as variable 19 | 'variable': [ 20 | { 21 | pattern: /(^\$\(\([\s\S]+)\)\)/, 22 | lookbehind: true 23 | }, 24 | /^\$\(\(/ 25 | ], 26 | 'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/, 27 | // Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic 28 | 'operator': /--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/, 29 | // If there is no $ sign at the beginning highlight (( and )) as punctuation 30 | 'punctuation': /\(\(?|\)\)?|,|;/ 31 | } 32 | }, 33 | // [1]: Command Substitution 34 | { 35 | pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/, 36 | greedy: true, 37 | inside: { 38 | 'variable': /^\$\(|^`|\)$|`$/ 39 | } 40 | }, 41 | // [2]: Brace expansion 42 | { 43 | pattern: /\$\{[^}]+\}/, 44 | greedy: true, 45 | inside: { 46 | 'operator': /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/, 47 | 'punctuation': /[\[\]]/, 48 | 'environment': { 49 | pattern: RegExp("(\\{)" + envVars), 50 | lookbehind: true, 51 | alias: 'constant' 52 | } 53 | } 54 | }, 55 | /\$(?:\w+|[#?*!@$])/ 56 | ], 57 | // Escape sequences from echo and printf's manuals, and escaped quotes. 58 | 'entity': /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/ 59 | }; 60 | 61 | Prism.languages.bash = { 62 | 'shebang': { 63 | pattern: /^#!\s*\/.*/, 64 | alias: 'important' 65 | }, 66 | 'comment': { 67 | pattern: /(^|[^"{\\$])#.*/, 68 | lookbehind: true 69 | }, 70 | 'function-name': [ 71 | // a) function foo { 72 | // b) foo() { 73 | // c) function foo() { 74 | // but not “foo {” 75 | { 76 | // a) and c) 77 | pattern: /(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/, 78 | lookbehind: true, 79 | alias: 'function' 80 | }, 81 | { 82 | // b) 83 | pattern: /\b\w+(?=\s*\(\s*\)\s*\{)/, 84 | alias: 'function' 85 | } 86 | ], 87 | // Highlight variable names as variables in for and select beginnings. 88 | 'for-or-select': { 89 | pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/, 90 | alias: 'variable', 91 | lookbehind: true 92 | }, 93 | // Highlight variable names as variables in the left-hand part 94 | // of assignments (“=” and “+=”). 95 | 'assign-left': { 96 | pattern: /(^|[\s;|&]|[<>]\()\w+(?=\+?=)/, 97 | inside: { 98 | 'environment': { 99 | pattern: RegExp("(^|[\\s;|&]|[<>]\\()" + envVars), 100 | lookbehind: true, 101 | alias: 'constant' 102 | } 103 | }, 104 | alias: 'variable', 105 | lookbehind: true 106 | }, 107 | 'string': [ 108 | // Support for Here-documents https://en.wikipedia.org/wiki/Here_document 109 | { 110 | pattern: /((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\2/, 111 | lookbehind: true, 112 | greedy: true, 113 | inside: insideString 114 | }, 115 | // Here-document with quotes around the tag 116 | // → No expansion (so no “inside”). 117 | { 118 | pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\3/, 119 | lookbehind: true, 120 | greedy: true 121 | }, 122 | // “Normal” string 123 | { 124 | pattern: /(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/, 125 | greedy: true, 126 | inside: insideString 127 | } 128 | ], 129 | 'environment': { 130 | pattern: RegExp("\\$?" + envVars), 131 | alias: 'constant' 132 | }, 133 | 'variable': insideString.variable, 134 | 'function': { 135 | pattern: /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/, 136 | lookbehind: true 137 | }, 138 | 'keyword': { 139 | pattern: /(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/, 140 | lookbehind: true 141 | }, 142 | // https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html 143 | 'builtin': { 144 | pattern: /(^|[\s;|&]|[<>]\()(?:\.|:|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)(?=$|[)\s;|&])/, 145 | lookbehind: true, 146 | // Alias added to make those easier to distinguish from strings. 147 | alias: 'class-name' 148 | }, 149 | 'boolean': { 150 | pattern: /(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/, 151 | lookbehind: true 152 | }, 153 | 'file-descriptor': { 154 | pattern: /\B&\d\b/, 155 | alias: 'important' 156 | }, 157 | 'operator': { 158 | // Lots of redirections here, but not just that. 159 | pattern: /\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/, 160 | inside: { 161 | 'file-descriptor': { 162 | pattern: /^\d/, 163 | alias: 'important' 164 | } 165 | } 166 | }, 167 | 'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/, 168 | 'number': { 169 | pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/, 170 | lookbehind: true 171 | } 172 | }; 173 | 174 | /* Patterns in command substitution. */ 175 | var toBeCopied = [ 176 | 'comment', 177 | 'function-name', 178 | 'for-or-select', 179 | 'assign-left', 180 | 'string', 181 | 'environment', 182 | 'function', 183 | 'keyword', 184 | 'builtin', 185 | 'boolean', 186 | 'file-descriptor', 187 | 'operator', 188 | 'punctuation', 189 | 'number' 190 | ]; 191 | var inside = insideString.variable[1].inside; 192 | for(var i = 0; i < toBeCopied.length; i++) { 193 | inside[toBeCopied[i]] = Prism.languages.bash[toBeCopied[i]]; 194 | } 195 | 196 | Prism.languages.shell = Prism.languages.bash; 197 | })(Prism); -------------------------------------------------------------------------------- /lib/search.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var INDEXS = {}; 3 | 4 | var LOCAL_STORAGE = { 5 | EXPIRE_KEY: 'docsify.search.expires', 6 | INDEX_KEY: 'docsify.search.index' 7 | }; 8 | 9 | function resolveExpireKey(namespace) { 10 | return namespace ? ((LOCAL_STORAGE.EXPIRE_KEY) + "/" + namespace) : LOCAL_STORAGE.EXPIRE_KEY 11 | } 12 | function resolveIndexKey(namespace) { 13 | return namespace ? ((LOCAL_STORAGE.INDEX_KEY) + "/" + namespace) : LOCAL_STORAGE.INDEX_KEY 14 | } 15 | 16 | function escapeHtml(string) { 17 | var entityMap = { 18 | '&': '&', 19 | '<': '<', 20 | '>': '>', 21 | '"': '"', 22 | '\'': ''', 23 | '/': '/' 24 | }; 25 | 26 | return String(string).replace(/[&<>"'/]/g, function (s) { return entityMap[s]; }) 27 | } 28 | 29 | function getAllPaths(router) { 30 | var paths = []; 31 | 32 | Docsify.dom.findAll('.sidebar-nav a:not(.section-link):not([data-nosearch])').forEach(function (node) { 33 | var href = node.href; 34 | var originHref = node.getAttribute('href'); 35 | var path = router.parse(href).path; 36 | 37 | if ( 38 | path && 39 | paths.indexOf(path) === -1 && 40 | !Docsify.util.isAbsolutePath(originHref) 41 | ) { 42 | paths.push(path); 43 | } 44 | }); 45 | 46 | return paths 47 | } 48 | 49 | function saveData(maxAge, expireKey, indexKey) { 50 | localStorage.setItem(expireKey, Date.now() + maxAge); 51 | localStorage.setItem(indexKey, JSON.stringify(INDEXS)); 52 | } 53 | 54 | function genIndex(path, content, router, depth) { 55 | if ( content === void 0 ) content = ''; 56 | 57 | var tokens = window.marked.lexer(content); 58 | var slugify = window.Docsify.slugify; 59 | var index = {}; 60 | var slug; 61 | 62 | tokens.forEach(function (token) { 63 | if (token.type === 'heading' && token.depth <= depth) { 64 | slug = router.toURL(path, {id: slugify(token.text)}); 65 | index[slug] = {slug: slug, title: token.text, body: ''}; 66 | } else { 67 | if (!slug) { 68 | return 69 | } 70 | if (!index[slug]) { 71 | index[slug] = {slug: slug, title: '', body: ''}; 72 | } else if (index[slug].body) { 73 | index[slug].body += '\n' + (token.text || ''); 74 | } else { 75 | index[slug].body = token.text; 76 | } 77 | } 78 | }); 79 | slugify.clear(); 80 | return index 81 | } 82 | 83 | /** 84 | * @param {String} query 85 | * @returns {Array} 86 | */ 87 | function search(query) { 88 | var matchingResults = []; 89 | var data = []; 90 | Object.keys(INDEXS).forEach(function (key) { 91 | data = data.concat(Object.keys(INDEXS[key]).map(function (page) { return INDEXS[key][page]; })); 92 | }); 93 | 94 | query = query.trim(); 95 | var keywords = query.split(/[\s\-,\\/]+/); 96 | if (keywords.length !== 1) { 97 | keywords = [].concat(query, keywords); 98 | } 99 | 100 | var loop = function ( i ) { 101 | var post = data[i]; 102 | var matchesScore = 0; 103 | var resultStr = ''; 104 | var postTitle = post.title && post.title.trim(); 105 | var postContent = post.body && post.body.trim(); 106 | var postUrl = post.slug || ''; 107 | 108 | if (postTitle) { 109 | keywords.forEach( function (keyword) { 110 | // From https://github.com/sindresorhus/escape-string-regexp 111 | var regEx = new RegExp( 112 | keyword.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'), 113 | 'gi' 114 | ); 115 | var indexTitle = -1; 116 | var indexContent = -1; 117 | 118 | indexTitle = postTitle ? postTitle.search(regEx) : -1; 119 | indexContent = postContent ? postContent.search(regEx) : -1; 120 | 121 | if (indexTitle >= 0 || indexContent >= 0) { 122 | matchesScore += indexTitle >= 0 ? 3 : indexContent >= 0 ? 2 : 0; 123 | if (indexContent < 0) { 124 | indexContent = 0; 125 | } 126 | 127 | var start = 0; 128 | var end = 0; 129 | 130 | start = indexContent < 11 ? 0 : indexContent - 10; 131 | end = start === 0 ? 70 : indexContent + keyword.length + 60; 132 | 133 | if (end > postContent.length) { 134 | end = postContent.length; 135 | } 136 | 137 | var matchContent = 138 | '...' + 139 | escapeHtml(postContent) 140 | .substring(start, end) 141 | .replace(regEx, ("" + keyword + "")) + 142 | '...'; 143 | 144 | resultStr += matchContent; 145 | } 146 | }); 147 | 148 | if (matchesScore > 0) { 149 | var matchingPost = { 150 | title: escapeHtml(postTitle), 151 | content: postContent ? resultStr : '', 152 | url: postUrl, 153 | score: matchesScore 154 | }; 155 | 156 | matchingResults.push(matchingPost); 157 | } 158 | } 159 | }; 160 | 161 | for (var i = 0; i < data.length; i++) loop( i ); 162 | 163 | return matchingResults.sort(function (r1, r2) { return r2.score - r1.score; }); 164 | } 165 | 166 | function init$1(config, vm) { 167 | var isAuto = config.paths === 'auto'; 168 | 169 | var expireKey = resolveExpireKey(config.namespace); 170 | var indexKey = resolveIndexKey(config.namespace); 171 | 172 | var isExpired = localStorage.getItem(expireKey) < Date.now(); 173 | 174 | INDEXS = JSON.parse(localStorage.getItem(indexKey)); 175 | 176 | if (isExpired) { 177 | INDEXS = {}; 178 | } else if (!isAuto) { 179 | return 180 | } 181 | 182 | var paths = isAuto ? getAllPaths(vm.router) : config.paths; 183 | var len = paths.length; 184 | var count = 0; 185 | 186 | paths.forEach(function (path) { 187 | if (INDEXS[path]) { 188 | return count++ 189 | } 190 | 191 | Docsify 192 | .get(vm.router.getFile(path), false, vm.config.requestHeaders) 193 | .then(function (result) { 194 | INDEXS[path] = genIndex(path, result, vm.router, config.depth); 195 | len === ++count && saveData(config.maxAge, expireKey, indexKey); 196 | }); 197 | }); 198 | } 199 | 200 | var NO_DATA_TEXT = ''; 201 | var options; 202 | 203 | function style() { 204 | var code = "\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .input-wrap {\n display: flex;\n align-items: center;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 0 7px;\n line-height: 36px;\n font-size: 14px;\n}\n\n.search input::-webkit-search-decoration,\n.search input::-webkit-search-cancel-button,\n.search input {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.search .clear-button {\n width: 36px;\n text-align: right;\n display: none;\n}\n\n.search .clear-button.show {\n display: block;\n}\n\n.search .clear-button svg {\n transform: scale(.5);\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}\n\n.app-name.hide, .sidebar-nav.hide {\n display: none;\n}"; 205 | 206 | Docsify.dom.style(code); 207 | } 208 | 209 | function tpl(defaultValue) { 210 | if ( defaultValue === void 0 ) defaultValue = ''; 211 | 212 | var html = 213 | "
\n \n
\n \n \n \n \n \n
\n
\n
\n "; 214 | var el = Docsify.dom.create('div', html); 215 | var aside = Docsify.dom.find('aside'); 216 | 217 | Docsify.dom.toggleClass(el, 'search'); 218 | Docsify.dom.before(aside, el); 219 | } 220 | 221 | function doSearch(value) { 222 | var $search = Docsify.dom.find('div.search'); 223 | var $panel = Docsify.dom.find($search, '.results-panel'); 224 | var $clearBtn = Docsify.dom.find($search, '.clear-button'); 225 | var $sidebarNav = Docsify.dom.find('.sidebar-nav'); 226 | var $appName = Docsify.dom.find('.app-name'); 227 | 228 | if (!value) { 229 | $panel.classList.remove('show'); 230 | $clearBtn.classList.remove('show'); 231 | $panel.innerHTML = ''; 232 | 233 | if (options.hideOtherSidebarContent) { 234 | $sidebarNav.classList.remove('hide'); 235 | $appName.classList.remove('hide'); 236 | } 237 | return 238 | } 239 | var matchs = search(value); 240 | 241 | var html = ''; 242 | matchs.forEach(function (post) { 243 | html += ""; 244 | }); 245 | 246 | $panel.classList.add('show'); 247 | $clearBtn.classList.add('show'); 248 | $panel.innerHTML = html || ("

" + NO_DATA_TEXT + "

"); 249 | if (options.hideOtherSidebarContent) { 250 | $sidebarNav.classList.add('hide'); 251 | $appName.classList.add('hide'); 252 | } 253 | } 254 | 255 | function bindEvents() { 256 | var $search = Docsify.dom.find('div.search'); 257 | var $input = Docsify.dom.find($search, 'input'); 258 | var $inputWrap = Docsify.dom.find($search, '.input-wrap'); 259 | 260 | var timeId; 261 | // Prevent to Fold sidebar 262 | Docsify.dom.on( 263 | $search, 264 | 'click', 265 | function (e) { return e.target.tagName !== 'A' && e.stopPropagation(); } 266 | ); 267 | Docsify.dom.on($input, 'input', function (e) { 268 | clearTimeout(timeId); 269 | timeId = setTimeout(function (_) { return doSearch(e.target.value.trim()); }, 100); 270 | }); 271 | Docsify.dom.on($inputWrap, 'click', function (e) { 272 | // Click input outside 273 | if (e.target.tagName !== 'INPUT') { 274 | $input.value = ''; 275 | doSearch(); 276 | } 277 | }); 278 | } 279 | 280 | function updatePlaceholder(text, path) { 281 | var $input = Docsify.dom.getNode('.search input[type="search"]'); 282 | 283 | if (!$input) { 284 | return 285 | } 286 | if (typeof text === 'string') { 287 | $input.placeholder = text; 288 | } else { 289 | var match = Object.keys(text).filter(function (key) { return path.indexOf(key) > -1; })[0]; 290 | $input.placeholder = text[match]; 291 | } 292 | } 293 | 294 | function updateNoData(text, path) { 295 | if (typeof text === 'string') { 296 | NO_DATA_TEXT = text; 297 | } else { 298 | var match = Object.keys(text).filter(function (key) { return path.indexOf(key) > -1; })[0]; 299 | NO_DATA_TEXT = text[match]; 300 | } 301 | } 302 | 303 | function updateOptions(opts) { 304 | options = opts; 305 | } 306 | 307 | function init(opts, vm) { 308 | var keywords = vm.router.parse().query.s; 309 | 310 | updateOptions(opts); 311 | style(); 312 | tpl(keywords); 313 | bindEvents(); 314 | keywords && setTimeout(function (_) { return doSearch(keywords); }, 500); 315 | } 316 | 317 | function update(opts, vm) { 318 | updateOptions(opts); 319 | updatePlaceholder(opts.placeholder, vm.route.path); 320 | updateNoData(opts.noData, vm.route.path); 321 | } 322 | 323 | var CONFIG = { 324 | placeholder: 'Type to search', 325 | noData: 'No Results!', 326 | paths: 'auto', 327 | depth: 2, 328 | maxAge: 86400000, // 1 day 329 | hideOtherSidebarContent: false, 330 | namespace: undefined 331 | }; 332 | 333 | var install = function (hook, vm) { 334 | var util = Docsify.util; 335 | var opts = vm.config.search || CONFIG; 336 | 337 | if (Array.isArray(opts)) { 338 | CONFIG.paths = opts; 339 | } else if (typeof opts === 'object') { 340 | CONFIG.paths = Array.isArray(opts.paths) ? opts.paths : 'auto'; 341 | CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge; 342 | CONFIG.placeholder = opts.placeholder || CONFIG.placeholder; 343 | CONFIG.noData = opts.noData || CONFIG.noData; 344 | CONFIG.depth = opts.depth || CONFIG.depth; 345 | CONFIG.hideOtherSidebarContent = opts.hideOtherSidebarContent || CONFIG.hideOtherSidebarContent; 346 | CONFIG.namespace = opts.namespace || CONFIG.namespace; 347 | } 348 | 349 | var isAuto = CONFIG.paths === 'auto'; 350 | 351 | hook.mounted(function (_) { 352 | init(CONFIG, vm); 353 | !isAuto && init$1(CONFIG, vm); 354 | }); 355 | hook.doneEach(function (_) { 356 | update(CONFIG, vm); 357 | isAuto && init$1(CONFIG, vm); 358 | }); 359 | }; 360 | 361 | $docsify.plugins = [].concat(install, $docsify.plugins); 362 | 363 | }()); -------------------------------------------------------------------------------- /lib/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "support": ["0.2.2"], 3 | "upgrade": ["0.0.0"], 4 | "newest": "v1.0.0" 5 | } 6 | -------------------------------------------------------------------------------- /lib/vue.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600");*{-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;box-sizing:border-box}body:not(.ready){overflow:hidden}body:not(.ready) .app-nav,body:not(.ready)>nav,body:not(.ready) [data-cloak]{display:none}div#app{font-size:30px;font-weight:lighter;margin:40vh auto;text-align:center}div#app:empty:before{content:"Loading..."}img.emoji{height:1.2em}img.emoji,span.emoji{vertical-align:middle}span.emoji{font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1.2em}.progress{background-color:#42b983;background-color:var(--theme-color,#42b983);height:2px;left:0;position:fixed;right:0;top:0;transition:width .2s,opacity .4s;width:0;z-index:999999}.search .search-keyword,.search a:hover{color:#42b983;color:var(--theme-color,#42b983)}.search .search-keyword{font-style:normal;font-weight:700}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#34495e;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}img{max-width:100%}a[disabled]{cursor:not-allowed;opacity:.6}kbd{border:1px solid #ccc;border-radius:3px;display:inline-block;font-size:12px!important;line-height:12px;margin-bottom:3px;padding:3px 5px;vertical-align:middle}li input[type=checkbox]{margin:0 .2em .25em 0;vertical-align:middle}.app-nav{margin:25px 60px 0 0;position:absolute;right:0;text-align:right;z-index:10}.app-nav.no-badge{margin-right:25px}.app-nav p{margin:0}.app-nav>a{margin:0 1rem;padding:5px 0}.app-nav li,.app-nav ul{display:inline-block;list-style:none;margin:0}.app-nav a{color:inherit;font-size:16px;text-decoration:none;transition:color .3s}.app-nav a.active,.app-nav a:hover{color:#42b983;color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983)}.app-nav li{display:inline-block;margin:0 1rem;padding:5px 0;position:relative;cursor:pointer}.app-nav li ul{background-color:#fff;border:1px solid;border-color:#ddd #ddd #ccc;border-radius:4px;box-sizing:border-box;display:none;max-height:calc(100vh - 61px);overflow-y:auto;padding:10px 0;position:absolute;right:-15px;text-align:left;top:100%;white-space:nowrap}.app-nav li ul li{display:block;font-size:14px;line-height:1rem;margin:8px 14px;white-space:nowrap}.app-nav li ul a{display:block;font-size:inherit;margin:0;padding:0}.app-nav li ul a.active{border-bottom:0}.app-nav li:hover ul{display:block}.github-corner{border-bottom:0;position:fixed;right:0;text-decoration:none;top:0;z-index:1}.github-corner:hover .octo-arm{animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;fill:#42b983;fill:var(--theme-color,#42b983);height:80px;width:80px}main{display:block;position:relative;width:100vw;height:100%;z-index:0}main.hidden{display:none}.anchor{display:inline-block;text-decoration:none;transition:all .3s}.anchor span{color:#34495e}.anchor:hover{text-decoration:underline}.sidebar{border-right:1px solid rgba(0,0,0,.07);overflow-y:auto;padding:40px 0 0;position:absolute;top:0;bottom:0;left:0;transition:transform .25s ease-out;width:300px;z-index:20}.sidebar>h1{margin:0 auto 1rem;font-size:1.5rem;font-weight:300;text-align:center}.sidebar>h1 a{color:inherit;text-decoration:none}.sidebar>h1 .app-nav{display:block;position:static}.sidebar .sidebar-nav{line-height:2em;padding-bottom:40px}.sidebar li.collapse .app-sub-sidebar{display:none}.sidebar ul{margin:0 0 0 15px;padding:0}.sidebar li>p{font-weight:700;margin:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{border-bottom:none;display:block}.sidebar ul li ul{padding-left:20px}.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:transparent;border-radius:4px}.sidebar:hover::-webkit-scrollbar-thumb{background:hsla(0,0%,53.3%,.4)}.sidebar:hover::-webkit-scrollbar-track{background:hsla(0,0%,53.3%,.1)}.sidebar-toggle{background-color:transparent;background-color:hsla(0,0%,100%,.8);border:0;outline:none;padding:10px;position:absolute;bottom:0;left:0;text-align:center;transition:opacity .3s;width:284px;z-index:30;cursor:pointer}.sidebar-toggle:hover .sidebar-toggle-button{opacity:.4}.sidebar-toggle span{background-color:#42b983;background-color:var(--theme-color,#42b983);display:block;margin-bottom:4px;width:16px;height:2px}body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}.content{padding-top:60px;position:absolute;top:0;right:0;bottom:0;left:300px;transition:left .25s ease}.markdown-section{margin:0 auto;max-width:80%;padding:30px 15px 40px;position:relative}.markdown-section>*{box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section hr{border:none;border-bottom:1px solid #eee;margin:2em 0}.markdown-section iframe{border:1px solid #eee;width:1px;min-width:100%}.markdown-section table{border-collapse:collapse;border-spacing:0;display:block;margin-bottom:1rem;overflow:auto;width:100%}.markdown-section th{font-weight:700}.markdown-section td,.markdown-section th{border:1px solid #ddd;padding:6px 13px}.markdown-section tr{border-top:1px solid #ccc}.markdown-section p.tip,.markdown-section tr:nth-child(2n){background-color:#f8f8f8}.markdown-section p.tip{border-bottom-right-radius:2px;border-left:4px solid #f66;border-top-right-radius:2px;margin:2em 0;padding:12px 24px 12px 30px;position:relative}.markdown-section p.tip:before{background-color:#f66;border-radius:100%;color:#fff;content:"!";font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px;font-weight:700;left:-12px;line-height:20px;position:absolute;height:20px;width:20px;text-align:center;top:14px}.markdown-section p.tip code{background-color:#efefef}.markdown-section p.tip em{color:#34495e}.markdown-section p.warn{background:rgba(66,185,131,.1);border-radius:2px;padding:1rem}.markdown-section ul.task-list>li{list-style-type:none}body.close .sidebar{transform:translateX(-300px)}body.close .sidebar-toggle{width:auto}body.close .content{left:0}@media print{.app-nav,.github-corner,.sidebar,.sidebar-toggle{display:none}}@media screen and (max-width:768px){.github-corner,.sidebar,.sidebar-toggle{position:fixed}.app-nav{margin-top:16px}.app-nav li ul{top:30px}main{height:auto;min-height:100vh;overflow-x:hidden}.sidebar{left:-300px;transition:transform .25s ease-out}.content{left:0;max-width:100vw;position:static;padding-top:20px;transition:transform .25s ease}.app-nav,.github-corner{transition:transform .25s ease-out}.sidebar-toggle{background-color:transparent;width:auto;padding:30px 30px 10px 10px}body.close .sidebar{transform:translateX(300px)}body.close .sidebar-toggle{background-color:hsla(0,0%,100%,.8);transition:background-color 1s;width:284px;padding:10px}body.close .content{transform:translateX(300px)}body.close .app-nav,body.close .github-corner{display:none}.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave .56s ease-in-out}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{position:relative;align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;min-height:100vh;width:100%;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;bottom:0;width:100%}section.cover .cover-main{flex:1;margin:0 16px;text-align:center;position:relative}section.cover a{color:inherit}section.cover a,section.cover a:hover{text-decoration:none}section.cover p{line-height:1.5rem;margin:1em 0}section.cover h1{color:inherit;font-size:2.5rem;font-weight:300;margin:.625rem 0 2.5rem;position:relative;text-align:center}section.cover h1 a{display:block}section.cover h1 small{bottom:-.4375rem;font-size:1rem;position:absolute}section.cover blockquote{font-size:1.5rem;text-align:center}section.cover ul{line-height:1.8;list-style-type:none;margin:1em auto;max-width:500px;padding:0}section.cover .cover-main>p:last-child a{border-radius:2rem;border:1px solid #42b983;border-color:var(--theme-color,#42b983);box-sizing:border-box;color:#42b983;color:var(--theme-color,#42b983);display:inline-block;font-size:1.05rem;letter-spacing:.1rem;margin:.5rem 1rem;padding:.75em 2rem;text-decoration:none;transition:all .15s ease}section.cover .cover-main>p:last-child a:last-child{background-color:#42b983;background-color:var(--theme-color,#42b983);color:#fff}section.cover .cover-main>p:last-child a:last-child:hover{color:inherit;opacity:.8}section.cover .cover-main>p:last-child a:hover{color:inherit}section.cover blockquote>p>a{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{color:#42b983;color:var(--theme-color,#42b983)}.sidebar,body{background-color:#fff}.sidebar{color:#364149}.sidebar li{margin:6px 0}.sidebar ul li a{color:#505d6b;font-size:14px;font-weight:400;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.sidebar ul li a:hover{text-decoration:underline}.sidebar ul li ul{padding:0}.sidebar ul li.active>a{border-right:2px solid;color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.app-sub-sidebar li:before{content:"-";padding-right:4px;float:left}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{color:#2c3e50;font-weight:600}.markdown-section a{color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.markdown-section h1{font-size:2rem;margin:0 0 1rem}.markdown-section h2{font-size:1.75rem;margin:45px 0 .8rem}.markdown-section h3{font-size:1.5rem;margin:40px 0 .6rem}.markdown-section h4{font-size:1.25rem}.markdown-section h5{font-size:1rem}.markdown-section h6{color:#777;font-size:1rem}.markdown-section figure,.markdown-section p{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{line-height:1.6rem;word-spacing:.05rem}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section blockquote{border-left:4px solid #42b983;border-left:4px solid var(--theme-color,#42b983);color:#858585;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code,.markdown-section output:after,.markdown-section pre{font-family:Roboto Mono,Monaco,courier,monospace}.markdown-section code,.markdown-section pre{background-color:#f8f8f8}.markdown-section output,.markdown-section pre{margin:1.2em 0;position:relative}.markdown-section output,.markdown-section pre>code{border-radius:2px;display:block}.markdown-section output:after,.markdown-section pre>code{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.markdown-section code{border-radius:2px;color:#e96900;margin:0 2px;padding:3px 5px;white-space:pre-wrap}.markdown-section>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code{font-size:.8rem}.markdown-section pre{padding:0 1.4rem;line-height:1.5rem;overflow:auto;word-wrap:normal}.markdown-section pre>code{color:#525252;font-size:.8rem;padding:2.2em 5px;line-height:inherit;margin:0 2px;max-width:inherit;overflow:inherit;white-space:inherit}.markdown-section output{padding:1.7rem 1.4rem;border:1px dotted #ccc}.markdown-section output>:first-child{margin-top:0}.markdown-section output>:last-child{margin-bottom:0}.markdown-section code:after,.markdown-section code:before,.markdown-section output:after,.markdown-section output:before{letter-spacing:.05rem}.markdown-section output:after,.markdown-section pre:after{color:#ccc;font-size:.6rem;font-weight:600;height:15px;line-height:15px;padding:5px 10px 0;position:absolute;right:0;text-align:right;top:0;content:attr(data-lang)}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8e908c}.token.namespace{opacity:.7}.token.boolean,.token.number{color:#c76b29}.token.punctuation{color:#525252}.token.property{color:#c08b30}.token.tag{color:#2973b7}.token.string{color:#42b983;color:var(--theme-color,#42b983)}.token.selector{color:#6679cc}.token.attr-name{color:#2973b7}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#22a2c9}.token.attr-value,.token.control,.token.directive,.token.unit{color:#42b983;color:var(--theme-color,#42b983)}.token.function,.token.keyword{color:#e96900}.token.atrule,.token.regex,.token.statement{color:#22a2c9}.token.placeholder,.token.variable{color:#3d8fd1}.token.deleted{text-decoration:line-through}.token.inserted{border-bottom:1px dotted #202746;text-decoration:none}.token.italic{font-style:italic}.token.bold,.token.important{font-weight:700}.token.important{color:#c94922}.token.entity{cursor:help}code .token{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;min-height:1.5rem;position:relative;left:auto} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eTest-docs", 3 | "version": "1.0.0", 4 | "description": "一个简单易用的集成测试应用", 5 | "homepage": "https://alltheblue.github.io/docs/#/", 6 | "main": "index.js", 7 | "keywords": [ 8 | "ETE", 9 | "UI", 10 | "API", 11 | "Ab", 12 | "test", 13 | "eTest" 14 | ], 15 | "author": "xflihaibo", 16 | "license": "ISC" 17 | } 18 | --------------------------------------------------------------------------------