├── .babelrc ├── .gitignore ├── LICENSE ├── README.md ├── debug.log ├── dist └── vm_markdown.min.js ├── docs ├── favicon.ico ├── index.html ├── logo.png ├── main └── main.map ├── index.html ├── package.json ├── src ├── App.vue ├── assets │ ├── favicon.ico │ └── iconfont │ │ ├── iconfont.css │ │ ├── iconfont.eot │ │ ├── iconfont.js │ │ ├── iconfont.svg │ │ ├── iconfont.ttf │ │ └── iconfont.woff ├── components │ └── vm-markdown │ │ ├── assets │ │ ├── favicon.ico │ │ ├── iconfont │ │ │ ├── demo.css │ │ │ ├── demo_index.html │ │ │ ├── iconfont.css │ │ │ ├── iconfont.eot │ │ │ ├── iconfont.js │ │ │ ├── iconfont.svg │ │ │ ├── iconfont.ttf │ │ │ ├── iconfont.woff │ │ │ └── iconfont.woff2 │ │ ├── js │ │ │ └── insertText.js │ │ └── logo_vmeditor.png │ │ ├── components │ │ ├── dropdown.vue │ │ ├── index.vue │ │ ├── menu-button.vue │ │ ├── menu.vue │ │ └── tool-table.vue │ │ ├── index.js │ │ ├── text │ │ └── intro.js │ │ └── theme │ │ └── theme.js ├── main.js ├── text │ └── intro.js └── theme │ └── theme.js ├── static ├── favicon.ico └── logo.png ├── webpack.config.js ├── webpack.config.rules.js └── webpack.dist.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env" 4 | ], 5 | "plugins": [ 6 | "@babel/plugin-transform-runtime" 7 | ] 8 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log 4 | debug.log 5 | yarn-error.log 6 | 7 | # Editor directories and files 8 | .idea 9 | *.suo 10 | *.ntvs* 11 | *.njsproj 12 | *.sln 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 JesseLuo 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 |

6 | example 7 |

8 |

9 | 10 | 11 | 12 |

