├── .prettierrc ├── src ├── assets │ ├── font │ │ ├── iconfont.eot │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ ├── iconfont.woff2 │ │ └── iconfont.svg │ ├── images │ │ └── favicon.ico │ └── stylus │ │ ├── terminal.styl │ │ ├── _mixins │ │ └── base.styl │ │ └── iconfont.css ├── terminal.html └── terminal.js ├── README.md ├── webpack ├── webpack.prod.js ├── webpack.dev.js └── webpack.base.js ├── .babelrc ├── .editorconfig ├── .gitignore ├── LICENSE └── package.json /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "semi": true, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projects-platform/blog-terminal/HEAD/src/assets/font/iconfont.eot -------------------------------------------------------------------------------- /src/assets/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projects-platform/blog-terminal/HEAD/src/assets/font/iconfont.ttf -------------------------------------------------------------------------------- /src/assets/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projects-platform/blog-terminal/HEAD/src/assets/font/iconfont.woff -------------------------------------------------------------------------------- /src/assets/font/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projects-platform/blog-terminal/HEAD/src/assets/font/iconfont.woff2 -------------------------------------------------------------------------------- /src/assets/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projects-platform/blog-terminal/HEAD/src/assets/images/favicon.ico -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Blog-terminal 2 | 3 | - npm 4 | 5 | ```bash 6 | npm i && npm run dev 7 | ``` 8 | 9 | - yarn 10 | 11 | ```bash 12 | yarn && yarn dev 13 | ``` 14 | -------------------------------------------------------------------------------- /webpack/webpack.prod.js: -------------------------------------------------------------------------------- 1 | const { merge } = require('webpack-merge'); 2 | const { BASE_CONF } = require('./webpack.base'); 3 | 4 | module.exports = merge(BASE_CONF, { 5 | }); 6 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | // 用于指定浏览器版本号 7 | "targets": { 8 | "browsers": "last 2 version" 9 | }, 10 | "useBuiltIns": "usage" 11 | } 12 | ] 13 | ], 14 | "plugins": ["@babel/plugin-transform-runtime"] 15 | } 16 | -------------------------------------------------------------------------------- /webpack/webpack.dev.js: -------------------------------------------------------------------------------- 1 | const { merge } = require('webpack-merge'); 2 | const {resolve , BASE_CONF} = require('./webpack.base'); 3 | 4 | module.exports = merge(BASE_CONF, { 5 | devtool: 'inline-source-map', 6 | devServer: { 7 | hot: true, 8 | contentBase: resolve('../dist'), 9 | port: 5500 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org/ 2 | # top-most EditorConfig file 3 | root = true 4 | 5 | # match all file 6 | [*] 7 | 8 | # control the character set 9 | charset = utf-8 10 | 11 | # tab indentation 12 | indent_size = 2 13 | indent_style = tab 14 | 15 | # control line breaks are represented 16 | end_of_line = lf 17 | 18 | # remove any whitespace characters preceding newline characters 19 | trim_trailing_whitespace = true 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### PROJECT ### 2 | HELP.md 3 | target/ 4 | !.mvn/wrapper/maven-wrapper.jar 5 | !**/src/main/** 6 | !**/src/test/** 7 | out/ 8 | rebel.xml 9 | .gradle 10 | 11 | ### STS ### 12 | .DS_Store 13 | .apt_generated 14 | .classpath 15 | .factorypath 16 | .project 17 | .settings 18 | .springBeans 19 | .sts4-cache 20 | 21 | ### IntelliJ IDEA ### 22 | .idea 23 | *.iws 24 | *.iml 25 | *.ipr 26 | 27 | ### NetBeans ### 28 | /nbproject/private/ 29 | /nbbuild/ 30 | /dist/ 31 | /nbdist/ 32 | /.nb-gradle/ 33 | build/ 34 | 35 | ### VS Code ### 36 | .vscode/ 37 | 38 | ### Node.js ### 39 | node_modules/ 40 | /dist/ 41 | npm-debug.log* 42 | yarn-debug.log* 43 | yarn-error.log* 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Slience HVK 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. -------------------------------------------------------------------------------- /src/terminal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Silence H_VK 7 | 8 | 9 | 10 | 11 |
12 | Hi, I'm H_VK. A Full Stack Engineer. Java Golang JavaScript Python.(。◝‿◜。). 13 |
14 | Try to find more infomation about me! 15 |
16 | 'help' to get help. 'exit' to open my website. 17 |

