├── docs ├── .nojekyll ├── _media │ ├── .gitkeep │ ├── favicon.ico │ └── icon_128.png ├── _src │ ├── prismjs │ │ ├── prism-json.min.js │ │ ├── prism-applescript.min.js │ │ ├── prism-javascript.min.js │ │ └── prism-bash.min.js │ ├── source.txt │ └── docsify │ │ ├── docsify-copy-code.js │ │ ├── vue.css │ │ ├── search.js │ │ ├── zoom-image.js │ │ └── docsify.min.js ├── README.md └── index.html ├── .github └── ISSUE_TEMPLATE │ └── config.yml ├── .gitignore ├── README.md └── appcast.xml /docs/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/_media/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/_media/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ripperhe/Bob/HEAD/docs/_media/favicon.ico -------------------------------------------------------------------------------- /docs/_media/icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ripperhe/Bob/HEAD/docs/_media/icon_128.png -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Bob 技术支持 4 | url: https://bobtranslate.com/general/contact.html 5 | about: GitHub 反馈渠道已关闭,请通过这个网页描述的方式反馈问题或建议。🙏 -------------------------------------------------------------------------------- /docs/_src/prismjs/prism-json.min.js: -------------------------------------------------------------------------------- 1 | Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json; -------------------------------------------------------------------------------- /docs/_src/source.txt: -------------------------------------------------------------------------------- 1 | https://cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css 2 | https://cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js 3 | https://cdn.jsdelivr.net/npm/docsify/lib/plugins/search.js 4 | https://cdn.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.js 5 | https://cdn.jsdelivr.net/npm/docsify-copy-code 6 | 7 | https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js 8 | https://cdn.jsdelivr.net/npm/prismjs/components/prism-json.min.js 9 | https://cdn.jsdelivr.net/npm/prismjs/components/prism-applescript.min.js 10 | https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Bob 官网迁移通知 2 | 3 | Bob 官网之前通过 Gitee/GitHub Pages 进行部署,但是经常会有用户无法访问,现已将官网部署到我自己的服务器,域名地址也有所变更。 4 | 5 | !> **Bob 已发布到 Mac App Store,详情请查看 [这篇文章](https://bobtranslate.com/blog/2022-07-03-v1-coming.html)。** 6 | 7 | ## 版本区分 8 | 9 | Bob 1.0.0 版本开始,正式发布到 Mac App Store,这里简称商店版。 10 | 11 | Bob 1.0.0 以下的版本(不包括 1.0.0,例如 0.10.x 等版本)发布在 GitHub/Gitee 平台,简称社区版。 12 | 13 | 商店版需要付费,采用内购终身买断模式,后续我会重点维护和优化。社区版目前还可以使用,不过后续不会再维护。 14 | 15 | Bob 版本区分 16 | 17 | ## 商店版官网 18 | 19 | Bob 商店版官网地址为 20 | 21 | ## 社区版官网 22 | 23 | Bob 社区版官网地址为 24 | 25 | 如果您是通过 Bob 社区版 App 跳转到当前页面,说明您的 Bob 社区版 App 不是最新版本。请将 Bob 社区版 App 升级到社区版最新版本,升级之后 App 内的所有链接都会跳转到 Bob 社区版新的官网地址。 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | # CocoaPods 32 | # 33 | # We recommend against adding the Pods directory to your .gitignore. However 34 | # you should judge for yourself, the pros and cons are mentioned at: 35 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 36 | # 37 | # Pods/ 38 | 39 | # Carthage 40 | # 41 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 42 | # Carthage/Checkouts 43 | 44 | Carthage/Build 45 | 46 | # fastlane 47 | # 48 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 49 | # screenshots whenever they are needed. 50 | # For more information about the recommended setup visit: 51 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 52 | 53 | fastlane/report.xml 54 | fastlane/Preview.html 55 | fastlane/screenshots/**/*.png 56 | fastlane/test_output 57 | 58 | # Code Injection 59 | # 60 | # After new code Injection tools there's a generated folder /iOSInjectionProject 61 | # https://github.com/johnno1962/injectionforxcode 62 | 63 | iOSInjectionProject/ 64 | -------------------------------------------------------------------------------- /docs/_src/prismjs/prism-applescript.min.js: -------------------------------------------------------------------------------- 1 | Prism.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class-name":/\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,punctuation:/[{}():,¬«»《》]/}; -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Bob 8 | 9 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
Loading...
21 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /docs/_src/docsify/docsify-copy-code.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * docsify-copy-code 3 | * v2.1.1 4 | * https://github.com/jperasmus/docsify-copy-code 5 | * (c) 2017-2020 JP Erasmus 6 | * MIT license 7 | */ 8 | !function(){"use strict";function s(o){return(s="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%;right: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{right:100%;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,r){o.doneEach(function(){var o=Array.apply(null,document.querySelectorAll("pre[data-lang]")),c={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};r.config.copyCode&&Object.keys(c).forEach(function(t){var n=r.config.copyCode[t];"string"==typeof n?c[t]=n:"object"===s(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 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 |

5 | Website 6 | QQ 群 7 |