13 | 14 | ### Install 15 | 16 | ```bash 17 | npm install --save vm-markdown 18 | ``` 19 | ### Usage 20 | 21 | ```vue 22 | 31 | 58 | ``` 59 | 60 | ### License 61 | 62 | [MIT](https://github.com/luosijie/vm-editor/blob/master/LICENSE.md) 63 | -------------------------------------------------------------------------------- /debug.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/debug.log -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/docs/favicon.ico -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | vm-markdown 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/docs/logo.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | vm-markdown 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vm-markdown", 3 | "description": "A Vue Markdown Editor", 4 | "version": "0.3.4", 5 | "author": "Jesse Luo ", 6 | "private": false, 7 | "main": "./src/components/vm-markdown/index.js", 8 | "license": "MIT", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/luosijie/vm-markdown" 12 | }, 13 | "scripts": { 14 | "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot", 15 | "build:example": "cross-env NODE_ENV=production webpack --progress --hide-modules", 16 | "build:dist": "cross-env NODE_ENV=production webpack --config webpack.dist.config.js" 17 | }, 18 | "dependencies": { 19 | "highlight.js": "^9.13.1", 20 | "marked": "^0.6.0" 21 | }, 22 | "devDependencies": { 23 | "@babel/core": "^7.2.2", 24 | "@babel/plugin-transform-runtime": "^7.2.0", 25 | "@babel/polyfill": "^7.2.5", 26 | "@babel/preset-env": "^7.2.3", 27 | "@babel/runtime": "7.3.1", 28 | "babel-loader": "^8.0.5", 29 | "cross-env": "^5.2.0", 30 | "css-loader": "^2.1.0", 31 | "file-loader": "^3.0.1", 32 | "html-webpack-plugin": "^3.2.0", 33 | "node-sass": "^4.13.0", 34 | "sass-loader": "^7.1.0", 35 | "style-loader": "^0.23.1", 36 | "url-loader": "^1.1.2", 37 | "vue": "^2.5.22", 38 | "vue-loader": "^15.5.0", 39 | "vue-style-loader": "^4.1.2", 40 | "vue-template-compiler": "^2.5.22", 41 | "webpack": "^4.28.3", 42 | "webpack-cli": "^3.2.0", 43 | "webpack-dev-server": "^3.1.14" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 98 | 99 | 177 | -------------------------------------------------------------------------------- /src/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/assets/favicon.ico -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face {font-family: "iconfont"; 3 | src: url('iconfont.eot?t=1503648697628'); /* IE9*/ 4 | src: url('iconfont.eot?t=1503648697628#iefix') format('embedded-opentype'), /* IE6-IE8 */ 5 | url('iconfont.woff?t=1503648697628') format('woff'), /* chrome, firefox */ 6 | url('iconfont.ttf?t=1503648697628') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 7 | url('iconfont.svg?t=1503648697628#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family:"iconfont" !important; 12 | font-size:16px; 13 | font-style:normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-code:before { content: "\e65f"; } 19 | 20 | .icon-line:before { content: "\e688"; } 21 | 22 | .icon-italic:before { content: "\e7fe"; } 23 | 24 | .icon-link:before { content: "\e66f"; } 25 | 26 | .icon-underline:before { content: "\e823"; } 27 | 28 | .icon-ul:before { content: "\e683"; } 29 | 30 | .icon-quote:before { content: "\e8cf"; } 31 | 32 | .icon-image:before { content: "\e627"; } 33 | 34 | .icon-font-size:before { content: "\e931"; } 35 | 36 | .icon-strikethrough:before { content: "\e61b"; } 37 | 38 | .icon-heading:before { content: "\e620"; } 39 | 40 | .icon-bold:before { content: "\e71b"; } 41 | 42 | .icon-table:before { content: "\e813"; } 43 | 44 | .icon-github:before { content: "\e603"; } 45 | 46 | .icon-ol:before { content: "\e93c"; } 47 | 48 | .icon-layout-default:before { content: "\e628"; } 49 | 50 | .icon-layout-right:before { content: "\e629"; } 51 | 52 | .icon-layout-left:before { content: "\e62a"; } 53 | 54 | .icon-layout-zoom:before { content: "\e62b"; } 55 | 56 | -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/assets/iconfont/iconfont.eot -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.js: -------------------------------------------------------------------------------- 1 | (function(window){var svgSprite=""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+''+""+""+""+''+""+''+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+""+""+''+""+''+""+''+""+""+""+"";var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by iconfont 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/assets/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/assets/iconfont/iconfont.woff -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/components/vm-markdown/assets/favicon.ico -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/demo.css: -------------------------------------------------------------------------------- 1 | /* Logo 字体 */ 2 | @font-face { 3 | font-family: "iconfont logo"; 4 | src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); 5 | src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), 6 | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), 7 | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), 8 | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); 9 | } 10 | 11 | .logo { 12 | font-family: "iconfont logo"; 13 | font-size: 160px; 14 | font-style: normal; 15 | -webkit-font-smoothing: antialiased; 16 | -moz-osx-font-smoothing: grayscale; 17 | } 18 | 19 | /* tabs */ 20 | .nav-tabs { 21 | position: relative; 22 | } 23 | 24 | .nav-tabs .nav-more { 25 | position: absolute; 26 | right: 0; 27 | bottom: 0; 28 | height: 42px; 29 | line-height: 42px; 30 | color: #666; 31 | } 32 | 33 | #tabs { 34 | border-bottom: 1px solid #eee; 35 | } 36 | 37 | #tabs li { 38 | cursor: pointer; 39 | width: 100px; 40 | height: 40px; 41 | line-height: 40px; 42 | text-align: center; 43 | font-size: 16px; 44 | border-bottom: 2px solid transparent; 45 | position: relative; 46 | z-index: 1; 47 | margin-bottom: -1px; 48 | color: #666; 49 | } 50 | 51 | 52 | #tabs .active { 53 | border-bottom-color: #f00; 54 | color: #222; 55 | } 56 | 57 | .tab-container .content { 58 | display: none; 59 | } 60 | 61 | /* 页面布局 */ 62 | .main { 63 | padding: 30px 100px; 64 | width: 960px; 65 | margin: 0 auto; 66 | } 67 | 68 | .main .logo { 69 | color: #333; 70 | text-align: left; 71 | margin-bottom: 30px; 72 | line-height: 1; 73 | height: 110px; 74 | margin-top: -50px; 75 | overflow: hidden; 76 | *zoom: 1; 77 | } 78 | 79 | .main .logo a { 80 | font-size: 160px; 81 | color: #333; 82 | } 83 | 84 | .helps { 85 | margin-top: 40px; 86 | } 87 | 88 | .helps pre { 89 | padding: 20px; 90 | margin: 10px 0; 91 | border: solid 1px #e7e1cd; 92 | background-color: #fffdef; 93 | overflow: auto; 94 | } 95 | 96 | .icon_lists { 97 | width: 100% !important; 98 | overflow: hidden; 99 | *zoom: 1; 100 | } 101 | 102 | .icon_lists li { 103 | width: 100px; 104 | margin-bottom: 10px; 105 | margin-right: 20px; 106 | text-align: center; 107 | list-style: none !important; 108 | cursor: default; 109 | } 110 | 111 | .icon_lists li .code-name { 112 | line-height: 1.2; 113 | } 114 | 115 | .icon_lists .icon { 116 | display: block; 117 | height: 100px; 118 | line-height: 100px; 119 | font-size: 42px; 120 | margin: 10px auto; 121 | color: #333; 122 | -webkit-transition: font-size 0.25s linear, width 0.25s linear; 123 | -moz-transition: font-size 0.25s linear, width 0.25s linear; 124 | transition: font-size 0.25s linear, width 0.25s linear; 125 | } 126 | 127 | .icon_lists .icon:hover { 128 | font-size: 100px; 129 | } 130 | 131 | .icon_lists .svg-icon { 132 | /* 通过设置 font-size 来改变图标大小 */ 133 | width: 1em; 134 | /* 图标和文字相邻时,垂直对齐 */ 135 | vertical-align: -0.15em; 136 | /* 通过设置 color 来改变 SVG 的颜色/fill */ 137 | fill: currentColor; 138 | /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 139 | normalize.css 中也包含这行 */ 140 | overflow: hidden; 141 | } 142 | 143 | .icon_lists li .name, 144 | .icon_lists li .code-name { 145 | color: #666; 146 | } 147 | 148 | /* markdown 样式 */ 149 | .markdown { 150 | color: #666; 151 | font-size: 14px; 152 | line-height: 1.8; 153 | } 154 | 155 | .highlight { 156 | line-height: 1.5; 157 | } 158 | 159 | .markdown img { 160 | vertical-align: middle; 161 | max-width: 100%; 162 | } 163 | 164 | .markdown h1 { 165 | color: #404040; 166 | font-weight: 500; 167 | line-height: 40px; 168 | margin-bottom: 24px; 169 | } 170 | 171 | .markdown h2, 172 | .markdown h3, 173 | .markdown h4, 174 | .markdown h5, 175 | .markdown h6 { 176 | color: #404040; 177 | margin: 1.6em 0 0.6em 0; 178 | font-weight: 500; 179 | clear: both; 180 | } 181 | 182 | .markdown h1 { 183 | font-size: 28px; 184 | } 185 | 186 | .markdown h2 { 187 | font-size: 22px; 188 | } 189 | 190 | .markdown h3 { 191 | font-size: 16px; 192 | } 193 | 194 | .markdown h4 { 195 | font-size: 14px; 196 | } 197 | 198 | .markdown h5 { 199 | font-size: 12px; 200 | } 201 | 202 | .markdown h6 { 203 | font-size: 12px; 204 | } 205 | 206 | .markdown hr { 207 | height: 1px; 208 | border: 0; 209 | background: #e9e9e9; 210 | margin: 16px 0; 211 | clear: both; 212 | } 213 | 214 | .markdown p { 215 | margin: 1em 0; 216 | } 217 | 218 | .markdown>p, 219 | .markdown>blockquote, 220 | .markdown>.highlight, 221 | .markdown>ol, 222 | .markdown>ul { 223 | width: 80%; 224 | } 225 | 226 | .markdown ul>li { 227 | list-style: circle; 228 | } 229 | 230 | .markdown>ul li, 231 | .markdown blockquote ul>li { 232 | margin-left: 20px; 233 | padding-left: 4px; 234 | } 235 | 236 | .markdown>ul li p, 237 | .markdown>ol li p { 238 | margin: 0.6em 0; 239 | } 240 | 241 | .markdown ol>li { 242 | list-style: decimal; 243 | } 244 | 245 | .markdown>ol li, 246 | .markdown blockquote ol>li { 247 | margin-left: 20px; 248 | padding-left: 4px; 249 | } 250 | 251 | .markdown code { 252 | margin: 0 3px; 253 | padding: 0 5px; 254 | background: #eee; 255 | border-radius: 3px; 256 | } 257 | 258 | .markdown strong, 259 | .markdown b { 260 | font-weight: 600; 261 | } 262 | 263 | .markdown>table { 264 | border-collapse: collapse; 265 | border-spacing: 0px; 266 | empty-cells: show; 267 | border: 1px solid #e9e9e9; 268 | width: 95%; 269 | margin-bottom: 24px; 270 | } 271 | 272 | .markdown>table th { 273 | white-space: nowrap; 274 | color: #333; 275 | font-weight: 600; 276 | } 277 | 278 | .markdown>table th, 279 | .markdown>table td { 280 | border: 1px solid #e9e9e9; 281 | padding: 8px 16px; 282 | text-align: left; 283 | } 284 | 285 | .markdown>table th { 286 | background: #F7F7F7; 287 | } 288 | 289 | .markdown blockquote { 290 | font-size: 90%; 291 | color: #999; 292 | border-left: 4px solid #e9e9e9; 293 | padding-left: 0.8em; 294 | margin: 1em 0; 295 | } 296 | 297 | .markdown blockquote p { 298 | margin: 0; 299 | } 300 | 301 | .markdown .anchor { 302 | opacity: 0; 303 | transition: opacity 0.3s ease; 304 | margin-left: 8px; 305 | } 306 | 307 | .markdown .waiting { 308 | color: #ccc; 309 | } 310 | 311 | .markdown h1:hover .anchor, 312 | .markdown h2:hover .anchor, 313 | .markdown h3:hover .anchor, 314 | .markdown h4:hover .anchor, 315 | .markdown h5:hover .anchor, 316 | .markdown h6:hover .anchor { 317 | opacity: 1; 318 | display: inline-block; 319 | } 320 | 321 | .markdown>br, 322 | .markdown>p>br { 323 | clear: both; 324 | } 325 | 326 | 327 | .hljs { 328 | display: block; 329 | background: white; 330 | padding: 0.5em; 331 | color: #333333; 332 | overflow-x: auto; 333 | } 334 | 335 | .hljs-comment, 336 | .hljs-meta { 337 | color: #969896; 338 | } 339 | 340 | .hljs-string, 341 | .hljs-variable, 342 | .hljs-template-variable, 343 | .hljs-strong, 344 | .hljs-emphasis, 345 | .hljs-quote { 346 | color: #df5000; 347 | } 348 | 349 | .hljs-keyword, 350 | .hljs-selector-tag, 351 | .hljs-type { 352 | color: #a71d5d; 353 | } 354 | 355 | .hljs-literal, 356 | .hljs-symbol, 357 | .hljs-bullet, 358 | .hljs-attribute { 359 | color: #0086b3; 360 | } 361 | 362 | .hljs-section, 363 | .hljs-name { 364 | color: #63a35c; 365 | } 366 | 367 | .hljs-tag { 368 | color: #333333; 369 | } 370 | 371 | .hljs-title, 372 | .hljs-attr, 373 | .hljs-selector-id, 374 | .hljs-selector-class, 375 | .hljs-selector-attr, 376 | .hljs-selector-pseudo { 377 | color: #795da3; 378 | } 379 | 380 | .hljs-addition { 381 | color: #55a532; 382 | background-color: #eaffea; 383 | } 384 | 385 | .hljs-deletion { 386 | color: #bd2c00; 387 | background-color: #ffecec; 388 | } 389 | 390 | .hljs-link { 391 | text-decoration: underline; 392 | } 393 | 394 | /* 代码高亮 */ 395 | /* PrismJS 1.15.0 396 | https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ 397 | /** 398 | * prism.js default theme for JavaScript, CSS and HTML 399 | * Based on dabblet (http://dabblet.com) 400 | * @author Lea Verou 401 | */ 402 | code[class*="language-"], 403 | pre[class*="language-"] { 404 | color: black; 405 | background: none; 406 | text-shadow: 0 1px white; 407 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 408 | text-align: left; 409 | white-space: pre; 410 | word-spacing: normal; 411 | word-break: normal; 412 | word-wrap: normal; 413 | line-height: 1.5; 414 | 415 | -moz-tab-size: 4; 416 | -o-tab-size: 4; 417 | tab-size: 4; 418 | 419 | -webkit-hyphens: none; 420 | -moz-hyphens: none; 421 | -ms-hyphens: none; 422 | hyphens: none; 423 | } 424 | 425 | pre[class*="language-"]::-moz-selection, 426 | pre[class*="language-"] ::-moz-selection, 427 | code[class*="language-"]::-moz-selection, 428 | code[class*="language-"] ::-moz-selection { 429 | text-shadow: none; 430 | background: #b3d4fc; 431 | } 432 | 433 | pre[class*="language-"]::selection, 434 | pre[class*="language-"] ::selection, 435 | code[class*="language-"]::selection, 436 | code[class*="language-"] ::selection { 437 | text-shadow: none; 438 | background: #b3d4fc; 439 | } 440 | 441 | @media print { 442 | 443 | code[class*="language-"], 444 | pre[class*="language-"] { 445 | text-shadow: none; 446 | } 447 | } 448 | 449 | /* Code blocks */ 450 | pre[class*="language-"] { 451 | padding: 1em; 452 | margin: .5em 0; 453 | overflow: auto; 454 | } 455 | 456 | :not(pre)>code[class*="language-"], 457 | pre[class*="language-"] { 458 | background: #f5f2f0; 459 | } 460 | 461 | /* Inline code */ 462 | :not(pre)>code[class*="language-"] { 463 | padding: .1em; 464 | border-radius: .3em; 465 | white-space: normal; 466 | } 467 | 468 | .token.comment, 469 | .token.prolog, 470 | .token.doctype, 471 | .token.cdata { 472 | color: slategray; 473 | } 474 | 475 | .token.punctuation { 476 | color: #999; 477 | } 478 | 479 | .namespace { 480 | opacity: .7; 481 | } 482 | 483 | .token.property, 484 | .token.tag, 485 | .token.boolean, 486 | .token.number, 487 | .token.constant, 488 | .token.symbol, 489 | .token.deleted { 490 | color: #905; 491 | } 492 | 493 | .token.selector, 494 | .token.attr-name, 495 | .token.string, 496 | .token.char, 497 | .token.builtin, 498 | .token.inserted { 499 | color: #690; 500 | } 501 | 502 | .token.operator, 503 | .token.entity, 504 | .token.url, 505 | .language-css .token.string, 506 | .style .token.string { 507 | color: #9a6e3a; 508 | background: hsla(0, 0%, 100%, .5); 509 | } 510 | 511 | .token.atrule, 512 | .token.attr-value, 513 | .token.keyword { 514 | color: #07a; 515 | } 516 | 517 | .token.function, 518 | .token.class-name { 519 | color: #DD4A68; 520 | } 521 | 522 | .token.regex, 523 | .token.important, 524 | .token.variable { 525 | color: #e90; 526 | } 527 | 528 | .token.important, 529 | .token.bold { 530 | font-weight: bold; 531 | } 532 | 533 | .token.italic { 534 | font-style: italic; 535 | } 536 | 537 | .token.entity { 538 | cursor: help; 539 | } 540 | -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/demo_index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IconFont Demo 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |

19 | 29 |
30 |
31 |
    32 | 33 |
  • 34 | 35 |
    code
    36 |
    
    37 |
  • 38 | 39 |
  • 40 | 41 |
    line
    42 |
    
    43 |
  • 44 | 45 |
  • 46 | 47 |
    italic
    48 |
    
    49 |
  • 50 | 51 |
  • 52 | 53 |
    link
    54 |
    
    55 |
  • 56 | 57 |
  • 58 | 59 |
    underline
    60 |
    
    61 |
  • 62 | 63 |
  • 64 | 65 |
    ul
    66 |
    
    67 |
  • 68 | 69 |
  • 70 | 71 |
    quote
    72 |
    
    73 |
  • 74 | 75 |
  • 76 | 77 |
    image
    78 |
    
    79 |
  • 80 | 81 |
  • 82 | 83 |
    font
    84 |
    
    85 |
  • 86 | 87 |
  • 88 | 89 |
    strike
    90 |
    
    91 |
  • 92 | 93 |
  • 94 | 95 |
    editor-heading
    96 |
    
    97 |
  • 98 | 99 |
  • 100 | 101 |
    bold
    102 |
    
    103 |
  • 104 | 105 |
  • 106 | 107 |
    table
    108 |
    
    109 |
  • 110 | 111 |
  • 112 | 113 |
    github
    114 |
    
    115 |
  • 116 | 117 |
  • 118 | 119 |
    ol
    120 |
    
    121 |
  • 122 | 123 |
  • 124 | 125 |
    layout-default
    126 |
    
    127 |
  • 128 | 129 |
  • 130 | 131 |
    layout-right
    132 |
    
    133 |
  • 134 | 135 |
  • 136 | 137 |
    layout-left
    138 |
    
    139 |
  • 140 | 141 |
  • 142 | 143 |
    layout-zoom
    144 |
    
    145 |
  • 146 | 147 |