18 |
19 | [usr@hvkcoder.me~]% 20 | 21 |
22 |
23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blog-terminal", 3 | "version": "1.0.0", 4 | "repository": "https://github.com/projects-platform/blog-terminal.git", 5 | "author": "hvkcoder ", 6 | "license": "MIT", 7 | "scripts": { 8 | "dev": "cross-env NODE_ENV=development webpack serve --config ./webpack/webpack.dev.js --open", 9 | "build": "cross-env NODE_ENV=production webpack --config ./webpack/webpack.prod.js --progress" 10 | }, 11 | "devDependencies": { 12 | "@babel/core": "^7.12.10", 13 | "@babel/plugin-transform-runtime": "^7.12.10", 14 | "@babel/preset-env": "^7.12.11", 15 | "autoprefixer": "^10.2.0", 16 | "babel-loader": "^8.2.2", 17 | "clean-webpack-plugin": "^3.0.0", 18 | "cross-env": "^7.0.3", 19 | "css-loader": "^5.0.1", 20 | "html-webpack-plugin": "^4.5.1", 21 | "mini-css-extract-plugin": "^1.3.3", 22 | "postcss": "^8.2.2", 23 | "postcss-loader": "^4.1.0", 24 | "postcss-preset-env": "^6.7.0", 25 | "style-loader": "^2.0.0", 26 | "stylus": "^0.54.8", 27 | "stylus-loader": "^4.3.1", 28 | "url-loader": "^4.1.1", 29 | "webpack": "^5.11.1", 30 | "webpack-cli": "^4.3.1", 31 | "webpack-dev-server": "^3.11.1", 32 | "webpack-merge": "^5.7.3" 33 | }, 34 | "dependencies": { 35 | "@babel/polyfill": "^7.12.1", 36 | "@babel/runtime": "^7.12.5", 37 | "core-js": "2" 38 | }, 39 | "browserslist": [ 40 | "last 2 version" 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /src/assets/font/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by iconfont 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/assets/stylus/terminal.styl: -------------------------------------------------------------------------------- 1 | @import '~@stylus/_mixins/base.styl' 2 | @import '~@stylus/iconfont.css' 3 | body ::selection 4 | background-color #000 5 | color #fff 6 | body 7 | font-family Courier New, Consolas, monospace 8 | font-size 17px 9 | color #000 10 | background-color #fff 11 | padding 5px 12 | margin 0 13 | #main 14 | line-height 23px 15 | word-wrap break-word 16 | position relative 17 | .input-lable 18 | position absolute 19 | top 100% 20 | left 0 21 | z-index 1 22 | width 100% 23 | .input-lable, .input-lable span 24 | word-break break-all !important 25 | #usr 26 | color rgb(193, 54, 70) 27 | .host 28 | color rgb(60, 187, 198) 29 | cursor pointer 30 | text-decoration none 31 | .content 32 | display inline-block 33 | width 100% 34 | word-break break-all 35 | .input-text, .input-text * 36 | background-color transparent !important 37 | font-size 17px !important 38 | font-family Cutive Mono, Courier New, Consolas, monospace !important 39 | word-break break-all !important 40 | color #000 !important 41 | .input-text 42 | border none !important 43 | -moz-appearance none !important 44 | -webkit-appearance none !important 45 | outline 0 !important 46 | box-sizing border-box !important 47 | padding-right 45px 48 | .folder-container 49 | display flex 50 | flex-flow row wrap 51 | align-content flex-start 52 | .folder 53 | flex 0 0 20% 54 | color rgb(83, 58, 221) 55 | box-sizing border-box 56 | +tablet-mobile() 57 | flex 0 0 33% 58 | +mobile-small() 59 | flex 0 0 50% 60 | +mobile-smallest() 61 | flex 100% 62 | .error 63 | color rgb(193, 57, 40) !important 64 | -------------------------------------------------------------------------------- /src/assets/stylus/_mixins/base.styl: -------------------------------------------------------------------------------- 1 | 2 | bg($url = '') 3 | background url($url) no-repeat 0 0 4 | background-size cover 5 | /* ----- 定义宽高 ----- */ 6 | wh($width = 0, $height = 0) 7 | width $width 8 | height $height 9 | /* ----- 元素居中 ----- */ 10 | center() 11 | position absolute 12 | top 50% 13 | left 50% 14 | transform translate(-50%, -50%) 15 | /* ----- 元素上下居中 ----- */ 16 | centerTop() 17 | position absolute 18 | top 50% 19 | transform translateY(-50%) 20 | /* ----- 元素左右居中 ----- */ 21 | centerLeft() 22 | position absolute 23 | left 50% 24 | transform translateX(-50%) 25 | /* ----- 元素固定底部 ----- */ 26 | fixed-bottom() 27 | position fixed 28 | bottom 0 29 | /* ----- 元素固定头部 ----- */ 30 | fixed-top() 31 | position fixed 32 | top 0 33 | /* ----- 定义元素位置 ----- */ 34 | def-position(top = 0, right = 0, bottom = 0, left = 0) 35 | position absolute 36 | top top 37 | right right 38 | bottom bottom 39 | left left 40 | flex-column($flex = '1', $bg-color = '') 41 | display flex 42 | flex $flex 43 | flex-direction column 44 | height 100% 45 | background '' 46 | /* ----- 自适应样式配置 ----- */ 47 | mobile-smallest() 48 | @media (max-width 413px) 49 | {block} 50 | mobile-small() 51 | @media (max-width 567px) 52 | {block} 53 | mobile() 54 | @media (max-width 767px) 55 | {block} 56 | tablet-mobile() 57 | @media (max-width 991px) 58 | {block} 59 | tablet() 60 | @media (min-width 768px) and (max-width 991px) 61 | {block} 62 | desktop() 63 | @media (min-width 992px) 64 | {block} 65 | desktop-large() 66 | @media (min-width 1200px) 67 | {block} 68 | desktop-largest() 69 | @media (min-width 1600px) 70 | {block} 71 | -------------------------------------------------------------------------------- /webpack/webpack.base.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpack = require('webpack'); 3 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 4 | const { CleanWebpackPlugin } = require('clean-webpack-plugin'); 5 | 6 | const resolve = p => path.join(__dirname, p); 7 | const mode = process.env.NODE_ENV || 'development'; 8 | 9 | module.exports = { 10 | resolve, 11 | BASE_CONF: { 12 | mode, 13 | entry: resolve('../src/terminal.js'), 14 | output: { 15 | path: resolve('../dist'), 16 | filename: 'terminal.bundle.js', 17 | }, 18 | resolve: { 19 | extensions: ['.js', '.styl', '.json'], 20 | alias: { 21 | '@': resolve('../src'), 22 | '@stylus': resolve('../src/assets/stylus') 23 | } 24 | }, 25 | module:{ 26 | rules: [ 27 | { 28 | test: /\.js$/, 29 | exclude: /(node_modules)/, 30 | loader: 'babel-loader' 31 | }, 32 | { 33 | test: /\.styl$/, 34 | use:[ 35 | 'style-loader', 36 | 'css-loader?importLoaders=1', 37 | { 38 | loader: 'postcss-loader', 39 | options: { 40 | postcssOptions: { 41 | plugins: [ 42 | 'autoprefixer', 43 | 'postcss-preset-env' 44 | ] 45 | } 46 | } 47 | }, 48 | 'stylus-loader', 49 | ] 50 | }, 51 | { 52 | test: /\.(jpg|png|jpe?g|gif|svg)(\?.*)?$/i, 53 | use: [ 54 | { 55 | loader: 'url-loader', 56 | options: { 57 | outputPath: 'images/',// 输出目录 58 | name(file) {// 输出名称 59 | return '[hansh].[ext]' 60 | }, 61 | limit: 5*1024 62 | } 63 | } 64 | ] 65 | }, 66 | { 67 | test: /\.(eot|woff2?|ttf|svg)$/, 68 | use: [{ 69 | loader: 'url-loader', 70 | options: { 71 | name: '[name]-[hash:5].min.[ext]', 72 | limit: 5000, 73 | outputPath: 'fonts/' 74 | } 75 | }] 76 | } 77 | ] 78 | }, 79 | plugins: [ 80 | new CleanWebpackPlugin(), 81 | new HtmlWebpackPlugin({ 82 | title: 'Silence H_VK', 83 | template: resolve('../src/terminal.html'), 84 | favicon: resolve('../src/assets/images/favicon.ico'), 85 | minify: { 86 | caseSensitive: false, //是否大小写敏感 87 | collapseBooleanAttributes: true, //是否简写boolean格式的属性如:disabled="disabled" 简写为disabled 88 | collapseWhitespace: true, //是否去除空格 89 | }, 90 | }), 91 | new webpack.HotModuleReplacementPlugin(), 92 | new webpack.LoaderOptionsPlugin({ 93 | options: { 94 | minify: true, 95 | htmlLoader: { 96 | removeAttributeQuotes: false, 97 | caseSensitive: true 98 | } 99 | } 100 | }), 101 | ], 102 | } 103 | }; 104 | -------------------------------------------------------------------------------- /src/terminal.js: -------------------------------------------------------------------------------- 1 | import '@stylus/terminal' 2 | 3 | $(function(){ 4 | const API = 'https://api.github.com/repos/silencehvk/blog'; 5 | let folder = []; 6 | const commandList = ['ls', 'cd', 'cat', 'rm', 'clear', 'help', 'uname']; 7 | let position = '~'; 8 | 9 | const $prefix = $('.prefix'); 10 | const $cmdput = $('.input-text'); 11 | const $content = $('.content'); 12 | const $html = $('body,html'); 13 | 14 | const doCommand = (cancel = false) => { 15 | const input = $cmdput.text().trim(); 16 | if (input === '') { 17 | $content.append(`${$prefix.html()} 
`); 18 | return; 19 | } 20 | const commands = input.replace(/\s+/g, ' ').split(' '); 21 | const cmd = $.trim(commands[0].toLowerCase()); 22 | let resultContent = `${$prefix.html()} ${input} `; 23 | 24 | if(!cancel){ 25 | switch(cmd) { 26 | case 'help': 27 | resultContent += `command[ Options...]
You can use following commands:

