├── src ├── assets │ ├── CNAME │ ├── images │ │ └── bg-main.png │ └── _redirects ├── fonts │ └── fontello │ │ ├── font │ │ ├── fontello.eot │ │ ├── fontello.ttf │ │ ├── fontello.woff │ │ ├── fontello.woff2 │ │ └── fontello.svg │ │ ├── LICENSE.txt │ │ ├── css │ │ ├── fontello-codes.css │ │ ├── fontello-ie7-codes.css │ │ ├── fontello-ie7.css │ │ ├── animation.css │ │ ├── fontello.css │ │ └── fontello-embedded.css │ │ ├── config.json │ │ ├── README.txt │ │ └── demo.html ├── less │ ├── index.less │ ├── variables.less │ └── main.less ├── js │ ├── helper.js │ ├── service-worker-helper.js │ ├── minify-worker-helper.js │ └── index.js ├── web-worker.js └── pug │ └── index.pug ├── .babelrc ├── wercker.yml ├── .eslintrc.json ├── .github └── workflows │ └── deploy.yml ├── minify-config.json ├── LICENSE ├── .gitignore ├── README.md ├── package.json └── gulpfile.js /src/assets/CNAME: -------------------------------------------------------------------------------- 1 | minifier.app 2 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/env"], 3 | "plugins": [ 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/images/bg-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wei/minifier/HEAD/src/assets/images/bg-main.png -------------------------------------------------------------------------------- /src/fonts/fontello/font/fontello.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wei/minifier/HEAD/src/fonts/fontello/font/fontello.eot -------------------------------------------------------------------------------- /src/fonts/fontello/font/fontello.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wei/minifier/HEAD/src/fonts/fontello/font/fontello.ttf -------------------------------------------------------------------------------- /src/fonts/fontello/font/fontello.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wei/minifier/HEAD/src/fonts/fontello/font/fontello.woff -------------------------------------------------------------------------------- /src/fonts/fontello/font/fontello.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wei/minifier/HEAD/src/fonts/fontello/font/fontello.woff2 -------------------------------------------------------------------------------- /src/assets/_redirects: -------------------------------------------------------------------------------- 1 | https://www.minifier.app/* https://minifier.app/:splat 301! 2 | https://www.uglify.app/* https://uglify.app/:splat 301! 3 | https://minifier.netlify.com/* https://minifier.app/:splat 301! 4 | -------------------------------------------------------------------------------- /src/fonts/fontello/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Font license info 2 | 3 | 4 | ## Font Awesome 5 | 6 | Copyright (C) 2016 by Dave Gandy 7 | 8 | Author: Dave Gandy 9 | License: SIL () 10 | Homepage: http://fortawesome.github.com/Font-Awesome/ 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/less/index.less: -------------------------------------------------------------------------------- 1 | @import (less) "normalize.css/normalize.css"; 2 | @import (less) "codemirror/lib/codemirror.css"; 3 | @import (less) "codemirror/theme/neo.css"; 4 | @import (less) "../fonts/fontello/css/fontello.css"; 5 | @import "variables.less"; 6 | @import "main.less"; 7 | -------------------------------------------------------------------------------- /src/fonts/fontello/css/fontello-codes.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-trash-empty:before { content: '\e800'; } /* '' */ 3 | .icon-download:before { content: '\e801'; } /* '' */ 4 | .icon-lock:before { content: '\e802'; } /* '' */ 5 | .icon-github-circled:before { content: '\f09b'; } /* '' */ 6 | .icon-paste:before { content: '\f0ea'; } /* '' */ -------------------------------------------------------------------------------- /wercker.yml: -------------------------------------------------------------------------------- 1 | box: node 2 | build: 3 | steps: 4 | - script: 5 | name: env 6 | code: | 7 | echo "node version $(node -v)" 8 | echo "npm version $(npm -v)" 9 | echo "NODE_ENV=$NODE_ENV" 10 | - npm-install 11 | - script: 12 | name: lint 13 | code: npm run eslint 14 | - script: 15 | name: build 16 | code: npm run build 17 | -------------------------------------------------------------------------------- /src/less/variables.less: -------------------------------------------------------------------------------- 1 | @color-success: #e6f2d0; 2 | @color-success-hover: #dbecbc; 3 | @color-info: #c8def1; 4 | @color-info-hover: #b4d2ec; 5 | @color-warning: #fff5db; 6 | @color-warning-hover: #ffeec2; 7 | @color-error: #f3c2c2; 8 | @color-error-hover: #efadad; 9 | @color-light-bg: #fafafa; 10 | @color-light-gray: #f0f0f0; 11 | @color-gray: #a3a3a3; 12 | @color-window-bar: #737373; 13 | @color-window-bar-bg: #ececec; 14 | -------------------------------------------------------------------------------- /src/js/helper.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | debounce: function debounce(callback, wait, context = this) { 3 | let timeout = null; 4 | let callbackArgs = null; 5 | 6 | const later = () => callback.apply(context, callbackArgs); 7 | 8 | return function () { 9 | callbackArgs = arguments; //eslint-disable-line 10 | clearTimeout(timeout); 11 | timeout = setTimeout(later, wait); 12 | }; 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /src/fonts/fontello/css/fontello-ie7-codes.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-trash-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 3 | .icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 4 | .icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 5 | .icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 6 | .icon-paste { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "env": { 4 | "browser": true, 5 | "node": true 6 | }, 7 | "parserOptions": { 8 | "ecmaVersion": 6, 9 | "sourceType": "module" 10 | }, 11 | "extends": "airbnb-base", 12 | "plugins": [ 13 | "import" 14 | ], 15 | "rules": { 16 | "no-console": 0, 17 | "func-names": 0, 18 | "prefer-object-spread": 0, 19 | "consistent-return": 0, 20 | "max-len": [2, { 21 | "code": 120, 22 | "ignoreTrailingComments": true, 23 | "ignoreUrls": true, 24 | "ignoreRegExpLiterals": true, 25 | "ignoreTemplateLiterals": true 26 | }], 27 | "function-paren-newline": 0, 28 | "prefer-destructuring": 0, 29 | "no-underscore-dangle": 0, 30 | "arrow-body-style": 0 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy 2 | on: 3 | push: 4 | branches: 5 | - master 6 | jobs: 7 | build-and-deploy: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout 🛎️ 11 | uses: actions/checkout@v2 12 | with: 13 | persist-credentials: false 14 | 15 | - uses: actions/setup-node@v1 16 | with: 17 | node-version: '10' 18 | 19 | - name: Install and Build 🔧 20 | run: | 21 | npm install 22 | npm run build 23 | 24 | - name: Deploy 🚀 25 | uses: JamesIves/github-pages-deploy-action@3.5.9 26 | with: 27 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 28 | BRANCH: gh-pages # The branch the action should deploy to. 29 | FOLDER: public # The folder the action should deploy. -------------------------------------------------------------------------------- /src/fonts/fontello/css/fontello-ie7.css: -------------------------------------------------------------------------------- 1 | [class^="icon-"], [class*=" icon-"] { 2 | font-family: 'fontello'; 3 | font-style: normal; 4 | font-weight: normal; 5 | 6 | /* fix buttons height */ 7 | line-height: 1em; 8 | 9 | /* you can be more comfortable with increased icons size */ 10 | /* font-size: 120%; */ 11 | } 12 | 13 | .icon-trash-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 14 | .icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 15 | .icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 16 | .icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 17 | .icon-paste { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -------------------------------------------------------------------------------- /minify-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "caseSensitive":false, 3 | "collapseBooleanAttributes":true, 4 | "collapseInlineTagWhitespace":false, 5 | "collapseWhitespace":true, 6 | "conservativeCollapse":false, 7 | "decodeEntities":true, 8 | "html5":true, 9 | "includeAutoGeneratedTags":false, 10 | "keepClosingSlash":false, 11 | "minifyCSS":true, 12 | "minifyJS":true, 13 | "preserveLineBreaks":false, 14 | "preventAttributesEscaping":false, 15 | "processConditionalComments":true, 16 | "processScripts":[ 17 | "text/html" 18 | ], 19 | "removeAttributeQuotes":true, 20 | "removeComments":true, 21 | "removeEmptyAttributes":true, 22 | "removeEmptyElements":false, 23 | "removeOptionalTags":true, 24 | "removeRedundantAttributes":true, 25 | "removeScriptTypeAttributes":true, 26 | "removeStyleLinkTypeAttributes":true, 27 | "removeTagWhitespace":true, 28 | "sortAttributes":true, 29 | "sortClassName":true, 30 | "trimCustomFragments":true, 31 | "useShortDoctype":true 32 | } 33 | -------------------------------------------------------------------------------- /src/fonts/fontello/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fontello", 3 | "css_prefix_text": "icon-", 4 | "css_use_suffix": false, 5 | "hinting": true, 6 | "units_per_em": 1000, 7 | "ascent": 850, 8 | "glyphs": [ 9 | { 10 | "uid": "f48ae54adfb27d8ada53d0fd9e34ee10", 11 | "css": "trash-empty", 12 | "code": 59392, 13 | "src": "fontawesome" 14 | }, 15 | { 16 | "uid": "b429436ec5a518c78479d44ef18dbd60", 17 | "css": "paste", 18 | "code": 61674, 19 | "src": "fontawesome" 20 | }, 21 | { 22 | "uid": "9a76bc135eac17d2c8b8ad4a5774fc87", 23 | "css": "download", 24 | "code": 59393, 25 | "src": "fontawesome" 26 | }, 27 | { 28 | "uid": "c1f1975c885aa9f3dad7810c53b82074", 29 | "css": "lock", 30 | "code": 59394, 31 | "src": "fontawesome" 32 | }, 33 | { 34 | "uid": "0f6a2573a7b6df911ed199bb63717e27", 35 | "css": "github-circled", 36 | "code": 61595, 37 | "src": "fontawesome" 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /src/web-worker.js: -------------------------------------------------------------------------------- 1 | /* eslint-env worker */ 2 | 3 | (function () { 4 | importScripts('htmlminifier.min.js'); 5 | const Minify = require('html-minifier').minify; // eslint-disable-line 6 | addEventListener('message', (event) => { 7 | if (event.data.pong) { 8 | return; 9 | } 10 | 11 | let loggedError = false; 12 | const log = function (msg) { 13 | console.log(msg); 14 | if (msg instanceof Error) { 15 | loggedError = true; 16 | const line = typeof msg.line === 'number' ? `Line ${msg.line}:${msg.col}\n ` : ''; 17 | postMessage({ error: line + msg.message }); 18 | } 19 | }; 20 | 21 | try { 22 | const output = Minify(event.data.input, Object.assign({}, event.data.config, { log })); 23 | if (!loggedError) { 24 | postMessage(output); 25 | } 26 | } catch (err) { 27 | const line = typeof err.line === 'number' ? `Line ${err.line}:${err.col}\n ` : ''; 28 | postMessage({ error: line + err.message }); 29 | } 30 | }); 31 | 32 | postMessage({ ping: true }); 33 | }()); 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Wei He 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | .publish/ 61 | dist/ 62 | public/ 63 | htmlminifier.min.js 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Minifier for JavaScript, CSS and HTML 2 | ======================================= 3 | Client-side offline-first JavaScript/CSS/HTML minifier. _Visit: https://minifier.app_ 4 | 5 | 6 | ## Description 7 | 8 | This tool implements [Web Worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) and [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API). Just load it once and it will available for offline use. 9 | 10 | Uses [html-minifier](https://github.com/kangax/html-minifier) which comes with [uglify-js](https://github.com/mishoo/UglifyJS2) and [clean-css](https://github.com/jakubpawlowicz/clean-css). See [default configurations](minify-config.json). 11 | 12 | 13 | ## Installation 14 | ```bash 15 | $ export HTTPMINIFIER_VERSION=4.0.0 # Optional, Default to latest 16 | 17 | $ npm i && npm run build 18 | ``` 19 | 20 | Start development server: 21 | ```bash 22 | $ npm run watch 23 | ``` 24 | 25 | 26 | ## Questions? 27 | 28 | Please [open an issue](https://github.com/wei/minifier/issues) or [email me](mailto:github@weispot.com) with any issues, feedback, or suggestions. 29 | 30 | 31 | ## Author 32 | [**Wei He**](https://whe.me) [_github@weispot.com_](mailto:github@weispot.com) 33 | 34 | 35 | ## License 36 | [MIT](LICENSE) 37 | -------------------------------------------------------------------------------- /src/fonts/fontello/css/animation.css: -------------------------------------------------------------------------------- 1 | /* 2 | Animation example, for spinners 3 | */ 4 | .animate-spin { 5 | -moz-animation: spin 2s infinite linear; 6 | -o-animation: spin 2s infinite linear; 7 | -webkit-animation: spin 2s infinite linear; 8 | animation: spin 2s infinite linear; 9 | display: inline-block; 10 | } 11 | @-moz-keyframes spin { 12 | 0% { 13 | -moz-transform: rotate(0deg); 14 | -o-transform: rotate(0deg); 15 | -webkit-transform: rotate(0deg); 16 | transform: rotate(0deg); 17 | } 18 | 19 | 100% { 20 | -moz-transform: rotate(359deg); 21 | -o-transform: rotate(359deg); 22 | -webkit-transform: rotate(359deg); 23 | transform: rotate(359deg); 24 | } 25 | } 26 | @-webkit-keyframes spin { 27 | 0% { 28 | -moz-transform: rotate(0deg); 29 | -o-transform: rotate(0deg); 30 | -webkit-transform: rotate(0deg); 31 | transform: rotate(0deg); 32 | } 33 | 34 | 100% { 35 | -moz-transform: rotate(359deg); 36 | -o-transform: rotate(359deg); 37 | -webkit-transform: rotate(359deg); 38 | transform: rotate(359deg); 39 | } 40 | } 41 | @-o-keyframes spin { 42 | 0% { 43 | -moz-transform: rotate(0deg); 44 | -o-transform: rotate(0deg); 45 | -webkit-transform: rotate(0deg); 46 | transform: rotate(0deg); 47 | } 48 | 49 | 100% { 50 | -moz-transform: rotate(359deg); 51 | -o-transform: rotate(359deg); 52 | -webkit-transform: rotate(359deg); 53 | transform: rotate(359deg); 54 | } 55 | } 56 | @-ms-keyframes spin { 57 | 0% { 58 | -moz-transform: rotate(0deg); 59 | -o-transform: rotate(0deg); 60 | -webkit-transform: rotate(0deg); 61 | transform: rotate(0deg); 62 | } 63 | 64 | 100% { 65 | -moz-transform: rotate(359deg); 66 | -o-transform: rotate(359deg); 67 | -webkit-transform: rotate(359deg); 68 | transform: rotate(359deg); 69 | } 70 | } 71 | @keyframes spin { 72 | 0% { 73 | -moz-transform: rotate(0deg); 74 | -o-transform: rotate(0deg); 75 | -webkit-transform: rotate(0deg); 76 | transform: rotate(0deg); 77 | } 78 | 79 | 100% { 80 | -moz-transform: rotate(359deg); 81 | -o-transform: rotate(359deg); 82 | -webkit-transform: rotate(359deg); 83 | transform: rotate(359deg); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/fonts/fontello/css/fontello.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'fontello'; 3 | src: url('../font/fontello.eot?97739671'); 4 | src: url('../font/fontello.eot?97739671#iefix') format('embedded-opentype'), 5 | url('../font/fontello.woff2?97739671') format('woff2'), 6 | url('../font/fontello.woff?97739671') format('woff'), 7 | url('../font/fontello.ttf?97739671') format('truetype'), 8 | url('../font/fontello.svg?97739671#fontello') format('svg'); 9 | font-weight: normal; 10 | font-style: normal; 11 | } 12 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 13 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 14 | /* 15 | @media screen and (-webkit-min-device-pixel-ratio:0) { 16 | @font-face { 17 | font-family: 'fontello'; 18 | src: url('../font/fontello.svg?97739671#fontello') format('svg'); 19 | } 20 | } 21 | */ 22 | 23 | [class^="icon-"]:before, [class*=" icon-"]:before { 24 | font-family: "fontello"; 25 | font-style: normal; 26 | font-weight: normal; 27 | speak: none; 28 | 29 | display: inline-block; 30 | text-decoration: inherit; 31 | width: 1em; 32 | margin-right: .2em; 33 | text-align: center; 34 | /* opacity: .8; */ 35 | 36 | /* For safety - reset parent styles, that can break glyph codes*/ 37 | font-variant: normal; 38 | text-transform: none; 39 | 40 | /* fix buttons height, for twitter bootstrap */ 41 | line-height: 1em; 42 | 43 | /* Animation center compensation - margins should be symmetric */ 44 | /* remove if not needed */ 45 | margin-left: .2em; 46 | 47 | /* you can be more comfortable with increased icons size */ 48 | /* font-size: 120%; */ 49 | 50 | /* Font smoothing. That was taken from TWBS */ 51 | -webkit-font-smoothing: antialiased; 52 | -moz-osx-font-smoothing: grayscale; 53 | 54 | /* Uncomment for 3D effect */ 55 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 56 | } 57 | 58 | .icon-trash-empty:before { content: '\e800'; } /* '' */ 59 | .icon-download:before { content: '\e801'; } /* '' */ 60 | .icon-lock:before { content: '\e802'; } /* '' */ 61 | .icon-github-circled:before { content: '\f09b'; } /* '' */ 62 | .icon-paste:before { content: '\f0ea'; } /* '' */ -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minifier", 3 | "version": "1.0.0", 4 | "description": "Client-side offline-first JavaScript/CSS/HTML minifier.", 5 | "repository": { 6 | "type": "git", 7 | "url": "git@github.com:wei/minifier.git" 8 | }, 9 | "scripts": { 10 | "check-extraneous-pkgs": "npm list --depth=0 && echo '[SUCCESS] No extraneous packages.' || (echo '[INFO] Pruning extraneous packages...\n' && npm prune)", 11 | "eslint": "echo '\n[INFO] Running ESLint...\n' && eslint ./src/js ./*.js --ignore-path .gitignore -f table --ext .js", 12 | "eslint-fix": "eslint ./src/js ./*.js --ignore-path .gitignore -f table --ext .js --fix || true", 13 | "build": "gulp", 14 | "watch": "gulp watch", 15 | "test": "echo \"Error: no test specified\" && exit 1" 16 | }, 17 | "author": "Wei He ", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/wei/minifier/issues" 21 | }, 22 | "homepage": "https://minifier.app", 23 | "dependencies": { 24 | "@babel/core": "^7.11.5", 25 | "@babel/preset-env": "^7.11.5", 26 | "babelify": "^10.0.0", 27 | "browserify": "^16.5.2", 28 | "clipboard": "^2.0.6", 29 | "codemirror": "^5.57.0", 30 | "cross-env": "^7.0.2", 31 | "dotenv": "^8.2.0", 32 | "eslint": "^7.8.1", 33 | "eslint-config-airbnb-base": "^14.2.0", 34 | "eslint-plugin-import": "^2.22.0", 35 | "file-saver": "^2.0.2", 36 | "gulp": "^4.0.2", 37 | "gulp-autoprefixer": "^7.0.1", 38 | "gulp-babel": "^8.0.0", 39 | "gulp-clean": "^0.4.0", 40 | "gulp-clean-css": "^4.3.0", 41 | "gulp-concat": "^2.6.1", 42 | "gulp-download-stream": "0.0.19", 43 | "gulp-filter": "^6.0.0", 44 | "gulp-flatten": "^0.4.0", 45 | "gulp-htmlmin": "^5.0.1", 46 | "gulp-if": "^3.0.0", 47 | "gulp-less": "^4.0.1", 48 | "gulp-load-plugins": "^2.0.4", 49 | "gulp-pug": "^4.0.1", 50 | "gulp-replace": "^1.0.0", 51 | "gulp-sourcemaps": "^2.6.5", 52 | "gulp-uglify": "^3.0.2", 53 | "gulp-watch": "^5.0.1", 54 | "gulp-webserver": "^0.9.1", 55 | "normalize.css": "^8.0.1", 56 | "pre-commit": "^1.2.2", 57 | "sw-precache": "^5.2.1", 58 | "vinyl-buffer": "^1.0.1", 59 | "vinyl-source-stream": "^2.0.0" 60 | }, 61 | "browserslist": [ 62 | "last 2 versions" 63 | ], 64 | "pre-commit": [ 65 | "check-extraneous-pkgs", 66 | "eslint" 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /src/fonts/fontello/README.txt: -------------------------------------------------------------------------------- 1 | This webfont is generated by http://fontello.com open source project. 2 | 3 | 4 | ================================================================================ 5 | Please, note, that you should obey original font licenses, used to make this 6 | webfont pack. Details available in LICENSE.txt file. 7 | 8 | - Usually, it's enough to publish content of LICENSE.txt file somewhere on your 9 | site in "About" section. 10 | 11 | - If your project is open-source, usually, it will be ok to make LICENSE.txt 12 | file publicly available in your repository. 13 | 14 | - Fonts, used in Fontello, don't require a clickable link on your site. 15 | But any kind of additional authors crediting is welcome. 16 | ================================================================================ 17 | 18 | 19 | Comments on archive content 20 | --------------------------- 21 | 22 | - /font/* - fonts in different formats 23 | 24 | - /css/* - different kinds of css, for all situations. Should be ok with 25 | twitter bootstrap. Also, you can skip style and assign icon classes 26 | directly to text elements, if you don't mind about IE7. 27 | 28 | - demo.html - demo file, to show your webfont content 29 | 30 | - LICENSE.txt - license info about source fonts, used to build your one. 31 | 32 | - config.json - keeps your settings. You can import it back into fontello 33 | anytime, to continue your work 34 | 35 | 36 | Why so many CSS files ? 37 | ----------------------- 38 | 39 | Because we like to fit all your needs :) 40 | 41 | - basic file, .css - is usually enough, it contains @font-face 42 | and character code definitions 43 | 44 | - *-ie7.css - if you need IE7 support, but still don't wish to put char codes 45 | directly into html 46 | 47 | - *-codes.css and *-ie7-codes.css - if you like to use your own @font-face 48 | rules, but still wish to benefit from css generation. That can be very 49 | convenient for automated asset build systems. When you need to update font - 50 | no need to manually edit files, just override old version with archive 51 | content. See fontello source code for examples. 52 | 53 | - *-embedded.css - basic css file, but with embedded WOFF font, to avoid 54 | CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain. 55 | We strongly recommend to resolve this issue by `Access-Control-Allow-Origin` 56 | server headers. But if you ok with dirty hack - this file is for you. Note, 57 | that data url moved to separate @font-face to avoid problems with 2 | 3 | 4 | Copyright (C) 2017 by original authors @ fontello.com 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/js/service-worker-helper.js: -------------------------------------------------------------------------------- 1 | module.exports = (function () { 2 | function SWHelper() {} 3 | 4 | SWHelper.supported = 'serviceWorker' in navigator; 5 | 6 | SWHelper.load = () => { 7 | if (!SWHelper.supported) { 8 | return; 9 | } 10 | /** 11 | * Copyright 2015 Google Inc. All rights reserved. 12 | * 13 | * Licensed under the Apache License, Version 2.0 (the "License"); 14 | * you may not use this file except in compliance with the License. 15 | * You may obtain a copy of the License at 16 | * 17 | * http://www.apache.org/licenses/LICENSE-2.0 18 | * 19 | * Unless required by applicable law or agreed to in writing, software 20 | * distributed under the License is distributed on an "AS IS" BASIS, 21 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 22 | * See the License for the specific language governing permissions and 23 | * limitations under the License. 24 | */ 25 | 26 | /* eslint-env browser */ 27 | 28 | // Delay registration until after the page has loaded, to ensure that our 29 | // precaching requests don't degrade the first visit experience. 30 | // See https://developers.google.com/web/fundamentals/instant-and-offline/service-worker/registration 31 | window.addEventListener('load', () => { 32 | // Your service-worker.js *must* be located at the top-level directory relative to your site. 33 | // It won't be able to control pages unless it's located at the same level or higher than them. 34 | // *Don't* register service worker file in, e.g., a scripts/ sub-directory! 35 | // See https://github.com/slightlyoff/ServiceWorker/issues/468 36 | navigator.serviceWorker.register('/service-worker.js').then((reg) => { 37 | // updatefound is fired if service-worker.js changes. 38 | reg.onupdatefound = function () { // eslint-disable-line no-param-reassign 39 | // The updatefound event implies that reg.installing is set; see 40 | // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event 41 | const installingWorker = reg.installing; 42 | 43 | installingWorker.onstatechange = function () { 44 | switch (installingWorker.state) { 45 | case 'installed': 46 | if (navigator.serviceWorker.controller) { 47 | // At this point, the old content will have been purged and the fresh content will 48 | // have been added to the cache. 49 | // It's the perfect time to display a "New content is available; please refresh." 50 | // message in the page's interface. 51 | console.log('New or updated content is available.'); 52 | } else { 53 | // At this point, everything has been precached. 54 | // It's the perfect time to display a "Content is cached for offline use." message. 55 | console.log('Content is now available offline!'); 56 | } 57 | break; 58 | 59 | case 'redundant': 60 | console.error('The installing service worker became redundant.'); 61 | break; 62 | 63 | default: 64 | break; 65 | } 66 | }; 67 | }; 68 | }).catch((e) => { 69 | console.error('Error during service worker registration:', e); 70 | }); 71 | }); 72 | }; 73 | 74 | return SWHelper; 75 | }()); 76 | -------------------------------------------------------------------------------- /src/js/minify-worker-helper.js: -------------------------------------------------------------------------------- 1 | const defaultConfig = require('../../minify-config.json'); 2 | 3 | module.exports = (function () { 4 | function MinifyHelper() {} 5 | 6 | MinifyHelper.webWorkerSupported = !!window.Worker; 7 | 8 | MinifyHelper.config = Object.assign({}, defaultConfig); 9 | 10 | MinifyHelper.setConfig = (newConfig) => { 11 | if (typeof newConfig === 'object') { 12 | MinifyHelper.config = Object.assign({}, defaultConfig, newConfig); 13 | try { 14 | window.localStorage.setItem('html-minifier-config', JSON.stringify(MinifyHelper.config)); 15 | } catch (_) { 16 | // Ignore localStorage Errors 17 | } 18 | } 19 | 20 | return MinifyHelper.config; 21 | }; 22 | 23 | MinifyHelper.load = () => { 24 | if (!window.Minify) { 25 | return console.error('html-minifier not loaded.'); 26 | } 27 | 28 | try { 29 | const lsConfigJSON = window.localStorage.getItem('html-minifier-config'); 30 | if (lsConfigJSON) { 31 | MinifyHelper.setConfig(JSON.parse(lsConfigJSON)); 32 | } 33 | } catch (_) { 34 | // Ignore localStorage Errors 35 | } 36 | 37 | if (MinifyHelper.webWorkerSupported) { 38 | MinifyHelper.webWorker = new Worker('/web-worker.js'); 39 | MinifyHelper.webWorker.onmessage = function () { 40 | MinifyHelper.workerMinify = function (input, config, callback, errorCallback) { 41 | console.log('In MinifyHelper.workerMinify'); 42 | 43 | MinifyHelper.webWorker.onmessage = function (event) { 44 | const { data } = event; 45 | if (data.error) { 46 | errorCallback(new Error(data.error)); 47 | } else { 48 | callback(data); 49 | } 50 | }; 51 | MinifyHelper.webWorker.postMessage({ 52 | input, config, 53 | }); 54 | }; 55 | }; 56 | return true; 57 | } 58 | return false; 59 | }; 60 | 61 | MinifyHelper.minify = (type = 'html', input = '', config = {}, callback = () => {}, errorCallback = () => {}) => { 62 | const minifyRequest = { input, config }; 63 | const callbackFailSafeProxy = (data) => { 64 | if (data) { 65 | callback(data); 66 | } else { 67 | errorCallback(new Error('Unable to process.')); 68 | } 69 | }; 70 | let callbackOverride = callback; 71 | 72 | switch (type) { 73 | case 'js': 74 | minifyRequest.input = ``; 75 | minifyRequest.config = Object.assign({}, MinifyHelper.config, { minifyJS: config || true }); 76 | callbackOverride = (data = '') => { 77 | callbackFailSafeProxy(data.replace(/^ 291 | 292 | 293 |
294 |

295 | fontello 296 | font demo 297 |

298 | 301 |
302 |
303 |
304 |
icon-trash-empty0xe800
305 |
icon-download0xe801
306 |
icon-lock0xe802
307 |
icon-github-circled0xf09b
308 |
309 |
310 |
icon-paste0xf0ea
311 |
312 |
313 | 314 | 315 | -------------------------------------------------------------------------------- /src/fonts/fontello/css/fontello-embedded.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'fontello'; 3 | src: url('../font/fontello.eot?64555818'); 4 | src: url('../font/fontello.eot?64555818#iefix') format('embedded-opentype'), 5 | url('../font/fontello.svg?64555818#fontello') format('svg'); 6 | font-weight: normal; 7 | font-style: normal; 8 | } 9 | @font-face { 10 | font-family: 'fontello'; 11 | src: url('data:application/octet-stream;base64,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') format('woff'), 12 | url('data:application/octet-stream;base64,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') format('truetype'); 13 | } 14 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 15 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 16 | /* 17 | @media screen and (-webkit-min-device-pixel-ratio:0) { 18 | @font-face { 19 | font-family: 'fontello'; 20 | src: url('../font/fontello.svg?64555818#fontello') format('svg'); 21 | } 22 | } 23 | */ 24 | 25 | [class^="icon-"]:before, [class*=" icon-"]:before { 26 | font-family: "fontello"; 27 | font-style: normal; 28 | font-weight: normal; 29 | speak: none; 30 | 31 | display: inline-block; 32 | text-decoration: inherit; 33 | width: 1em; 34 | margin-right: .2em; 35 | text-align: center; 36 | /* opacity: .8; */ 37 | 38 | /* For safety - reset parent styles, that can break glyph codes*/ 39 | font-variant: normal; 40 | text-transform: none; 41 | 42 | /* fix buttons height, for twitter bootstrap */ 43 | line-height: 1em; 44 | 45 | /* Animation center compensation - margins should be symmetric */ 46 | /* remove if not needed */ 47 | margin-left: .2em; 48 | 49 | /* you can be more comfortable with increased icons size */ 50 | /* font-size: 120%; */ 51 | 52 | /* Uncomment for 3D effect */ 53 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 54 | } 55 | .icon-trash-empty:before { content: '\e800'; } /* '' */ 56 | .icon-download:before { content: '\e801'; } /* '' */ 57 | .icon-lock:before { content: '\e802'; } /* '' */ 58 | .icon-github-circled:before { content: '\f09b'; } /* '' */ 59 | .icon-paste:before { content: '\f0ea'; } /* '' */ -------------------------------------------------------------------------------- /src/pug/index.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(class='no-js') 3 | head 4 | meta(charset='utf-8') 5 | meta(http-equiv='X-UA-Compatible', content='IE=edge') 6 | 7 | title Minifier for JavaScript, CSS and HTML 8 | 9 | meta(name='description', content='Client-side offline-first JavaScript/CSS/HTML minifier.') 10 | meta(name='viewport', content='width=device-width, initial-scale=1') 11 | 12 | link(rel='stylesheet', href='css/index.css') 13 | div(style='display: none') 14 | svg(xmlns='http://www.w3.org/2000/svg', style='display: none') 15 | symbol#js(viewbox='0 0 56 56') 16 | title js 17 | path(style='fill:#E9E9E0;', d='M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074 c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z') 18 | polygon(style='fill:#D9D7CA;', points='37.5,0.151 37.5,12 49.349,12 ') 19 | path(style='fill:#EEAF4B;', d='M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z') 20 | g 21 | path(style='fill:#FFFFFF;', d='M26.021,42.719v7.848c0,0.474-0.087,0.873-0.26,1.196c-0.174,0.323-0.406,0.583-0.697,0.779 c-0.292,0.196-0.627,0.333-1.005,0.41s-0.769,0.116-1.169,0.116c-0.201,0-0.436-0.021-0.704-0.062s-0.547-0.104-0.834-0.191 s-0.563-0.185-0.827-0.294c-0.265-0.109-0.488-0.232-0.67-0.369l0.697-1.107c0.091,0.063,0.221,0.13,0.39,0.198 s0.353,0.132,0.554,0.191c0.2,0.06,0.41,0.111,0.629,0.157s0.424,0.068,0.615,0.068c0.482,0,0.868-0.094,1.155-0.28 s0.439-0.504,0.458-0.95v-7.711H26.021z') 22 | path(style='fill:#FFFFFF;', d='M34.184,50.238c0,0.364-0.075,0.718-0.226,1.06s-0.362,0.643-0.636,0.902s-0.611,0.467-1.012,0.622 c-0.401,0.155-0.857,0.232-1.367,0.232c-0.219,0-0.444-0.012-0.677-0.034s-0.468-0.062-0.704-0.116 c-0.237-0.055-0.463-0.13-0.677-0.226s-0.399-0.212-0.554-0.349l0.287-1.176c0.127,0.073,0.289,0.144,0.485,0.212 s0.398,0.132,0.608,0.191c0.209,0.06,0.419,0.107,0.629,0.144c0.209,0.036,0.405,0.055,0.588,0.055c0.556,0,0.982-0.13,1.278-0.39 s0.444-0.645,0.444-1.155c0-0.31-0.105-0.574-0.314-0.793c-0.21-0.219-0.472-0.417-0.786-0.595s-0.654-0.355-1.019-0.533 c-0.365-0.178-0.707-0.388-1.025-0.629c-0.319-0.241-0.584-0.526-0.793-0.854c-0.21-0.328-0.314-0.738-0.314-1.23 c0-0.446,0.082-0.843,0.246-1.189s0.385-0.641,0.663-0.882s0.602-0.426,0.971-0.554s0.759-0.191,1.169-0.191 c0.419,0,0.843,0.039,1.271,0.116c0.428,0.077,0.774,0.203,1.039,0.376c-0.055,0.118-0.119,0.248-0.191,0.39 c-0.073,0.142-0.142,0.273-0.205,0.396c-0.064,0.123-0.119,0.226-0.164,0.308c-0.046,0.082-0.073,0.128-0.082,0.137 c-0.055-0.027-0.116-0.063-0.185-0.109s-0.167-0.091-0.294-0.137c-0.128-0.046-0.297-0.077-0.506-0.096 c-0.21-0.019-0.479-0.014-0.807,0.014c-0.183,0.019-0.355,0.07-0.52,0.157s-0.311,0.193-0.438,0.321 c-0.128,0.128-0.229,0.271-0.301,0.431c-0.073,0.159-0.109,0.313-0.109,0.458c0,0.364,0.104,0.658,0.314,0.882 c0.209,0.224,0.469,0.419,0.779,0.588c0.31,0.169,0.646,0.333,1.012,0.492c0.364,0.159,0.704,0.354,1.019,0.581 s0.576,0.513,0.786,0.854C34.078,49.261,34.184,49.7,34.184,50.238z') 23 | g 24 | path(style='fill:#EEAF4B;', d='M19.5,19v-4c0-0.551,0.448-1,1-1c0.553,0,1-0.448,1-1s-0.447-1-1-1c-1.654,0-3,1.346-3,3v4 c0,1.103-0.897,2-2,2c-0.553,0-1,0.448-1,1s0.447,1,1,1c1.103,0,2,0.897,2,2v4c0,1.654,1.346,3,3,3c0.553,0,1-0.448,1-1 s-0.447-1-1-1c-0.552,0-1-0.449-1-1v-4c0-1.2-0.542-2.266-1.382-3C18.958,21.266,19.5,20.2,19.5,19z') 25 | circle(style='fill:#EEAF4B;', cx='27.5', cy='18.5', r='1.5') 26 | path(style='fill:#EEAF4B;', d='M39.5,21c-1.103,0-2-0.897-2-2v-4c0-1.654-1.346-3-3-3c-0.553,0-1,0.448-1,1s0.447,1,1,1 c0.552,0,1,0.449,1,1v4c0,1.2,0.542,2.266,1.382,3c-0.84,0.734-1.382,1.8-1.382,3v4c0,0.551-0.448,1-1,1c-0.553,0-1,0.448-1,1 s0.447,1,1,1c1.654,0,3-1.346,3-3v-4c0-1.103,0.897-2,2-2c0.553,0,1-0.448,1-1S40.053,21,39.5,21z') 27 | path(style='fill:#EEAF4B;', d='M27.5,24c-0.553,0-1,0.448-1,1v3c0,0.552,0.447,1,1,1s1-0.448,1-1v-3 C28.5,24.448,28.053,24,27.5,24z') 28 | symbol#css(viewbox='0 0 56 56') 29 | title css 30 | path(style='fill:#E9E9E0;', d='M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074 c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z') 31 | polygon(style='fill:#D9D7CA;', points='37.5,0.151 37.5,12 49.349,12 ') 32 | path(style='fill:#0096E6;', d='M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z') 33 | g 34 | path(style='fill:#FFFFFF;', d='M23.58,51.975c-0.374,0.364-0.798,0.638-1.271,0.82s-0.984,0.273-1.531,0.273 c-0.602,0-1.155-0.109-1.661-0.328s-0.948-0.542-1.326-0.971s-0.675-0.966-0.889-1.613c-0.214-0.647-0.321-1.395-0.321-2.242 s0.107-1.593,0.321-2.235c0.214-0.643,0.511-1.178,0.889-1.606s0.822-0.754,1.333-0.978s1.062-0.335,1.654-0.335 c0.547,0,1.058,0.091,1.531,0.273s0.897,0.456,1.271,0.82l-1.135,1.012c-0.228-0.265-0.48-0.456-0.759-0.574 s-0.567-0.178-0.868-0.178c-0.337,0-0.658,0.063-0.964,0.191s-0.579,0.344-0.82,0.649s-0.431,0.699-0.567,1.183 s-0.21,1.075-0.219,1.777c0.009,0.684,0.08,1.267,0.212,1.75s0.314,0.877,0.547,1.183s0.497,0.528,0.793,0.67 s0.608,0.212,0.937,0.212s0.636-0.06,0.923-0.178s0.549-0.31,0.786-0.574L23.58,51.975z') 35 | path(style='fill:#FFFFFF;', d='M31.633,50.238c0,0.364-0.075,0.718-0.226,1.06s-0.362,0.643-0.636,0.902s-0.61,0.467-1.012,0.622 s-0.856,0.232-1.367,0.232c-0.219,0-0.444-0.012-0.677-0.034s-0.467-0.062-0.704-0.116s-0.463-0.13-0.677-0.226 s-0.398-0.212-0.554-0.349l0.287-1.176c0.128,0.073,0.289,0.144,0.485,0.212s0.398,0.132,0.608,0.191s0.419,0.107,0.629,0.144 s0.405,0.055,0.588,0.055c0.556,0,0.982-0.13,1.278-0.39s0.444-0.645,0.444-1.155c0-0.31-0.104-0.574-0.314-0.793 s-0.472-0.417-0.786-0.595s-0.654-0.355-1.019-0.533s-0.706-0.388-1.025-0.629s-0.583-0.526-0.793-0.854s-0.314-0.738-0.314-1.23 c0-0.446,0.082-0.843,0.246-1.189s0.385-0.641,0.663-0.882s0.602-0.426,0.971-0.554s0.759-0.191,1.169-0.191 c0.419,0,0.843,0.039,1.271,0.116s0.774,0.203,1.039,0.376c-0.055,0.118-0.118,0.248-0.191,0.39s-0.142,0.273-0.205,0.396 c-0.063,0.123-0.118,0.226-0.164,0.308s-0.073,0.128-0.082,0.137c-0.055-0.027-0.116-0.063-0.185-0.109s-0.166-0.091-0.294-0.137 s-0.296-0.077-0.506-0.096s-0.479-0.014-0.807,0.014c-0.183,0.019-0.355,0.07-0.52,0.157s-0.31,0.193-0.438,0.321 s-0.228,0.271-0.301,0.431s-0.109,0.313-0.109,0.458c0,0.364,0.104,0.658,0.314,0.882s0.47,0.419,0.779,0.588 s0.647,0.333,1.012,0.492s0.704,0.354,1.019,0.581s0.576,0.513,0.786,0.854S31.633,49.7,31.633,50.238z') 36 | path(style='fill:#FFFFFF;', d='M39.043,50.238c0,0.364-0.075,0.718-0.226,1.06s-0.362,0.643-0.636,0.902s-0.61,0.467-1.012,0.622 s-0.856,0.232-1.367,0.232c-0.219,0-0.444-0.012-0.677-0.034s-0.467-0.062-0.704-0.116s-0.463-0.13-0.677-0.226 s-0.398-0.212-0.554-0.349l0.287-1.176c0.128,0.073,0.289,0.144,0.485,0.212s0.398,0.132,0.608,0.191s0.419,0.107,0.629,0.144 s0.405,0.055,0.588,0.055c0.556,0,0.982-0.13,1.278-0.39s0.444-0.645,0.444-1.155c0-0.31-0.104-0.574-0.314-0.793 s-0.472-0.417-0.786-0.595s-0.654-0.355-1.019-0.533s-0.706-0.388-1.025-0.629s-0.583-0.526-0.793-0.854s-0.314-0.738-0.314-1.23 c0-0.446,0.082-0.843,0.246-1.189s0.385-0.641,0.663-0.882s0.602-0.426,0.971-0.554s0.759-0.191,1.169-0.191 c0.419,0,0.843,0.039,1.271,0.116s0.774,0.203,1.039,0.376c-0.055,0.118-0.118,0.248-0.191,0.39s-0.142,0.273-0.205,0.396 s-0.118,0.226-0.164,0.308s-0.073,0.128-0.082,0.137c-0.055-0.027-0.116-0.063-0.185-0.109s-0.166-0.091-0.294-0.137 s-0.296-0.077-0.506-0.096s-0.479-0.014-0.807,0.014c-0.183,0.019-0.355,0.07-0.52,0.157s-0.31,0.193-0.438,0.321 s-0.228,0.271-0.301,0.431s-0.109,0.313-0.109,0.458c0,0.364,0.104,0.658,0.314,0.882s0.47,0.419,0.779,0.588 s0.647,0.333,1.012,0.492s0.704,0.354,1.019,0.581s0.576,0.513,0.786,0.854S39.043,49.7,39.043,50.238z') 37 | g 38 | path(style='fill:#0096E6;', d='M19.5,19v-4c0-0.551,0.448-1,1-1c0.553,0,1-0.448,1-1s-0.447-1-1-1c-1.654,0-3,1.346-3,3v4 c0,1.103-0.897,2-2,2c-0.553,0-1,0.448-1,1s0.447,1,1,1c1.103,0,2,0.897,2,2v4c0,1.654,1.346,3,3,3c0.553,0,1-0.448,1-1 s-0.447-1-1-1c-0.552,0-1-0.449-1-1v-4c0-1.2-0.542-2.266-1.382-3C18.958,21.266,19.5,20.2,19.5,19z') 39 | path(style='fill:#0096E6;', d='M39.5,21c-1.103,0-2-0.897-2-2v-4c0-1.654-1.346-3-3-3c-0.553,0-1,0.448-1,1s0.447,1,1,1 c0.552,0,1,0.449,1,1v4c0,1.2,0.542,2.266,1.382,3c-0.84,0.734-1.382,1.8-1.382,3v4c0,0.551-0.448,1-1,1c-0.553,0-1,0.448-1,1 s0.447,1,1,1c1.654,0,3-1.346,3-3v-4c0-1.103,0.897-2,2-2c0.553,0,1-0.448,1-1S40.053,21,39.5,21z') 40 | symbol#html(viewbox='0 0 56 56') 41 | title html 42 | path(style='fill:#E9E9E0;', d='M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074 c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z') 43 | polygon(style='fill:#D9D7CA;', points='37.5,0.151 37.5,12 49.349,12 ') 44 | path(style='fill:#EC6630;', d='M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z') 45 | g 46 | path(style='fill:#FFFFFF;', d='M17.455,42.924V53h-1.641v-4.539h-4.361V53H9.785V42.924h1.668v4.416h4.361v-4.416H17.455z') 47 | path(style='fill:#FFFFFF;', d='M27.107,42.924v1.121H24.1V53h-1.654v-8.955h-3.008v-1.121H27.107z') 48 | path(style='fill:#FFFFFF;', d='M36.705,42.924h1.668V53h-1.668v-6.932l-2.256,5.605H33l-2.27-5.605V53h-1.668V42.924h1.668 l2.994,6.891L36.705,42.924z') 49 | path(style='fill:#FFFFFF;', d='M42.57,42.924v8.832h4.635V53h-6.303V42.924H42.57z') 50 | g 51 | path(style='fill:#EC6630;', d='M23.207,16.293c-0.391-0.391-1.023-0.391-1.414,0l-6,6c-0.391,0.391-0.391,1.023,0,1.414l6,6 C21.988,29.902,22.244,30,22.5,30s0.512-0.098,0.707-0.293c0.391-0.391,0.391-1.023,0-1.414L17.914,23l5.293-5.293 C23.598,17.316,23.598,16.684,23.207,16.293z') 52 | path(style='fill:#EC6630;', d='M41.207,22.293l-6-6c-0.391-0.391-1.023-0.391-1.414,0s-0.391,1.023,0,1.414L39.086,23 l-5.293,5.293c-0.391,0.391-0.391,1.023,0,1.414C33.988,29.902,34.244,30,34.5,30s0.512-0.098,0.707-0.293l6-6 C41.598,23.316,41.598,22.684,41.207,22.293z') 53 | 54 | body 55 | //if lt IE 8 56 | p.chromeframe. 57 | You are using an outdated browser. 58 | Please upgrade your browser 59 | to improve your experience. 60 | h1 Minifier 61 | 62 | p.subheading 63 | span Client-side offline-first JavaScript/CSS/HTML minifier. 64 | span   65 | | Using 66 | a(href='https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API' target='_blank') 67 | i.icon-lock 68 | | Web Worker 69 | |  and  70 | a(href='https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API' target='_blank') 71 | i.icon-lock 72 | | Service Worker 73 | | . 74 | 75 | div#code-wrapper-container 76 | div.code-wrapper#input-code-wrapper 77 | div.window-header 78 | div.window-buttons 79 | p.window-filename input 80 | span.suffix.suffix-js .js 81 | span.suffix.suffix-css .css 82 | span.suffix.suffix-html .html 83 | div.right-button-group 84 | a.select-button#select-js JS 85 | a.select-button#select-css CSS 86 | a.select-button#select-html HTML 87 | a.select-button#reset 88 | i.icon-trash-empty 89 | textarea#input-code 90 | div.minify-buttons 91 | a.minify-button#minify-js 92 | svg 93 | use(xlink:href='#js') 94 | a.minify-button#minify-css 95 | svg 96 | use(xlink:href='#css') 97 | a.minify-button#minify-html 98 | svg 99 | use(xlink:href='#html') 100 | div.code-wrapper#output-code-wrapper 101 | div.window-header 102 | div.window-buttons 103 | input.window-filename#output-filename(type=text, placeholder="edit-me") 104 | div.right-button-group 105 | a#copy 106 | i.icon-paste 107 | a#download 108 | i.icon-download 109 | textarea#output-code 110 | 111 | footer 112 | p 113 | | Made by 114 | a(href='https://whe.me' target='_blank') 115 | i.icon-lock 116 | | Wei 117 | | . Source code at 118 | a(href='https://github.com/wei/minifier', target='_blank') 119 | i.icon-github-circled 120 | | wei/minifier 121 | | . 122 | p 123 | | If you find this tool useful, please consider supporting me by 124 | a(href='https://o.whe.me/supportwei', target='_blank') 125 | i.icon-lock 126 | | sending me a coffee. 127 | small 128 | a(href='https://github.com/wei/minifier/blob/master/LICENSE', target='_blank') 129 | i.icon-lock 130 | | MIT License 131 | | . View http-minifier 132 | a(href='https://github.com/wei/minifier/blob/master/minify-config.json', target='_blank') default configurations 133 | | . Uses 134 | a(href='https://github.com/kangax/html-minifier', target='_blank') html-minifier#{__ENV.HTTPMINIFIER_VERSION ? '@' + __ENV.HTTPMINIFIER_VERSION : ''} 135 | |  which comes with 136 | a(href='https://github.com/mishoo/UglifyJS2', target='_blank') uglify-js 137 | |  and  138 | a(href='https://github.com/jakubpawlowicz/clean-css', target='_blank') clean-css 139 | | . 140 | br 141 | | Based on 142 | a(href='http://kangax.github.com/html-minifier', target='_blank') kangax/html-minifier 143 | | . Design Inspired by 144 | a(href='https://kazzkiq.github.io/CodeFlask', target='_blank') kazzkiq/CodeFlask 145 | | . File type icons are made by 146 | a(href='https://www.flaticon.com/packs/file-types', target='_blank') Madebyoliver 147 | |  from Flaticon. 148 | 149 | script(src='htmlminifier.min.js') 150 | script. 151 | window.Minify = require('html-minifier').minify; 152 | script(src='js/index.js') 153 | script. 154 | !function(m,i,n,_,f,y){m.GoogleAnalyticsObject=n;m[n]||(m[n]=function(){ 155 | (m[n].q=m[n].q||[]).push(arguments)});m[n].l=+new Date;f=i.createElement(_); 156 | y=i.getElementsByTagName(_)[0];f.src='//www.google-analytics.com/analytics.js'; 157 | y.parentNode.insertBefore(f,y)}(window,document,'ga','script'); 158 | ga('create', 'UA-18952818-15', 'auto'); 159 | ga('send', 'pageview'); 160 | 161 | !function() { 162 | var t; 163 | if (t = window.driftt = window.drift = window.driftt || [], !t.init) return t.invoked ? void (window.console && console.error && console.error("Drift snippet included twice.")) : (t.invoked = !0, 164 | t.methods = [ "identify", "config", "track", "reset", "debug", "show", "ping", "page", "hide", "off", "on" ], 165 | t.factory = function(e) { 166 | return function() { 167 | var n; 168 | return n = Array.prototype.slice.call(arguments), n.unshift(e), t.push(n), t; 169 | }; 170 | }, t.methods.forEach(function(e) { 171 | t[e] = t.factory(e); 172 | }), t.load = function(t) { 173 | var e, n, o, i; 174 | e = 3e5, i = Math.ceil(new Date() / e) * e, o = document.createElement("script"), 175 | o.type = "text/javascript", o.async = !0, o.crossorigin = "anonymous", o.src = "https://js.driftt.com/include/" + i + "/" + t + ".js", 176 | n = document.getElementsByTagName("script")[0], n.parentNode.insertBefore(o, n); 177 | }); 178 | }(); 179 | drift.SNIPPET_VERSION = '0.3.1'; 180 | drift.load('inhgwis639xz'); 181 | 182 | for (var links = document.links, i = 0, length = links.length; i < length; i++) { 183 | var link = links[i]; 184 | if (link.hostname != window.location.hostname) { 185 | link.onclick = function(e) { 186 | var url = e.target.href; 187 | var openingInNewWindow = (e.target.target && !e.target.target.match(/^_(self|parent|top)$/i)) || e.ctrlKey || e.shiftKey || e.metaKey; 188 | ga('send', 'event', 'outbound', 'click', url, { 189 | 'transport': 'beacon', 190 | 'hitCallback': openingInNewWindow ? null : function() { 191 | document.location = url; 192 | } 193 | }); 194 | return openingInNewWindow; 195 | } 196 | } 197 | } 198 | 199 | noscript Version #{__BRANCH}##{__HASH} Built @ #{__BUILD_DATE} 200 | --------------------------------------------------------------------------------