├── example ├── .nojekyll ├── README.md ├── index.html └── docsify-footer-enh.js ├── .prettierrc ├── src ├── index.js └── plugin-footer.js ├── README.md ├── .editorconfig ├── package.json ├── .vscode └── settings.json ├── .npmignore ├── .gitignore └── LICENSE /example/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # Footer Plugin for Docsify 2 | 3 | ## Example 4 | 5 | Text 6 | Text 7 | 8 | 1. More Text 9 | 2. More Text 10 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | # Prettier configuration 2 | 3 | printWidth: 140 4 | singleQuote: true 5 | tabWidth: 2 6 | useTabs: false 7 | 8 | # js and ts rules: 9 | arrowParens: avoid 10 | 11 | # jsx and tsx rules: 12 | jsxBracketSameLine: false 13 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { install } from './plugin-footer'; 2 | 3 | // if (!window.$docsify) { 4 | // window.$docsify = {} 5 | // } 6 | window.$docsify = window.$docsify || {}; 7 | window.$docsify.plugins = (window.$docsify.plugins || []).concat(install); 8 | -------------------------------------------------------------------------------- /src/plugin-footer.js: -------------------------------------------------------------------------------- 1 | export function install(hook, vm) { 2 | let userOptions = vm.config.footer; 3 | 4 | let copy = vm.config.footer && vm.config.footer.copy ? vm.config.footer.copy : '© 2019.'; 5 | let auth = 6 | vm.config.footer && vm.config.footer.auth 7 | ? vm.config.footer.auth 8 | : 'Published with docsify.'; 9 | let style = vm.config.footer && vm.config.footer.style ? `style="${vm.config.footer.style}"` : ''; 10 | let clazz = vm.config.footer && vm.config.footer.class ? `class="${vm.config.footer.class}"` : ''; 11 | let pre = vm.config.footer && vm.config.footer.pre ? `${vm.config.footer.pre}` : ''; 12 | 13 | var footer = `${pre}`; 14 | 15 | hook.afterEach(function (html) { 16 | return html + footer; 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docsify-footer 2 | 3 | Footer Enhancement plugin for [Docsify](https://docsify.js.org), based on [Docsify example](https://docsify.js.org/#/write-a-plugin?id=example). 4 | 5 | ## Install 6 | 7 | 1. Then insert script plugin into Docsify document (index.html) 8 | 9 | ```html 10 | 11 | ``` 12 | 13 | 2. Add configuration 14 | 15 | ```html 16 | 27 | ``` 28 | 29 | | Config Option | Description | 30 | | :------------ | :------------------------ | 31 | | copy | Copyright text to display | 32 | | auth | Author text | 33 | | style | Footer CSS inline style | 34 | | class | Footer Classes to include | 35 | | pre | Html pre footer text | 36 | 37 | ## Example 38 | 39 | 1. Run `npm run build` 40 | 1. Run `npm run example` 41 | 1. Go to [http://localhost:3000/]() 42 | 43 | ## License 44 | 45 | [Apache License](LICENSE) 46 | 47 | ## TODO 48 | 49 | - Waiting for recommendations. 50 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Document 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
Loading...
15 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # https://editorconfig.org/ 4 | # By EJA 5 | 6 | # 7 | # Plugin for Eclipse: 8 | # http://editorconfig-eclipse.github.io/repository/ 9 | # 10 | # Kate / KWrite nativ supported 11 | # 12 | # Note++ : Download plugin from configuration 13 | # 14 | # Vim : https://github.com/editorconfig/editorconfig-vim#readme 15 | # Opensuse: zypper in editorconfig vim-plugin-editorconfig 16 | # 17 | # Sublime: https://github.com/sindresorhus/editorconfig-sublime#readme 18 | # Install from Package Control: https://packagecontrol.io/ 19 | 20 | root = true 21 | 22 | # Root config 23 | [*] 24 | charset = utf-8 25 | end_of_line = lf 26 | indent_style = space 27 | indent_size = 4 28 | insert_final_newline = true 29 | trim_trailing_whitespace = true 30 | 31 | [*.md] 32 | trim_trailing_whitespace = false 33 | 34 | # Config for Java & XML 35 | [*.{java,xml}] 36 | indent_size = 4 37 | 38 | # Config for HTML & CSS 39 | [*.{htm,html,css,scss}] 40 | indent_size = 2 41 | 42 | # Config for JS & TS 43 | [*.{ts,tsx,js,jsx}] 44 | indent_size = 2 45 | 46 | # Config for YML & JSON 47 | [*.{yaml,yml,json}] 48 | indent_size = 2 49 | 50 | # Config for Python 51 | [*.py] 52 | indent_size = 4 53 | 54 | # Tab indentation (no size specified) 55 | [Makefile] 56 | indent_style = tab 57 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docsify-footer-enh", 3 | "version": "0.1.0", 4 | "description": "A simple Footer plugin for Docsify", 5 | "main": "src", 6 | "files": [ 7 | "src", 8 | "dist", 9 | "README.md" 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/erickjx/docsify-footer-enh.git" 14 | }, 15 | "author": "Erick JA", 16 | "license": "Apache-2.0", 17 | "bugs": { 18 | "url": "https://github.com/erickjx/docsify-footer-enh/issues" 19 | }, 20 | "homepage": "https://github.com/erickjx/docsify-footer-enh#readme", 21 | "dependencies": {}, 22 | "devDependencies": { 23 | "docsify-cli": "4.4.4", 24 | "license-checker": "latest", 25 | "npm-check-updates": "latest", 26 | "prettier": "3.3.3", 27 | "webpack": "5.95.0", 28 | "webpack-cli": "5.1.4" 29 | }, 30 | "directories": { 31 | "example": "example" 32 | }, 33 | "scripts": { 34 | "build": "npm run build:dev && npm run build:prod", 35 | "build:dev": "webpack ./src/index.js -o ./dist/ --output-filename docsify-footer-enh.js --mode=development && webpack ./src/index.js -o ./example/ --output-filename docsify-footer-enh.js --mode=development", 36 | "build:prod": "webpack ./src/index.js -o ./dist/ --output-filename docsify-footer-enh.min.js --mode=production", 37 | "prettier:format": "npx prettier --write \"{,src/**/,example/**/}*.{md,json,js,ts,html,css,scss,yml}\"", 38 | "prettier:check": "npx prettier --list-different \"{,src/**/,example/**/}*.{md,json,js,ts,html,css,scss,yml}\" ", 39 | "example": "npm run build && npx docsify serve example --open", 40 | "lic-chk": "npx license-checker", 41 | "lib-chk": "npx ncu", 42 | "lib-chk-up": "npx ncu -u" 43 | }, 44 | "keywords": [ 45 | "Docsify", 46 | "Footer" 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "workbench.colorCustomizations": { 3 | "activityBar.background": "#2f7c47", 4 | "activityBar.activeBackground": "#2f7c47", 5 | "activityBar.activeBorder": "#422c74", 6 | "activityBar.foreground": "#e7e7e7", 7 | "activityBar.inactiveForeground": "#e7e7e799", 8 | "activityBarBadge.background": "#422c74", 9 | "activityBarBadge.foreground": "#e7e7e7", 10 | "titleBar.activeBackground": "#215732", 11 | "titleBar.inactiveBackground": "#21573299", 12 | "titleBar.activeForeground": "#e7e7e7", 13 | "titleBar.inactiveForeground": "#e7e7e799", 14 | "statusBar.background": "#215732", 15 | "statusBarItem.hoverBackground": "#2f7c47", 16 | "statusBar.foreground": "#e7e7e7", 17 | "commandCenter.border": "#e7e7e799", 18 | "sash.hoverBorder": "#2f7c47", 19 | "statusBarItem.remoteBackground": "#215732", 20 | "statusBarItem.remoteForeground": "#e7e7e7" 21 | }, 22 | "peacock.color": "#215732", 23 | "files.exclude": { 24 | "**/.git": true, 25 | "**/.gradle": true, 26 | "**/.idea": true, 27 | "**/.mvn": true, 28 | "**/.svn": true, 29 | "**/.hg": true, 30 | "**/.DS_Store": true, 31 | "**/build": true, 32 | "**/target": true, 33 | "**/tmp": true, 34 | "**/.settings": true, 35 | }, 36 | "search.exclude": { 37 | "**/node": true, 38 | "**/node_modules": true, 39 | "**/bower_components": true, 40 | "**/build": true, 41 | "**/target": true, 42 | "**/tmp": true, 43 | "**/.settings": true, 44 | }, 45 | "files.watcherExclude": { 46 | "**/.git/objects/**": true, 47 | "**/.git/subtree-cache/**": true, 48 | "**/node_modules/*/**": true, 49 | "**/.gradle": true, 50 | "**/build": true, 51 | "**/target": true, 52 | "**/tmp": true, 53 | "**/.settings": true, 54 | }, 55 | "java.configuration.updateBuildConfiguration": "automatic", 56 | "explorer.compactFolders": false 57 | } 58 | -------------------------------------------------------------------------------- /example/docsify-footer-enh.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). 3 | * This devtool is neither made for production nor for readable output files. 4 | * It uses "eval()" calls to create a separate source file in the browser devtools. 5 | * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) 6 | * or disable the default devtool with "devtool: false". 7 | * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). 8 | */ 9 | /******/ (() => { // webpackBootstrap 10 | /******/ "use strict"; 11 | /******/ var __webpack_modules__ = ({ 12 | 13 | /***/ "./src/index.js": 14 | /*!**********************!*\ 15 | !*** ./src/index.js ***! 16 | \**********************/ 17 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 18 | 19 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _plugin_footer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./plugin-footer */ \"./src/plugin-footer.js\");\n\n\n// if (!window.$docsify) {\n// window.$docsify = {}\n// }\nwindow.$docsify = window.$docsify || {};\nwindow.$docsify.plugins = (window.$docsify.plugins || []).concat(_plugin_footer__WEBPACK_IMPORTED_MODULE_0__.install);\n\n\n//# sourceURL=webpack://docsify-footer-enh/./src/index.js?"); 20 | 21 | /***/ }), 22 | 23 | /***/ "./src/plugin-footer.js": 24 | /*!******************************!*\ 25 | !*** ./src/plugin-footer.js ***! 26 | \******************************/ 27 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 28 | 29 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ install: () => (/* binding */ install)\n/* harmony export */ });\nfunction install(hook, vm) {\n let userOptions = vm.config.footer;\n\n let copy = vm.config.footer && vm.config.footer.copy ? vm.config.footer.copy : '© 2019.';\n let auth =\n vm.config.footer && vm.config.footer.auth\n ? vm.config.footer.auth\n : 'Published with docsify.';\n let style = vm.config.footer && vm.config.footer.style ? `style=\"${vm.config.footer.style}\"` : '';\n let clazz = vm.config.footer && vm.config.footer.class ? `class=\"${vm.config.footer.class}\"` : '';\n let pre = vm.config.footer && vm.config.footer.pre ? `${vm.config.footer.pre}` : '';\n\n var footer = `${pre}`;\n\n hook.afterEach(function (html) {\n return html + footer;\n });\n}\n\n\n//# sourceURL=webpack://docsify-footer-enh/./src/plugin-footer.js?"); 30 | 31 | /***/ }) 32 | 33 | /******/ }); 34 | /************************************************************************/ 35 | /******/ // The module cache 36 | /******/ var __webpack_module_cache__ = {}; 37 | /******/ 38 | /******/ // The require function 39 | /******/ function __webpack_require__(moduleId) { 40 | /******/ // Check if module is in cache 41 | /******/ var cachedModule = __webpack_module_cache__[moduleId]; 42 | /******/ if (cachedModule !== undefined) { 43 | /******/ return cachedModule.exports; 44 | /******/ } 45 | /******/ // Create a new module (and put it into the cache) 46 | /******/ var module = __webpack_module_cache__[moduleId] = { 47 | /******/ // no module.id needed 48 | /******/ // no module.loaded needed 49 | /******/ exports: {} 50 | /******/ }; 51 | /******/ 52 | /******/ // Execute the module function 53 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 54 | /******/ 55 | /******/ // Return the exports of the module 56 | /******/ return module.exports; 57 | /******/ } 58 | /******/ 59 | /************************************************************************/ 60 | /******/ /* webpack/runtime/define property getters */ 61 | /******/ (() => { 62 | /******/ // define getter functions for harmony exports 63 | /******/ __webpack_require__.d = (exports, definition) => { 64 | /******/ for(var key in definition) { 65 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 66 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 67 | /******/ } 68 | /******/ } 69 | /******/ }; 70 | /******/ })(); 71 | /******/ 72 | /******/ /* webpack/runtime/hasOwnProperty shorthand */ 73 | /******/ (() => { 74 | /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) 75 | /******/ })(); 76 | /******/ 77 | /******/ /* webpack/runtime/make namespace object */ 78 | /******/ (() => { 79 | /******/ // define __esModule on exports 80 | /******/ __webpack_require__.r = (exports) => { 81 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 82 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 83 | /******/ } 84 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); 85 | /******/ }; 86 | /******/ })(); 87 | /******/ 88 | /************************************************************************/ 89 | /******/ 90 | /******/ // startup 91 | /******/ // Load entry module and return exports 92 | /******/ // This entry module can't be inlined because the eval devtool is used. 93 | /******/ var __webpack_exports__ = __webpack_require__("./src/index.js"); 94 | /******/ 95 | /******/ })() 96 | ; -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | package-lock.json 2 | /node_modules 3 | /dist 4 | .npmignore 5 | 6 | ### Backup ### 7 | *.bak 8 | *.gho 9 | *.ori 10 | *.orig 11 | *.tmp 12 | 13 | ### Compressed ### 14 | *.7z 15 | *.deb 16 | *.gz 17 | *.pkg 18 | *.rar 19 | *.rpm 20 | *.sit 21 | *.sitx 22 | *.tar 23 | *.zip 24 | *.zipx 25 | *.tgz 26 | 27 | ### Git ### 28 | # Created by git for backups. To disable backups in Git: 29 | # $ git config --global mergetool.keepBackup false 30 | 31 | # Created by git when using merge tools for conflicts 32 | *.BACKUP.* 33 | *.BASE.* 34 | *.LOCAL.* 35 | *.REMOTE.* 36 | *_BACKUP_*.txt 37 | *_BASE_*.txt 38 | *_LOCAL_*.txt 39 | *_REMOTE_*.txt 40 | 41 | ### Kate ### 42 | # Swap Files # 43 | .*.kate-swp 44 | .swp.* 45 | 46 | ### Linux ### 47 | *~ 48 | 49 | # temporary files which can be created if a process still has a handle open of a deleted file 50 | .fuse_hidden* 51 | 52 | # KDE directory preferences 53 | .directory 54 | 55 | # Linux trash folder which might appear on any partition or disk 56 | .Trash-* 57 | 58 | # .nfs files are created when an open file is removed but is still being accessed 59 | .nfs* 60 | 61 | ### macOS ### 62 | # General 63 | .DS_Store 64 | .AppleDouble 65 | .LSOverride 66 | 67 | # Icon must end with two \r 68 | Icon 69 | 70 | # Thumbnails 71 | ._* 72 | 73 | # Files that might appear in the root of a volume 74 | .DocumentRevisions-V100 75 | .fseventsd 76 | .Spotlight-V100 77 | .TemporaryItems 78 | .Trashes 79 | .VolumeIcon.icns 80 | .com.apple.timemachine.donotpresent 81 | 82 | # Directories potentially created on remote AFP share 83 | .AppleDB 84 | .AppleDesktop 85 | Network Trash Folder 86 | Temporary Items 87 | .apdisk 88 | 89 | ### Node ### 90 | # Logs 91 | logs 92 | *.log 93 | npm-debug.log* 94 | yarn-debug.log* 95 | yarn-error.log* 96 | lerna-debug.log* 97 | 98 | # Diagnostic reports (https://nodejs.org/api/report.html) 99 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 100 | 101 | # Runtime data 102 | pids 103 | *.pid 104 | *.seed 105 | *.pid.lock 106 | 107 | # Directory for instrumented libs generated by jscoverage/JSCover 108 | lib-cov 109 | 110 | # Coverage directory used by tools like istanbul 111 | coverage 112 | *.lcov 113 | 114 | # nyc test coverage 115 | .nyc_output 116 | 117 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 118 | .grunt 119 | 120 | # Bower dependency directory (https://bower.io/) 121 | bower_components 122 | 123 | # node-waf configuration 124 | .lock-wscript 125 | 126 | # Compiled binary addons (https://nodejs.org/api/addons.html) 127 | build/Release 128 | 129 | # Dependency directories 130 | node_modules/ 131 | jspm_packages/ 132 | 133 | # TypeScript v1 declaration files 134 | typings/ 135 | 136 | # TypeScript cache 137 | *.tsbuildinfo 138 | 139 | # Optional npm cache directory 140 | .npm 141 | 142 | # Optional eslint cache 143 | .eslintcache 144 | 145 | # Optional REPL history 146 | .node_repl_history 147 | 148 | # Output of 'npm pack' 149 | 150 | # Yarn Integrity file 151 | .yarn-integrity 152 | 153 | # dotenv environment variables file 154 | .env 155 | .env.test 156 | 157 | # parcel-bundler cache (https://parceljs.org/) 158 | .cache 159 | 160 | # next.js build output 161 | .next 162 | 163 | # nuxt.js build output 164 | .nuxt 165 | 166 | # react / gatsby 167 | public/ 168 | 169 | # vuepress build output 170 | .vuepress/dist 171 | 172 | # Serverless directories 173 | .serverless/ 174 | 175 | # FuseBox cache 176 | .fusebox/ 177 | 178 | # DynamoDB Local files 179 | .dynamodb/ 180 | 181 | ### NotepadPP ### 182 | # Notepad++ backups # 183 | 184 | ### SublimeText ### 185 | # Cache files for Sublime Text 186 | *.tmlanguage.cache 187 | *.tmPreferences.cache 188 | *.stTheme.cache 189 | 190 | # Workspace files are user-specific 191 | *.sublime-workspace 192 | 193 | # Project files should be checked into the repository, unless a significant 194 | # proportion of contributors will probably not be using Sublime Text 195 | # *.sublime-project 196 | 197 | # SFTP configuration file 198 | sftp-config.json 199 | 200 | # Package control specific files 201 | Package Control.last-run 202 | Package Control.ca-list 203 | Package Control.ca-bundle 204 | Package Control.system-ca-bundle 205 | Package Control.cache/ 206 | Package Control.ca-certs/ 207 | Package Control.merged-ca-bundle 208 | Package Control.user-ca-bundle 209 | oscrypto-ca-bundle.crt 210 | bh_unicode_properties.cache 211 | 212 | # Sublime-github package stores a github token in this file 213 | # https://packagecontrol.io/packages/sublime-github 214 | GitHub.sublime-settings 215 | 216 | ### Vim ### 217 | # Swap 218 | [._]*.s[a-v][a-z] 219 | [._]*.sw[a-p] 220 | [._]s[a-rt-v][a-z] 221 | [._]ss[a-gi-z] 222 | [._]sw[a-p] 223 | 224 | # Session 225 | Session.vim 226 | Sessionx.vim 227 | 228 | # Temporary 229 | .netrwhist 230 | # Auto-generated tag files 231 | tags 232 | # Persistent undo 233 | [._]*.un~ 234 | 235 | ### VisualStudioCode ### 236 | .vscode/* 237 | !.vscode/settings.json 238 | !.vscode/tasks.json 239 | !.vscode/launch.json 240 | !.vscode/extensions.json 241 | 242 | ### VisualStudioCode Patch ### 243 | # Ignore all local history of files 244 | .history 245 | 246 | ### Windows ### 247 | # Windows thumbnail cache files 248 | Thumbs.db 249 | Thumbs.db:encryptable 250 | ehthumbs.db 251 | ehthumbs_vista.db 252 | 253 | # Dump file 254 | *.stackdump 255 | 256 | # Folder config file 257 | [Dd]esktop.ini 258 | 259 | # Recycle Bin used on file shares 260 | $RECYCLE.BIN/ 261 | 262 | # Windows Installer files 263 | *.cab 264 | *.msi 265 | *.msix 266 | *.msm 267 | *.msp 268 | 269 | # Windows shortcuts 270 | *.lnk 271 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Extras 3 | package-lock.json 4 | /node_modules 5 | /dist 6 | 7 | # Created by https://www.toptal.com/developers/gitignore/api/git,vim,kate,node,linux,macos,backup,windows,notepadpp,compressed,sublimetext,visualstudiocode 8 | # Edit at https://www.toptal.com/developers/gitignore?templates=git,vim,kate,node,linux,macos,backup,windows,notepadpp,compressed,sublimetext,visualstudiocode 9 | 10 | ### Backup ### 11 | *.bak 12 | *.gho 13 | *.ori 14 | *.orig 15 | *.tmp 16 | 17 | ### Compressed ### 18 | *.7z 19 | *.deb 20 | *.gz 21 | *.pkg 22 | *.rar 23 | *.rpm 24 | *.sit 25 | *.sitx 26 | *.tar 27 | *.zip 28 | *.zipx 29 | *.tgz 30 | 31 | ### Git ### 32 | # Created by git for backups. To disable backups in Git: 33 | # $ git config --global mergetool.keepBackup false 34 | 35 | # Created by git when using merge tools for conflicts 36 | *.BACKUP.* 37 | *.BASE.* 38 | *.LOCAL.* 39 | *.REMOTE.* 40 | *_BACKUP_*.txt 41 | *_BASE_*.txt 42 | *_LOCAL_*.txt 43 | *_REMOTE_*.txt 44 | 45 | ### Kate ### 46 | # Swap Files # 47 | .*.kate-swp 48 | .swp.* 49 | 50 | ### Linux ### 51 | *~ 52 | 53 | # temporary files which can be created if a process still has a handle open of a deleted file 54 | .fuse_hidden* 55 | 56 | # KDE directory preferences 57 | .directory 58 | 59 | # Linux trash folder which might appear on any partition or disk 60 | .Trash-* 61 | 62 | # .nfs files are created when an open file is removed but is still being accessed 63 | .nfs* 64 | 65 | ### macOS ### 66 | # General 67 | .DS_Store 68 | .AppleDouble 69 | .LSOverride 70 | 71 | # Icon must end with two \r 72 | Icon 73 | 74 | # Thumbnails 75 | ._* 76 | 77 | # Files that might appear in the root of a volume 78 | .DocumentRevisions-V100 79 | .fseventsd 80 | .Spotlight-V100 81 | .TemporaryItems 82 | .Trashes 83 | .VolumeIcon.icns 84 | .com.apple.timemachine.donotpresent 85 | 86 | # Directories potentially created on remote AFP share 87 | .AppleDB 88 | .AppleDesktop 89 | Network Trash Folder 90 | Temporary Items 91 | .apdisk 92 | 93 | ### Node ### 94 | # Logs 95 | logs 96 | *.log 97 | npm-debug.log* 98 | yarn-debug.log* 99 | yarn-error.log* 100 | lerna-debug.log* 101 | 102 | # Diagnostic reports (https://nodejs.org/api/report.html) 103 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 104 | 105 | # Runtime data 106 | pids 107 | *.pid 108 | *.seed 109 | *.pid.lock 110 | 111 | # Directory for instrumented libs generated by jscoverage/JSCover 112 | lib-cov 113 | 114 | # Coverage directory used by tools like istanbul 115 | coverage 116 | *.lcov 117 | 118 | # nyc test coverage 119 | .nyc_output 120 | 121 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 122 | .grunt 123 | 124 | # Bower dependency directory (https://bower.io/) 125 | bower_components 126 | 127 | # node-waf configuration 128 | .lock-wscript 129 | 130 | # Compiled binary addons (https://nodejs.org/api/addons.html) 131 | build/Release 132 | 133 | # Dependency directories 134 | node_modules/ 135 | jspm_packages/ 136 | 137 | # TypeScript v1 declaration files 138 | typings/ 139 | 140 | # TypeScript cache 141 | *.tsbuildinfo 142 | 143 | # Optional npm cache directory 144 | .npm 145 | 146 | # Optional eslint cache 147 | .eslintcache 148 | 149 | # Microbundle cache 150 | .rpt2_cache/ 151 | .rts2_cache_cjs/ 152 | .rts2_cache_es/ 153 | .rts2_cache_umd/ 154 | 155 | # Optional REPL history 156 | .node_repl_history 157 | 158 | # Output of 'npm pack' 159 | 160 | # Yarn Integrity file 161 | .yarn-integrity 162 | 163 | # dotenv environment variables file 164 | .env 165 | .env.test 166 | 167 | # parcel-bundler cache (https://parceljs.org/) 168 | .cache 169 | 170 | # Next.js build output 171 | .next 172 | 173 | # Nuxt.js build / generate output 174 | .nuxt 175 | dist 176 | 177 | # Gatsby files 178 | .cache/ 179 | # Comment in the public line in if your project uses Gatsby and not Next.js 180 | # https://nextjs.org/blog/next-9-1#public-directory-support 181 | # public 182 | 183 | # vuepress build output 184 | .vuepress/dist 185 | 186 | # Serverless directories 187 | .serverless/ 188 | 189 | # FuseBox cache 190 | .fusebox/ 191 | 192 | # DynamoDB Local files 193 | .dynamodb/ 194 | 195 | # TernJS port file 196 | .tern-port 197 | 198 | # Stores VSCode versions used for testing VSCode extensions 199 | .vscode-test 200 | 201 | ### NotepadPP ### 202 | # Notepad++ backups # 203 | 204 | ### SublimeText ### 205 | # Cache files for Sublime Text 206 | *.tmlanguage.cache 207 | *.tmPreferences.cache 208 | *.stTheme.cache 209 | 210 | # Workspace files are user-specific 211 | *.sublime-workspace 212 | 213 | # Project files should be checked into the repository, unless a significant 214 | # proportion of contributors will probably not be using Sublime Text 215 | # *.sublime-project 216 | 217 | # SFTP configuration file 218 | sftp-config.json 219 | 220 | # Package control specific files 221 | Package Control.last-run 222 | Package Control.ca-list 223 | Package Control.ca-bundle 224 | Package Control.system-ca-bundle 225 | Package Control.cache/ 226 | Package Control.ca-certs/ 227 | Package Control.merged-ca-bundle 228 | Package Control.user-ca-bundle 229 | oscrypto-ca-bundle.crt 230 | bh_unicode_properties.cache 231 | 232 | # Sublime-github package stores a github token in this file 233 | # https://packagecontrol.io/packages/sublime-github 234 | GitHub.sublime-settings 235 | 236 | ### Vim ### 237 | # Swap 238 | [._]*.s[a-v][a-z] 239 | !*.svg # comment out if you don't need vector files 240 | [._]*.sw[a-p] 241 | [._]s[a-rt-v][a-z] 242 | [._]ss[a-gi-z] 243 | [._]sw[a-p] 244 | 245 | # Session 246 | Session.vim 247 | Sessionx.vim 248 | 249 | # Temporary 250 | .netrwhist 251 | # Auto-generated tag files 252 | tags 253 | # Persistent undo 254 | [._]*.un~ 255 | 256 | ### VisualStudioCode ### 257 | .vscode/* 258 | !.vscode/settings.json 259 | !.vscode/tasks.json 260 | !.vscode/launch.json 261 | !.vscode/extensions.json 262 | *.code-workspace 263 | 264 | ### VisualStudioCode Patch ### 265 | # Ignore all local history of files 266 | .history 267 | 268 | ### Windows ### 269 | # Windows thumbnail cache files 270 | Thumbs.db 271 | Thumbs.db:encryptable 272 | ehthumbs.db 273 | ehthumbs_vista.db 274 | 275 | # Dump file 276 | *.stackdump 277 | 278 | # Folder config file 279 | [Dd]esktop.ini 280 | 281 | # Recycle Bin used on file shares 282 | $RECYCLE.BIN/ 283 | 284 | # Windows Installer files 285 | *.cab 286 | *.msi 287 | *.msix 288 | *.msm 289 | *.msp 290 | 291 | # Windows shortcuts 292 | *.lnk 293 | 294 | # End of https://www.toptal.com/developers/gitignore/api/git,vim,kate,node,linux,macos,backup,windows,notepadpp,compressed,sublimetext,visualstudiocode 295 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | --------------------------------------------------------------------------------