148 |
149 |

Unicode 引用

150 |
151 | 152 |

Unicode 是字体在网页端最原始的应用方式,特点是:

153 |
    154 |
  • 兼容性最好,支持 IE6+,及所有现代浏览器。
  • 155 |
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • 156 |
  • 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
  • 157 |
158 |
159 |

注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式

160 |
161 |

Unicode 使用步骤如下:

162 |

第一步:拷贝项目下面生成的 @font-face

163 |
@font-face {
165 |   font-family: 'iconfont';
166 |   src: url('iconfont.eot');
167 |   src: url('iconfont.eot?#iefix') format('embedded-opentype'),
168 |       url('iconfont.woff2') format('woff2'),
169 |       url('iconfont.woff') format('woff'),
170 |       url('iconfont.ttf') format('truetype'),
171 |       url('iconfont.svg#iconfont') format('svg');
172 | }
173 | 
174 |

第二步:定义使用 iconfont 的样式

175 |
.iconfont {
177 |   font-family: "iconfont" !important;
178 |   font-size: 16px;
179 |   font-style: normal;
180 |   -webkit-font-smoothing: antialiased;
181 |   -moz-osx-font-smoothing: grayscale;
182 | }
183 | 
184 |

第三步:挑选相应图标并获取字体编码,应用于页面