${commandList.join('
')}

Besides, there are some hidden commands, try to find them!`; 28 | break; 29 | case 'exit': 30 | resultContent += `(^∀^●)ノシ вyё вyё~
`; 31 | window.open('https://blog.hvkcoder.me'); 32 | break 33 | case 'clear': 34 | $content.html(`
`); 35 | $cmdput.html(' '); 36 | return; 37 | case 'ls': 38 | const folders = folder.map(item => ` ${item.name}`); 39 | resultContent += `
${folders.join(' ')}
`; 40 | break; 41 | case 'cd': 42 | if(commands.length === 2) { 43 | const [_, folder] = commands; 44 | // const $contentTest = $(`
${resultContent}
`); 45 | // $contentTest.find('#pos').eq(0).html('fda'); 46 | // resultContent += `${$contentTest.html()}`; 47 | } 48 | if(commands.length > 2) { 49 | resultContent = `${resultContent}
cd: string not in pwd: ${commands[1]}`; 50 | } 51 | break; 52 | default: 53 | resultContent = `${resultContent}
zsh: command not found: ${cmd}`; 54 | break; 55 | } 56 | } 57 | $content.append(resultContent + '
'); 58 | $cmdput.html(' '); 59 | } 60 | 61 | const getLabels = async () => { 62 | const { data } = await axios.get(`${API}/labels`); 63 | folder = data; 64 | }; 65 | 66 | document.addEventListener('keydown', event => { 67 | $cmdput.focus(); 68 | if(event.keyCode === 13) { 69 | event.preventDefault(); 70 | doCommand(); 71 | $html.animate({ scrollTop: $(document).height() },0); 72 | } else if(event.ctrlKey && event.keyCode === 75) { // Ctrl + K 73 | $content.html('
'); 74 | } else if(event.ctrlKey && event.keyCode === 67) { // Ctrl + C 75 | doCommand(true); 76 | } 77 | }, false); 78 | 79 | $cmdput.focus(); 80 | getLabels(); 81 | }); 82 | -------------------------------------------------------------------------------- /src/assets/stylus/iconfont.css: -------------------------------------------------------------------------------- 1 | /* latin-ext */ 2 | @font-face { 3 | font-family: 'Cutive Mono'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: local('Cutive Mono Regular'), local('CutiveMono-Regular'), 7 | url(https://fonts.gstatic.com/s/cutivemono/v6/m8JWjfRfY7WVjVi2E-K9H6RMTm6o39ucNvc.woff2) format('woff2'); 8 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 9 | } 10 | 11 | /* latin */ 12 | @font-face { 13 | font-family: 'Cutive Mono'; 14 | font-style: normal; 15 | font-weight: 400; 16 | src: local('Cutive Mono Regular'), local('CutiveMono-Regular'), 17 | url(https://fonts.gstatic.com/s/cutivemono/v6/m8JWjfRfY7WVjVi2E-K9H6RCTm6o39uc.woff2) format('woff2'); 18 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, 19 | U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 20 | } 21 | 22 | /* latin */ 23 | @font-face { 24 | font-family: 'Monaco'; 25 | font-style: normal; 26 | font-weight: 400; 27 | src: local('monaco.ttf'); 28 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, 29 | U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 30 | } 31 | @font-face { 32 | font-family: 'iconfont'; 33 | src: url('../font/iconfont.eot?t=1610004060752'); /* IE9 */ 34 | src: url('../font/iconfont.eot?t=1610004060752#iefix') format('embedded-opentype'), 35 | /* IE6-IE8 */ 36 | url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMIAAsAAAAABtwAAAK7AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDBgqBPIFHATYCJAMMCwgABCAFhG0HQBsXBsiemjwxZmCxKACP1QfWxRDFw9N+v86dmf9QaZBEoydPKolIIjQS0SQGqBoambUS9n/Xyn9AnCMHiAphIAOUedkcAAiDjuRx1ZEtOVLt8yRbuYsqXIo644vQG+7376tP3Dv907JA5rvLc9yTxtjnn7oA44ACHXOSFVCC3DB2wQvcTKBRvyxuKy1dveCrsHsF4kyVOfAthBSFZeuFqmFiEQ/gpT5dun/CffT9+Gf5ktQye+D2abMIdT/uv948Vl2rRgMCwiDA6TVkTACFOGlMHfMQjO+hUe/ZXVwpQloq6nIRyQ1t5fzhkQRRsSubwQiKJH48Eu/ve+VTb5NBhYI5YB2x3QeE3BMa6HvuvvrFP/jqm5vXxfeAgOuvoMV/8ELw+VNsOnrObLt6TcjHL6K/234/+Oemg4GAof4AtyZN+9V3mc9Fq53F74qBuygzsYavBl2h9N+cN4VNzqbCmyiPd3rr0R2pN3tVz06ey+/XWyh/6z0MJtld83cuBSC/pref+xtfZ+r/hVT98w0o4Dvx+0X2Yni6XoIpfqViYE0xVLYjF03uyS1PNnBbyYRGw+s/29fp53Rzz+1mQr2eDEmdPmT1BsjCTqCmySQq9ebRaFzr9CZdKA9RGjBmCyC0u0bS6gVZu89kYX+gptdfVNrzQKPDiFiwyVCqfyPFHMMi4ueQKhBLcl3MP67uxvKUwdG8KhL0Y+pQoyg/J6+cbcUWpksMcUzLBYxJSKLERC1gO2wYBNmUaFhgOQpjdkVurtT0phyBmOBvGYVxGEyE8OYgKgFhkYLGjH/l890w2RQDh3Zw6rL9MMpBbR3JlyNvANmqtwZxHuUah2myAgwjQSQUYUJaQDvMYCAQu7mdBhMwOZQJCVuFXKeeNFSfs73R/L9N0Mg+NUeKHEV1SgwR0yCDyCTb5KgukhkLAAA=') 37 | format('woff2'), 38 | url('../font/iconfont.woff?t=1610004060752') format('woff'), 39 | url('../font/iconfont.ttf?t=1610004060752') format('truetype'), 40 | /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url('../font/iconfont.svg?t=1610004060752#iconfont') 41 | format('svg'); /* iOS 4.1- */ 42 | } 43 | 44 | .iconfont { 45 | font-family: 'iconfont' !important; 46 | font-size: 16px; 47 | font-style: normal; 48 | -webkit-font-smoothing: antialiased; 49 | -moz-osx-font-smoothing: grayscale; 50 | } 51 | 52 | .icon-folder:before { 53 | content: '\eac9'; 54 | } 55 | 56 | .icon-logo-markdown:before { 57 | content: '\e602'; 58 | } 59 | --------------------------------------------------------------------------------