8 | 9 | > [!NOTE] 10 | > Bob 不是开源软件,本仓库曾经用于提供反馈渠道,现在请通过 [这个链接](https://bobtranslate.com/general/contact.html) 联系我们。 11 | 12 | # Bob 13 | 14 | Bob 是一款 macOS 平台的 **翻译** 和 **OCR** 软件。 15 | 16 | 主要特性: 17 | 18 | - **翻译功能**:划词翻译、截图翻译、输入翻译、翻译多开、自定义插件、自动识别语种、驼峰拆分、蛇形拆分、AppleScript 调用、PopClip 调用 19 | - **OCR 功能**:截图 OCR、静默截图 OCR、访达选图 OCR、离线识别、连续识别、二维码识别、自动复制、智能分段 20 | 21 | 支持的服务: 22 | 23 | - **文本翻译**:系统翻译、火山翻译、腾讯翻译君、阿里翻译、百度翻译、有道翻译、彩云小译、小牛翻译、Google 翻译、Microsoft 翻译、Amazon 翻译、DeepL 翻译、OpenAI 翻译 24 | - **文本识别**:离线文本识别、火山 OCR、腾讯 OCR、腾讯图片翻译、百度 OCR、有道 OCR、Google OCR 25 | - **语音合成**:离线语音合成、火山语音合成 、腾讯语音合成、Google 语音合成、Microsoft 语音合成 26 | 27 | ## 安装 28 | 29 | [![Download on the Mac App Store](https://cdn.ripperhe.com/oss/master/2022/0626/Download_on_the_Mac_App_Store_Badge_US-UK_RGB_blk_092917.svg)](https://apps.apple.com/cn/app/id1630034110#?platform=mac) 30 | 31 | ## 使用方法 32 | 33 | 详细使用方法请直接查看文档 [👉 点此跳转文档](https://bobtranslate.com) 34 | 35 | Bob 是一个菜单栏软件,启动之后,菜单栏会出现一个图标,点击菜单选项即可触发相应的功能,如下所示: 36 | 37 | statesitem.jpg 38 | 39 | ### 翻译功能 40 | 41 | | 方式 | 描述 | 预览 | 42 | | :---: | :---: | :---: | 43 | | 划词翻译 | 选中需要翻译的文本之后,按下划词翻译快捷键即可(默认 `⌥ + D`) | ![划词翻译-句子](https://cdn.ripperhe.com/oss/master/2022/0508/translate_selection.gif) | 44 | | 截图翻译 | 按下截图翻译快捷键(默认 `⌥ + S`),截取需要翻译的区域 | ![截图翻译-句子](https://cdn.ripperhe.com/oss/master/2022/0508/translate_snip.gif) | 45 | | 输入翻译| 按下输入翻译快捷键(默认 `⌥ + A`),输入需要翻译的文本,`Enter` 键翻译 | ![输入翻译-单词](https://cdn.ripperhe.com/oss/master/2022/0508/translate_input.gif) | 46 | | PopClip 调用 | 选中需要翻译的文本之后,点击 [PopClip](https://pilotmoon.com/popclip) 插件图标即可,详情见 [PopClip 调用](https://bobtranslate.com/guide/integration/popclip.html) | ![插件翻译-句子](https://cdn.ripperhe.com/oss/master/2022/0508/translate_popclip.gif) | 47 | 48 | ### OCR 功能 49 | 50 | **截图识别** 51 | 52 | * 按下「截图 OCR」快捷键(默认 `⇧ + ⌥ + S`)或者点击菜单栏 Bob 图标菜单中的「截图 OCR」 53 | * 选中屏幕上的对应的位置 54 | * 松手即可开始识别 55 | 56 | 截图 OCR 57 | 58 | **静默截图 OCR** 59 | 60 | * 按下「静默截图 OCR」快捷键(默认 `⌥` `C`)或者点击菜单栏 Bob 图标菜单中的「静默截图 OCR」 61 | * 选中屏幕上的对应的位置 62 | * 松手即可开始识别 63 | 64 | 「静默截图 OCR」不会自动显示 OCR 窗口,识别完成后直接将文本拷贝到剪切板。 65 | 66 | **访达选图 OCR** 67 | 68 | 按下「访达选图 OCR」快捷键(没有设置默认快捷键,可去「 Bob 偏好设置-OCR-OCR 设置」添加)或者点击菜单栏 Bob 图标菜单中的「访达选图 OCR」。 69 | 70 | 在弹出的访达窗口中选中对应的图片文件(可以一次性选中多张),点击右下角「开始识别」即可。 71 | 72 | 访达选图 OCR 73 | 74 | ## 感谢 75 | 76 | * 感谢 [@isee15](https://github.com/isee15/Capture-Screen-For-Multi-Screens-On-Mac) 提供最初版本截图功能的思路 77 | * 感谢 [@可口可乐](https://github.com/wakewon) 长期帮忙解决用户反馈 78 | * 感谢 [@ix4n33](https://github.com/IsaacXen) 不定期提供技术支持 79 | * 感谢朋友们的赞赏 [赞赏列表](https://bobtranslate.com/general/reward.html) 80 | * 感谢作者们发文支持 Bob(时间倒序) 81 | * @火山翻译:[双厨狂喜:Bob x 火山翻译梦幻联动!](https://mp.weixin.qq.com/s/c5zwcDsCgL10m_WdBiksEQ) 82 | * @奇客派:[macOS 翻译工具 Bob 大更新:支持更多翻译服务,增强 OCR 功能](https://sspai.com/post/62721) 83 | * @鹿額:[截图/划词/输入都能查,快捷高效的 macOS 翻译工具: Bob](https://sspai.com/post/58249) 84 | * @Newlearnerの自留地:[Bob:一款 macOS 全局翻译软件,支持划词翻译和截图翻译](https://t.me/NewlearnerChannel/3329) 85 | 86 | ## 优秀软件推荐 87 | 88 | * [uPic: 一个强大的图床工具](https://github.com/gee1k/uPic) 89 | * [MWeb Pro: 专业的 Markdown 写作、记笔记、静态博客生成软件](https://zh.mweb.im/) 90 | * [Picsee: 专业的图片采集收藏、照片整理标记、查找查看、分享协同软件](https://picsee.chitaner.com) 91 | * [赤友 NTFS 助手: Mac用户最喜欢的 NTFS for Mac 读写软件](https://aibotech.cn/ntfs-for-mac/) 92 | * [赤友右键超人: Mac 右键快捷操作工具,集合右键新建文件、卸载软件、压缩文件、剪切、截图录屏超多功能,一键快速搞定!](https://aibotech.cn/right-click-menu/) 93 | 94 | -------------------------------------------------------------------------------- /docs/_src/prismjs/prism-javascript.min.js: -------------------------------------------------------------------------------- 1 | Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; -------------------------------------------------------------------------------- /docs/_src/prismjs/prism-bash.min.js: -------------------------------------------------------------------------------- 1 | !function(e){var t="\\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",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|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|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|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|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],s=a.variable[1].inside,i=0;inav,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..."}.emoji{height:1.2rem;vertical-align:middle}.progress{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 a:hover{color:var(--theme-color,#42b983)}.search .search-keyword{color:var(--theme-color,#42b983);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:hover{color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid var(--theme-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;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{-webkit-animation:octocat-wave .56s ease-in-out;animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;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: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 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: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{-webkit-animation:none;animation:none}.github-corner .octo-arm{-webkit-animation:octocat-wave .56s ease-in-out;animation:octocat-wave .56s ease-in-out}}@-webkit-keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;height:100vh;width:100vw;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;height:100%;width:100%}section.cover .cover-main{flex:1;margin:-20px 16px 0;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:.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 var(--theme-color,#42b983);box-sizing:border-box;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: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 var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{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: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: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 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}.markdown-section output:after,.markdown-section pre:after{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: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: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} -------------------------------------------------------------------------------- /appcast.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Bob 5 | 6 | 0.10.3 7 | 周六, 09 7月 2022 20:30:21 +0800 8 | 10.13 9 | 10 | 12 |
  • 将 App 内部所有链接指向新的社区版官网
  • 13 |
  • Bob 已发布到 Mac App Store,详情请查看 这篇文章
  • 14 | 15 | ]]>
    16 |
    17 | 18 | 0.10.2 19 | 周四, 19 5月 2022 18:48:44 +0800 20 | 10.13 21 | 22 | 24 |
  • 修复翻译功能无法添加语音合成插件的问题
  • 25 | 26 | ]]>
    27 |
    28 | 29 | 0.10.1 30 | 周日, 15 5月 2022 13:48:28 +0800 31 | 10.13 32 | 33 | 35 |
  • 优化在 macOS 12.3.1 调用系统翻译服务的逻辑
  • 36 | 37 | ]]>
    38 |
    39 | 40 | 0.10.0 41 | 周五, 13 5月 2022 21:43:36 +0800 42 | 10.13 43 | 44 | 46 |
  • 新增静默截图 OCR 功能(使用静默截图 OCR 不会显示 OCR 窗口)
  • 47 |
  • 新增系统翻译服务,macOS 12.3.1 以上可用(实验性功能)
  • 48 |
  • 新增保持翻译服务折叠状态的功能(可在偏好设置开启)
  • 49 |
  • 修复 10.14.6 以下系统无法添加服务的问题
  • 50 |
  • 修复调用金山词霸服务崩溃的问题
  • 51 | 52 | ]]>
    53 |
    54 | 55 | 0.9.0 56 | 周日, 08 5月 2022 13:54:15 +0800 57 | 10.13 58 | 59 | 61 |
  • 全新的独立 OCR 功能
  • 62 |
  • 支持截图识别
  • 63 |
  • 支持访达选图识别
  • 64 |
  • 支持离线识别
  • 65 |
  • 支持连续识别
  • 66 |
  • 支持二维码识别
  • 67 |
  • 支持自动复制
  • 68 |
  • 支持智能分段
  • 69 |
  • 新增翻译功能取词模式设置
  • 70 | 71 | ]]>
    72 |
    73 | 74 | 0.8.1 75 | 周二, 29 3月 2022 22:14:00 +0800 76 | 10.13 77 | 78 | 80 |
  • 修复离线文本识别严重内存泄漏的问题
  • 81 |
  • 修复划词翻译偶发崩溃的问题
  • 82 | 83 | ]]>
    84 |
    85 | 86 | 0.8.0 87 | 90 |
  • 新增离线文本识别服务,macOS 11 以上可用
  • 91 |
  • 支持不保存翻译历史
  • 92 |
  • 支持在翻译窗口导航栏添加按钮用于快捷显隐输入框
  • 93 |
  • 优化对连字字符的处理
  • 94 |
  • 优化取词模块,支持在 Parallels Desktop 取词;详情参考这篇文章
  • 95 |
  • 修复隐藏状态栏图标无效的问题
  • 96 |
  • 修复在文档文件夹创建 mmkv 文件夹的问题
  • 97 |
  • 修复金山词霸无法查询大写的问题
  • 98 | 99 | 100 | ]]>
    101 | 周一, 28 2月 2022 16:25:23 +0800 102 | 10.13 103 | 104 |
    105 | 106 | 0.7.0 107 | 110 |
  • 全新的偏好设置页面
  • 111 |
  • 全新的快捷键系统,支持双击 command 等按键触发快捷键(由于换了快捷键系统,如果你之前修改过快捷键,请升级完再手动修改下)
  • 112 |
  • 新增翻译历史记录
  • 113 |
  • 新增翻译收藏夹
  • 114 |
  • 新增偏好设置导入导出功能
  • 115 |
  • 新增金山词霸查词引擎
  • 116 |
  • 支持隐藏菜单栏图标
  • 117 |
  • 支持在翻译窗口快捷切换服务
  • 118 |
  • 部分常用设置迁移到翻译窗口快捷控制菜单
  • 119 |
  • 翻译窗口 UI 微调
  • 120 |
  • 修复部分 PDF 软件的换行符无法替换为空格的问题
  • 121 |
  • 修复一些崩溃
  • 122 | 123 | 124 | ]]>
    125 | 周六, 27 11月 2021 17:53:18 +0800 126 | 10.13 127 | 128 |
    129 | 130 | 0.6.1 131 | 134 |
  • 修复截图翻译在 Catalina 崩溃的问题
  • 135 | 136 | 137 | ]]>
    138 | 周日, 14 3月 2021 16:31:12 +0800 139 | 10.13 140 | 141 |
    142 | 143 | 0.6.0 144 | 147 |
  • 新增阿里翻译、小牛翻译、简明英汉词典增强版
  • 148 |
  • 新增 Google OCR
  • 149 |
  • 新增翻译结果为英文时将其复制为驼峰或蛇形字符串的功能(可在偏好设置开启)
  • 150 |
  • 修复在 Safari 浏览器下查看 Google 文档无法取词的问题
  • 151 |
  • 修复在部分系统下无法截图的问题
  • 152 | 153 | 154 | ]]>
    155 | 周日, 14 3月 2021 00:20:08 +0800 156 | 10.13 157 | 158 |
    159 | 160 | 0.5.4 161 | 164 |
  • 适配 Big Sur 图标
  • 165 |
  • 新增 Google 语音合成
  • 166 |
  • 语音合成服务支持根据语言选择声音
  • 167 |
  • 彩云小译使用 https 协议
  • 168 |
  • 修复了 Google 翻译引号乱码的问题
  • 169 |
  • 修复了部分用户翻译窗口失焦后不消失的问题
  • 170 |
  • 修复了在 Chrome 浏览器下 Google 表格无法取词的问题
  • 171 |
  • 修复了百度 OCR 高精度版数字中间有空格的问题
  • 172 | 173 | 174 | ]]>
    175 | 周日, 27 12月 2020 23:58:32 +0800 176 | 10.13 177 | 178 |
    179 | 180 | 0.5.3 181 | 184 |
  • Intel 和 Apple Silicon 双架构支持
  • 185 |
  • 修复部分机型在 Big Sur 下菜单栏图标显示异常的问题
  • 186 |
  • 修复部分机型在 Chrome 浏览器下划词翻译窗口突然消失的问题
  • 187 |
  • 修复部分机型 Apple 语音合成无法使用及崩溃的问题
  • 188 |
  • 修复腾讯云语音合成无法使用的问题并增加可选项
  • 189 |
  • 修复 Emoji 导致有道翻译崩溃的问题
  • 190 |
  • 默认隐藏插件设置项的输入框文本
  • 191 |
  • 调整开启权限的提示
  • 192 |
  • 调整免费服务异常的提示
  • 193 |
  • 调整导出日志的提示
  • 194 | 195 | 196 | ]]>
    197 | 周日, 29 11月 2020 18:42:05 +0800 198 | 10.13 199 | 200 |
    201 | 202 | 0.5.2 203 | 206 |
  • 修复在 macOS High Sierra (10.13) 崩溃的问题
  • 207 | 208 | 209 | ]]>
    210 | 周五, 09 10月 2020 17:13:20 +0800 211 | 10.13 212 | 213 |
    214 | 215 | 0.5.1 216 | 219 |
  • 接入了多家服务,通过申请私人秘钥使用
  • 220 |
  • 支持多开翻译,最多可同时开启5个
  • 221 |
  • 支持插件,可以实现自定义 API
  • 222 |
  • 支持驼峰拆分、蛇形拆分
  • 223 |
  • UI 调整
  • 224 |
  • 删除了隐藏菜单栏图标的功能
  • 225 |
  • 删除了拖拽翻译窗口大小的功能
  • 226 |
  • 删除了原有的百度翻译、有道翻译和谷歌翻译
  • 227 |
  • 更新内容详情https://ripperhe.gitee.io/bob/#/blog/2020-08-03-0.5.0-new-features
  • 228 | 229 | 230 | ]]>
    231 | 周二, 06 10月 2020 22:08:34 +0800 232 | 10.13 233 | 234 |
    235 | 236 | 0.4.0 237 | 240 |
  • 支持切换和自定义菜单栏图标
  • 241 |
  • 支持隐藏菜单栏图标
  • 242 |
  • 支持显示上次翻译结果
  • 243 |
  • 可设置翻译窗口位置在鼠标位置、居中和菜单栏图标下方
  • 244 |
  • 可独立设置划词翻译和截图翻译输入框折叠状态
  • 245 |
  • 可设置划词取到的翻译原文中的「\n」替换为「空格」
  • 246 |
  • 可设置自动复制截图翻译OCR结果
  • 247 |
  • 可设置自动复制翻译结果中点击后自动查询的单词
  • 248 |
  • 谷歌翻译新增了维吾尔语等几门语言
  • 249 |
  • 优化了取词功能,理论上不再影响剪切板
  • 250 |
  • 针对Chrome浏览器的取词做了特殊处理,开启相关权限后取词更准
  • 251 |
  • 修复了系统外观选为「自动」的时候,深色浅色切换异常的问题
  • 252 | 253 | 254 | ]]>
    255 | 周一, 16 3月 2020 14:04:51 +0800 256 | 10.12 257 | 258 |
    259 | 260 | 0.3.0 261 | 264 |
  • 新增了设置字体大小的功能
  • 265 |
  • 支持 ESC 关闭翻译页面
  • 266 |
  • 支持 PopClip 插件翻译
  • 267 |
  • 取词时去掉首尾的空白字符
  • 268 |
  • 输入翻译居中显示(0.2.0 之前显示在鼠标位置)
  • 269 |
  • 新增了未开启辅助功能权限的提示
  • 270 |
  • 修复了部分机型无法使用截图翻译的问题
  • 271 |
  • 修复了翻译窗口超出屏幕底部偶尔无法回调屏幕的问题
  • 272 |
  • 修复了 10.12 默认显示为深色的问题
  • 273 | 274 | 275 | ]]>
    276 | 周日, 02 2月 2020 21:29:58 +0800 277 | 10.12 278 | 279 |
    280 | 281 | 0.2.0 282 | 285 |
  • 适配暗黑模式
  • 286 |
  • 翻译视图 UI 微调
  • 287 |
  • 新增了自动复制翻译结果的选项
  • 288 |
  • 快捷键提示改为用技术符号表示
  • 289 |
  • 截图模式可使用鼠标右键退出
  • 290 |
  • 弱化了翻译视图弹出影响
  • 291 |
  • 修复了有道词典中文查词数据解决异常的问题
  • 292 |
  • 解决了关闭翻译视图后无法停止朗读的问题
  • 293 |
  • 修复了偏好设置以及检查更新弹窗不居中的问题
  • 294 | 295 | 296 | ]]>
    297 | 周六, 28 12月 2019 17:22:38 +0800 298 | 10.12 299 | 300 |
    301 | 302 | 0.1.0 303 | 周日, 22 12月 2019 18:20:35 +0800 304 | 10.12 305 | 306 | 307 |
    308 |
    -------------------------------------------------------------------------------- /docs/_src/docsify/search.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | /** 3 | * Converts a colon formatted string to a object with properties. 4 | * 5 | * This is process a provided string and look for any tokens in the format 6 | * of `:name[=value]` and then convert it to a object and return. 7 | * An example of this is ':include :type=code :fragment=demo' is taken and 8 | * then converted to: 9 | * 10 | * ``` 11 | * { 12 | * include: '', 13 | * type: 'code', 14 | * fragment: 'demo' 15 | * } 16 | * ``` 17 | * 18 | * @param {string} str The string to parse. 19 | * 20 | * @return {object} The original string and parsed object, { str, config }. 21 | */ 22 | function getAndRemoveConfig(str) { 23 | if ( str === void 0 ) str = ''; 24 | 25 | var config = {}; 26 | 27 | if (str) { 28 | str = str 29 | .replace(/^('|")/, '') 30 | .replace(/('|")$/, '') 31 | .replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g, function (m, key, value) { 32 | if (key.indexOf(':') === -1) { 33 | config[key] = (value && value.replace(/"/g, '')) || true; 34 | return ''; 35 | } 36 | 37 | return m; 38 | }) 39 | .trim(); 40 | } 41 | 42 | return { str: str, config: config }; 43 | } 44 | 45 | /* eslint-disable no-unused-vars */ 46 | 47 | var INDEXS = {}; 48 | 49 | var LOCAL_STORAGE = { 50 | EXPIRE_KEY: 'docsify.search.expires', 51 | INDEX_KEY: 'docsify.search.index', 52 | }; 53 | 54 | function resolveExpireKey(namespace) { 55 | return namespace 56 | ? ((LOCAL_STORAGE.EXPIRE_KEY) + "/" + namespace) 57 | : LOCAL_STORAGE.EXPIRE_KEY; 58 | } 59 | 60 | function resolveIndexKey(namespace) { 61 | return namespace 62 | ? ((LOCAL_STORAGE.INDEX_KEY) + "/" + namespace) 63 | : LOCAL_STORAGE.INDEX_KEY; 64 | } 65 | 66 | function escapeHtml(string) { 67 | var entityMap = { 68 | '&': '&', 69 | '<': '<', 70 | '>': '>', 71 | '"': '"', 72 | "'": ''', 73 | }; 74 | 75 | return String(string).replace(/[&<>"']/g, function (s) { return entityMap[s]; }); 76 | } 77 | 78 | function getAllPaths(router) { 79 | var paths = []; 80 | 81 | Docsify.dom 82 | .findAll('.sidebar-nav a:not(.section-link):not([data-nosearch])') 83 | .forEach(function (node) { 84 | var href = node.href; 85 | var originHref = node.getAttribute('href'); 86 | var path = router.parse(href).path; 87 | 88 | if ( 89 | path && 90 | paths.indexOf(path) === -1 && 91 | !Docsify.util.isAbsolutePath(originHref) 92 | ) { 93 | paths.push(path); 94 | } 95 | }); 96 | 97 | return paths; 98 | } 99 | 100 | function getTableData(token) { 101 | if (!token.text && token.type === 'table') { 102 | token.cells.unshift(token.header); 103 | token.text = token.cells 104 | .map(function(rows) { 105 | return rows.join(' | '); 106 | }) 107 | .join(' |\n '); 108 | } 109 | return token.text; 110 | } 111 | 112 | function getListData(token) { 113 | if (!token.text && token.type === 'list') { 114 | token.text = token.raw; 115 | } 116 | return token.text; 117 | } 118 | 119 | function saveData(maxAge, expireKey, indexKey) { 120 | localStorage.setItem(expireKey, Date.now() + maxAge); 121 | localStorage.setItem(indexKey, JSON.stringify(INDEXS)); 122 | } 123 | 124 | function genIndex(path, content, router, depth) { 125 | if ( content === void 0 ) content = ''; 126 | 127 | var tokens = window.marked.lexer(content); 128 | var slugify = window.Docsify.slugify; 129 | var index = {}; 130 | var slug; 131 | var title = ''; 132 | 133 | tokens.forEach(function(token, tokenIndex) { 134 | if (token.type === 'heading' && token.depth <= depth) { 135 | var ref = getAndRemoveConfig(token.text); 136 | var str = ref.str; 137 | var config = ref.config; 138 | 139 | if (config.id) { 140 | slug = router.toURL(path, { id: slugify(config.id) }); 141 | } else { 142 | slug = router.toURL(path, { id: slugify(escapeHtml(token.text)) }); 143 | } 144 | 145 | if (str) { 146 | title = str 147 | .replace(//, '') 148 | .replace(/{docsify-ignore}/, '') 149 | .replace(//, '') 150 | .replace(/{docsify-ignore-all}/, '') 151 | .trim(); 152 | } 153 | 154 | index[slug] = { slug: slug, title: title, body: '' }; 155 | } else { 156 | if (tokenIndex === 0) { 157 | slug = router.toURL(path); 158 | index[slug] = { 159 | slug: slug, 160 | title: path !== '/' ? path.slice(1) : 'Home Page', 161 | body: token.text || '', 162 | }; 163 | } 164 | 165 | if (!slug) { 166 | return; 167 | } 168 | 169 | if (!index[slug]) { 170 | index[slug] = { slug: slug, title: '', body: '' }; 171 | } else if (index[slug].body) { 172 | token.text = getTableData(token); 173 | token.text = getListData(token); 174 | 175 | index[slug].body += '\n' + (token.text || ''); 176 | } else { 177 | token.text = getTableData(token); 178 | token.text = getListData(token); 179 | 180 | index[slug].body = index[slug].body 181 | ? index[slug].body + token.text 182 | : token.text; 183 | } 184 | } 185 | }); 186 | slugify.clear(); 187 | return index; 188 | } 189 | 190 | function ignoreDiacriticalMarks(keyword) { 191 | if (keyword && keyword.normalize) { 192 | return keyword.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); 193 | } 194 | return keyword; 195 | } 196 | 197 | /** 198 | * @param {String} query Search query 199 | * @returns {Array} Array of results 200 | */ 201 | function search(query) { 202 | var matchingResults = []; 203 | var data = []; 204 | Object.keys(INDEXS).forEach(function (key) { 205 | data = data.concat(Object.keys(INDEXS[key]).map(function (page) { return INDEXS[key][page]; })); 206 | }); 207 | 208 | query = query.trim(); 209 | var keywords = query.split(/[\s\-,\\/]+/); 210 | if (keywords.length !== 1) { 211 | keywords = [].concat(query, keywords); 212 | } 213 | 214 | var loop = function ( i ) { 215 | var post = data[i]; 216 | var matchesScore = 0; 217 | var resultStr = ''; 218 | var handlePostTitle = ''; 219 | var handlePostContent = ''; 220 | var postTitle = post.title && post.title.trim(); 221 | var postContent = post.body && post.body.trim(); 222 | var postUrl = post.slug || ''; 223 | 224 | if (postTitle) { 225 | keywords.forEach(function (keyword) { 226 | // From https://github.com/sindresorhus/escape-string-regexp 227 | var regEx = new RegExp( 228 | escapeHtml(ignoreDiacriticalMarks(keyword)).replace( 229 | /[|\\{}()[\]^$+*?.]/g, 230 | '\\$&' 231 | ), 232 | 'gi' 233 | ); 234 | var indexTitle = -1; 235 | var indexContent = -1; 236 | handlePostTitle = postTitle 237 | ? escapeHtml(ignoreDiacriticalMarks(postTitle)) 238 | : postTitle; 239 | handlePostContent = postContent 240 | ? escapeHtml(ignoreDiacriticalMarks(postContent)) 241 | : postContent; 242 | 243 | indexTitle = postTitle ? handlePostTitle.search(regEx) : -1; 244 | indexContent = postContent ? handlePostContent.search(regEx) : -1; 245 | 246 | if (indexTitle >= 0 || indexContent >= 0) { 247 | matchesScore += indexTitle >= 0 ? 3 : indexContent >= 0 ? 2 : 0; 248 | if (indexContent < 0) { 249 | indexContent = 0; 250 | } 251 | 252 | var start = 0; 253 | var end = 0; 254 | 255 | start = indexContent < 11 ? 0 : indexContent - 10; 256 | end = start === 0 ? 70 : indexContent + keyword.length + 60; 257 | 258 | if (postContent && end > postContent.length) { 259 | end = postContent.length; 260 | } 261 | 262 | var matchContent = 263 | '...' + 264 | handlePostContent 265 | .substring(start, end) 266 | .replace( 267 | regEx, 268 | function (word) { return ("" + word + ""); } 269 | ) + 270 | '...'; 271 | 272 | resultStr += matchContent; 273 | } 274 | }); 275 | 276 | if (matchesScore > 0) { 277 | var matchingPost = { 278 | title: handlePostTitle, 279 | content: postContent ? resultStr : '', 280 | url: postUrl, 281 | score: matchesScore, 282 | }; 283 | 284 | matchingResults.push(matchingPost); 285 | } 286 | } 287 | }; 288 | 289 | for (var i = 0; i < data.length; i++) loop( i ); 290 | 291 | return matchingResults.sort(function (r1, r2) { return r2.score - r1.score; }); 292 | } 293 | 294 | function init(config, vm) { 295 | var isAuto = config.paths === 'auto'; 296 | var paths = isAuto ? getAllPaths(vm.router) : config.paths; 297 | 298 | var namespaceSuffix = ''; 299 | 300 | // only in auto mode 301 | if (paths.length && isAuto && config.pathNamespaces) { 302 | var path = paths[0]; 303 | 304 | if (Array.isArray(config.pathNamespaces)) { 305 | namespaceSuffix = 306 | config.pathNamespaces.filter( 307 | function (prefix) { return path.slice(0, prefix.length) === prefix; } 308 | )[0] || namespaceSuffix; 309 | } else if (config.pathNamespaces instanceof RegExp) { 310 | var matches = path.match(config.pathNamespaces); 311 | 312 | if (matches) { 313 | namespaceSuffix = matches[0]; 314 | } 315 | } 316 | var isExistHome = paths.indexOf(namespaceSuffix + '/') === -1; 317 | var isExistReadme = paths.indexOf(namespaceSuffix + '/README') === -1; 318 | if (isExistHome && isExistReadme) { 319 | paths.unshift(namespaceSuffix + '/'); 320 | } 321 | } else if (paths.indexOf('/') === -1 && paths.indexOf('/README') === -1) { 322 | paths.unshift('/'); 323 | } 324 | 325 | var expireKey = resolveExpireKey(config.namespace) + namespaceSuffix; 326 | var indexKey = resolveIndexKey(config.namespace) + namespaceSuffix; 327 | 328 | var isExpired = localStorage.getItem(expireKey) < Date.now(); 329 | 330 | INDEXS = JSON.parse(localStorage.getItem(indexKey)); 331 | 332 | if (isExpired) { 333 | INDEXS = {}; 334 | } else if (!isAuto) { 335 | return; 336 | } 337 | 338 | var len = paths.length; 339 | var count = 0; 340 | 341 | paths.forEach(function (path) { 342 | if (INDEXS[path]) { 343 | return count++; 344 | } 345 | 346 | Docsify.get(vm.router.getFile(path), false, vm.config.requestHeaders).then( 347 | function (result) { 348 | INDEXS[path] = genIndex(path, result, vm.router, config.depth); 349 | len === ++count && saveData(config.maxAge, expireKey, indexKey); 350 | } 351 | ); 352 | }); 353 | } 354 | 355 | /* eslint-disable no-unused-vars */ 356 | 357 | var NO_DATA_TEXT = ''; 358 | var options; 359 | 360 | function style() { 361 | 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 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.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}"; 362 | 363 | Docsify.dom.style(code); 364 | } 365 | 366 | function tpl(defaultValue) { 367 | if ( defaultValue === void 0 ) defaultValue = ''; 368 | 369 | var html = "
    \n \n
    \n \n \n \n \n \n
    \n
    \n
    \n "; 370 | var el = Docsify.dom.create('div', html); 371 | var aside = Docsify.dom.find('aside'); 372 | 373 | Docsify.dom.toggleClass(el, 'search'); 374 | Docsify.dom.before(aside, el); 375 | } 376 | 377 | function doSearch(value) { 378 | var $search = Docsify.dom.find('div.search'); 379 | var $panel = Docsify.dom.find($search, '.results-panel'); 380 | var $clearBtn = Docsify.dom.find($search, '.clear-button'); 381 | var $sidebarNav = Docsify.dom.find('.sidebar-nav'); 382 | var $appName = Docsify.dom.find('.app-name'); 383 | 384 | if (!value) { 385 | $panel.classList.remove('show'); 386 | $clearBtn.classList.remove('show'); 387 | $panel.innerHTML = ''; 388 | 389 | if (options.hideOtherSidebarContent) { 390 | $sidebarNav && $sidebarNav.classList.remove('hide'); 391 | $appName && $appName.classList.remove('hide'); 392 | } 393 | 394 | return; 395 | } 396 | 397 | var matchs = search(value); 398 | 399 | var html = ''; 400 | matchs.forEach(function (post) { 401 | html += ""; 402 | }); 403 | 404 | $panel.classList.add('show'); 405 | $clearBtn.classList.add('show'); 406 | $panel.innerHTML = html || ("

    " + NO_DATA_TEXT + "

    "); 407 | if (options.hideOtherSidebarContent) { 408 | $sidebarNav && $sidebarNav.classList.add('hide'); 409 | $appName && $appName.classList.add('hide'); 410 | } 411 | } 412 | 413 | function bindEvents() { 414 | var $search = Docsify.dom.find('div.search'); 415 | var $input = Docsify.dom.find($search, 'input'); 416 | var $inputWrap = Docsify.dom.find($search, '.input-wrap'); 417 | 418 | var timeId; 419 | 420 | /** 421 | Prevent to Fold sidebar. 422 | 423 | When searching on the mobile end, 424 | the sidebar is collapsed when you click the INPUT box, 425 | making it impossible to search. 426 | */ 427 | Docsify.dom.on( 428 | $search, 429 | 'click', 430 | function (e) { return ['A', 'H2', 'P', 'EM'].indexOf(e.target.tagName) === -1 && 431 | e.stopPropagation(); } 432 | ); 433 | Docsify.dom.on($input, 'input', function (e) { 434 | clearTimeout(timeId); 435 | timeId = setTimeout(function (_) { return doSearch(e.target.value.trim()); }, 100); 436 | }); 437 | Docsify.dom.on($inputWrap, 'click', function (e) { 438 | // Click input outside 439 | if (e.target.tagName !== 'INPUT') { 440 | $input.value = ''; 441 | doSearch(); 442 | } 443 | }); 444 | } 445 | 446 | function updatePlaceholder(text, path) { 447 | var $input = Docsify.dom.getNode('.search input[type="search"]'); 448 | 449 | if (!$input) { 450 | return; 451 | } 452 | 453 | if (typeof text === 'string') { 454 | $input.placeholder = text; 455 | } else { 456 | var match = Object.keys(text).filter(function (key) { return path.indexOf(key) > -1; })[0]; 457 | $input.placeholder = text[match]; 458 | } 459 | } 460 | 461 | function updateNoData(text, path) { 462 | if (typeof text === 'string') { 463 | NO_DATA_TEXT = text; 464 | } else { 465 | var match = Object.keys(text).filter(function (key) { return path.indexOf(key) > -1; })[0]; 466 | NO_DATA_TEXT = text[match]; 467 | } 468 | } 469 | 470 | function updateOptions(opts) { 471 | options = opts; 472 | } 473 | 474 | function init$1(opts, vm) { 475 | var keywords = vm.router.parse().query.s; 476 | 477 | updateOptions(opts); 478 | style(); 479 | tpl(keywords); 480 | bindEvents(); 481 | keywords && setTimeout(function (_) { return doSearch(keywords); }, 500); 482 | } 483 | 484 | function update(opts, vm) { 485 | updateOptions(opts); 486 | updatePlaceholder(opts.placeholder, vm.route.path); 487 | updateNoData(opts.noData, vm.route.path); 488 | } 489 | 490 | /* eslint-disable no-unused-vars */ 491 | 492 | var CONFIG = { 493 | placeholder: 'Type to search', 494 | noData: 'No Results!', 495 | paths: 'auto', 496 | depth: 2, 497 | maxAge: 86400000, // 1 day 498 | hideOtherSidebarContent: false, 499 | namespace: undefined, 500 | pathNamespaces: undefined, 501 | }; 502 | 503 | var install = function(hook, vm) { 504 | var util = Docsify.util; 505 | var opts = vm.config.search || CONFIG; 506 | 507 | if (Array.isArray(opts)) { 508 | CONFIG.paths = opts; 509 | } else if (typeof opts === 'object') { 510 | CONFIG.paths = Array.isArray(opts.paths) ? opts.paths : 'auto'; 511 | CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge; 512 | CONFIG.placeholder = opts.placeholder || CONFIG.placeholder; 513 | CONFIG.noData = opts.noData || CONFIG.noData; 514 | CONFIG.depth = opts.depth || CONFIG.depth; 515 | CONFIG.hideOtherSidebarContent = 516 | opts.hideOtherSidebarContent || CONFIG.hideOtherSidebarContent; 517 | CONFIG.namespace = opts.namespace || CONFIG.namespace; 518 | CONFIG.pathNamespaces = opts.pathNamespaces || CONFIG.pathNamespaces; 519 | } 520 | 521 | var isAuto = CONFIG.paths === 'auto'; 522 | 523 | hook.mounted(function (_) { 524 | init$1(CONFIG, vm); 525 | !isAuto && init(CONFIG, vm); 526 | }); 527 | hook.doneEach(function (_) { 528 | update(CONFIG, vm); 529 | isAuto && init(CONFIG, vm); 530 | }); 531 | }; 532 | 533 | $docsify.plugins = [].concat(install, $docsify.plugins); 534 | 535 | }()); -------------------------------------------------------------------------------- /docs/_src/docsify/zoom-image.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | /*! medium-zoom 1.0.6 | MIT License | https://github.com/francoischalifour/medium-zoom */ 3 | var _extends = Object.assign || function (target) { 4 | var arguments$1 = arguments; 5 | 6 | for (var i = 1; i < arguments.length; i++) { 7 | var source = arguments$1[i]; 8 | 9 | for (var key in source) { 10 | if (Object.prototype.hasOwnProperty.call(source, key)) { 11 | target[key] = source[key]; 12 | } 13 | } 14 | } 15 | 16 | return target; 17 | }; 18 | 19 | var isSupported = function isSupported(node) { 20 | return node.tagName === 'IMG'; 21 | }; 22 | 23 | /* eslint-disable-next-line no-prototype-builtins */ 24 | var isNodeList = function isNodeList(selector) { 25 | return NodeList.prototype.isPrototypeOf(selector); 26 | }; 27 | 28 | var isNode = function isNode(selector) { 29 | return selector && selector.nodeType === 1; 30 | }; 31 | 32 | var isSvg = function isSvg(image) { 33 | var source = image.currentSrc || image.src; 34 | return source.substr(-4).toLowerCase() === '.svg'; 35 | }; 36 | 37 | var getImagesFromSelector = function getImagesFromSelector(selector) { 38 | try { 39 | if (Array.isArray(selector)) { 40 | return selector.filter(isSupported); 41 | } 42 | 43 | if (isNodeList(selector)) { 44 | // Do not use spread operator or Array.from() for IE support 45 | return [].slice.call(selector).filter(isSupported); 46 | } 47 | 48 | if (isNode(selector)) { 49 | return [selector].filter(isSupported); 50 | } 51 | 52 | if (typeof selector === 'string') { 53 | // Do not use spread operator or Array.from() for IE support 54 | return [].slice.call(document.querySelectorAll(selector)).filter(isSupported); 55 | } 56 | 57 | return []; 58 | } catch (err) { 59 | throw new TypeError('The provided selector is invalid.\n' + 'Expects a CSS selector, a Node element, a NodeList or an array.\n' + 'See: https://github.com/francoischalifour/medium-zoom'); 60 | } 61 | }; 62 | 63 | var createOverlay = function createOverlay(background) { 64 | var overlay = document.createElement('div'); 65 | overlay.classList.add('medium-zoom-overlay'); 66 | overlay.style.background = background; 67 | 68 | return overlay; 69 | }; 70 | 71 | var cloneTarget = function cloneTarget(template) { 72 | var _template$getBounding = template.getBoundingClientRect(), 73 | top = _template$getBounding.top, 74 | left = _template$getBounding.left, 75 | width = _template$getBounding.width, 76 | height = _template$getBounding.height; 77 | 78 | var clone = template.cloneNode(); 79 | var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; 80 | var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; 81 | 82 | clone.removeAttribute('id'); 83 | clone.style.position = 'absolute'; 84 | clone.style.top = top + scrollTop + 'px'; 85 | clone.style.left = left + scrollLeft + 'px'; 86 | clone.style.width = width + 'px'; 87 | clone.style.height = height + 'px'; 88 | clone.style.transform = ''; 89 | 90 | return clone; 91 | }; 92 | 93 | var createCustomEvent = function createCustomEvent(type, params) { 94 | var eventParams = _extends({ 95 | bubbles: false, 96 | cancelable: false, 97 | detail: undefined 98 | }, params); 99 | 100 | if (typeof window.CustomEvent === 'function') { 101 | return new CustomEvent(type, eventParams); 102 | } 103 | 104 | var customEvent = document.createEvent('CustomEvent'); 105 | customEvent.initCustomEvent(type, eventParams.bubbles, eventParams.cancelable, eventParams.detail); 106 | 107 | return customEvent; 108 | }; 109 | 110 | var mediumZoom = function mediumZoom(selector) { 111 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 112 | 113 | /** 114 | * Ensure the compatibility with IE11 if no Promise polyfill are used. 115 | */ 116 | var Promise = window.Promise || function Promise(fn) { 117 | function noop() {} 118 | fn(noop, noop); 119 | }; 120 | 121 | var _handleClick = function _handleClick(event) { 122 | var target = event.target; 123 | 124 | 125 | if (target === overlay) { 126 | close(); 127 | return; 128 | } 129 | 130 | if (images.indexOf(target) === -1) { 131 | return; 132 | } 133 | 134 | toggle({ target: target }); 135 | }; 136 | 137 | var _handleScroll = function _handleScroll() { 138 | if (isAnimating || !active.original) { 139 | return; 140 | } 141 | 142 | var currentScroll = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; 143 | 144 | if (Math.abs(scrollTop - currentScroll) > zoomOptions.scrollOffset) { 145 | setTimeout(close, 150); 146 | } 147 | }; 148 | 149 | var _handleKeyUp = function _handleKeyUp(event) { 150 | var key = event.key || event.keyCode; 151 | 152 | // Close if escape key is pressed 153 | if (key === 'Escape' || key === 'Esc' || key === 27) { 154 | close(); 155 | } 156 | }; 157 | 158 | var update = function update() { 159 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 160 | 161 | var newOptions = options; 162 | 163 | if (options.background) { 164 | overlay.style.background = options.background; 165 | } 166 | 167 | if (options.container && options.container instanceof Object) { 168 | newOptions.container = _extends({}, zoomOptions.container, options.container); 169 | } 170 | 171 | if (options.template) { 172 | var template = isNode(options.template) ? options.template : document.querySelector(options.template); 173 | 174 | newOptions.template = template; 175 | } 176 | 177 | zoomOptions = _extends({}, zoomOptions, newOptions); 178 | 179 | images.forEach(function (image) { 180 | image.dispatchEvent(createCustomEvent('medium-zoom:update', { 181 | detail: { zoom: zoom } 182 | })); 183 | }); 184 | 185 | return zoom; 186 | }; 187 | 188 | var clone = function clone() { 189 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 190 | return mediumZoom(_extends({}, zoomOptions, options)); 191 | }; 192 | 193 | var attach = function attach() { 194 | var arguments$1 = arguments; 195 | 196 | for (var _len = arguments.length, selectors = Array(_len), _key = 0; _key < _len; _key++) { 197 | selectors[_key] = arguments$1[_key]; 198 | } 199 | 200 | var newImages = selectors.reduce(function (imagesAccumulator, currentSelector) { 201 | return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector)); 202 | }, []); 203 | 204 | newImages.filter(function (newImage) { 205 | return images.indexOf(newImage) === -1; 206 | }).forEach(function (newImage) { 207 | images.push(newImage); 208 | newImage.classList.add('medium-zoom-image'); 209 | }); 210 | 211 | eventListeners.forEach(function (_ref) { 212 | var type = _ref.type, 213 | listener = _ref.listener, 214 | options = _ref.options; 215 | 216 | newImages.forEach(function (image) { 217 | image.addEventListener(type, listener, options); 218 | }); 219 | }); 220 | 221 | return zoom; 222 | }; 223 | 224 | var detach = function detach() { 225 | var arguments$1 = arguments; 226 | 227 | for (var _len2 = arguments.length, selectors = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 228 | selectors[_key2] = arguments$1[_key2]; 229 | } 230 | 231 | if (active.zoomed) { 232 | close(); 233 | } 234 | 235 | var imagesToDetach = selectors.length > 0 ? selectors.reduce(function (imagesAccumulator, currentSelector) { 236 | return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector)); 237 | }, []) : images; 238 | 239 | imagesToDetach.forEach(function (image) { 240 | image.classList.remove('medium-zoom-image'); 241 | image.dispatchEvent(createCustomEvent('medium-zoom:detach', { 242 | detail: { zoom: zoom } 243 | })); 244 | }); 245 | 246 | images = images.filter(function (image) { 247 | return imagesToDetach.indexOf(image) === -1; 248 | }); 249 | 250 | return zoom; 251 | }; 252 | 253 | var on = function on(type, listener) { 254 | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 255 | 256 | images.forEach(function (image) { 257 | image.addEventListener('medium-zoom:' + type, listener, options); 258 | }); 259 | 260 | eventListeners.push({ type: 'medium-zoom:' + type, listener: listener, options: options }); 261 | 262 | return zoom; 263 | }; 264 | 265 | var off = function off(type, listener) { 266 | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 267 | 268 | images.forEach(function (image) { 269 | image.removeEventListener('medium-zoom:' + type, listener, options); 270 | }); 271 | 272 | eventListeners = eventListeners.filter(function (eventListener) { 273 | return !(eventListener.type === 'medium-zoom:' + type && eventListener.listener.toString() === listener.toString()); 274 | }); 275 | 276 | return zoom; 277 | }; 278 | 279 | var open = function open() { 280 | var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, 281 | target = _ref2.target; 282 | 283 | var _animate = function _animate() { 284 | var container = { 285 | width: document.documentElement.clientWidth, 286 | height: document.documentElement.clientHeight, 287 | left: 0, 288 | top: 0, 289 | right: 0, 290 | bottom: 0 291 | }; 292 | var viewportWidth = void 0; 293 | var viewportHeight = void 0; 294 | 295 | if (zoomOptions.container) { 296 | if (zoomOptions.container instanceof Object) { 297 | // The container is given as an object with properties like width, height, left, top 298 | container = _extends({}, container, zoomOptions.container); 299 | 300 | // We need to adjust custom options like container.right or container.bottom 301 | viewportWidth = container.width - container.left - container.right - zoomOptions.margin * 2; 302 | viewportHeight = container.height - container.top - container.bottom - zoomOptions.margin * 2; 303 | } else { 304 | // The container is given as an element 305 | var zoomContainer = isNode(zoomOptions.container) ? zoomOptions.container : document.querySelector(zoomOptions.container); 306 | 307 | var _zoomContainer$getBou = zoomContainer.getBoundingClientRect(), 308 | _width = _zoomContainer$getBou.width, 309 | _height = _zoomContainer$getBou.height, 310 | _left = _zoomContainer$getBou.left, 311 | _top = _zoomContainer$getBou.top; 312 | 313 | container = _extends({}, container, { 314 | width: _width, 315 | height: _height, 316 | left: _left, 317 | top: _top 318 | }); 319 | } 320 | } 321 | 322 | viewportWidth = viewportWidth || container.width - zoomOptions.margin * 2; 323 | viewportHeight = viewportHeight || container.height - zoomOptions.margin * 2; 324 | 325 | var zoomTarget = active.zoomedHd || active.original; 326 | var naturalWidth = isSvg(zoomTarget) ? viewportWidth : zoomTarget.naturalWidth || viewportWidth; 327 | var naturalHeight = isSvg(zoomTarget) ? viewportHeight : zoomTarget.naturalHeight || viewportHeight; 328 | 329 | var _zoomTarget$getBoundi = zoomTarget.getBoundingClientRect(), 330 | top = _zoomTarget$getBoundi.top, 331 | left = _zoomTarget$getBoundi.left, 332 | width = _zoomTarget$getBoundi.width, 333 | height = _zoomTarget$getBoundi.height; 334 | 335 | var scaleX = Math.min(naturalWidth, viewportWidth) / width; 336 | var scaleY = Math.min(naturalHeight, viewportHeight) / height; 337 | var scale = Math.min(scaleX, scaleY); 338 | var translateX = (-left + (viewportWidth - width) / 2 + zoomOptions.margin + container.left) / scale; 339 | var translateY = (-top + (viewportHeight - height) / 2 + zoomOptions.margin + container.top) / scale; 340 | var transform = 'scale(' + scale + ') translate3d(' + translateX + 'px, ' + translateY + 'px, 0)'; 341 | 342 | active.zoomed.style.transform = transform; 343 | 344 | if (active.zoomedHd) { 345 | active.zoomedHd.style.transform = transform; 346 | } 347 | }; 348 | 349 | return new Promise(function (resolve) { 350 | if (target && images.indexOf(target) === -1) { 351 | resolve(zoom); 352 | return; 353 | } 354 | 355 | var _handleOpenEnd = function _handleOpenEnd() { 356 | isAnimating = false; 357 | active.zoomed.removeEventListener('transitionend', _handleOpenEnd); 358 | active.original.dispatchEvent(createCustomEvent('medium-zoom:opened', { 359 | detail: { zoom: zoom } 360 | })); 361 | 362 | resolve(zoom); 363 | }; 364 | 365 | if (active.zoomed) { 366 | resolve(zoom); 367 | return; 368 | } 369 | 370 | if (target) { 371 | // The zoom was triggered manually via a click 372 | active.original = target; 373 | } else if (images.length > 0) { 374 | var _images = images; 375 | active.original = _images[0]; 376 | } else { 377 | resolve(zoom); 378 | return; 379 | } 380 | 381 | active.original.dispatchEvent(createCustomEvent('medium-zoom:open', { 382 | detail: { zoom: zoom } 383 | })); 384 | 385 | scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; 386 | isAnimating = true; 387 | active.zoomed = cloneTarget(active.original); 388 | 389 | document.body.appendChild(overlay); 390 | 391 | if (zoomOptions.template) { 392 | var template = isNode(zoomOptions.template) ? zoomOptions.template : document.querySelector(zoomOptions.template); 393 | active.template = document.createElement('div'); 394 | active.template.appendChild(template.content.cloneNode(true)); 395 | 396 | document.body.appendChild(active.template); 397 | } 398 | 399 | document.body.appendChild(active.zoomed); 400 | 401 | window.requestAnimationFrame(function () { 402 | document.body.classList.add('medium-zoom--opened'); 403 | }); 404 | 405 | active.original.classList.add('medium-zoom-image--hidden'); 406 | active.zoomed.classList.add('medium-zoom-image--opened'); 407 | 408 | active.zoomed.addEventListener('click', close); 409 | active.zoomed.addEventListener('transitionend', _handleOpenEnd); 410 | 411 | if (active.original.getAttribute('data-zoom-src')) { 412 | active.zoomedHd = active.zoomed.cloneNode(); 413 | 414 | // Reset the `scrset` property or the HD image won't load. 415 | active.zoomedHd.removeAttribute('srcset'); 416 | active.zoomedHd.removeAttribute('sizes'); 417 | 418 | active.zoomedHd.src = active.zoomed.getAttribute('data-zoom-src'); 419 | 420 | active.zoomedHd.onerror = function () { 421 | clearInterval(getZoomTargetSize); 422 | console.warn('Unable to reach the zoom image target ' + active.zoomedHd.src); 423 | active.zoomedHd = null; 424 | _animate(); 425 | }; 426 | 427 | // We need to access the natural size of the full HD 428 | // target as fast as possible to compute the animation. 429 | var getZoomTargetSize = setInterval(function () { 430 | if ( active.zoomedHd.complete) { 431 | clearInterval(getZoomTargetSize); 432 | active.zoomedHd.classList.add('medium-zoom-image--opened'); 433 | active.zoomedHd.addEventListener('click', close); 434 | document.body.appendChild(active.zoomedHd); 435 | _animate(); 436 | } 437 | }, 10); 438 | } else if (active.original.hasAttribute('srcset')) { 439 | // If an image has a `srcset` attribuet, we don't know the dimensions of the 440 | // zoomed (HD) image (like when `data-zoom-src` is specified). 441 | // Therefore the approach is quite similar. 442 | active.zoomedHd = active.zoomed.cloneNode(); 443 | 444 | // Resetting the sizes attribute tells the browser to load the 445 | // image best fitting the current viewport size, respecting the `srcset`. 446 | active.zoomedHd.removeAttribute('sizes'); 447 | 448 | // In Firefox, the `loading` attribute needs to be set to `eager` (default 449 | // value) for the load event to be fired. 450 | active.zoomedHd.removeAttribute('loading'); 451 | 452 | // Wait for the load event of the hd image. This will fire if the image 453 | // is already cached. 454 | var loadEventListener = active.zoomedHd.addEventListener('load', function () { 455 | active.zoomedHd.removeEventListener('load', loadEventListener); 456 | active.zoomedHd.classList.add('medium-zoom-image--opened'); 457 | active.zoomedHd.addEventListener('click', close); 458 | document.body.appendChild(active.zoomedHd); 459 | _animate(); 460 | }); 461 | } else { 462 | _animate(); 463 | } 464 | }); 465 | }; 466 | 467 | var close = function close() { 468 | return new Promise(function (resolve) { 469 | if (isAnimating || !active.original) { 470 | resolve(zoom); 471 | return; 472 | } 473 | 474 | var _handleCloseEnd = function _handleCloseEnd() { 475 | active.original.classList.remove('medium-zoom-image--hidden'); 476 | document.body.removeChild(active.zoomed); 477 | if (active.zoomedHd) { 478 | document.body.removeChild(active.zoomedHd); 479 | } 480 | document.body.removeChild(overlay); 481 | active.zoomed.classList.remove('medium-zoom-image--opened'); 482 | if (active.template) { 483 | document.body.removeChild(active.template); 484 | } 485 | 486 | isAnimating = false; 487 | active.zoomed.removeEventListener('transitionend', _handleCloseEnd); 488 | 489 | active.original.dispatchEvent(createCustomEvent('medium-zoom:closed', { 490 | detail: { zoom: zoom } 491 | })); 492 | 493 | active.original = null; 494 | active.zoomed = null; 495 | active.zoomedHd = null; 496 | active.template = null; 497 | 498 | resolve(zoom); 499 | }; 500 | 501 | isAnimating = true; 502 | document.body.classList.remove('medium-zoom--opened'); 503 | active.zoomed.style.transform = ''; 504 | 505 | if (active.zoomedHd) { 506 | active.zoomedHd.style.transform = ''; 507 | } 508 | 509 | // Fade out the template so it's not too abrupt 510 | if (active.template) { 511 | active.template.style.transition = 'opacity 150ms'; 512 | active.template.style.opacity = 0; 513 | } 514 | 515 | active.original.dispatchEvent(createCustomEvent('medium-zoom:close', { 516 | detail: { zoom: zoom } 517 | })); 518 | 519 | active.zoomed.addEventListener('transitionend', _handleCloseEnd); 520 | }); 521 | }; 522 | 523 | var toggle = function toggle() { 524 | var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, 525 | target = _ref3.target; 526 | 527 | if (active.original) { 528 | return close(); 529 | } 530 | 531 | return open({ target: target }); 532 | }; 533 | 534 | var getOptions = function getOptions() { 535 | return zoomOptions; 536 | }; 537 | 538 | var getImages = function getImages() { 539 | return images; 540 | }; 541 | 542 | var getZoomedImage = function getZoomedImage() { 543 | return active.original; 544 | }; 545 | 546 | var images = []; 547 | var eventListeners = []; 548 | var isAnimating = false; 549 | var scrollTop = 0; 550 | var zoomOptions = options; 551 | var active = { 552 | original: null, 553 | zoomed: null, 554 | zoomedHd: null, 555 | template: null 556 | 557 | // If the selector is omitted, it's replaced by the options 558 | };if (Object.prototype.toString.call(selector) === '[object Object]') { 559 | zoomOptions = selector; 560 | } else if (selector || typeof selector === 'string' // to process empty string as a selector 561 | ) { 562 | attach(selector); 563 | } 564 | 565 | // Apply the default option values 566 | zoomOptions = _extends({ 567 | margin: 0, 568 | background: '#fff', 569 | scrollOffset: 40, 570 | container: null, 571 | template: null 572 | }, zoomOptions); 573 | 574 | var overlay = createOverlay(zoomOptions.background); 575 | 576 | document.addEventListener('click', _handleClick); 577 | document.addEventListener('keyup', _handleKeyUp); 578 | document.addEventListener('scroll', _handleScroll); 579 | window.addEventListener('resize', close); 580 | 581 | var zoom = { 582 | open: open, 583 | close: close, 584 | toggle: toggle, 585 | update: update, 586 | clone: clone, 587 | attach: attach, 588 | detach: detach, 589 | on: on, 590 | off: off, 591 | getOptions: getOptions, 592 | getImages: getImages, 593 | getZoomedImage: getZoomedImage 594 | }; 595 | 596 | return zoom; 597 | }; 598 | 599 | function styleInject(css, ref) { 600 | if ( ref === void 0 ) { ref = {}; } 601 | var insertAt = ref.insertAt; 602 | 603 | if (!css || typeof document === 'undefined') { return; } 604 | 605 | var head = document.head || document.getElementsByTagName('head')[0]; 606 | var style = document.createElement('style'); 607 | style.type = 'text/css'; 608 | 609 | if (insertAt === 'top') { 610 | if (head.firstChild) { 611 | head.insertBefore(style, head.firstChild); 612 | } else { 613 | head.appendChild(style); 614 | } 615 | } else { 616 | head.appendChild(style); 617 | } 618 | 619 | if (style.styleSheet) { 620 | style.styleSheet.cssText = css; 621 | } else { 622 | style.appendChild(document.createTextNode(css)); 623 | } 624 | } 625 | 626 | var css = ".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}"; 627 | styleInject(css); 628 | 629 | /* eslint-disable no-unused-vars */ 630 | 631 | var matchesSelector = 632 | Element.prototype.matches || 633 | Element.prototype.webkitMatchesSelector || 634 | Element.prototype.msMatchesSelector; 635 | 636 | function install(hook) { 637 | var zoom; 638 | 639 | hook.doneEach(function (_) { 640 | var elms = Array.apply( 641 | null, 642 | document.querySelectorAll( 643 | '.markdown-section img:not(.emoji):not([data-no-zoom])' 644 | ) 645 | ); 646 | 647 | elms = elms.filter(function (elm) { return matchesSelector.call(elm, 'a img') === false; }); 648 | 649 | if (zoom) { 650 | zoom.detach(); 651 | } 652 | 653 | zoom = mediumZoom(elms); 654 | }); 655 | } 656 | 657 | $docsify.plugins = [].concat(install, $docsify.plugins); 658 | 659 | }()); -------------------------------------------------------------------------------- /docs/_src/docsify/docsify.min.js: -------------------------------------------------------------------------------- 1 | !function(){function s(n){var r=Object.create(null);return function(e){var t=c(e)?e:JSON.stringify(e);return r[t]||(r[t]=n(e))}}var o=s(function(e){return e.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}),l=Object.prototype.hasOwnProperty,y=Object.assign||function(e){for(var t=arguments,n=1;n/gm),it=Q(/^data-[\-\w.\u00B7-\uFFFF]/),ot=Q(/^aria-[\-\w]+$/),at=Q(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),st=Q(/^(?:\w+script|data):/i),lt=Q(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),ct="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function ut(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t/i,t))xe(o,e);else{W&&(t=De(t,F," "),t=De(t,C," "));var l=e.nodeName.toLowerCase();if(Re(l,s,t))try{a?e.setAttributeNS(a,o,t):e.setAttribute(o,t),Le(c.removed)}catch(e){}}}Te("afterSanitizeAttributes",e,null)}}function $e(e){var t,n=Se(e);for(Te("beforeSanitizeShadowDOM",e,null);t=n.nextNode();)Te("uponSanitizeShadowNode",t,null),Ee(t)||(t.content instanceof u&&$e(t.content),Oe(t));Te("afterSanitizeShadowDOM",e,null)}return c.sanitize=function(e,t){var n,r=void 0,i=void 0,o=void 0;if((fe=!e)&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Ae(e)){if("function"!=typeof e.toString)throw He("toString is not a function");if("string"!=typeof(e=e.toString()))throw He("dirty is not a string, aborting")}if(!c.isSupported){if("object"===ct(s.toStaticHTML)||"function"==typeof s.toStaticHTML){if("string"==typeof e)return s.toStaticHTML(e);if(Ae(e))return s.toStaticHTML(e.outerHTML)}return e}if(Y||O(t),c.removed=[],"string"==typeof e&&(re=!1),!re)if(e instanceof p)1===(t=(r=_e("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===t.nodeName||"HTML"===t.nodeName?r=t:r.appendChild(t);else{if(!K&&!W&&!V&&-1===e.indexOf("<"))return k&&ee?k.createHTML(e):e;if(!(r=_e(e)))return K?null:w}r&&X&&we(r.firstChild);for(var a=Se(re?e:r);n=a.nextNode();)3===n.nodeType&&n===i||Ee(n)||(n.content instanceof u&&$e(n.content),Oe(n),i=n);if(i=null,re)return e;if(K){if(Q)for(o=S.call(r.ownerDocument);r.firstChild;)o.appendChild(r.firstChild);else o=r;return J&&(o=T.call(l,o,!0)),o}return e=V?r.outerHTML:r.innerHTML,W&&(e=De(e,F," "),e=De(e,C," ")),k&&ee?k.createHTML(e):e},c.setConfig=function(e){O(e),Y=!0},c.clearConfig=function(){ge=null,Y=!1},c.isValidAttribute=function(e,t,n){return ge||O({}),e=Ne(e),t=Ne(t),Re(e,t,n)},c.addHook=function(e,t){"function"==typeof t&&(R[e]=R[e]||[],ze(R[e],t))},c.removeHook=function(e){R[e]&&Le(R[e])},c.removeHooks=function(e){R[e]&&(R[e]=[])},c.removeAllHooks=function(){R={}},c}();function se(e){var t,n=e.loaded,r=e.total,i=e.step;ie||((e=v("div")).classList.add("progress"),a(g,e),ie=e),t=i?80<(t=parseInt(ie.style.width||0,10)+i)?80:t:Math.floor(n/r*100),ie.style.opacity=1,ie.style.width=95<=t?"100%":t+"%",95<=t&&(clearTimeout(oe),oe=setTimeout(function(e){ie.style.opacity=0,ie.style.width="0%"},200))}var le={};function ce(i,e,t){void 0===e&&(e=!1),void 0===t&&(t={});function o(){a.addEventListener.apply(a,arguments)}var n,a=new XMLHttpRequest,r=le[i];if(r)return{then:function(e){return e(r.content,r.opt)},abort:u};for(n in a.open("GET",i),t)l.call(t,n)&&a.setRequestHeader(n,t[n]);return a.send(),{then:function(t,n){var r;void 0===n&&(n=u),e&&(r=setInterval(function(e){return se({step:Math.floor(5*Math.random()+1)})},500),o("progress",se),o("loadend",function(e){se(e),clearInterval(r)})),o("error",n),o("load",function(e){e=e.target;400<=e.status?n(e):(e=le[i]={content:e.response,opt:{updatedAt:a.getResponseHeader("last-modified")}},t(e.content,e.opt))})},abort:function(e){return 4!==a.readyState&&a.abort()}}}function ue(e,t){e.innerHTML=e.innerHTML.replace(/var\(\s*--theme-color.*?\)/g,t)}var pe=f.title;function he(){var e,t=d("section.cover");t&&(e=t.getBoundingClientRect().height,window.pageYOffset>=e||t.classList.contains("hidden")?S(g,"add","sticky"):S(g,"remove","sticky"))}function de(e,t,r,n){var i=[];null!=(t=d(t))&&(i=k(t,"a"));var o,a=decodeURI(e.toURL(e.getCurrentPath()));return i.sort(function(e,t){return t.href.length-e.href.length}).forEach(function(e){var t=decodeURI(e.getAttribute("href")),n=r?e.parentNode:e;e.title=e.title||e.innerText,0!==a.indexOf(t)||o?S(n,"remove","active"):(o=e,S(n,"add","active"))}),n&&(f.title=o?o.title||o.innerText+" - "+pe:pe),o}function fe(e,t){for(var n=0;nthis.end&&e>=this.next}[this.direction]}},{key:"_defaultEase",value:function(e,t,n,r){return(e/=r/2)<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t}}]),be);function be(){var e=0l){t=t||p;break}t=p}!t||(n=xe[Re(e,t.getAttribute("data-id"))])&&n!==a&&(a&&a.classList.remove("active"),n.classList.add("active"),a=n,!_e&&g.classList.contains("sticky")&&(s=r.clientHeight,e=a.offsetTop+a.clientHeight+40,n=a.offsetTop>=o.scrollTop&&e<=o.scrollTop+s,a=+e"']/),yt=/[&<>"']/g,bt=/[<>"']|&(?!#?\w+;)/,kt=/[<>"']|&(?!#?\w+;)/g,wt={"&":"&","<":"<",">":">",'"':""","'":"'"};var xt=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function _t(e){return e.replace(xt,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}var St=/(^|[^\[])\^/g;var At=/[^\w:]/g,Tt=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;var Et={},Rt=/^[^:]+:\/*[^/]*$/,Ot=/^([^:]+:)[\s\S]*$/,$t=/^([^:]+:\/*[^/]*)[\s\S]*$/;function Ft(e,t){Et[" "+e]||(Rt.test(e)?Et[" "+e]=e+"/":Et[" "+e]=Ct(e,"/",!0));var n=-1===(e=Et[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(Ot,"$1")+t:"/"===t.charAt(0)?n?t:e.replace($t,"$1")+t:e+t}function Ct(e,t,n){var r=e.length;if(0===r)return"";for(var i=0;it)n.splice(t);else for(;n.length>=1,e+=e;return n+e},jt=mt.defaults,Ht=Ct,qt=It,Ut=Lt,Bt=I;function Zt(e,t,n){var r=t.href,i=t.title?Ut(t.title):null,t=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:n,href:r,title:i,text:t}:{type:"image",raw:n,href:r,title:i,text:Ut(t)}}var Gt=function(){function e(e){this.options=e||jt}return e.prototype.space=function(e){e=this.rules.block.newline.exec(e);if(e)return 1=n.length?e.slice(n.length):e}).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim():t[2],text:e}}},e.prototype.heading=function(e){var t=this.rules.block.heading.exec(e);if(t){var n=t[2].trim();return/#$/.test(n)&&(e=Ht(n,"#"),!this.options.pedantic&&e&&!/ $/.test(e)||(n=e.trim())),{type:"heading",raw:t[0],depth:t[1].length,text:n}}},e.prototype.nptable=function(e){e=this.rules.block.nptable.exec(e);if(e){var t={type:"table",header:qt(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(t.header.length===t.align.length){for(var n=t.align.length,r=0;r ?/gm,"");return{type:"blockquote",raw:t[0],text:e}}},e.prototype.list=function(e){e=this.rules.block.list.exec(e);if(e){for(var t,n,r,i,o,a=e[0],s=e[2],l=1d[1].length:r[1].length>d[0].length||3/i.test(e[0])&&(t=!1),!n&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?n=!0:n&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(n=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:t,inRawBlock:n,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Ut(e[0]):e[0]}},e.prototype.link=function(e){var t=this.rules.inline.link.exec(e);if(t){var n=t[2].trim();if(!this.options.pedantic&&/^$/.test(n))return;e=Ht(n.slice(0,-1),"\\");if((n.length-e.length)%2==0)return}else{var r=Bt(t[2],"()");-1$/.test(n)?r.slice(1):r.slice(1,-1)),Zt(t,{href:r?r.replace(this.rules.inline._escapes,"$1"):r,title:o?o.replace(this.rules.inline._escapes,"$1"):o},t[0])}},e.prototype.reflink=function(e,t){if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){e=(n[2]||n[1]).replace(/\s+/g," ");if((e=t[e.toLowerCase()])&&e.href)return Zt(n,e,n[0]);var n=n[0].charAt(0);return{type:"text",raw:n,text:n}}},e.prototype.strong=function(e,t,n){void 0===n&&(n="");var r=this.rules.inline.strong.start.exec(e);if(r&&(!r[1]||r[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var i,o="**"===r[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(o.lastIndex=0;null!=(r=o.exec(t));)if(i=this.rules.inline.strong.middle.exec(t.slice(0,r.index+3)))return{type:"strong",raw:e.slice(0,i[0].length),text:e.slice(2,i[0].length-2)}}},e.prototype.em=function(e,t,n){void 0===n&&(n="");var r=this.rules.inline.em.start.exec(e);if(r&&(!r[1]||r[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var i,o="*"===r[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(o.lastIndex=0;null!=(r=o.exec(t));)if(i=this.rules.inline.em.middle.exec(t.slice(0,r.index+2)))return{type:"em",raw:e.slice(0,i[0].length),text:e.slice(1,i[0].length-1)}}},e.prototype.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),r=/[^ ]/.test(n),e=/^ /.test(n)&&/ $/.test(n);return r&&e&&(n=n.substring(1,n.length-1)),n=Ut(n,!0),{type:"codespan",raw:t[0],text:n}}},e.prototype.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},e.prototype.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2]}},e.prototype.autolink=function(e,t){e=this.rules.inline.autolink.exec(e);if(e){var n,t="@"===e[2]?"mailto:"+(n=Ut(this.options.mangle?t(e[1]):e[1])):n=Ut(e[1]);return{type:"link",raw:e[0],text:n,href:t,tokens:[{type:"text",raw:n,text:n}]}}},e.prototype.url=function(e,t){var n,r,i,o;if(n=this.rules.inline.url.exec(e)){if("@"===n[2])i="mailto:"+(r=Ut(this.options.mangle?t(n[0]):n[0]));else{for(;o=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0],o!==n[0];);r=Ut(n[0]),i="www."===n[1]?"http://"+r:r}return{type:"link",raw:n[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}},e.prototype.inlineText=function(e,t,n){e=this.rules.inline.text.exec(e);if(e){n=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Ut(e[0]):e[0]:Ut(this.options.smartypants?n(e[0]):e[0]);return{type:"text",raw:e[0],text:n}}},e}(),It=Dt,I=Nt,Dt=Pt,Nt={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:It,table:It,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};Nt.def=I(Nt.def).replace("label",Nt._label).replace("title",Nt._title).getRegex(),Nt.bullet=/(?:[*+-]|\d{1,9}[.)])/,Nt.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,Nt.item=I(Nt.item,"gm").replace(/bull/g,Nt.bullet).getRegex(),Nt.listItemStart=I(/^( *)(bull)/).replace("bull",Nt.bullet).getRegex(),Nt.list=I(Nt.list).replace(/bull/g,Nt.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+Nt.def.source+")").getRegex(),Nt._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Nt._comment=/|$)/,Nt.html=I(Nt.html,"i").replace("comment",Nt._comment).replace("tag",Nt._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Nt.paragraph=I(Nt._paragraph).replace("hr",Nt.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Nt._tag).getRegex(),Nt.blockquote=I(Nt.blockquote).replace("paragraph",Nt.paragraph).getRegex(),Nt.normal=Dt({},Nt),Nt.gfm=Dt({},Nt.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),Nt.gfm.nptable=I(Nt.gfm.nptable).replace("hr",Nt.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Nt._tag).getRegex(),Nt.gfm.table=I(Nt.gfm.table).replace("hr",Nt.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Nt._tag).getRegex(),Nt.pedantic=Dt({},Nt.normal,{html:I("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",Nt._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:It,paragraph:I(Nt.normal._paragraph).replace("hr",Nt.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",Nt.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});It={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:It,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:It,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};It.punctuation=I(It.punctuation).replace(/punctuation/g,It._punctuation).getRegex(),It._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",It._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",It._comment=I(Nt._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),It.em.start=I(It.em.start).replace(/punctuation/g,It._punctuation).getRegex(),It.em.middle=I(It.em.middle).replace(/punctuation/g,It._punctuation).replace(/overlapSkip/g,It._overlapSkip).getRegex(),It.em.endAst=I(It.em.endAst,"g").replace(/punctuation/g,It._punctuation).getRegex(),It.em.endUnd=I(It.em.endUnd,"g").replace(/punctuation/g,It._punctuation).getRegex(),It.strong.start=I(It.strong.start).replace(/punctuation/g,It._punctuation).getRegex(),It.strong.middle=I(It.strong.middle).replace(/punctuation/g,It._punctuation).replace(/overlapSkip/g,It._overlapSkip).getRegex(),It.strong.endAst=I(It.strong.endAst,"g").replace(/punctuation/g,It._punctuation).getRegex(),It.strong.endUnd=I(It.strong.endUnd,"g").replace(/punctuation/g,It._punctuation).getRegex(),It.blockSkip=I(It._blockSkip,"g").getRegex(),It.overlapSkip=I(It._overlapSkip,"g").getRegex(),It._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,It._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,It._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,It.autolink=I(It.autolink).replace("scheme",It._scheme).replace("email",It._email).getRegex(),It._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,It.tag=I(It.tag).replace("comment",It._comment).replace("attribute",It._attribute).getRegex(),It._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,It._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,It._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,It.link=I(It.link).replace("label",It._label).replace("href",It._href).replace("title",It._title).getRegex(),It.reflink=I(It.reflink).replace("label",It._label).getRegex(),It.reflinkSearch=I(It.reflinkSearch,"g").replace("reflink",It.reflink).replace("nolink",It.nolink).getRegex(),It.normal=Dt({},It),It.pedantic=Dt({},It.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:I(/^!?\[(label)\]\((.*?)\)/).replace("label",It._label).getRegex(),reflink:I(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",It._label).getRegex()}),It.gfm=Dt({},It.normal,{escape:I(It.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\'+(n?e:nn(e,!0))+"\n":"
    "+(n?e:nn(e,!0))+"
    \n"},e.prototype.blockquote=function(e){return"
    \n"+e+"
    \n"},e.prototype.html=function(e){return e},e.prototype.heading=function(e,t,n,r){return this.options.headerIds?"'+e+"\n":""+e+"\n"},e.prototype.hr=function(){return this.options.xhtml?"
    \n":"
    \n"},e.prototype.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"},e.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},e.prototype.checkbox=function(e){return" "},e.prototype.paragraph=function(e){return"

    "+e+"

    \n"},e.prototype.table=function(e,t){return"\n\n"+e+"\n"+(t=t&&""+t+"")+"
    \n"},e.prototype.tablerow=function(e){return"\n"+e+"\n"},e.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},e.prototype.strong=function(e){return""+e+""},e.prototype.em=function(e){return""+e+""},e.prototype.codespan=function(e){return""+e+""},e.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},e.prototype.del=function(e){return""+e+""},e.prototype.link=function(e,t,n){if(null===(e=tn(this.options.sanitize,this.options.baseUrl,e)))return n;e='"},e.prototype.image=function(e,t,n){if(null===(e=tn(this.options.sanitize,this.options.baseUrl,e)))return n;n=''+n+'":">"},e.prototype.text=function(e){return e},e}(),on=function(){function e(){}return e.prototype.strong=function(e){return e},e.prototype.em=function(e){return e},e.prototype.codespan=function(e){return e},e.prototype.del=function(e){return e},e.prototype.html=function(e){return e},e.prototype.text=function(e){return e},e.prototype.link=function(e,t,n){return""+n},e.prototype.image=function(e,t,n){return""+n},e.prototype.br=function(){return""},e}(),an=function(){function e(){this.seen={}}return e.prototype.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},e.prototype.getNextSafeSlug=function(e,t){var n=e,r=0;if(this.seen.hasOwnProperty(n))for(r=this.seen[e];n=e+"-"+ ++r,this.seen.hasOwnProperty(n););return t||(this.seen[e]=r,this.seen[n]=0),n},e.prototype.slug=function(e,t){void 0===t&&(t={});var n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)},e}(),sn=mt.defaults,ln=zt,cn=function(){function n(e){this.options=e||sn,this.options.renderer=this.options.renderer||new rn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new on,this.slugger=new an}return n.parse=function(e,t){return new n(t).parse(e)},n.parseInline=function(e,t){return new n(t).parseInline(e)},n.prototype.parse=function(e,t){void 0===t&&(t=!0);for(var n,r,i,o,a,s,l,c,u,p,h,d,f,g,m,v="",y=e.length,b=0;bAn error occurred:

    "+hn(e.message+"",!0)+"
    ";throw e}}fn.options=fn.setOptions=function(e){return un(fn.defaults,e),dn(fn.defaults),fn},fn.getDefaults=Lt,fn.defaults=mt,fn.use=function(o){var t,e=un({},o);if(o.renderer){var n,a=fn.defaults.renderer||new rn;for(n in o.renderer)!function(r){var i=a[r];a[r]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=o.renderer[r].apply(a,e);return!1===n&&(n=i.apply(a,e)),n}}(n);e.renderer=a}if(o.tokenizer){var i,s=fn.defaults.tokenizer||new Gt;for(i in o.tokenizer)!function(){var r=s[i];s[i]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=o.tokenizer[i].apply(s,e);return!1===n&&(n=r.apply(s,e)),n}}();e.tokenizer=s}o.walkTokens&&(t=fn.defaults.walkTokens,e.walkTokens=function(e){o.walkTokens(e),t&&t(e)}),fn.setOptions(e)},fn.walkTokens=function(e,t){for(var n=0,r=e;nAn error occurred:

    "+hn(e.message+"",!0)+"
    ";throw e}},fn.Parser=cn,fn.parser=cn.parse,fn.Renderer=rn,fn.TextRenderer=on,fn.Lexer=Jt,fn.lexer=Jt.lex,fn.Tokenizer=Gt,fn.Slugger=an;var gn=fn.parse=fn;function mn(e,n){if(void 0===n&&(n='
      {inner}
    '),!e||!e.length)return"";var r="";return e.forEach(function(e){var t=e.title.replace(/(<([^>]+)>)/g,"");r+='
  • '+e.title+"
  • ",e.children&&(r+=mn(e.children,n))}),n.replace("{inner}",r)}function vn(e,t){return'

    '+t.slice(5).trim()+"

    "}function yn(e,r){var i=[],o={};return e.forEach(function(e){var t=e.level||1,n=t-1;r?@[\]^`{|}~]/g;function wn(e){return e.toLowerCase()}function xn(e){if("string"!=typeof e)return"";var t=e.trim().replace(/[A-Z]+/g,wn).replace(/<[^>]+>/g,"").replace(kn,"").replace(/\s/g,"-").replace(/-+/g,"-").replace(/^(\d)/,"_$1"),e=bn[t],e=l.call(bn,t)?e+1:0;return(bn[t]=e)&&(t=t+"-"+e),t}function _n(e,t){return''+t+''}function Sn(e){void 0===e&&(e="");var r={};return{str:e=e&&e.replace(/^('|")/,"").replace(/('|")$/,"").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g,function(e,t,n){return-1===t.indexOf(":")?(r[t]=n&&n.replace(/"/g,"")||!0,""):e}).trim(),config:r}}function An(e){return void 0===e&&(e=""),e.replace(/(<\/?a.*?>)/gi,"")}xn.clear=function(){bn={}};var Tn,En=ft(function(e){var a,s,l,c,u,r,t,i=function(l){var c=/\blang(?:uage)?-([\w-]+)\b/i,t=0,$={manual:l.Prism&&l.Prism.manual,disableWorkerMessageHandler:l.Prism&&l.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof F?new F(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=a.reach);y+=v.value.length,v=v.next){var b=v.value;if(n.length>t.length)return;if(!(b instanceof F)){var k,w=1;if(f){if(!(k=C(m,y,t,d)))break;var x=k.index,_=k.index+k[0].length,S=y;for(S+=v.value.length;S<=x;)v=v.next,S+=v.value.length;if(S-=v.value.length,y=S,v.value instanceof F)continue;for(var A=v;A!==n.tail&&(S<_||"string"==typeof A.value);A=A.next)w++,S+=A.value.length;w--,b=t.slice(y,S),k.index-=y}else if(!(k=C(m,0,b,d)))continue;var x=k.index,T=k[0],E=b.slice(0,x),R=b.slice(x+T.length),O=y+b.length;a&&O>a.reach&&(a.reach=O);var b=v.prev;E&&(b=L(n,b,E),y+=E.length),z(n,b,w);var T=new F(s,h?$.tokenize(T,h):T,g,T);v=L(n,b,T),R&&L(n,v,R),1"+i.content+""},!l.document)return l.addEventListener&&($.disableWorkerMessageHandler||l.addEventListener("message",function(e){var t=JSON.parse(e.data),n=t.language,e=t.code,t=t.immediateClose;l.postMessage($.highlight(e,$.languages[n],n)),t&&l.close()},!1)),$;var e,n=$.util.currentScript();function r(){$.manual||$.highlightAll()}return n&&($.filename=n.src,n.hasAttribute("data-manual")&&($.manual=!0)),$.manual||("loading"===(e=document.readyState)||"interactive"===e&&n&&n.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),$}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});function p(e,t){var n=(n=e.className).replace(r," ")+" language-"+t;e.className=n.replace(/\s+/g," ").trim()}e.exports&&(e.exports=i),void 0!==dt&&(dt.Prism=i),i.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},i.languages.markup.tag.inside["attr-value"].inside.entity=i.languages.markup.entity,i.languages.markup.doctype.inside["internal-subset"].inside=i.languages.markup,i.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(i.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:i.languages[t]},n.cdata=/^$/i;n={"included-cdata":{pattern://i,inside:n}};n["language-"+t]={pattern:/[\s\S]+/,inside:i.languages[t]};t={};t[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},i.languages.insertBefore("markup","cdata",t)}}),i.languages.html=i.languages.markup,i.languages.mathml=i.languages.markup,i.languages.svg=i.languages.markup,i.languages.xml=i.languages.extend("markup",{}),i.languages.ssml=i.languages.xml,i.languages.atom=i.languages.xml,i.languages.rss=i.languages.xml,function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/(^|["'\s])style\s*=\s*(?:"[^"]*"|'[^']*')/i,lookbehind:!0,inside:{"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{style:{pattern:/(["'])[\s\S]+(?=["']$)/,lookbehind:!0,alias:"language-css",inside:e.languages.css},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},"attr-name":/^style/i}}},t.tag))}(i),i.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},i.languages.javascript=i.languages.extend("clike",{"class-name":[i.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),i.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,i.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:i.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:i.languages.javascript},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,inside:i.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:i.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:i.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),i.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:i.languages.javascript}},string:/[\s\S]+/}}}),i.languages.markup&&i.languages.markup.tag.addInlined("script","javascript"),i.languages.js=i.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),a=window.Prism,s={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},u="pre[data-src]:not(["+(l="data-src-status")+'="loaded"]):not(['+l+'="'+(c="loading")+'"])',r=/\blang(?:uage)?-([\w-]+)\b/i,a.hooks.add("before-highlightall",function(e){e.selector+=", "+u}),a.hooks.add("before-sanity-check",function(e){var t,n,r,i,o=e.element;o.matches(u)&&(e.code="",o.setAttribute(l,c),(t=o.appendChild(document.createElement("CODE"))).textContent="Loading…",n=o.getAttribute("data-src"),"none"===(e=e.language)&&(r=(/\.(\w+)$/.exec(n)||[,"none"])[1],e=s[r]||r),p(t,e),p(o,e),(r=a.plugins.autoloader)&&r.loadLanguages(e),(i=new XMLHttpRequest).open("GET",n,!0),i.onreadystatechange=function(){4==i.readyState&&(i.status<400&&i.responseText?(o.setAttribute(l,"loaded"),t.textContent=i.responseText,a.highlightElement(t)):(o.setAttribute(l,"failed"),400<=i.status?t.textContent="✖ Error "+i.status+" while fetching file: "+i.statusText:t.textContent="✖ Error: File does not exist or is empty"))},i.send(null))}),t=!(a.plugins.fileHighlight={highlight:function(e){for(var t,n=(e||document).querySelectorAll(u),r=0;t=n[r++];)a.highlightElement(t)}}),a.fileHighlight=function(){t||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),t=!0),a.plugins.fileHighlight.highlight.apply(this,arguments)})});function Rn(e,t){return"___"+e.toUpperCase()+t+"___"}Tn=Prism,Object.defineProperties(Tn.languages["markup-templating"]={},{buildPlaceholders:{value:function(r,i,e,o){var a;r.language===i&&(a=r.tokenStack=[],r.code=r.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var t,n=a.length;-1!==r.code.indexOf(t=Rn(i,n));)++n;return a[n]=e,t}),r.grammar=Tn.languages.markup)}},tokenizePlaceholders:{value:function(c,u){var p,h;c.language===u&&c.tokenStack&&(c.grammar=Tn.languages[u],p=0,h=Object.keys(c.tokenStack),function e(t){for(var n=0;n=h.length);n++){var r,i,o,a,s,l=t[n];"string"==typeof l||l.content&&"string"==typeof l.content?(i=h[p],o=c.tokenStack[i],r="string"==typeof l?l:l.content,s=Rn(u,i),-1<(a=r.indexOf(s))&&(++p,i=r.substring(0,a),o=new Tn.Token(u,Tn.tokenize(o,c.grammar),"language-"+u,o),a=r.substring(a+s.length),s=[],i&&s.push.apply(s,e([i])),s.push(o),a&&s.push.apply(s,e([a])),"string"==typeof l?t.splice.apply(t,[n,1].concat(s)):l.content=s)):l.content&&e(l.content)}return t}(c.tokens))}}});function On(i,e){var o=this;this.config=i,this.router=e,this.cacheTree={},this.toc=[],this.cacheTOC={},this.linkTarget=i.externalLinkTarget||"_blank",this.linkRel="_blank"===this.linkTarget?i.externalLinkRel||"noopener":"",this.contentBase=e.getBasePath();var t=this._initRenderer();this.heading=t.heading;var a=r(e=i.markdown||{})?e(gn,t):(gn.setOptions(y(e,{renderer:y(t,e.renderer)})),gn);this._marked=a,this.compile=function(n){var r=!0,e=s(function(e){r=!1;var t="";return n?(t=c(n)?a(n):a.parser(n),t=i.noEmoji?t:t.replace(/:\+1:/g,":thumbsup:").replace(/:-1:/g,":thumbsdown:").replace(/<(pre|template|code)[^>]*?>[\s\S]+?<\/(pre|template|code)>/g,function(e){return e.replace(/:/g,"__colon__")}).replace(/:(\w+?):/gi,window.emojify||_n).replace(/__colon__/g,":"),xn.clear(),t):n})(n),t=o.router.parse().file;return r?o.toc=o.cacheTOC[t]:o.cacheTOC[t]=[].concat(o.toc),e}}var $n={},Fn={markdown:function(e){return{url:e}},mermaid:function(e){return{url:e}},iframe:function(e,t){return{html:'"}},video:function(e,t){return{html:'"}},audio:function(e,t){return{html:'"}},code:function(e,t){var n=e.match(/\.(\w+)$/);return"md"===(n=t||n&&n[1])&&(n="markdown"),{url:e,lang:n}}};On.prototype.compileEmbed=function(e,t){var n,r,i=Sn(t),o=i.str,i=i.config;if(t=o,i.include)return O(e)||(e=N(this.contentBase,F(this.router.getCurrentPath()),e)),i.type&&(r=Fn[i.type])?(n=r.call(this,e,t)).type=i.type:(r="code",/\.(md|markdown)/.test(e)?r="markdown":/\.mmd/.test(e)?r="mermaid":/\.html?/.test(e)?r="iframe":/\.(mp4|ogg)/.test(e)?r="video":/\.mp3/.test(e)&&(r="audio"),(n=Fn[r].call(this,e,t)).type=r),n.fragment=i.fragment,n},On.prototype._matchNotCompileLink=function(e){for(var t=this.config.noCompileLinks||[],n=0;n/g.test(r)&&(r=r.replace("\x3c!-- {docsify-ignore} --\x3e",""),e.title=An(r),e.ignoreSubHeading=!0),/{docsify-ignore}/g.test(r)&&(r=r.replace("{docsify-ignore}",""),e.title=An(r),e.ignoreSubHeading=!0),//g.test(r)&&(r=r.replace("\x3c!-- {docsify-ignore-all} --\x3e",""),e.title=An(r),e.ignoreAllSubs=!0),/{docsify-ignore-all}/g.test(r)&&(r=r.replace("{docsify-ignore-all}",""),e.title=An(r),e.ignoreAllSubs=!0);n=xn(i.id||r),i=o.toURL(o.getCurrentPath(),{id:n});return e.slug=i,h.toc.push(e),"'+r+""},i.code={renderer:e}.renderer.code=function(e,t){void 0===t&&(t="markup");var n=En.languages[t]||En.languages.markup;return'
    '+En.highlight(e.replace(/@DOCSIFY_QM@/g,"`"),n,t)+"
    "},i.link=(n=(t={renderer:e,router:o,linkTarget:t,linkRel:n,compilerClass:h}).renderer,a=t.router,s=t.linkTarget,l=t.linkRel,c=t.compilerClass,n.link=function(e,t,n){void 0===t&&(t="");var r=[],i=Sn(t),o=i.str,i=i.config;return s=i.target||s,l="_blank"===s?c.config.externalLinkRel||"noopener":"",t=o,O(e)||c._matchNotCompileLink(e)||i.ignore?(O(e)||"./"!==e.slice(0,2)||(e=document.URL.replace(/\/(?!.*\/).*/,"/").replace("#/./","")+e),r.push(0===e.indexOf("mailto:")?"":'target="'+s+'"'),r.push(0!==e.indexOf("mailto:")&&""!==l?' rel="'+l+'"':"")):(e===c.config.homepage&&(e="README"),e=a.toURL(e,null,a.getCurrentPath())),i.crossorgin&&"_self"===s&&"history"===c.config.routerMode&&-1===c.config.crossOriginLinks.indexOf(e)&&c.config.crossOriginLinks.push(e),i.disabled&&(r.push("disabled"),e="javascript:void(0)"),i.class&&r.push('class="'+i.class+'"'),i.id&&r.push('id="'+i.id+'"'),t&&r.push('title="'+t+'"'),'"+n+""}),i.paragraph={renderer:e}.renderer.paragraph=function(e){e=/^!>/.test(e)?vn("tip",e):/^\?>/.test(e)?vn("warn",e):"

    "+e+"

    ";return e},i.image=(r=(n={renderer:e,contentBase:r,router:o}).renderer,u=n.contentBase,p=n.router,r.image=function(e,t,n){var r=e,i=[],o=Sn(t),a=o.str,o=o.config;return t=a,o["no-zoom"]&&i.push("data-no-zoom"),t&&i.push('title="'+t+'"'),o.size&&(t=(a=o.size.split("x"))[0],(a=a[1])?i.push('width="'+t+'" height="'+a+'"'):i.push('width="'+t+'"')),o.class&&i.push('class="'+o.class+'"'),o.id&&i.push('id="'+o.id+'"'),O(e)||(r=N(u,F(p.getCurrentPath()),e)),0":''+n+'"}),i.list={renderer:e}.renderer.list=function(e,t,n){t=t?"ol":"ul";return"<"+t+" "+[/
  • /.test(e.split('class="task-list"')[0])?'class="task-list"':"",n&&1"+e+""},i.listitem={renderer:e}.renderer.listitem=function(e){return/^(]*>)/.test(e)?'
  • ":"
  • "+e+"
  • "},e.origin=i,e},On.prototype.sidebar=function(e,t){var n=this.toc,r=this.router.getCurrentPath(),i="";if(e)i=this.compile(e);else{for(var o=0;o{inner}");this.cacheTree[r]=t}return i},On.prototype.subSidebar=function(e){if(e){var t=this.router.getCurrentPath(),n=this.cacheTree,r=this.toc;r[0]&&r[0].ignoreAllSubs&&r.splice(0),r[0]&&1===r[0].level&&r.shift();for(var i=0;i\n'+e+"\n"}]).links={}:(t=[{type:"html",text:e}]).links={}),o({token:i,embedToken:t}),++l>=s&&o({})}}(t);t.embed.url?ce(t.embed.url).then(r):r(t.embed.html)}}({compile:n,embedTokens:s,fetch:t},function(e){var t,n=e.embedToken,e=e.token;e?(t=e.index,u.forEach(function(e){t>e.start&&(t+=e.length)}),y(c,n.links),a=a.slice(0,t).concat(n,a.slice(t+1)),u.push({start:t,length:n.length-1})):(zn[i]=a.concat(),a.links=zn[i].links=c,r(a))})}function Mn(e,t,n){var r,i,o,a;return t="function"==typeof n?n(t):"string"==typeof n?(o=[],a=0,(r=n).replace(B,function(t,e,n){o.push(r.substring(a,n-1)),a=n+=t.length+1,o.push(i&&i[t]||function(e){return("00"+("string"==typeof Z[t]?e[Z[t]]():Z[t](e))).slice(-t.length)})}),a!==r.length&&o.push(r.substring(a)),function(e){for(var t="",n=0,r=e||new Date;n404 - Not found","Vue"in window)for(var o=0,a=k(".markdown-section > *").filter(t);oscript").filter(function(e){return!/template/.test(e.type)})[0])||(e=e.innerText.trim())&&new Function(e)()),"Vue"in window){var l,c,u=[],p=Object.keys(n.vueComponents||{});2===i&&p.length&&p.forEach(function(e){window.Vue.options.components[e]||window.Vue.component(e,n.vueComponents[e])}),!Cn&&n.vueGlobalOptions&&"function"==typeof n.vueGlobalOptions.data&&(Cn=n.vueGlobalOptions.data()),u.push.apply(u,Object.keys(n.vueMounts||{}).map(function(e){return[b(r,e),n.vueMounts[e]]}).filter(function(e){var t=e[0];e[1];return t})),(n.vueGlobalOptions||p.length)&&(l=/{{2}[^{}]*}{2}/,c=/<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/,u.push.apply(u,k(".markdown-section > *").filter(function(n){return!u.some(function(e){var t=e[0];e[1];return t===n})}).filter(function(e){return e.tagName.toLowerCase()in(n.vueComponents||{})||e.querySelector(p.join(",")||null)||l.test(e.outerHTML)||c.test(e.outerHTML)}).map(function(e){var t=y({},n.vueGlobalOptions||{});return Cn&&(t.data=function(){return Cn}),[e,t]})));for(var h=0,d=u;h([^<]*?)

    $'))&&("color"===t[2]?r.style.background=t[1]+(t[3]||""):(e=t[1],S(r,"add","has-mask"),O(t[1])||(e=N(this.router.getBasePath(),t[1])),r.style.backgroundImage="url("+e+")",r.style.backgroundSize="cover",r.style.backgroundPosition="center center"),n=n.replace(t[0],"")),this._renderTo(".cover-main",n),he()):S(r,"remove","show")},t.prototype._updateRender=function(){var e,t,n,r;e=this,t=d(".app-name-link"),n=e.config.nameLink,r=e.route.path,t&&(c(e.config.nameLink)?t.setAttribute("href",n):"object"==typeof n&&(e=Object.keys(n).filter(function(e){return-1'):"")),e.coverpage&&(c+=(r=", 100%, 85%",'
    \x3c!--cover--\x3e
    ')),e.logo&&(r=/^data:image/.test(e.logo),t=/(?:http[s]?:)?\/\//.test(e.logo),n=/^\./.test(e.logo),r||t||n||(e.logo=N(this.router.getBasePath(),e.logo))),c+=(n=(t=e).name?t.name:"","
    "+('')+'
    \x3c!--main--\x3e
    '),this._renderTo(l,c,!0)):this.rendered=!0,e.mergeNavbar&&h?u=b(".sidebar"):(s.classList.add("app-nav"),e.repo||s.classList.add("no-badge")),e.loadNavbar&&w(u,s),e.themeColor&&(f.head.appendChild(v("div","").firstElementChild),o=e.themeColor,window.CSS&&window.CSS.supports&&window.CSS.supports("(--v:red)")||(e=k("style:not(.inserted),link"),[].forEach.call(e,function(e){if("STYLE"===e.nodeName)ue(e,o);else if("LINK"===e.nodeName){e=e.getAttribute("href");if(!/\.css$/.test(e))return;ce(e).then(function(e){e=v("style",e);m.appendChild(e),ue(e,o)})}}))),this._updateRender(),S(g,"ready")},t}(function(n){function e(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];n.apply(this,e),this.route={}}return n&&(e.__proto__=n),((e.prototype=Object.create(n&&n.prototype)).constructor=e).prototype.updateRender=function(){this.router.normalize(),this.route=this.router.parse(),g.setAttribute("data-page",this.route.file)},e.prototype.initRouter=function(){var t=this,e=this.config,e=new("history"===(e.routerMode||"hash")&&i?q:H)(e);this.router=e,this.updateRender(),U=this.route,e.onchange(function(e){t.updateRender(),t._updateRender(),U.path!==t.route.path?(t.$fetch(u,t.$resetEvents.bind(t,e.source)),U=t.route):t.$resetEvents(e.source)})},e}(function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.initLifecycle=function(){var n=this;this._hooks={},this._lifecycle={},["init","mounted","beforeEach","afterEach","doneEach","ready"].forEach(function(e){var t=n._hooks[e]=[];n._lifecycle[e]=function(e){return t.push(e)}})},t.prototype.callHook=function(e,n,r){void 0===r&&(r=u);var i=this._hooks[e],o=function(t){var e=i[t];t>=i.length?r(n):"function"==typeof e?2===e.length?e(n,function(e){n=e,o(t+1)}):(e=e(n),n=void 0===e?n:e,o(t+1)):o(t+1)};o(0)},t}(Hn)))))));function Un(e,t,n){return jn&&jn.abort&&jn.abort(),jn=ce(e,!0,n)}window.Docsify={util:In,dom:t,get:ce,slugify:xn,version:"4.12.2"},window.DocsifyCompiler=On,window.marked=gn,window.Prism=En,e(function(e){return new qn})}(); --------------------------------------------------------------------------------