185 |
186 | <span class="iconfont">&#x33;</span>
188 | 
189 |
190 |

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

191 |
192 |
193 |
194 |
195 |
    196 | 197 |
  • 198 | 199 |
    200 | code 201 |
    202 |
    .vm-code 203 |
    204 |
  • 205 | 206 |
  • 207 | 208 |
    209 | line 210 |
    211 |
    .vm-line 212 |
    213 |
  • 214 | 215 |
  • 216 | 217 |
    218 | italic 219 |
    220 |
    .vm-italic 221 |
    222 |
  • 223 | 224 |
  • 225 | 226 |
    227 | link 228 |
    229 |
    .vm-link 230 |
    231 |
  • 232 | 233 |
  • 234 | 235 |
    236 | underline 237 |
    238 |
    .vm-underline 239 |
    240 |
  • 241 | 242 |
  • 243 | 244 |
    245 | ul 246 |
    247 |
    .vm-ul 248 |
    249 |
  • 250 | 251 |
  • 252 | 253 |
    254 | quote 255 |
    256 |
    .vm-quote 257 |
    258 |
  • 259 | 260 |
  • 261 | 262 |
    263 | image 264 |
    265 |
    .vm-image 266 |
    267 |
  • 268 | 269 |
  • 270 | 271 |
    272 | font 273 |
    274 |
    .vm-font-size 275 |
    276 |
  • 277 | 278 |
  • 279 | 280 |
    281 | strike 282 |
    283 |
    .vm-strikethrough 284 |
    285 |
  • 286 | 287 |
  • 288 | 289 |
    290 | editor-heading 291 |
    292 |
    .vm-heading 293 |
    294 |
  • 295 | 296 |
  • 297 | 298 |
    299 | bold 300 |
    301 |
    .vm-bold 302 |
    303 |
  • 304 | 305 |
  • 306 | 307 |
    308 | table 309 |
    310 |
    .vm-table 311 |
    312 |
  • 313 | 314 |
  • 315 | 316 |
    317 | github 318 |
    319 |
    .vm-github 320 |
    321 |
  • 322 | 323 |
  • 324 | 325 |
    326 | ol 327 |
    328 |
    .vm-ol 329 |
    330 |
  • 331 | 332 |
  • 333 | 334 |
    335 | layout-default 336 |
    337 |
    .vm-layout-default 338 |
    339 |
  • 340 | 341 |
  • 342 | 343 |
    344 | layout-right 345 |
    346 |
    .vm-layout-right 347 |
    348 |
  • 349 | 350 |
  • 351 | 352 |
    353 | layout-left 354 |
    355 |
    .vm-layout-left 356 |
    357 |
  • 358 | 359 |
  • 360 | 361 |
    362 | layout-zoom 363 |
    364 |
    .vm-layout-zoom 365 |
    366 |
  • 367 | 368 |
369 |
370 |

font-class 引用

371 |
372 | 373 |

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

374 |

与 Unicode 使用方式相比,具有如下特点:

375 |
    376 |
  • 兼容性良好,支持 IE8+,及所有现代浏览器。
  • 377 |
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • 378 |
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • 379 |
  • 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
  • 380 |
381 |

使用步骤如下:

382 |

第一步:引入项目下面生成的 fontclass 代码:

383 |
<link rel="stylesheet" href="./iconfont.css">
384 | 
385 |

第二步:挑选相应图标并获取类名,应用于页面:

386 |
<span class="iconfont vm--xxx"></span>
387 | 
388 |
389 |

" 390 | iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

391 |
392 |
393 |
394 |
395 |
    396 | 397 |
  • 398 | 401 |
    code
    402 |
    #vm-code
    403 |
  • 404 | 405 |
  • 406 | 409 |
    line
    410 |
    #vm-line
    411 |
  • 412 | 413 |
  • 414 | 417 |
    italic
    418 |
    #vm-italic
    419 |
  • 420 | 421 |
  • 422 | 425 |
    link
    426 |
    #vm-link
    427 |
  • 428 | 429 |
  • 430 | 433 |
    underline
    434 |
    #vm-underline
    435 |
  • 436 | 437 |
  • 438 | 441 |
    ul
    442 |
    #vm-ul
    443 |
  • 444 | 445 |
  • 446 | 449 |
    quote
    450 |
    #vm-quote
    451 |
  • 452 | 453 |
  • 454 | 457 |
    image
    458 |
    #vm-image
    459 |
  • 460 | 461 |
  • 462 | 465 |
    font
    466 |
    #vm-font-size
    467 |
  • 468 | 469 |
  • 470 | 473 |
    strike
    474 |
    #vm-strikethrough
    475 |
  • 476 | 477 |
  • 478 | 481 |
    editor-heading
    482 |
    #vm-heading
    483 |
  • 484 | 485 |
  • 486 | 489 |
    bold
    490 |
    #vm-bold
    491 |
  • 492 | 493 |
  • 494 | 497 |
    table
    498 |
    #vm-table
    499 |
  • 500 | 501 |
  • 502 | 505 |
    github
    506 |
    #vm-github
    507 |
  • 508 | 509 |
  • 510 | 513 |
    ol
    514 |
    #vm-ol
    515 |
  • 516 | 517 |
  • 518 | 521 |
    layout-default
    522 |
    #vm-layout-default
    523 |
  • 524 | 525 |
  • 526 | 529 |
    layout-right
    530 |
    #vm-layout-right
    531 |
  • 532 | 533 |
  • 534 | 537 |
    layout-left
    538 |
    #vm-layout-left
    539 |
  • 540 | 541 |
  • 542 | 545 |
    layout-zoom
    546 |
    #vm-layout-zoom
    547 |
  • 548 | 549 |
