Lv110版本源码上传

This commit is contained in:
西瓜°
2024-11-04 15:00:40 +08:00
parent a6dbccdead
commit e029da72e4
6642 changed files with 131203 additions and 136087 deletions
+1064 -1298
View File
File diff suppressed because it is too large Load Diff
+5 -7
View File
@@ -1,7 +1,5 @@
## 留言板
和计算器相关的 BUG、意见可在此处反馈
## 其余途径
- [码云](https://gitee.com/i_melon/DNFCalculating/issues)
## BUG 反馈
和计算器相关的 BUG、意见可点击下方反馈
- [码云](https://gitee.com/dcalc/dnfcalculating_110/issues)
+9 -9
View File
@@ -1,9 +1,9 @@
## 主体维护人员
纸飞机、西瓜 °、fzls、SCUDRT、知月、Umi<br>
## 参与制作人员
`以下排名以首字母排序,不分先后`<br>
🐎,777,Garson,Kaito,Leisa,Lizzy 荔枝贝壳喵,Paxis,阿武,爱敏,熬夜砍树,贰肆,疯,共产主义战士,海豹,韩械,机枪哥,极脂の魔道,绝唱唱,卡通,乐于驴,龙卷风,莫方,墨羽狼,幕城,平静,千景,一定要玩混沌魔灵,浅笑,球,时光,时雨,碳末,天府星,洗具,小一,轩轩,雪露,雅男,亚索,一 ye 遮天,真奥
## 主体维护人员
✈(纸飞机)、🍉(西瓜)、🌙(知月)、🍋(冰柠檬)、🗿(礁石)
## 参与制作人员
<!-- `以下排名以首字母排序,不分先后`<br> -->
🐎(阿马先生)、🐱(肥猫池塘)、🦆(魔灵)、❄(平静)、🤺(亚索)、Umi(🦈)
+25 -9
View File
@@ -1,15 +1,31 @@
![avatar](img\logo.ico)
# DNF 计算器
# DNF 计算器 <small class="version">2024.09.06</small>
> 为 DNF 装备搭配及伤害计算提供便利的工具
> sponsored by Colg
- python(3.8)编写,使用 pyqt5(5.14.2) 图形 GUI 库
- 主框架由纸飞机实现
- 仅支持 PC 端使用
> 为 DNF 装备搭配及伤害计算提供便利的免费工具
[软件介绍](USERMANUAL)
[相关源码](https://github.com/wxh0402/DNFCalculating)
[下载链接](https://wwx.lanzoui.com/b01bfj76f)
<div class="linkButton">
<!-- [BUG反馈](https://wwx.lanzoui.com/b01bfj76f) -->
[说明书](USERMANUAL)
[网页版](https://dcalc.dnftools.com/)
[桌面版](https://wwn.lanzout.com/s/dcalc)
[小程序](WX)
</div>
<div class="cover-link-container">
<a class="cover-link" href="https://bbs.colg.cn/forum.php" target="_blank">
<span class="link-title">Colg</span>
<span class="link-description">DNF游戏资讯论坛,一手游戏资讯和攻略。</span>
</a>
<a class="cover-link" href="https://avatar.dnftools.com/" target="_blank">
<span class="link-title">纸娃娃</span>
<span class="link-description">由知月开发的在线时装搭配纸娃娃系统。</span>
</a>
<a class="cover-link" href="https://dcalc.dnftools.com/skillinfo" target="_blank">
<span class="link-title">技能数据</span>
<span class="link-description">DNF游戏内职业技能数据在线查看。</span>
</a>
</div>
+13 -8
View File
@@ -1,12 +1,17 @@
- **计算器版本**
- [桌面版](https://wwn.lanzout.com/s/dcalc)
- [网页版](https://dcalc.dnftools.com/)
- [微信小程序版](wx.md)
- **指南**
- [使用说明](USERMANUAL.md)
- [更新日志](CHANGELOG.md)
- [使用说明](usermanual.md)
- [更新日志](changelog.md)
- **维护**
- [Git Code](README.md)
- [Contributors](CONTRIBUTERS.md)
- [Git Code](readme.md)
- [Contributors](contributers.md)
- **其他**
- [反馈](COMMENT.md)
- [反馈](comment.md)
- **友情链接**
- [下载链接](https://wwx.lanzoui.com/b01bfj76f)
- [源码](https://gitee.com/i_melon/DNFCalculating)
- [下载链接](https://wwn.lanzout.com/s/dcalc)
- [源码](https://gitee.com/dcalc/dnfcalculating_110)
- [Colg](https://bbs.colg.cn/)
- [无名空岛](https://www.skycity.top?from=calc)
+6 -127
View File
@@ -1,127 +1,6 @@
## 简介
此项目为 DNF 装备搭配及伤害计算提供便利的工具
执行程序下载:https://wwx.lanzoui.com/b01bfj76f 或 https://www.lanzoui.com/b01bfj76f
python(3.8)编写,使用 pyqt5 图形 GUI 库
主框架由纸飞机实现,西瓜协助修改,SCUDRT 对算法进行优化修改,风之凌殇添加多进程优化
## 依赖安装
安装[Python](https://www.python.org/),计算器开发使用的是 3.8 版本
安装项目依赖
## 其余注意
择优相关加速,需自行将 PublicReference/preferred 的 C++ 的程序需要自己编译为 DLL 然后放到 InternalFile/DLL 目录
> pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ -r requirements.txt
<!-- ### 修改项目
* fork本项目
* 克隆(clone)你fork的项目到本地,如果clone速度太慢,可以在github.com后添加.cnpmjs.org,切换仓库,如
> 从
> git clone https://github.com/wxh0402/DNFCalculating.git
> 变成
> git clone https://github.com.cnpmjs.org/wxh0402/DNFCalculating.git
> 提示下载速度
* 新建分支并检出新分支,如
> git checkout -b ver0.1 -->
## macOS 下运行方式
&#160; &#160; &#160; &#160; 直接在`Finder`中双击`run_mac.command`即可运行。
&#160; &#160; &#160; &#160; 或者在`终端(Terminal)`中,执行命令`python3.8 main.py`即可运行。
## 程序结构
|--  DNFCalculating
    |--  .gitignore
    |--  .gitmodules
    |--  .editorconfig
    |--  run_mac.command:macOS 下运行脚本
    |--  CHANGELOG.md:程序更新记录
    |--  LICENSE:开源许可
    |--  main.py:程序主入口
    |--  README.md:程序说明
    |--  requirements.txt:项目依赖包
    |--  Characters:职业实现目录
    |--  PublicReference:公有引用方法
    |   |--  base.py:输出职业公有实现方法
    |   |--  base_buff.py:奶系职业公有实现方法
    |   |--  buff_panel.py:奶系切装功能实现
    |   |--  common.py:界面公有实现方法
    |   |--  \_\_init\_\_.py:初始化文件,启用多线程及日志记录
    |   |--  choise:选项设置
    |   |   |-- 细节选项.py
    |   |   |-- 选项设置.py
    |   |   |-- 选项设置\_buff.py
    |   |--  equipment:装备设置
    |   |   |--  basic_equ.py:装备公有类
    |   |   |--  equ_list.py:装备列表
    |   |   |-- 基础函数.py:各类隐藏基础公式
    |   |   |-- 宠物.py
    |   |   |-- 宠物\_buff.py
    |   |   |-- 武器融合.py
    |   |   |-- 武器融合\_buff.py
    |   |   |-- 称号.py
    |   |   |-- 称号\_buff.py
    |   |   |-- 装备\_套装.py
    |   |   |-- 装备\_武器.py
    |   |   |-- 装备\_特殊.py
    |   |   |-- 装备\_防具.py
    |   |   |-- 装备\_首饰.py
    |   |   |-- 辟邪玉.py
    |   |   |-- 辟邪玉\_buff.py
    |   |   |-- 融合\_奥兹玛.py
    |   |   |-- 融合\_希洛克.py
    |   |--  preferred:择优 DLL 源码,需自行编译
    |   |--  views:界面扩展类
    |   |--  utils:工具类
    |       |--  calc_core.py:装备寻优
    |       |--  common.py:格式化时间
    |       |--  config.py:配置读取
    |       |--  constant.py:常量
    |       |--  copy.py:深度拷贝
    |       |--  img.py:常量图片
    |       |--  MainWindow.py:自定义窗口
    |       |--  minheap.py:最小堆排序
    |       |--  producer_consumer.py:多进程
    |       |--  TitleBar.py:自定义标题栏
    |       |--  zipfile.py:压缩文件
    |       |--  storex.py:存储数据,组件间通信
    |       |--  LZextends.py:蓝奏云扩展
    |--  ResourceFiles:资源文件夹
    |   |-- 职业文件夹
    |   |   |--  bg.jpg:背景图
    |   |   |-- 人物.png:详情界面人物图
    |   |   |--  reset:默认配置文件夹
    |   |   |   |--  char.json:职业特有选项存档
    |   |   |   |--  page_1.json:第一页选项存档
    |   |   |   |--  page_2.json:第二页选项存档
    |   |   |   |--  page_3.json:第三页选项存档
    |   |   |   |--  page_4.json:第四页选项存档
    |   |   |   |--  page_5.json:第五页选项存档
    |   |   |   |--  page_6.json:第六页选项存档
    |   |   |-- 技能:技能图标文件夹
    |   |--  Config:配置文件夹
    |   |   |-- 基础设置.ini
    |   |   |-- 攻击目标.ini
    |   |   |--  adventure_info.json:加载职业配置
    |   |   |--  config.json:配置选项文件
    |   |   |--  release_version.json:计算器版本
    |   |--  img:公有图片
    |   |   |--  logo.ico
    |   |   |-- 刀魂之卡赞.png
    |   |   |-- 觉醒选择.png
    |   |   |-- 输出背景.png
    |   |   |-- 输出背景\_BUFF.png
    |   |   |-- 远古记忆.png
    |   |   |-- 分类
    |   |   |-- 头像
    |   |   |-- 希洛克
    |   |   |-- 装备
    |   |--  Skins:计算器皮肤包
    |--  Tools
        |-- 图标去白点.py
        |-- 神话融合图标拼接.py
## 简介
此项目为 DNF 装备搭配及伤害计算提供便利的工具
执行程序下载:https://wwn.lanzout.com/s/dcalc
web:vue3+TS+electron+vite api:python+FastAPI <br> 参考项目:https://github.com/caoxiemeihao/electron-vue-vite <br> 使用拖拽组件:https://github.com/SortableJS/vue.draggable.next <br>
+171 -241
View File
@@ -1,241 +1,171 @@
## 软件简介
![打开界面](img/使用-2.png "打开界面")
![详情界面](img/简介-1.png "详情界面")
本软件为 DNF 相关的计算器,供玩家进行搭配装备及伤害计算等各方面使用<br>
主体功能包含:装备择优、打桩伤害计算、光环|宠物装备|希洛克词条择优、辟邪玉计算、切装计算等<br>
目前计算器已涵盖所有的职业,同时对韩服特有的部分职业平衡进行了前瞻性更新<br>
## 开始使用
<strong>下载路径</strong>: https://wwx.lanzous.com/b01bfj76f 或 https://pan.lanzou.com/b01bfj76f<br>
![压缩包](img/使用-1.png "压缩包")
下载网盘中最新程序`DNF计算器XX.XX.zip`并完整解压,ResourceFiles 为资源文件,包含贴图及配置文件<br>
更新时仅需将压缩包完整解压出来并且覆盖(提示时点击替换)旧版文件即可,旧版设置的配置文件会被保留<br>
## 合规性校验
![程序是否合规](img/证书校验.png "程序是否合规")
正规途径下载的计算器,右键 exe 程序的属性,可在数字签名中查看到第三方机构认证颁发的代码签名<br>
!> 使用前请确保数字签名存在且与说明书中一致<br>如无数字签名,则程序可能为第三方修改后的打包版本,请谨慎使用<br>
### 常见问题
- 蓝奏云无法打开<br>
修改 DNS 服务器地址,首选 114.114.114.114,备用 8.8.8.8<br>
![修改DNS](img/使用-3.png "修改DNS")
- 提示解压问题<br>
![解压问题](img/使用-4.png "解压问题")
!> 请勿直接在 zip 内打开 exe 执行程序或只解压 exe 程序,exe 程序需要与 ResourceFiles 在同级目录下<br>
- 软件打开报错,可在 https://wwx.lanzoui.com/b01bwta9i 下载系统补丁解决<br>
- failed to execute script
- 计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll
- Failed to execute script pyi_rth_certifi 可按照以下方式解决<br>
- 百度 openssl.light 安装
- 安装https://chocolatey.org/install,然后执行命令choco install openssl.light
## 设置
![设置入口](img/设置-1.png "设置入口")
![设置](img/设置-2.png "设置详情")
该窗口下,用户可以对计算器的部分功能进行个性化设置,常见的有:开关输出系切装、控制窗口缩放、切换计算器皮肤、停启用自动更新、控制三觉屏蔽选项等<br>
设置选项修改后,需要重启计算器才能生效<br>
## 装备/选择/打造
![装备设置](img/装备-1.png "装备设置")
该页面下可选择自身以有的装备、称号、宠物,同时选择装备触发、选择特色装备的择优等<br>
### 一键修正
在玩家选择完所穿戴装备,初步调整打造情况(增幅、时装、宠物)后,可使用一件修正面板细节功能,输入角色站街力智、三攻、属强修正角色面板数据<br>
!> 该功能仅在选择单套装备的情况下生效<br>
如玩家穿戴了部分影响站街属性的辟邪玉(属强、加成影响站街数据技能的等级等)<br>
或影响站街属性的白金、时装上衣等级等,需在[辟邪玉/希洛克/黑鸦/奥兹玛]、[基础/细节/修正]进行修正<br>
### 装备触发
部分装备及伤害词条存在不同的触发情况,需要玩家在计算前选择对应的属性<br>
如手搓、777、军神等各种会触发不同属性的装备,不同的选择下会对应不同的计算结果<br>
较为特殊的是,`持续伤害词条`也需要调整对应的计算比例,默认为 100%,计算器目前无法做到技能队列排列,需自行预估适用比例(影响范围较小)<br>
### 计算模式
出于计算时间考虑,计算器设置了三种后台计算模式<br>
- 急速模式:计算 533 搭配、3332(散搭)搭配,智慧产物相关防具、首饰、特殊不纳入计算
- 套装模式:计算 533 搭配、3332(散搭)搭配、3332(防具 3+2)搭配,智慧产物相关防具、首饰、特殊不纳入计算
- 单件模式:计算所有组合,不包含百变怪
注:选项中的组合数为预估值,不代表实际计算组合<br>
计算占用进程数默认为电脑 CPU 的逻辑核心数,选择最大值时速度最快,但是 CPU 占用会达到 100%(计算时会造成游戏卡顿),为了避免影响电脑性能,可适当降低计算器占用核心数<br>
计算速度参考值(CPU 为 AMD Ryzen 7 3700X ,16 进程,芙蕾雅):<br>
- 急速模式(预估 9.79 万组合):总计耗时 5.79s
- 套装模式(预估 90.43 万组合):总计耗时 1min2.46s
- 单件模式(预估 46.35 万亿组合):太烧 CPU,不建议这么玩
### 多配置模式
![复制配置](img/装备-2.png "复制配置")
如果存在同职业多个配置(账号)的情况,可在 ResourceFiles 对应的职业文件夹下,复制 reset 文件夹后,粘贴后重命名为 set 开头的文件夹,重新选择计算器职业后即可切换配置<br>
!> 如出现计算结果较为离谱或出现无法使用的情况,可尝全局重置,重置所有的配置<br>
## 技能/符文/其他
![技能相关](img/技能-1.png "技能相关")
该页面下可设置计算技能相关、药剂、护符等<br>
### 技能相关设置
各职业已预设模板,如与自身有所出入,可以自行调整参数,具体可设置以下参数<br>
- 技能等级调整:技能等级默认契约满级,等级调整视个人加点情况而定,调整数值基于契约满级进行+/-调整<br>
!> 装备、时装上衣、白金、附魔等对技能等级的加成无需在此调整,时装下装的等级调整可在此调整<br>
- TP 等级:TP 基础等级为 0 级,调整数值基于契约 0 级进行+/-调整<br>
- 技能释放次数:技能释放次数分为/CD 与固定次数,/CD 较多职业并未考虑技能演出时间(少部分职业入芙蕾雅等做过特殊修正),如需贴合自身修炼场技能次数,可自行调整技能次数<br>
!> 固定次数后会影响部分 CDR 装备的最终结果
- 宠物次数:宠物技能对技能能够加成多少次
- 技能形态选择:部分技能存在不同形态,对这些技能计算器采用下拉/勾选的形式提供选择
- BUFF 换装数值:BUFF 图标旁的输入框内可设置 BUFF 数值,默认完美换装数值
- 远古记忆/红阵:右下角可设置计算是否适用于远古或红阵,默认适用,可自行调整
### 护符设置
各职业已预设护符及符文的选择,护符版本进行切换,如与自身有所出入,可以自行调整。<br>
### 药剂等设置
药剂设置包含修炼场常见的药剂,同时还设置了称号触发、白兔子选项、队友光环、系统奶等一系列选项供模拟不同情况下的装备计算<br>
### 其余设置
计算器预设了 120、130 沙袋、0 防强化机供模拟,如需模拟其他怪物,可在`ResourceFiles\Config\攻击目标.ini`中自行修改<br>
## 基础/细节/修正
![细节调整](img/细节-1.png "细节调整")<br>
该页面下可设置附魔、白金、时装、徽章、勋章、宠物装备等细节方面的数据<br>
!> 如在装备/选择/打造页面勾选了光环词条择优、宠物装备择优,则对应的部位的词条选择将被禁用无法选择<br>
## 神话/改造属性修正
![神话改造调整](img/神话改造调整-1.png "神话改造调整")<br>
由于游戏内神话词条数值、改造装备升级数值存在随机性,计算器提供了调整神话词条数值及改造升级属性的界面以保证计算的准确性<br>
!> 改造升级属性调整需在[辟邪玉/希洛克/黑鸦]中勾选智慧产物升级才会显示<br>
## 辟邪玉/希洛克/黑鸦/奥兹玛
![黑鸦](img/黑鸦-1.png "黑鸦")<br>
该页面下可设置计算相关的辟邪玉、希洛克装备、黑鸦、奥兹玛装备等<br>
### 辟邪玉
可根据自身情况选择对应的辟邪玉属性,鼠标悬停至文字上方可查看辟邪玉的算法<br>
!> 属白增幅分对应属性,计算器未作区分,双属性附加(星之海)需手动计算并在第三页修正<br>
### 希洛克
可根据自身情况选择对应的残香融合及装备融合,残香选择自适应最高值会自动计算最优解,结果显示在详情界面<br>
守门人全属强自动补正:自带单属强职业不可使用,在计算时自动替换细节页的附魔勋章为<strong>毕业</strong>的全属强方案,细节页面对应的附魔设置会失效,如需调整,可在进图/站街修正做对应的属强加减<br>
### 黑鸦
可根据自身情况选择对应的黑鸦遴选词条,选择计算最高会自动计算最优解,结果显示在详情界面<br>
!> 计算最优解时,百分比力智词条较为特殊,与力智数值有关,在无奶/系统奶时,受到力智影响,没有实际数值显示的提升<br>
由于除武器外,不同装备的遴选最终显示数值存在差异,自选范围计算器提供的选项为相对值:2%、4%、6%、8%(武器为:4%、8%、12%、16%),计算器选择数值 = 装备最终遴选数值 - 装备遴选最小值 + 2%<br>
此外,为了减少计算量,黑鸦武器词条择优提供了词条择优及觉醒词条择优的选项,用户可针对自身情况选择<br>
### 奥兹玛
可根据自身情况选择对应的奥兹玛装备,阿斯特罗斯暂不支持分时间段加成技能,需自行选择对应的技能加成区间,几件装备选择几个区间<br>
## 自选装备计算
![自选计算](img/自选-1.png "自选计算")
自选装备计算界面,可供用户快捷的进行单套装备的选择和预估<br>
在选择完单套装备后,可将其设置为基准值,之后的排行/计算等将以基准值为参考进行各技能及总伤害等的对比以供参考<br>
同时提供了辟邪玉的<strong>单个词条</strong>的理论提升<br>
!> 部分等级加成的词条可能会造成技能 CD 的缩减,导致提升偏高
## 装备排行界面
![装备排行](img/排行-1.png "装备排行")
点击开始计算后会对选择装备进行排行计算,按钮 | 左边为预估的伤害数字,| 右边为相较于第一套装备的强度,点击按钮可查看详细的数据情况<br>
如当前搭配存在技能等级溢出的情况,按钮颜色会显示为红色以作提示,鼠标移动到按钮上会告知溢出技能详情<br>
## 详细数据界面
![详情界面](img/详情-1.png "详情界面")
详情界面详细展示某个搭配下人物属性、技能伤害等,如选择了宠物装备|光环择优,会在套装情况下展示择优选择供参考<br>
右下角提供了输出所有的择优项搭配及相对最优解的差值方便用户自行选择,以及输出技能倍率数据功能方便对比技能秒伤等<br>
## 奶系
### 择优方向选择
![择优方向](img/奶系-1.png "择优方向")由于奶在不同的副本存在择优偏差,计算器对于单套的择优,提供了续航向、爆发向、及自定义太阳系数的方式作为最优解的计算方向,用户在使用时,可针对自身情况选择合适的选项<br>
### 光环、宠物、称号等补正
![称号光环宠物补正](img/奶系-2.png "补正")
针对奶的时装、光环、宠物、称号登记和穿戴不同,计算器在[基础/细节/修正]页面提供了对应的修正等级、词条及适用的选项,宠物、光环等级加成被动差异造成的适用不同暂时需要在此进行手动修正<br>
### 双切计算
![双切计算](img/奶系-3.png "双切计算")
![双切界面](img/奶系-4.png "双切界面")
部分用户存在双切需求,在[自选装备计算]中勾选启用登记,并在登记设置中设置对应的双切,登记设置中为 BUFF 套,自选装备为太阳套,双切只适用于自选装备计算<br>
## 补充
### 输出系切装
如存在需要切换武器/装备的情况,可在选择职业页面点击打开设置,开启对应功能<br>
重启后,在自选装备计算的装备后及技能/符文/其他的技能后面会出现勾选选项,对需要切换的装备及技能进行勾选即可<br>
### BUG 反馈等
提供了 QQ 群及 Gitee 反馈途径,推荐在 Gitee 上按照要求建立 issue 进行反馈,Gitee 会优先处理,群不常看<br>
Gitee 反馈地址:https://gitee.com/i_melon/DNFCalculating/issues?state=all<br>
## 软件简介
本软件为 DNF 相关的计算器,供玩家进行搭配装备等各方面使用</br>
!> 请勿使用计算器进行打桩排名、带节奏等行为</br>
为避免营销号节奏及不怀好意的使用方式,现已删除100版本的/CD及宠物技能模拟</br>
本工具为开源免费软件,不存在收费等情况,请自行甄别下载途径和使用方式</br>
!> 由colg赞助,与无名空岛是两个不同的软件,空岛相关咨询和建议联系冰柠檬
![首页](img/image.png)
![首页-2](img/image-1.png)
## 程序版本说明
计算器分为桌面版、网页版、小程序版
- 网页版:网页程序,访问链接 https://dcalc.dnftools.com ,部署在服务器端,限制了多套计算,存档保存在用户浏览器的localStorage内,更新最为及时,会有较多测试性功能
- 桌面版:桌面端计算程序,需要下载后安装使用,存档保存在用户本地,下载链接 https://wwk.lanzout.com/s/dcalc ,调用本地系统资源,支持大数据量的多套及多窗口同时打开,会在网页版测试稳定后推送程序版本
- 小程序:微信搜索`纸飞机计算器`,不支持调整技能次数等复杂操作,仅为方便部分手机用户使用
## BUG反馈
为了契合DNF双服的版本更新、职业平衡,更新过程中不可避免的会存在部分功能bug以及部分职业的隐藏设定未能考虑到,计算器欢迎<strong>友好</strong>的bug反馈
- [gitee](https://gitee.com/dcalc/dnfcalculating_110/issues)
- [colg](https://bbs.colg.cn/thread-9130678-1-1.html)
- [QQ群](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Cd6K0WTQgcJEefXYnPt1jm1JZh6uLTEb&authKey=LfdldC2BoibB6CxHXzf%2FYcH43YBWN6WCaDFYoL2XqUCGg%2BC%2B1IIVx%2FcCPdWJCEMe&noverify=0&group_code=183439472)
反馈样例
```
职业:女弹药
BUG描述:XXX技能在XXXX情况下,出现伤害XXX异常,存档设置:aaaaa-bbbbb-ccccc-ddddd
```
## 开始使用
<strong>下载路径</strong>: https://wwk.lanzout.com/s/dcalc<br>
![](img/20220630130403.png)</br>
下载网盘中最新程序`DNF计算器_XX.XX_.exe`并完成安装</br>
- exe:安装包,多次使用会删除老的存档
- 绿色版:免安装版本,解压到文件夹下后,打开`DNF计算器.exe`即可,覆盖不会删除存档
- 更新包:计算器的更新文件,可手动下载后覆盖计算器下的`resources`文件夹
## 合规性校验
![](img/20220811165450.png)
正规途径下载的计算器,右键 exe 程序的属性,可在数字签名中查看到第三方机构认证颁发的代码签名
!> 使用前请确保数字签名存在且与说明书中一致<br>如无数字签名,则程序可能为第三方修改后的打包版本,请谨慎使用<br>
## 常见问题
- 蓝奏云无法打开<br> 修改 DNS 服务器地址,首选 114.114.114.114,备用 8.8.8.8<br>
- 打开黑屏 Ctrl R<br>
仍然无效,可尝试运行安装路径下`resources\修复脚本.bat`
- Permission denied:安装再非C盘或管理员运行
- 程序放大:Ctrl shift +
- 程序缩小:Ctrl -
## 更新
### 自动更新
![自动更新-1](img/20220630125539.png)</br>
![自动更新-2](img/20220630125605.png)</br>
计算器在每次打开的时候会自动检测是否有版本更新,确认后将进行自动更新,更新完毕点击完成会自动重启计算器
### 手动更新
如自动更新报错或想要手动更新,有如下两种方式手动更新,且存档不会丢失:
- 关闭计算器后,手动下载网盘中更新包`resources.zip`,手动解压覆盖如下文件夹<br> ![](img/20220630131552.png)</br>
- 关闭计算器后,手动下载网盘中绿色版,直接覆盖
## 单套选择
![alt text](img/image-2.png)
### 快捷设置及操作
从左向右图标依次为药剂设置、特性系统、装备触发条件、收藏、流派推荐
- 当存在多个装备版本时,药剂设置左侧会出现装备版本快捷切换
- 药剂设置:设置常见消耗的药剂,如斗神、灵药等<br/>![alt text](img/image-3.png)
- 特性系统:快捷设置特性系统入口<br/>![alt text](img/image-4.png)
- 装备触发条件:设置部分无法完全模拟的装备触发条件,如部分职业的CP武器、敌人异常情况等<br/>![alt text](img/image-5.png)
- 收藏:收藏用户自己不同的搭配,方便快捷切换对比<br/>![alt text](img/image-6.png)
- 流派推荐:取自colg流派模拟数据,由玩家自行上传<br/>![alt text](img/image-7.png)
### 装备设置
在左侧选择装备后,右侧会自行展示装备1级的属性并穿戴计算。<br/>
当用户选择装备为自定义装备时,右侧展示所有自定义词条,并按照选择词条后的提升进行排序供参考,可勾选词条分类切换词条的划分,默认按照伤害、CD、其他划分,取消勾选后按照专属、部位、公共划分。<br/>
![alt text](img/image-8.png)
当选择装备为武器时,左侧会默认展示贴膜选择,用户可点击信息、融合进行切换选择。
### 装备展示
展示角色穿戴的装备及贴膜情况,当装备属性未完全触发时,装备图标展示为灰色,鼠标移动到图标可显示装备属性及装备未能触发的条件。<br/>
![alt text](img/image-9.png)
### 技能冷却详情
点击技能冷却详情,会展示当前搭配下技能的冷却情况及适用的CDR供参考。
![alt text](img/image-10.png)
### 左下角工具栏
从左向右图标依次是首页、检查更新、刷新、设置、存档分享、存档导入<br/>
![alt text](img/image-12.png)
- 首页:跳转到计算器首页,可查阅更新日志、使用手册等
- 检查更新:检查桌面端计算器是否有更新
- 刷新:重新获取Token及接口信息
- 设置:点击后对计算器部分功能进行自定义设置,详细设置如下,装备版本存在切换时,在快捷设置
![alt text](img/image-13.png)
- 存档分享、存档导入:供用户多终端或用户与用户之间进行存档分享
### 基准、详情查看
- 设为基准:以当前搭配每个技能的伤害、总伤害为基准与其他搭配进行对比,搭配伤害参考与详情界面会变成相较于基准搭配的伤害百分比变化<br/>
![alt text](img/image-14.png)
- 显示伤害:删除基准数值,显示正常数值
- 查看详情:查看每个技能的详细数据
![alt text](img/image-15.png)
### 导出搭配
为了方便用户快捷导出搭配分享,点击👉,可自动根据当前搭配生成搭配图,展示装备信息、自定义信息、武器融合信息等,并导出图片进行分享。<br/>
![alt text](img/image-16.png)
## 技能设置
![alt text](img/image-17.png)</br>该页面下可设置计算技能相关:技能等级、技能次数、技能形态、护石、符文</br>
### 技能队列说明
![](img/20220630135454.gif)</br>在选择技能次数后,会自动添加技能到队列中,部分右上角有文字的技能可点击图标进行形态切换,技能图标可长按拖拽进行队列位置变更</br>
!> 为了避免工具滥用,现已删除/CD功能,预设技能次数为colg提供</br>
### 职业特殊设置
部分较为特殊的职业如女机械、召唤,需要在右侧设置续航类技能输出时间
## 打造设置
![alt text](img/image-18.png)
点击对应的部位,可切换部位进行打造修改</br> 右上角可进行全局修改勾选,可全部部位一起设置增幅、成长属性,同类型可一直设置附魔、徽章</br> 星辰百变、贴膜升级在此处进行勾选,默认已勾选
属性修正为在部分测试情况下,自行调整属性使用,常规可不使用
## 定制史诗词条
![alt text](img/image-19.png)
所有自定义装备单独设置的地方,单件的设置已在单套选择功能中包含
## 装备特性
![alt text](img/image-20.png)
装备特性设置,已在单套选择功能中包含
## 装备融合
![alt text](img/image-21.png)
装备融合设置,已在单套选择功能中包含
-20
View File
@@ -1,20 +0,0 @@
{
"2190155ee92d17e8cc3b0c9892fd5ac7": {
"reason": "https://tieba.baidu.com/p/7624625617 不好意思 是计算器配不上你"
},
"99a2f094ef7daa0d53525b0f2474c0ea": {
"reason": "https://bbs.colg.cn/thread-8355814-1-1.html 带??节奏"
},
"1ba5ea8fa16964666f0c0a85e89c3e96": {
"reason": "https://bbs.colg.cn/thread-8358088-1-1.html 带节奏能请先把龙虎啸等级和其他计算搞清楚"
},
"2e3d28298db82f8b23dc9fa6aac14b6d": {
"reason": "https://bbs.colg.cn/thread-8358088-1-1.html 带节奏能请先把龙虎啸等级和其他计算搞清楚"
},
"f8b3cf5c269c97a8d6d2d97ecf769a06": {
"reason": "屠戮直播带节奏"
},
"761cf5dbd2e3d07e8eaaf1dc99ebc49b": {
"reason": "https://bbs.colg.cn/thread-8382566-1-1.html"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 729 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 836 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 828 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

After

Width:  |  Height:  |  Size: 264 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 680 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 611 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 416 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 783 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 507 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 479 KiB

+160 -48
View File
@@ -3,25 +3,28 @@
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, minimum-scale=1.0, shrink-to-fit=no"
/>
<title>纸飞机计算器</title>
<!-- <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/themes/vue.css"> -->
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-control" content="no-cache" />
<meta http-equiv="Cache" content="no-cache" />
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, shrink-to-fit=no" />
<link rel="icon" href="img/logo.ico" />
<title>DNF计算器</title>
<link rel="stylesheet" href="src/vue.css" />
<link rel="stylesheet" href="src/style.css">
<meta name="baidu-site-verification" content="codeva-U1BnBxOPtX" />
<!-- 1. Theme -->
<link
rel="stylesheet"
href="https://unpkg.com/docsify-themeable/dist/css/theme-simple.css"
/>
<!-- <link rel="stylesheet" href="https://unpkg.com/docsify-themeable/dist/css/theme-simple.css" /> -->
<!-- <link rel="stylesheet" href="https://unpkg.com/docsify-themeable/dist/css/theme-simple-dark.css"> -->
<!-- <link rel="stylesheet" href="https://unpkg.com/docsify-themeable/dist/css/theme-defaults.css"> -->
<!-- <link rel="stylesheet" href="https://unpkg.com/docsify-themeable/dist/css/theme-defaults.css" /> -->
<!-- 2. PrismJS Themes -->
<!-- <link rel="stylesheet" href="https://unpkg.com/prism-github/prism-github.css"> -->
<!-- <link rel="stylesheet" href="https://unpkg.com/prism-github/prism-github.css" /> -->
<!-- <link rel="stylesheet" href="https://unpkg.com/prism-theme-one-dark/prism-onedark.css"> -->
<!-- 3. Custom Theme Properties -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-J0NPDEYQJS"></script>
<style>
:root {
/* Reduce the font size */
@@ -36,22 +39,66 @@
--code-font-weight: bolder;
/* Add sidebar navigation bullets */
/* --sidebar-nav-link-before-content-l1: '😀';
/* --sidebar-nav-link-before-content-l1: '😀';
--sidebar-nav-link-before-content-l2: '💩'; */
}
.cover .mask {
background: linear-gradient(
to left bottom,
hsl(172, 100%, 85%) 0%,
hsl(15, 100%, 85%) 100%
);
background: linear-gradient(to left bottom, hsl(172, 100%, 85%) 0%, hsl(15, 100%, 85%) 100%);
visibility: visible;
}
section.cover .cover-main .linkButton > p:last-child a {
border-color: #42b983;
border-color: var(--theme-color, #42b983);
border-radius: 2rem;
border-style: solid;
border-width: 1px;
box-sizing: border-box;
color: #42b983;
color: var(--theme-color, #42b983);
display: inline-block;
font-size: 1.05rem;
letter-spacing: 0.1rem;
margin: 0.5rem 1rem;
padding: 0.75em 2rem;
text-decoration: none;
transition: all 0.15s ease;
}
section.cover .cover-main .linkButton > p:nth-last-child(-n + 3) a:nth-last-child(-n + 3) {
/* background-color: #42b983; */
background-color: var(--theme-color, #42b983);
color: #fff;
}
.cover h1 span {
text-shadow: grey 3px 3px 3px;
}
.markdown-section img {
max-width: 100%;
}
.markdown-section > p > img {
display: block;
margin: 0 auto;
}
.markdown-section {
position: relative;
max-width: 60em;
margin: 0 auto;
padding: 2rem 45px;
}
.version {
text-shadow: none;
top: 0;
font-size: 1.2rem;
position: absolute;
font-weight: bolder;
text-shadow: grey 1px 1px 1px;
}
.sidebar ul li a {
color: #505d6b;
font-size: 14px;
@@ -61,20 +108,45 @@
text-overflow: ellipsis;
white-space: nowrap;
}
td:nth-child(1)::before {
content: "" !important;
}
.markdown-section td {
padding: 5px 10px !important;
}
</style>
<script>
var _hmt = _hmt || []
;(function () {
const hm = document.createElement("script")
hm.src = "https://hm.baidu.com/hm.js?472775d2edd6fb31b00828eef60ba388"
const s = document.querySelectorAll("script")[0]
s.parentNode.insertBefore(hm, s)
})()
// Google 分析
window.dataLayer = window.dataLayer || []
function gtag() {
dataLayer.push(arguments)
}
gtag("js", new Date())
gtag("config", "G-J0NPDEYQJS")
</script>
</head>
<body>
<!-- <a href="http://dnf.17173.com/" target="_blank" style="position: absolute;z-index: 40;top: 30px;right:30px">
<img src="https://ue.17173cdn.com/a/www/index/2016v2/img/logo-2018.png">
</a> -->
<div id="app"></div>
<div id="app"> </div>
<script>
// 4. Docsify Configuration
window.$docsify = {
name: "DNF计算器",
repo: "https://github.com/wxh0402/DNFCalculating",
repo: "https://gitee.com/dcalc/dnfcalculating_110",
coverpage: "HTMLSet/coverpage.md",
homepage: "README.md",
// homepage : 'https://raw.githubusercontent.com/jhildenbiddle/docsify-themeable/master/README.md',
@@ -84,47 +156,87 @@
maxLevel: 3,
onlyCover: false,
topMargin: 90,
// 5. docsify-themeable
routerMode: "history", // 5. docsify-themeable
nameLink: "/",
crossOriginLinks: ["https://dnftools.com/"],
relativePath: true,
beian: {
ICP: "赣ICP备2023003492号",
NISMSP: {
number: "",
url: ""
}
},
themeable: {
// readyTransition : false,
// responsiveTables: false
},
plugins: [
function (hook, vm) {
// load livere
hook.beforeEach(function (content) {
var comment = "";
if (content.indexOf("和计算器相关的BUG、意见可在此处反馈") > 0)
comment =
"<div id='lv-container' data-id='city' data-uid='MTAyMC80NjcwNC8yMzIxNA=='></div>\n\n----\n";
return content + comment;
});
hook.doneEach(content => {
if (!conent.includes("目录")) {
return
}
const imgs = document.querySelectorAll("img")
imgs.forEach(a => {
a.setAttribute("data-src", a.getAttribute("src"))
a.setAttribute("style", "width:100%;height:auto;min-height:500px")
a.setAttribute("src", "")
})
hook.doneEach(function () {
(function (d, s) {
var j,
e = d.getElementsByTagName(s)[0];
if (typeof LivereTower === "function") {
return;
if (IntersectionObserver) {
const lazyImageObserver = new IntersectionObserver((entries, observer) => {
entries.forEach((entry, index) => {
const lazyImage = entry.target
// 如果元素可见
if (entry.intersectionRatio > 0) {
lazyImage.src = lazyImage.getAttribute("data-src")
lazyImageObserver.unobserve(lazyImage)
}
})
})
for (let i = 0; i < imgs.length; i++) {
lazyImageObserver.observe(imgs[i])
}
j = d.createElement(s);
j.src = "https://cdn-city.livere.com/js/embed.dist.js";
j.async = true;
e.parentNode.insertBefore(j, e);
})(document, "script");
});
},
],
};
}
})
}
]
// plugins: [
// function (hook, vm) {
// // load livere
// hook.beforeEach(function (content) {
// var comment = ""
// if (content.indexOf("和计算器相关的BUG、意见可在此处反馈") > 0) comment = "<div id='lv-container' data-id='city' data-uid='MTAyMC80NjcwNC8yMzIxNA=='></div>\n\n----\n"
// return content + comment
// })
// hook.doneEach(function () {
// ;(function (d, s) {
// var j,
// e = d.getElementsByTagName(s)[0]
// if (typeof LivereTower === "function") {
// return
// }
// j = d.createElement(s)
// j.src = "https://cdn-city.livere.com/js/embed.dist.js"
// j.async = true
// e.parentNode.insertBefore(j, e)
// })(document, "script")
// })
// }
// ]
}
</script>
<!-- Required: docsify + docsify-themeable -->
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.min.js"></script>
<script src="https://unpkg.com/docsify/lib/docsify.min.js"></script>
<script src="https://unpkg.com/docsify-themeable"></script>
<script src="src/zoom-image.min.js"></script>
<script src="src/docsify.min.js"></script>
<script src="src/docsify-themeable.min.js"></script>
<!-- 6. Docsify Plugins -->
<script src="https://unpkg.com/docsify/lib/plugins/search.js"></script>
<script src="src/search.js"></script>
<script src="src/beian.min.js"></script>
<!-- <script src="https://unpkg.com/docsify-copy-code"></script> -->
<!-- <script src="https://unpkg.com/docsify-pagination/dist/docsify-pagination.min.js"></script> -->
<!-- <script src="https://unpkg.com/docsify/lib/plugins/zoom-image.min.js"></script> -->
-6
View File
@@ -1,6 +0,0 @@
[
{
"time": "2022.2.2",
"info": "同步游戏内辟邪玉技攻上限的设定,由于不确定游戏内结算顺序,会有部分出入<br>技攻累加超过200的部分不享受玉的加成,计算器详情会红色标注"
}
]
+20
View File
@@ -0,0 +1,20 @@
● 开发中 ☑ 已完成 ☐ 尚未开始
| 职业系 | | | | | |
| ---------- | ---------------------------------------- | ----------------- | --------------- | --------------- | ------------------ |
| 鬼剑士(男) | ☑ 极诣·剑魂 | ☑ 极诣·鬼泣 | ☑ 极诣·狂战士 | ☑ 极诣·阿修罗 | ☑ 极诣·剑影 |
| 鬼剑士(女) | ☑ 极诣·驭剑士 | ☑ 极诣·暗殿骑士 | ☑ 极诣·契魔者 | ☑ 极诣·流浪武士 | ☑ 极诣·刃影 |
| 格斗家(男) | ☑ 归元·气功师 | ☑ 归元·散打 | ☑ 归元·街霸 | ☑ 归元·柔道家 | |
| 格斗家(女) | ☑ 归元·气功师 | ☑ 归元·散打 | ☑ 归元·街霸 | ☑ 归元·柔道家 | |
| 神枪手(男) | ☑ 重霄·漫游枪手 | ☑ 重霄·枪炮师 | ☑ 重霄·机械师 | ☑ 重霄·弹药专家 | ☐ 重霄·合金战士 |
| 神枪手(女) | ☑ 重霄·漫游枪手 | ☑ 重霄·枪炮师 | ☑ 重霄·机械师 | ☑ 重霄·弹药专家 | |
| 魔法师(男) | ☑ 知源·元素爆破师 | ☑ 知源·冰结师 | ☑ 知源·血法师 | ☑ 知源·逐风者 | ☑ 知源·次元行者 |
| 魔法师(女) | ☑ 知源·元素师 | ☐ 知源·召唤师 | ☑ 知源·战斗法师 | ☑ 知源·魔道学者 | ☑ 知源·小魔女-BUFF |
| 圣职者(男) | ☑ 神启·圣骑士-BUFF<br>☑ 神启·圣骑士-审判 | ☑ 神启·蓝拳圣使 | ☑ 神启·驱魔师 | ☑ 神启·复仇者 | |
| 圣职者(女) | ☑ 神启·圣骑士-BUFF | ☑ 神启·异端审判者 | ☑ 神启·巫女 | ☑ 神启·诱魔者 | |
| 暗夜使者 | ☐ 隐夜·刺客 | ☐ 隐夜·死灵术士 | ☐ 隐夜·忍者 | ☐ 隐夜·影舞者 | |
| 守护者 | ☐ 皓曦·精灵骑士 | ☐ 皓曦·混沌魔灵 | ☐ 皓曦·帕拉丁 | ☐ 皓曦·龙骑士 | |
| 魔枪士 | ☐ 千魂·征战者 | ☐ 千魂·决战者 | ☐ 千魂·狩猎者 | ☐ 千魂·暗枪士 | |
| 枪剑士 | ☐ 苍暮·暗刃 | ☐ 苍暮·特工 | ☐ 苍暮·战线佣兵 | ☐ 苍暮·源能专家 | |
| 弓箭手 | ☑ 聆风·缪斯 | ☐ 聆风·旅人 | | | |
| 外传 | ☐ 知源·缔造者 | ☐ 极诣·黑暗武士 | | | |
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<loc>http://www.dnftools.com</loc>
<lastmod>2023-09-25</lastmod>
<changefreq>Monthly</changefreq>
<priority>1.0</priority>
</url>
</urlset>
+20
View File
@@ -0,0 +1,20 @@
function plugin(hook, vm) {
hook.afterEach(function (html, next) {
next(
html +
`\n <hr>\n <footer class="beian" style="text-align: center;">\n <a style="text-decoration: none; color: #34495e; font-size: 15px; font-weight: 400;" href="https://beian.miit.gov.cn/#/Integrated/recordQuery" target="_blank">${
window.$docsify["beian"].ICP
}</a>\n ${
window.$docsify["beian"].NISMSP && window.$docsify["beian"].NISMSP.number.length !== 0
? `\n &nbsp;&nbsp;\n <a style="text-decoration: none; color: #34495e; font-size: 15px; font-weight: 400;" href="${
!window.$docsify["beian"].NISMSP.id ? window.$docsify["beian"].NISMSP.url : `http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=${window.$docsify["beian"].NISMSP.id}`
}" target="_blank">\n <img style="width: 15px; height: 15px;" src="http://www.beian.gov.cn/img/new/gongan.png" alt="全国互联网安全" />${
window.$docsify["beian"].NISMSP.number
}\n </a>\n `
: ""
}\n\n </footer>\n `
)
})
}
window.$docsify["beian"] = Object.assign({ ICP: "", NISMSP: { number: "", url: "", id: "" } }, window.$docsify["beian"])
window.$docsify.plugins = [].concat(plugin, window.$docsify.plugins)
+1107
View File
File diff suppressed because it is too large Load Diff
+5541
View File
File diff suppressed because it is too large Load Diff
+531
View File
@@ -0,0 +1,531 @@
;(function () {
/**
* Converts a colon formatted string to a object with properties.
*
* This is process a provided string and look for any tokens in the format
* of `:name[=value]` and then convert it to a object and return.
* An example of this is ':include :type=code :fragment=demo' is taken and
* then converted to:
*
* ```
* {
* include: '',
* type: 'code',
* fragment: 'demo'
* }
* ```
*
* @param {string} str The string to parse.
*
* @return {object} The original string and parsed object, { str, config }.
*/
function getAndRemoveConfig(str) {
if (str === void 0) str = ""
var config = {}
if (str) {
str = str
.replace(/^('|")/, "")
.replace(/('|")$/, "")
.replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g, function (m, key, value) {
if (key.indexOf(":") === -1) {
config[key] = (value && value.replace(/&quot;/g, "")) || true
return ""
}
return m
})
.trim()
}
return { str: str, config: config }
}
function removeDocsifyIgnoreTag(str) {
return str
.replace(/<!-- {docsify-ignore} -->/, "")
.replace(/{docsify-ignore}/, "")
.replace(/<!-- {docsify-ignore-all} -->/, "")
.replace(/{docsify-ignore-all}/, "")
.trim()
}
/* eslint-disable no-unused-vars */
var INDEXS = {}
var LOCAL_STORAGE = {
EXPIRE_KEY: "docsify.search.expires",
INDEX_KEY: "docsify.search.index"
}
function resolveExpireKey(namespace) {
return namespace ? LOCAL_STORAGE.EXPIRE_KEY + "/" + namespace : LOCAL_STORAGE.EXPIRE_KEY
}
function resolveIndexKey(namespace) {
return namespace ? LOCAL_STORAGE.INDEX_KEY + "/" + namespace : LOCAL_STORAGE.INDEX_KEY
}
function escapeHtml(string) {
var entityMap = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#39;"
}
return String(string).replace(/[&<>"']/g, function (s) {
return entityMap[s]
})
}
function getAllPaths(router) {
var paths = []
Docsify.dom.findAll(".sidebar-nav a:not(.section-link):not([data-nosearch])").forEach(function (node) {
var href = node.href
var originHref = node.getAttribute("href")
var path = router.parse(href).path
if (path && paths.indexOf(path) === -1 && !Docsify.util.isAbsolutePath(originHref)) {
paths.push(path)
}
})
return paths
}
function getTableData(token) {
if (!token.text && token.type === "table") {
token.cells.unshift(token.header)
token.text = token.cells
.map(function (rows) {
return rows.join(" | ")
})
.join(" |\n ")
}
return token.text
}
function getListData(token) {
if (!token.text && token.type === "list") {
token.text = token.raw
}
return token.text
}
function saveData(maxAge, expireKey, indexKey) {
localStorage.setItem(expireKey, Date.now() + maxAge)
localStorage.setItem(indexKey, JSON.stringify(INDEXS))
}
function genIndex(path, content, router, depth) {
if (content === void 0) content = ""
var tokens = window.marked.lexer(content)
var slugify = window.Docsify.slugify
var index = {}
var slug
var title = ""
tokens.forEach(function (token, tokenIndex) {
if (token.type === "heading" && token.depth <= depth) {
var ref = getAndRemoveConfig(token.text)
var str = ref.str
var config = ref.config
var text = removeDocsifyIgnoreTag(token.text)
if (config.id) {
slug = router.toURL(path, { id: slugify(config.id) })
} else {
slug = router.toURL(path, { id: slugify(escapeHtml(text)) })
}
if (str) {
title = removeDocsifyIgnoreTag(str)
}
index[slug] = { slug: slug, title: title, body: "" }
} else {
if (tokenIndex === 0) {
slug = router.toURL(path)
index[slug] = {
slug: slug,
title: path !== "/" ? path.slice(1) : "Home Page",
body: token.text || ""
}
}
if (!slug) {
return
}
if (!index[slug]) {
index[slug] = { slug: slug, title: "", body: "" }
} else if (index[slug].body) {
token.text = getTableData(token)
token.text = getListData(token)
index[slug].body += "\n" + (token.text || "")
} else {
token.text = getTableData(token)
token.text = getListData(token)
index[slug].body = index[slug].body ? index[slug].body + token.text : token.text
}
}
})
slugify.clear()
return index
}
function ignoreDiacriticalMarks(keyword) {
if (keyword && keyword.normalize) {
return keyword.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
}
return keyword
}
/**
* @param {String} query Search query
* @returns {Array} Array of results
*/
function search(query) {
var matchingResults = []
var data = []
Object.keys(INDEXS).forEach(function (key) {
data = data.concat(
Object.keys(INDEXS[key]).map(function (page) {
return INDEXS[key][page]
})
)
})
query = query.trim()
var keywords = query.split(/[\s\-,\\/]+/)
if (keywords.length !== 1) {
keywords = [].concat(query, keywords)
}
var loop = function (i) {
var post = data[i]
var matchesScore = 0
var resultStr = ""
var handlePostTitle = ""
var handlePostContent = ""
var postTitle = post.title && post.title.trim()
var postContent = post.body && post.body.trim()
var postUrl = post.slug || ""
if (postTitle) {
keywords.forEach(function (keyword) {
// From https://github.com/sindresorhus/escape-string-regexp
var regEx = new RegExp(escapeHtml(ignoreDiacriticalMarks(keyword)).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&"), "gi")
var indexTitle = -1
var indexContent = -1
handlePostTitle = postTitle ? escapeHtml(ignoreDiacriticalMarks(postTitle)) : postTitle
handlePostContent = postContent ? escapeHtml(ignoreDiacriticalMarks(postContent)) : postContent
indexTitle = postTitle ? handlePostTitle.search(regEx) : -1
indexContent = postContent ? handlePostContent.search(regEx) : -1
if (indexTitle >= 0 || indexContent >= 0) {
matchesScore += indexTitle >= 0 ? 3 : indexContent >= 0 ? 2 : 0
if (indexContent < 0) {
indexContent = 0
}
var start = 0
var end = 0
start = indexContent < 11 ? 0 : indexContent - 10
end = start === 0 ? 70 : indexContent + keyword.length + 60
if (postContent && end > postContent.length) {
end = postContent.length
}
var matchContent =
handlePostContent &&
"..." +
handlePostContent.substring(start, end).replace(regEx, function (word) {
return '<em class="search-keyword">' + word + "</em>"
}) +
"..."
resultStr += matchContent
}
})
if (matchesScore > 0) {
var matchingPost = {
title: handlePostTitle,
content: postContent ? resultStr : "",
url: postUrl,
score: matchesScore
}
matchingResults.push(matchingPost)
}
}
}
for (var i = 0; i < data.length; i++) loop(i)
return matchingResults.sort(function (r1, r2) {
return r2.score - r1.score
})
}
function init(config, vm) {
var isAuto = config.paths === "auto"
var paths = isAuto ? getAllPaths(vm.router) : config.paths
var namespaceSuffix = ""
// only in auto mode
if (paths.length && isAuto && config.pathNamespaces) {
var path = paths[0]
if (Array.isArray(config.pathNamespaces)) {
namespaceSuffix =
config.pathNamespaces.filter(function (prefix) {
return path.slice(0, prefix.length) === prefix
})[0] || namespaceSuffix
} else if (config.pathNamespaces instanceof RegExp) {
var matches = path.match(config.pathNamespaces)
if (matches) {
namespaceSuffix = matches[0]
}
}
var isExistHome = paths.indexOf(namespaceSuffix + "/") === -1
var isExistReadme = paths.indexOf(namespaceSuffix + "/README") === -1
if (isExistHome && isExistReadme) {
paths.unshift(namespaceSuffix + "/")
}
} else if (paths.indexOf("/") === -1 && paths.indexOf("/README") === -1) {
paths.unshift("/")
}
var expireKey = resolveExpireKey(config.namespace) + namespaceSuffix
var indexKey = resolveIndexKey(config.namespace) + namespaceSuffix
var isExpired = localStorage.getItem(expireKey) < Date.now()
INDEXS = JSON.parse(localStorage.getItem(indexKey))
if (isExpired) {
INDEXS = {}
} else if (!isAuto) {
return
}
var len = paths.length
var count = 0
paths.forEach(function (path) {
if (INDEXS[path]) {
return count++
}
Docsify.get(vm.router.getFile(path), false, vm.config.requestHeaders).then(function (result) {
INDEXS[path] = genIndex(path, result, vm.router, config.depth)
len === ++count && saveData(config.maxAge, expireKey, indexKey)
})
})
}
/* eslint-disable no-unused-vars */
var NO_DATA_TEXT = ""
var options
function style() {
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.6em 7px;\n font-size: inherit;\n border: 1px solid transparent;\n}\n\n.search input:focus {\n box-shadow: 0 0 5px var(--theme-color, #42b983);\n border: 1px solid var(--theme-color, #42b983);\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\n.search input::-ms-clear {\n display: none;\n height: 0;\n width: 0;\n}\n\n.search .clear-button {\n cursor: pointer;\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}"
Docsify.dom.style(code)
}
function tpl(defaultValue) {
if (defaultValue === void 0) defaultValue = ""
var html =
'<div class="input-wrap">\n <input type="search" value="' +
defaultValue +
'" aria-label="Search text" />\n <div class="clear-button">\n <svg width="26" height="24">\n <circle cx="12" cy="12" r="11" fill="#ccc" />\n <path stroke="white" stroke-width="2" d="M8.25,8.25,15.75,15.75" />\n <path stroke="white" stroke-width="2"d="M8.25,15.75,15.75,8.25" />\n </svg>\n </div>\n </div>\n <div class="results-panel"></div>\n </div>'
var el = Docsify.dom.create("div", html)
var aside = Docsify.dom.find("aside")
Docsify.dom.toggleClass(el, "search")
Docsify.dom.before(aside, el)
}
function doSearch(value) {
var $search = Docsify.dom.find("div.search")
var $panel = Docsify.dom.find($search, ".results-panel")
var $clearBtn = Docsify.dom.find($search, ".clear-button")
var $sidebarNav = Docsify.dom.find(".sidebar-nav")
var $appName = Docsify.dom.find(".app-name")
if (!value) {
$panel.classList.remove("show")
$clearBtn.classList.remove("show")
$panel.innerHTML = ""
if (options.hideOtherSidebarContent) {
$sidebarNav && $sidebarNav.classList.remove("hide")
$appName && $appName.classList.remove("hide")
}
return
}
var matchs = search(value)
var html = ""
matchs.forEach(function (post) {
html += '<div class="matching-post">\n<a href="' + post.url + '">\n<h2>' + post.title + "</h2>\n<p>" + post.content + "</p>\n</a>\n</div>"
})
$panel.classList.add("show")
$clearBtn.classList.add("show")
$panel.innerHTML = html || '<p class="empty">' + NO_DATA_TEXT + "</p>"
if (options.hideOtherSidebarContent) {
$sidebarNav && $sidebarNav.classList.add("hide")
$appName && $appName.classList.add("hide")
}
}
function bindEvents() {
var $search = Docsify.dom.find("div.search")
var $input = Docsify.dom.find($search, "input")
var $inputWrap = Docsify.dom.find($search, ".input-wrap")
var timeId
/**
Prevent to Fold sidebar.
When searching on the mobile end,
the sidebar is collapsed when you click the INPUT box,
making it impossible to search.
*/
Docsify.dom.on($search, "click", function (e) {
return ["A", "H2", "P", "EM"].indexOf(e.target.tagName) === -1 && e.stopPropagation()
})
Docsify.dom.on($input, "input", function (e) {
clearTimeout(timeId)
timeId = setTimeout(function (_) {
return doSearch(e.target.value.trim())
}, 100)
})
Docsify.dom.on($inputWrap, "click", function (e) {
// Click input outside
if (e.target.tagName !== "INPUT") {
$input.value = ""
doSearch()
}
})
}
function updatePlaceholder(text, path) {
var $input = Docsify.dom.getNode('.search input[type="search"]')
if (!$input) {
return
}
if (typeof text === "string") {
$input.placeholder = text
} else {
var match = Object.keys(text).filter(function (key) {
return path.indexOf(key) > -1
})[0]
$input.placeholder = text[match]
}
}
function updateNoData(text, path) {
if (typeof text === "string") {
NO_DATA_TEXT = text
} else {
var match = Object.keys(text).filter(function (key) {
return path.indexOf(key) > -1
})[0]
NO_DATA_TEXT = text[match]
}
}
function updateOptions(opts) {
options = opts
}
function init$1(opts, vm) {
var keywords = vm.router.parse().query.s
updateOptions(opts)
style()
tpl(keywords)
bindEvents()
keywords &&
setTimeout(function (_) {
return doSearch(keywords)
}, 500)
}
function update(opts, vm) {
updateOptions(opts)
updatePlaceholder(opts.placeholder, vm.route.path)
updateNoData(opts.noData, vm.route.path)
}
/* eslint-disable no-unused-vars */
var CONFIG = {
placeholder: "Type to search",
noData: "No Results!",
paths: "auto",
depth: 2,
maxAge: 86400000, // 1 day
hideOtherSidebarContent: false,
namespace: undefined,
pathNamespaces: undefined
}
var install = function (hook, vm) {
var util = Docsify.util
var opts = vm.config.search || CONFIG
if (Array.isArray(opts)) {
CONFIG.paths = opts
} else if (typeof opts === "object") {
CONFIG.paths = Array.isArray(opts.paths) ? opts.paths : "auto"
CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge
CONFIG.placeholder = opts.placeholder || CONFIG.placeholder
CONFIG.noData = opts.noData || CONFIG.noData
CONFIG.depth = opts.depth || CONFIG.depth
CONFIG.hideOtherSidebarContent = opts.hideOtherSidebarContent || CONFIG.hideOtherSidebarContent
CONFIG.namespace = opts.namespace || CONFIG.namespace
CONFIG.pathNamespaces = opts.pathNamespaces || CONFIG.pathNamespaces
}
var isAuto = CONFIG.paths === "auto"
hook.mounted(function (_) {
init$1(CONFIG, vm)
!isAuto && init(CONFIG, vm)
})
hook.doneEach(function (_) {
update(CONFIG, vm)
isAuto && init(CONFIG, vm)
})
}
$docsify.plugins = [].concat(install, $docsify.plugins)
})()
+94
View File
@@ -0,0 +1,94 @@
/* Container for the Button links, within cover page*/
.cover-main .cover-link-container {
display: flex;
justify-content: center;
align-items: stretch;
max-width: 1000px;
margin: auto;
}
@media (max-width: 820px) {
.cover-main .cover-link-container {
flex-direction: column;
}
.cover-link{
min-width: 90%;
}
}
.cover-link {
display: flex;
flex-grow: 1;
flex-direction: column;
border: 2px solid #42b983;
margin: 0.5rem;
padding: 1rem;
border-radius: 3px;
width:0;
/* min-width: 20%; */
}
a.cover-link:link,
a.cover-link:visited {
/* text-shadow: 0 0 1px rgba(0, 0, 0, 0.2), 0 1px 0 rgba(0, 0, 0, 0.2); */
-webkit-transition: all 1s ease;
-moz-transition: all 1s ease;
-o-transition: all 1s ease;
transition: all 1s ease;
}
a.cover-link:link:after,
a.cover-link:visited:after {
content: "";
position: absolute;
height: 0%;
left: 50%;
top: 50%;
width: 150%;
-webkit-transition: all 0.75s ease 0s;
-moz-transition: all 0.75s ease 0s;
-o-transition: all 0.75s ease 0s;
transition: all 0.75s ease 0s;
}
a.cover-link:link:hover:after,
a.cover-link:visited:hover:after {
height: 450%;
}
a.cover-link:link,
a.cover-link:visited {
position: relative;
overflow: hidden;
-webkit-transition: all 1s ease;
-moz-transition: all 1s ease;
-o-transition: all 1s ease;
transition: all 1s ease;
color:white !important;
}
a.cover-link:after {
background: rgba(255, 255, 255, 0.2);
color:white !important;
-moz-transform: translateX(-50%) translateY(-50%) rotate(135deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(135deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(135deg);
transform: translateX(-50%) translateY(-50%) rotate(135deg);
}
/* Main text within Button on cover page*/
.cover-main .cover-link-container .cover-link .link-title {
font-family: 'Cutive Mono', monospace;
color: #42b983;
font-size: 1.8rem;
z-index: 1;
}
/* Description of button, on cover page */
.cover-main .cover-link-container .cover-link .link-description {
font-family: 'Cutive Mono', monospace;
color: #42b983;
font-size: 1.1rem;
border-top: 1px solid #42b983;
padding-top: 2px;
z-index: 1;
}
+871
View File
@@ -0,0 +1,871 @@
@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) [data-cloak],
body:not(.ready) .app-nav,
body:not(.ready) > nav {
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;
vertical-align: middle;
}
span.emoji {
font-family: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1.2em;
vertical-align: middle;
}
.progress {
background-color: #42b983;
background-color: var(--theme-color, #42b983);
height: 2px;
left: 0px;
position: fixed;
right: 0px;
top: 0px;
transition: width 0.2s, opacity 0.4s;
width: 0%;
z-index: 999999;
}
.search a:hover {
color: #42b983;
color: var(--theme-color, #42b983);
}
.search .search-keyword {
color: #42b983;
color: var(--theme-color, #42b983);
font-style: normal;
font-weight: bold;
}
html,
body {
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: 0.6;
}
kbd {
border: solid 1px #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 0.2em 0.25em 0;
vertical-align: middle;
}
.app-nav {
margin: 25px 60px 0 0;
position: absolute;
right: 0;
text-align: right;
z-index: 10;
/* navbar dropdown */
}
.app-nav.no-badge {
margin-right: 25px;
}
.app-nav p {
margin: 0;
}
.app-nav > a {
margin: 0 1rem;
padding: 5px 0;
}
.app-nav ul,
.app-nav li {
display: inline-block;
list-style: none;
margin: 0;
}
.app-nav a {
color: inherit;
font-size: 16px;
text-decoration: none;
transition: color 0.3s;
}
.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);
color: #42b983;
color: 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 #ddd;
border-bottom-color: #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: 0;
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 560ms 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 0.3s;
}
.anchor span {
color: #34495e;
}
.anchor:hover {
text-decoration: underline;
}
.sidebar {
border-right: 1px solid rgba(0, 0, 0, 0.07);
overflow-y: auto;
padding: 40px 0 0;
position: absolute;
top: 0;
bottom: 0;
left: 0;
transition: transform 250ms 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: rgba(136, 136, 136, 0.4);
}
.sidebar:hover::-webkit-scrollbar-track {
background: rgba(136, 136, 136, 0.1);
}
.sidebar-toggle {
background-color: transparent;
background-color: rgba(255, 255, 255, 0.8);
border: 0;
outline: none;
padding: 10px;
position: absolute;
bottom: 0;
left: 0;
text-align: center;
transition: opacity 0.3s;
width: 284px;
z-index: 30;
cursor: pointer;
}
.sidebar-toggle:hover .sidebar-toggle-button {
opacity: 0.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 250ms ease;
}
.markdown-section {
margin: 0 auto;
max-width: 80%;
padding: 30px 15px 40px 15px;
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;
/* fix horizontal overflow on iOS Safari */
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 {
border: 1px solid #ddd;
font-weight: bold;
padding: 6px 13px;
}
.markdown-section td {
border: 1px solid #ddd;
padding: 6px 13px;
}
.markdown-section tr {
border-top: 1px solid #ccc;
}
.markdown-section tr:nth-child(2n) {
background-color: #f8f8f8;
}
.markdown-section p.tip {
background-color: #f8f8f8;
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: bold;
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, 0.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 {
.github-corner,
.sidebar-toggle,
.sidebar,
.app-nav {
display: none;
}
}
@media screen and (max-width: 768px) {
.github-corner,
.sidebar-toggle,
.sidebar {
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 250ms ease-out;
}
.content {
left: 0;
max-width: 100vw;
position: static;
padding-top: 20px;
transition: transform 250ms ease;
}
.app-nav,
.github-corner {
transition: transform 250ms 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: rgba(255, 255, 255, 0.8);
transition: 1s background-color;
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 560ms ease-in-out;
}
}
@keyframes octocat-wave {
0%,
100% {
transform: rotate(0);
}
20%,
60% {
transform: rotate(-25deg);
}
40%,
80% {
transform: rotate(10deg);
}
}
section.cover {
position: relative;
align-items: center;
background-position: center center;
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: 0.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;
text-decoration: none;
}
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: 0.625rem 0 2.5rem;
position: relative;
text-align: center;
}
section.cover h1 a {
display: block;
}
section.cover h1 small {
bottom: -0.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-color: #42b983;
border-color: var(--theme-color, #42b983);
border-radius: 2rem;
border-style: solid;
border-width: 1px;
box-sizing: border-box;
color: #42b983;
color: var(--theme-color, #42b983);
display: inline-block;
font-size: 1.05rem;
letter-spacing: 0.1rem;
margin: 0.5rem 1rem;
padding: 0.75em 2rem;
text-decoration: none;
transition: all 0.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: 0.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 0.3s;
}
section.cover blockquote > p > a:hover {
color: #42b983;
color: var(--theme-color, #42b983);
}
body {
background-color: #fff;
}
/* sidebar */
.sidebar {
background-color: #fff;
color: #364149;
}
.sidebar li {
margin: 6px 0 6px 0;
}
.sidebar ul li a {
color: #505d6b;
font-size: 14px;
font-weight: normal;
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 content found on pages */
.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 0.8rem;
}
.markdown-section h3 {
font-size: 1.5rem;
margin: 40px 0 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 p,
.markdown-section ul,
.markdown-section ol {
line-height: 1.6rem;
word-spacing: 0.05rem;
}
.markdown-section ul,
.markdown-section ol {
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 pre,
.markdown-section output::after {
font-family: "Roboto Mono", Monaco, courier, monospace;
}
.markdown-section code,
.markdown-section pre {
background-color: #f8f8f8;
}
.markdown-section pre,
.markdown-section output {
margin: 1.2em 0;
position: relative;
}
.markdown-section pre > code,
.markdown-section output {
border-radius: 2px;
display: block;
}
.markdown-section pre > code,
.markdown-section output::after {
-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: 0.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: 0.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: 0.05rem;
}
.markdown-section pre::after,
.markdown-section output::after {
color: #ccc;
font-size: 0.6rem;
font-weight: 600;
height: 15px;
line-height: 15px;
padding: 5px 10px 0;
position: absolute;
right: 0;
text-align: right;
top: 0;
}
.markdown-section pre::after,
.markdown-section output::after {
content: attr(data-lang);
}
/* code highlight */
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #8e908c;
}
.token.namespace {
opacity: 0.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;
}
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #22a2c9;
}
.token.attr-value,
.token.control,
.token.directive,
.token.unit {
color: #42b983;
color: var(--theme-color, #42b983);
}
.token.keyword,
.token.function {
color: #e96900;
}
.token.statement,
.token.regex,
.token.atrule {
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.important,
.token.bold {
font-weight: bold;
}
.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;
}
+337
View File
@@ -0,0 +1,337 @@
!(function () {
function t(e) {
return "IMG" === e.tagName
}
function d(e) {
function t() {
for (var e = arguments, t = arguments.length, o = Array(t), n = 0; n < t; n++) o[n] = e[n]
var i = o.reduce(function (e, t) {
return [].concat(e, z(t))
}, [])
return (
i
.filter(function (e) {
return -1 === m.indexOf(e)
})
.forEach(function (e) {
m.push(e), e.classList.add("medium-zoom-image")
}),
r.forEach(function (e) {
var t = e.type,
o = e.listener,
n = e.options
i.forEach(function (e) {
e.addEventListener(t, o, n)
})
}),
f
)
}
function o() {
var e = (0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}).target
return s.original ? a() : i({ target: e })
}
var n =
window.Promise ||
function (e) {
function t() {}
e(t, t)
},
i = function () {
function r() {
var e = { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight, left: 0, top: 0, right: 0, bottom: 0 },
t = void 0,
o = void 0
u.container &&
(u.container instanceof Object
? ((t = (e = g({}, e, u.container)).width - e.left - e.right - 2 * u.margin), (o = e.height - e.top - e.bottom - 2 * u.margin))
: ((r = (i = (h(u.container) ? u.container : document.querySelector(u.container)).getBoundingClientRect()).width),
(m = i.height),
(d = i.left),
(a = i.top),
(e = g({}, e, { width: r, height: m, left: d, top: a }))))
var t = t || e.width - 2 * u.margin,
o = o || e.height - 2 * u.margin,
n = s.zoomedHd || s.original,
i = (!v(n) && n.naturalWidth) || t,
r = (!v(n) && n.naturalHeight) || o,
d = (m = n.getBoundingClientRect()).top,
a = m.left,
n = m.width,
m = m.height,
i = Math.min(i, t) / n,
r = Math.min(r, o) / m,
r = "scale(" + (r = Math.min(i, r)) + ") translate3d(" + ((t - n) / 2 - a + u.margin + e.left) / r + "px, " + ((o - m) / 2 - d + u.margin + e.top) / r + "px, 0)"
;(s.zoomed.style.transform = r), s.zoomedHd && (s.zoomedHd.style.transform = r)
}
var d = (0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}).target
return new n(function (e) {
if (d && -1 === m.indexOf(d)) e(f)
else {
function t() {
;(c = !1), s.zoomed.removeEventListener("transitionend", t), s.original.dispatchEvent(E("medium-zoom:opened", { detail: { zoom: f } })), e(f)
}
var o, n
if (s.zoomed) e(f)
else {
if (d) s.original = d
else {
if (!(0 < m.length)) return void e(f)
var i = m
s.original = i[0]
}
s.original.dispatchEvent(E("medium-zoom:open", { detail: { zoom: f } })),
(l = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0),
(c = !0),
(s.zoomed = b(s.original)),
document.body.appendChild(p),
u.template &&
((i = h(u.template) ? u.template : document.querySelector(u.template)),
(s.template = document.createElement("div")),
s.template.appendChild(i.content.cloneNode(!0)),
document.body.appendChild(s.template)),
document.body.appendChild(s.zoomed),
window.requestAnimationFrame(function () {
document.body.classList.add("medium-zoom--opened")
}),
s.original.classList.add("medium-zoom-image--hidden"),
s.zoomed.classList.add("medium-zoom-image--opened"),
s.zoomed.addEventListener("click", a),
s.zoomed.addEventListener("transitionend", t),
s.original.getAttribute("data-zoom-src")
? ((s.zoomedHd = s.zoomed.cloneNode()),
s.zoomedHd.removeAttribute("srcset"),
s.zoomedHd.removeAttribute("sizes"),
(s.zoomedHd.src = s.zoomed.getAttribute("data-zoom-src")),
(s.zoomedHd.onerror = function () {
clearInterval(o), console.warn("Unable to reach the zoom image target " + s.zoomedHd.src), (s.zoomedHd = null), r()
}),
(o = setInterval(function () {
s.zoomedHd.complete &&
(clearInterval(o), s.zoomedHd.classList.add("medium-zoom-image--opened"), s.zoomedHd.addEventListener("click", a), document.body.appendChild(s.zoomedHd), r())
}, 10)))
: s.original.hasAttribute("srcset")
? ((s.zoomedHd = s.zoomed.cloneNode()),
s.zoomedHd.removeAttribute("sizes"),
s.zoomedHd.removeAttribute("loading"),
(n = s.zoomedHd.addEventListener("load", function () {
s.zoomedHd.removeEventListener("load", n),
s.zoomedHd.classList.add("medium-zoom-image--opened"),
s.zoomedHd.addEventListener("click", a),
document.body.appendChild(s.zoomedHd),
r()
})))
: r()
}
}
})
},
a = function () {
return new n(function (t) {
var e
!c && s.original
? ((e = function e() {
s.original.classList.remove("medium-zoom-image--hidden"),
document.body.removeChild(s.zoomed),
s.zoomedHd && document.body.removeChild(s.zoomedHd),
document.body.removeChild(p),
s.zoomed.classList.remove("medium-zoom-image--opened"),
s.template && document.body.removeChild(s.template),
(c = !1),
s.zoomed.removeEventListener("transitionend", e),
s.original.dispatchEvent(E("medium-zoom:closed", { detail: { zoom: f } })),
(s.original = null),
(s.zoomed = null),
(s.zoomedHd = null),
(s.template = null),
t(f)
}),
(c = !0),
document.body.classList.remove("medium-zoom--opened"),
(s.zoomed.style.transform = ""),
s.zoomedHd && (s.zoomedHd.style.transform = ""),
s.template && ((s.template.style.transition = "opacity 150ms"), (s.template.style.opacity = 0)),
s.original.dispatchEvent(E("medium-zoom:close", { detail: { zoom: f } })),
s.zoomed.addEventListener("transitionend", e))
: t(f)
})
},
m = [],
r = [],
c = !1,
l = 0,
u = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},
s = { original: null, zoomed: null, zoomedHd: null, template: null }
"[object Object]" === Object.prototype.toString.call(e) ? (u = e) : (!e && "string" != typeof e) || t(e)
var u = g({ margin: 0, background: "#fff", scrollOffset: 40, container: null, template: null }, u),
p = y(u.background)
document.addEventListener("click", function (e) {
e = e.target
e !== p ? -1 !== m.indexOf(e) && o({ target: e }) : a()
}),
document.addEventListener("keyup", function (e) {
e = e.key || e.keyCode
;("Escape" !== e && "Esc" !== e && 27 !== e) || a()
}),
document.addEventListener("scroll", function () {
var e
!c && s.original && ((e = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0), Math.abs(l - e) > u.scrollOffset && setTimeout(a, 150))
}),
window.addEventListener("resize", a)
var f = {
open: i,
close: a,
toggle: o,
update: function () {
var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {},
t = e
return (
e.background && (p.style.background = e.background),
e.container && e.container instanceof Object && (t.container = g({}, u.container, e.container)),
e.template && ((e = h(e.template) ? e.template : document.querySelector(e.template)), (t.template = e)),
(u = g({}, u, t)),
m.forEach(function (e) {
e.dispatchEvent(E("medium-zoom:update", { detail: { zoom: f } }))
}),
f
)
},
clone: function () {
return d(g({}, u, 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}))
},
attach: t,
detach: function () {
for (var e = arguments, t = arguments.length, o = Array(t), n = 0; n < t; n++) o[n] = e[n]
s.zoomed && a()
var i =
0 < o.length
? o.reduce(function (e, t) {
return [].concat(e, z(t))
}, [])
: m
return (
i.forEach(function (e) {
e.classList.remove("medium-zoom-image"), e.dispatchEvent(E("medium-zoom:detach", { detail: { zoom: f } }))
}),
(m = m.filter(function (e) {
return -1 === i.indexOf(e)
})),
f
)
},
on: function (t, o) {
var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {}
return (
m.forEach(function (e) {
e.addEventListener("medium-zoom:" + t, o, n)
}),
r.push({ type: "medium-zoom:" + t, listener: o, options: n }),
f
)
},
off: function (t, o) {
var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {}
return (
m.forEach(function (e) {
e.removeEventListener("medium-zoom:" + t, o, n)
}),
(r = r.filter(function (e) {
return !(e.type === "medium-zoom:" + t && e.listener.toString() === o.toString())
})),
f
)
},
getOptions: function () {
return u
},
getImages: function () {
return m
},
getZoomedImage: function () {
return s.original
}
}
return f
}
var g =
Object.assign ||
function (e) {
for (var t = arguments, o = 1; o < arguments.length; o++) {
var n,
i = t[o]
for (n in i) Object.prototype.hasOwnProperty.call(i, n) && (e[n] = i[n])
}
return e
},
h = function (e) {
return e && 1 === e.nodeType
},
v = function (e) {
return ".svg" === (e.currentSrc || e.src).substr(-4).toLowerCase()
},
z = function (e) {
try {
return Array.isArray(e)
? e.filter(t)
: NodeList.prototype.isPrototypeOf(e)
? [].slice.call(e).filter(t)
: h(e)
? [e].filter(t)
: "string" == typeof e
? [].slice.call(document.querySelectorAll(e)).filter(t)
: []
} catch (e) {
throw new TypeError("The provided selector is invalid.\nExpects a CSS selector, a Node element, a NodeList or an array.\nSee: https://github.com/francoischalifour/medium-zoom")
}
},
y = function (e) {
var t = document.createElement("div")
return t.classList.add("medium-zoom-overlay"), (t.style.background = e), t
},
b = function (e) {
var t = e.getBoundingClientRect(),
o = t.top,
n = t.left,
i = t.width,
r = t.height,
d = e.cloneNode(),
t = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
e = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
return (
d.removeAttribute("id"),
(d.style.position = "absolute"),
(d.style.top = o + t + "px"),
(d.style.left = n + e + "px"),
(d.style.width = i + "px"),
(d.style.height = r + "px"),
(d.style.transform = ""),
d
)
},
E = function (e, t) {
var o = g({ bubbles: !1, cancelable: !1, detail: void 0 }, t)
if ("function" == typeof window.CustomEvent) return new CustomEvent(e, o)
t = document.createEvent("CustomEvent")
return t.initCustomEvent(e, o.bubbles, o.cancelable, o.detail), t
}
var e, o, n, i
;(e =
".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}"),
(i = (o = void 0 === o ? {} : o).insertAt),
e &&
"undefined" != typeof document &&
((n = document.head || document.getElementsByTagName("head")[0]),
((o = document.createElement("style")).type = "text/css"),
"top" === i && n.firstChild ? n.insertBefore(o, n.firstChild) : n.appendChild(o),
o.styleSheet ? (o.styleSheet.cssText = e) : o.appendChild(document.createTextNode(e)))
var r = Element.prototype.matches || Element.prototype.webkitMatchesSelector || Element.prototype.msMatchesSelector
$docsify.plugins = [].concat(function (e) {
var o
e.doneEach(function (e) {
var t = (t = Array.apply(null, document.querySelectorAll(".markdown-section img:not(.emoji):not([data-no-zoom])"))).filter(function (e) {
return !1 === r.call(e, "a img")
})
o && o.detach(), (o = d(t))
})
}, $docsify.plugins)
})()
+7
View File
@@ -0,0 +1,7 @@
## 微信小程序
![微信小程序](img/wx.jpg)
微信扫描上方二维码或搜索纸飞机计算机,即可使用微信小程序。