550 |
551 |

Symbol 引用

552 |
553 | 554 |

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 555 | 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

556 |
    557 |
  • 支持多色图标了,不再受单色限制。
  • 558 |
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • 559 |
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • 560 |
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • 561 |
562 |

使用步骤如下:

563 |

第一步:引入项目下面生成的 symbol 代码:

564 |
<script src="./iconfont.js"></script>
565 | 
566 |

第二步:加入通用 CSS 代码(引入一次就行):

567 |
<style>
568 | .icon {
569 |   width: 1em;
570 |   height: 1em;
571 |   vertical-align: -0.15em;
572 |   fill: currentColor;
573 |   overflow: hidden;
574 | }
575 | </style>
576 | 
577 |

第三步:挑选相应图标并获取类名,应用于页面:

578 |
<svg class="icon" aria-hidden="true">
579 |   <use xlink:href="#icon-xxx"></use>
580 | </svg>
581 | 
582 |
583 |
584 | 585 |
586 |
587 | 606 | 607 | 608 | -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/iconfont.css: -------------------------------------------------------------------------------- 1 | @font-face {font-family: "iconfont"; 2 | src: url('iconfont.eot?t=1548814803647'); /* IE9 */ 3 | src: url('iconfont.eot?t=1548814803647#iefix') format('embedded-opentype'), /* IE6-IE8 */ 4 | url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAs0AAsAAAAAFJAAAArkAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCFXAqYDJNaATYCJANQCyoABCAFhG0HgWUbaREz0izOyoPsv0rgyfCalyMCxZsxDiBmqw3rGHO4bUWE9NppiYgED2E7+5fGA7lf+fKTRXAFILuyVcCOcTyCYuErXI1kW0W5vQI7/P9p0/6+GSwzaLD40og3JeZEjYZQSZVCGzFC2pJUhp5Ntwv/e8QrTqpOqo5UbV3TgASlreO/BwhOgJo41/ZEys2KwpUweZpvP1enDY00PfTaQkJSpIQvtt397R2qFimRSBKTJKJRNNRKCBkN2yTMrOghVorLb6xOQN10S4W1+Rt2YEmYIaDQqbqj+7F8fpLAOqgay5xZUy3cQ1ct7hQ3cJc+Pny0OrAolCK2pi26dYco3sXPRpH6Ty0OVV4IrnMRsRSJMOaGvRFt/VJCdV7O5AkwUzmORI7vpuSZeUnem8/ma3ndhPfEv/FgPGf87LPoydF/oTcX1B8o1MLA64Uz01bXUNXV0zcYs3/yygpNUUtJRU2HUMZQ86T9lT4gRw3SJk+B1MkzIQ3yAkiVvBDSJS+C9MiLIX3yErZsvBdEAD4LIgFfA1EGvg1IwcQUokn4HyCR8YBoAc8BUQJ+BkiFyVVEDXiEMjpgaMyyECPiN9JTTH50SosKQdaXNWVC0Y/q+47h0ddig7JF7jTEDpQyDW1BkmQI3Ji+iB8QskYkiuFLyVm+vnyOmZ1Op9FYdJa+RDpt3hZRdQ8lVqFey7hJUqPuN1mbKAb1mXdw6OjonRYpgqTznp+otgcGdwZZxqXz+tGQFTeCO+oCYgkJbEQ2EKir5sQVUaVy+l6npOaWXVQ94RCrbrqk06tsxdXHqT7v1IX2OUPN+6pCqS3BNX1jEWrT9jBV705tdc8WSY25T5rZ60jtP6iM6N8epLIMdpGY3V7tdNbgJEbtD9vpsLgixg+iRTzgziaAVAMPLSdt56sazHaIQydM90nN49S7TIjBZ3bxt5zyYAyeDhJst3kzh84EV4/cMd8z3bfcncNHs2eS6i4BRvQ5iy/ZRbXU7iAS2AFqy0nveX3OFuxmHN5l6QXQQ7ib+xAy9ZMaq9cBZHKRFtVh1eAUB/AQ5UucGfeI+9I5VIeLjgepBoGSj4TuSLoSd4Ew59cckWTbpYJBT99e8e6bDtLiciFTubW4qweonVsPi7fCHIE9h8w7gBqM0VuEOYeRadsRybbKSkv7SY5FTIHqZbZli5G86M3FTtk3NCTxoiNTSP/27ePINNSITLOTMA98cleDHoJtrp8Wezi6RM1x0oJMUUNnTlw6QphF1TAyunHWVuhvt46cuyUMiaMcmXdkSUC/K6R/WOrdj1C3V9+2bZIEv8uvSZXF4bjpAPt2nToW6IQAOzMQhU5p1yBTH0GYewD0kqQlTy1+zxZ0RCdq1LS11jWEmkbdIfjme4i+JrYqsNztsr+pdjhUW/slyO6U7jkhsm4XHz4NZx0h60NW3VJMmX3OWNNF1WVLnusy3C46DQshpHe3b1E5pS6X2vlOdclhzojdSVrGco9zvSKGx6UoFwhEQvVOzwZiCJn2njw5btpGmCPLh6+Tlpvg1LFjIhIZV5KWG8uz9HbmGKCa6AnNUJMQ0xruH7SLzxAwlzM5DLaRbTDvUp04D3FxAeNaFq/E+EwBxoXIHRUw+Mu4NB69lo1zvvGWPz116q+I2Xhis8GNUGvojdGx0dEnYdbfv5b8dfoU3LRzhT0ZGR0d+y38BGy2J6t7+G1lk2Nzw61yDAanFAp0hXYckuI5H5U5SX3CfLmQ9vzJ+/efduM3cvPue+ZEP38uLpDR9uzfFFBS5XCtzZbR12mzsv4bkFd59+7UYk+hzYa8s75J0gYWy9/SCz61YqN7x0b438Ubl+E2/diojNU18kk36vxszy7kdyMgKC9eWunVsQytzNy0Ca2ByKigNmDGQ5s+wRTKGBQzbqA2+PWvPVbgqVSzH1vb7zc5j2LZ4crN4ZHhMi3byRH5fxOHUalsaPjksPx/Tc6vYfX/zu7uTlCYyLPm2VbfhoK0CABAQZJqCsUSQKzZQGmrn7NUSuV0FYVAPV89mfnnNmAczIwXB3qqBt58VowDnMN/Ozw9+iIqBPx3JByS1zJL+TPnsEvkAsi/QrlZ3UI1OU4+OY8Q8ePHyW1bRzfJCoj+XLF6Aas0iJQviKX8arElpQXTCxOjqpQfB4//qWhuXJ84JW/s7jPtdc4jn+jTnVrjkbw21+3Stx+vvVcSqGwq9owKmStLKg6P98n6DdDbhEaeu2JfQHdqPoRsLetw95YLeA95novwWB3uZa9Y8vTFtlTlSTajjTvEa2Oy4YSypAOnMlMUW4h7eDfi3tzXNt0rvGM6lCsTArh05J8f2f2TXiDgfuB4avC4BtwntsT8CWV37XR4WMpfJPmHuI3Ofpsf0Ss2Rbvz3nO9dHjcYtyLC1av/wa7bFkdH9qy60xTwn+CQ8GIiMPG2oOn5XHbfbLkoaQpmxfk6/Sl6f1g5pRYFr2tglOQUOnlL+UkRx8LSHwzcf6jViFRUgah67n5ssyP8iP8+P/5NvqpWmhoVaWEzMxOmRk8jxfvuQjzTHtLQuHpJtYQ66jGk83rZtYgBR45A+81saysI+DRW+CZ1CmB95tZO7kBO1lybwH3hL0FnMnfW8D9Glp7kzpn4emm4Lxg0Hi6tSCLZRdoGEa7gA3v/uwfke63mGW17IycYBoHth6Xi/MwrByKLzRX0FbW4qvKnlqYWQj/oAipWF6hCH+LcxnZhU9L8TUrZ1XgJzwwivX1q39E7v4MGy7rFmDw0Hfqm6g01XfHpwha+YEHvwm9l2CF+dPT1bbYBMWlcCjaeTuA9F1fO2OHD5frJUdP5k0J/1eYT8tnzdyigAT+0R6ZmA1fMdMaU/V7si05Hf6LigzmssL09wmyp83MeMTsK4XWfJMvBpIPVupGN4wmaHSRxjBjzARupLkh7VXl6OiGhPkpxrqUuqWRYYHgrwaNbsnIpXUpkB4rN8QSjcZf3HIueM78OclBX7KlwepL3wLA5K4QtmsSWgmdQsoECldQ2jrf4AuhVpT8w32cDgAgQsBTD6dsbCU+DylnfIbnIO2q/+OJaQyvifaH3MTLYEcF+DmfHXQHr+QOSKPBSfT8j3m8tJ9Y5J9U4oNl4fdlMlmOamUqsGBYOAKHH7+0vRemCx/hpBd9CdDOcbTSpFsvrb2P+dXBlu4gsgGINAwA4VY7+ES5e9YGWZyakfUsH3cFGCZfgGMJVNK0kYCOFAcYWDIBIULB3CQhPRxKbgAQrlsCCN9egOGyARzfTSVN+xTQSXwFGPgBB4SaIFwkKTjUETl67QKDdpFsoVFWp2lp1qmBBsIqrNQu7mhcoPcKZFuj1bfXJcqio+TBzAJts1ZfxhTtSxfHGAw6mU7f0iTLl9ambWxskbXqW+q1GkPUEoOhNWXaNB1vyihNSxMQcuhpLWAwXC8is5BRt45Gi2a6vg2I0PsraS3WodECekGtb90aWnrt6vovEy2KPIWyADWnqrUtJdsttVgMgxyiI9Mq6rVoIpMvh2g1KmktZFr5I9XT0jCIsiRHSqsU0+TWdGlRVP1y0xaQYSHWwc5SFDCEIxqiIwZiIhZyQwQiERtxEBfxEB8JkDsSIhESA+0gpGocki84eRLJKzd3vHLRGJxpd5yOnSvh6LOwuE7GpW/T//GcNHwEuVHZurOD0L7Yg6xJH0nIhJP15Fjuanol8atMm4YRnOjhLTC8dXS/RiWYc65/rXkBAAAA') format('woff2'), 5 | url('iconfont.woff?t=1548814803647') format('woff'), 6 | url('iconfont.ttf?t=1548814803647') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ 7 | url('iconfont.svg?t=1548814803647#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family: "iconfont" !important; 12 | font-size: 16px; 13 | font-style: normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .vm-code:before { 19 | content: "\e65f"; 20 | } 21 | 22 | .vm-line:before { 23 | content: "\e688"; 24 | } 25 | 26 | .vm-italic:before { 27 | content: "\e7fe"; 28 | } 29 | 30 | .vm-link:before { 31 | content: "\e66f"; 32 | } 33 | 34 | .vm-underline:before { 35 | content: "\e823"; 36 | } 37 | 38 | .vm-ul:before { 39 | content: "\e683"; 40 | } 41 | 42 | .vm-quote:before { 43 | content: "\e8cf"; 44 | } 45 | 46 | .vm-image:before { 47 | content: "\e627"; 48 | } 49 | 50 | .vm-font-size:before { 51 | content: "\e931"; 52 | } 53 | 54 | .vm-strikethrough:before { 55 | content: "\e61b"; 56 | } 57 | 58 | .vm-heading:before { 59 | content: "\e620"; 60 | } 61 | 62 | .vm-bold:before { 63 | content: "\e71b"; 64 | } 65 | 66 | .vm-table:before { 67 | content: "\e813"; 68 | } 69 | 70 | .vm-github:before { 71 | content: "\e603"; 72 | } 73 | 74 | .vm-ol:before { 75 | content: "\e93c"; 76 | } 77 | 78 | .vm-layout-default:before { 79 | content: "\e628"; 80 | } 81 | 82 | .vm-layout-right:before { 83 | content: "\e629"; 84 | } 85 | 86 | .vm-layout-left:before { 87 | content: "\e62a"; 88 | } 89 | 90 | .vm-layout-zoom:before { 91 | content: "\e62b"; 92 | } 93 | 94 | -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/components/vm-markdown/assets/iconfont/iconfont.eot -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/iconfont.js: -------------------------------------------------------------------------------- 1 | !function(s){var t,i='',l=(t=document.getElementsByTagName("script"))[t.length-1].getAttribute("data-injectcss");if(l&&!s.__iconfont__svg__cssinject__){s.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}!function(t){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(t,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),t()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(e=t,o=s.document,c=!1,h=function(){c||(c=!0,e())},(i=function(){try{o.documentElement.doScroll("left")}catch(t){return void setTimeout(i,50)}h()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,h())});var e,o,c,h,i}(function(){var t,l,e,o,c,h;(t=document.createElement("div")).innerHTML=i,i=null,(l=t.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",e=l,(o=document.body).firstChild?(c=e,(h=o.firstChild).parentNode.insertBefore(c,h)):o.appendChild(e))})}(window); -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/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 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/components/vm-markdown/assets/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/components/vm-markdown/assets/iconfont/iconfont.woff -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/components/vm-markdown/assets/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/js/insertText.js: -------------------------------------------------------------------------------- 1 | function insertText(textDom, value) { 2 | textDom.focus() 3 | var startPos = getSelection(textDom).start 4 | var endPos = getSelection(textDom).end 5 | textDom.value = textDom.value.substring(0, startPos) + value + textDom.value.substring(endPos, textDom.value.length); 6 | textDom.selectionStart = startPos + value.length; 7 | textDom.selectionEnd = startPos + value.length; 8 | 9 | } 10 | // 获取焦点起始坐标 11 | function getSelection(el) { 12 | var start = 0, end = 0, normalizedValue, range, 13 | textInputRange, len, endRange; 14 | 15 | if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") { 16 | start = el.selectionStart; 17 | end = el.selectionEnd; 18 | } else { 19 | range = document.selection.createRange(); 20 | 21 | if (range && range.parentElement() == el) { 22 | len = el.value.length; 23 | normalizedValue = el.value.replace(/\r\n/g, "\n"); 24 | 25 | // Create a working TextRange that lives only in the input 26 | textInputRange = el.createTextRange(); 27 | textInputRange.moveToBookmark(range.getBookmark()); 28 | 29 | // Check if the start and end of the selection are at the very end 30 | // of the input, since moveStart/moveEnd doesn't return what we want 31 | // in those cases 32 | endRange = el.createTextRange(); 33 | endRange.collapse(false); 34 | 35 | if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { 36 | start = end = len; 37 | } else { 38 | start = -textInputRange.moveStart("character", -len); 39 | start += normalizedValue.slice(0, start).split("\n").length - 1; 40 | 41 | if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) { 42 | end = len; 43 | } else { 44 | end = -textInputRange.moveEnd("character", -len); 45 | end += normalizedValue.slice(0, end).split("\n").length - 1; 46 | } 47 | } 48 | } 49 | } 50 | return { 51 | start: start, 52 | end: end 53 | } 54 | } 55 | export default insertText 56 | -------------------------------------------------------------------------------- /src/components/vm-markdown/assets/logo_vmeditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luosijie/vm-markdown/8eb5a15f891d71d3c7e6eb6cb7edc4505dfe23a1/src/components/vm-markdown/assets/logo_vmeditor.png -------------------------------------------------------------------------------- /src/components/vm-markdown/components/dropdown.vue: -------------------------------------------------------------------------------- 1 | 7 | 28 | 33 | -------------------------------------------------------------------------------- /src/components/vm-markdown/components/index.vue: -------------------------------------------------------------------------------- 1 |