feat: markdown rendering
This commit is contained in:
		| @@ -22,6 +22,7 @@ | |||||||
|           outline |           outline | ||||||
|           color='red' |           color='red' | ||||||
|           :class='{ "is-icon": $vuetify.breakpoint.mdAndDown }' |           :class='{ "is-icon": $vuetify.breakpoint.mdAndDown }' | ||||||
|  |           @click.native.stop='exit' | ||||||
|           ) |           ) | ||||||
|           v-icon(color='red', :left='$vuetify.breakpoint.lgAndUp') close |           v-icon(color='red', :left='$vuetify.breakpoint.lgAndUp') close | ||||||
|           span.white--text(v-if='$vuetify.breakpoint.lgAndUp') {{ $t('common:actions.discard') }} |           span.white--text(v-if='$vuetify.breakpoint.lgAndUp') {{ $t('common:actions.discard') }} | ||||||
| @@ -285,6 +286,9 @@ export default { | |||||||
|         }) |         }) | ||||||
|       } |       } | ||||||
|       this.hideProgressDialog() |       this.hideProgressDialog() | ||||||
|  |     }, | ||||||
|  |     exit() { | ||||||
|  |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ | |||||||
|       transition(name='editor-code-preview') |       transition(name='editor-code-preview') | ||||||
|         .editor-code-preview(v-if='previewShown') |         .editor-code-preview(v-if='previewShown') | ||||||
|           .editor-code-preview-title(@click='previewShown = false') Preview |           .editor-code-preview-title(@click='previewShown = false') Preview | ||||||
|           .editor-code-preview-content.markdown-content(ref='editorPreview', v-html='previewHTML') |           .editor-code-preview-content.contents(ref='editorPreview', v-html='previewHTML') | ||||||
|  |  | ||||||
|       v-speed-dial(v-model='fabInsertMenu', :open-on-hover='true', direction='top', transition='slide-y-reverse-transition', fixed, left, bottom) |       v-speed-dial(v-model='fabInsertMenu', :open-on-hover='true', direction='top', transition='slide-y-reverse-transition', fixed, left, bottom) | ||||||
|         v-btn(color='blue', fab, dark, v-model='fabInsertMenu', slot='activator') |         v-btn(color='blue', fab, dark, v-model='fabInsertMenu', slot='activator') | ||||||
| @@ -97,6 +97,7 @@ import 'codemirror/addon/search/match-highlighter.js' | |||||||
|  |  | ||||||
| // Markdown-it | // Markdown-it | ||||||
| import MarkdownIt from 'markdown-it' | import MarkdownIt from 'markdown-it' | ||||||
|  | import mdAttrs from 'markdown-it-attrs' | ||||||
| import mdEmoji from 'markdown-it-emoji' | import mdEmoji from 'markdown-it-emoji' | ||||||
| import mdTaskLists from 'markdown-it-task-lists' | import mdTaskLists from 'markdown-it-task-lists' | ||||||
| import mdExpandTabs from 'markdown-it-expand-tabs' | import mdExpandTabs from 'markdown-it-expand-tabs' | ||||||
| @@ -126,8 +127,9 @@ const md = new MarkdownIt({ | |||||||
|     return `<pre class="line-numbers"><code class="language-${lang}">${str}</code></pre>` |     return `<pre class="line-numbers"><code class="language-${lang}">${str}</code></pre>` | ||||||
|   } |   } | ||||||
| }) | }) | ||||||
|  |   .use(mdAttrs) | ||||||
|   .use(mdEmoji) |   .use(mdEmoji) | ||||||
|   .use(mdTaskLists) |   .use(mdTaskLists, {label: true, labelAfter: true}) | ||||||
|   .use(mdExpandTabs) |   .use(mdExpandTabs) | ||||||
|   .use(mdAbbr) |   .use(mdAbbr) | ||||||
|   .use(mdSup) |   .use(mdSup) | ||||||
| @@ -323,7 +325,7 @@ export default { | |||||||
|     &-content { |     &-content { | ||||||
|       height: calc(100vh - 112px); |       height: calc(100vh - 112px); | ||||||
|       overflow-y: scroll; |       overflow-y: scroll; | ||||||
|       padding: 30px 1rem 1rem 1rem; |       padding: 1rem 1rem 1rem 0; | ||||||
|       width: calc(100% + 1rem + 17px) |       width: calc(100% + 1rem + 17px) | ||||||
|       // -ms-overflow-style: none; |       // -ms-overflow-style: none; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,6 @@ | |||||||
| @import "../libs/animate/animate"; | @import "../libs/animate/animate"; | ||||||
| @import '~vue2-animate/src/sass/vue2-animate'; | @import '~vue2-animate/src/sass/vue2-animate'; | ||||||
|  |  | ||||||
| @import 'components/markdown-content'; |  | ||||||
| @import 'components/v-btn'; | @import 'components/v-btn'; | ||||||
| @import 'components/v-data-table'; | @import 'components/v-data-table'; | ||||||
| @import 'components/v-dialog'; | @import 'components/v-dialog'; | ||||||
|   | |||||||
| @@ -1,100 +0,0 @@ | |||||||
| .markdown-content { |  | ||||||
|   font-size: 1rem; |  | ||||||
|   color: mc('blue-grey', '800'); |  | ||||||
|  |  | ||||||
|   // -------------------------------------------- |  | ||||||
|   // Headers |  | ||||||
|   // -------------------------------------------- |  | ||||||
|  |  | ||||||
|   h1, h2, h3, h4, h5, h6 { |  | ||||||
|     color: mc('blue-grey', '700'); |  | ||||||
|     font-weight: 500; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   > * + h1, > * + h2, > * + h3, > * + h4 { |  | ||||||
|     margin-top: 3rem; |  | ||||||
|   } |  | ||||||
|   h1 { |  | ||||||
|     font-size: 1.5rem; |  | ||||||
|     border-bottom: 2px solid mc('blue-grey', '100'); |  | ||||||
|     margin-bottom: 1rem; |  | ||||||
|   } |  | ||||||
|   h2 { |  | ||||||
|     font-size: 1.25rem; |  | ||||||
|     border-bottom: 1px solid mc('blue-grey', '100'); |  | ||||||
|     margin-bottom: .75rem; |  | ||||||
|   } |  | ||||||
|   h3 { |  | ||||||
|     font-size: 1.15rem; |  | ||||||
|     border-bottom: 1px dotted mc('blue-grey', '100'); |  | ||||||
|     margin-bottom: .5rem; |  | ||||||
|     color: mc('blue-grey', '500'); |  | ||||||
|   } |  | ||||||
|   h4 { |  | ||||||
|     font-size: 1.1rem; |  | ||||||
|   } |  | ||||||
|   h5 { |  | ||||||
|     font-size: 1.05rem; |  | ||||||
|   } |  | ||||||
|   h6 { |  | ||||||
|     font-size: 1.025rem; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // -------------------------------------------- |  | ||||||
|   // Paragraphs |  | ||||||
|   // -------------------------------------------- |  | ||||||
|   p + p { |  | ||||||
|     margin-top: 1rem; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // -------------------------------------------- |  | ||||||
|   // Lists |  | ||||||
|   // -------------------------------------------- |  | ||||||
|   ul, ol { |  | ||||||
|     & + p { |  | ||||||
|       margin-top: .5rem; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   ul { |  | ||||||
|     list-style-type: square; |  | ||||||
|     list-style-position: inside; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   ol { |  | ||||||
|     list-style-type: decimal; |  | ||||||
|     list-style-position: inside; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // -------------------------------------------- |  | ||||||
|   // Code Blocks |  | ||||||
|   // -------------------------------------------- |  | ||||||
|   > pre { |  | ||||||
|     border: none; |  | ||||||
|     border-radius: 5px; |  | ||||||
|     box-shadow: initial; |  | ||||||
|     background-color: mc('blue-grey', '900'); |  | ||||||
|     padding: 1rem 1rem 1rem 3rem; |  | ||||||
|  |  | ||||||
|     > code { |  | ||||||
|       box-shadow: initial; |  | ||||||
|       display: block; |  | ||||||
|       font-size: .85rem; |  | ||||||
|       font-family: 'Source Code Pro', monospace; |  | ||||||
|  |  | ||||||
|       &:after, &:before { |  | ||||||
|         content: initial; |  | ||||||
|         letter-spacing: initial; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .task-list-item { |  | ||||||
|     display: flex; |  | ||||||
|     align-items: center; |  | ||||||
|  |  | ||||||
|     &-checkbox { |  | ||||||
|       margin-right: .5rem; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @@ -4,6 +4,10 @@ | |||||||
|   color: mc('grey', '800'); |   color: mc('grey', '800'); | ||||||
|   padding-bottom: 50px; |   padding-bottom: 50px; | ||||||
|  |  | ||||||
|  |   // --------------------------------- | ||||||
|  |   // HEADERS | ||||||
|  |   // --------------------------------- | ||||||
|  |  | ||||||
|   h1, h2, h3, h4, h5, h6 { |   h1, h2, h3, h4, h5, h6 { | ||||||
|     position: relative; |     position: relative; | ||||||
|  |  | ||||||
| @@ -81,14 +85,74 @@ | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   // --------------------------------- | ||||||
|  |   // PARAGRAPHS | ||||||
|  |   // --------------------------------- | ||||||
|  |  | ||||||
|   p { |   p { | ||||||
|     padding: 1rem 24px 0 24px; |     padding: 1rem 24px 0 24px; | ||||||
|     margin: 0; |     margin: 0; | ||||||
|     text-align: justify; |     text-align: justify; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   blockquote { | ||||||
|  |     padding: 0 0 1rem 0; | ||||||
|  |     border: 1px solid mc('blue', '500'); | ||||||
|  |     border-radius: .5rem; | ||||||
|  |     margin: 1rem; | ||||||
|  |  | ||||||
|  |     &.is-info { | ||||||
|  |       background-color: mc('blue', '50'); | ||||||
|  |       background-image: radial-gradient(ellipse at top, mc('blue', '50'), lighten(mc('blue', '50'), 5%)); | ||||||
|  |       border-color: mc('blue', '100'); | ||||||
|  |       box-shadow: 0 0 2px 0 mc('blue', '100'); | ||||||
|  |  | ||||||
|       code { |       code { | ||||||
|     background-color: rgba(mc('indigo', '50'), 1); |         background-color: mc('blue', '50'); | ||||||
|  |         color: mc('blue', '800'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     &.is-warning { | ||||||
|  |       background-color: mc('orange', '50'); | ||||||
|  |       background-image: radial-gradient(ellipse at top, mc('orange', '50'), lighten(mc('orange', '50'), 5%)); | ||||||
|  |       border-color: mc('orange', '100'); | ||||||
|  |       box-shadow: 0 0 2px 0 mc('orange', '100'); | ||||||
|  |  | ||||||
|  |       code { | ||||||
|  |         background-color: mc('orange', '50'); | ||||||
|  |         color: mc('orange', '800'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     &.is-danger { | ||||||
|  |       background-color: mc('red', '50'); | ||||||
|  |       background-image: radial-gradient(ellipse at top, mc('red', '50'), lighten(mc('red', '50'), 5%)); | ||||||
|  |       border-color: mc('red', '100'); | ||||||
|  |       box-shadow: 0 0 2px 0 mc('red', '100'); | ||||||
|  |  | ||||||
|  |       code { | ||||||
|  |         background-color: mc('red', '50'); | ||||||
|  |         color: mc('red', '800'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     &.is-success { | ||||||
|  |       background-color: mc('green', '50'); | ||||||
|  |       background-image: radial-gradient(ellipse at top, mc('green', '50'), lighten(mc('green', '50'), 5%)); | ||||||
|  |       border-color: mc('green', '100'); | ||||||
|  |       box-shadow: 0 0 2px 0 mc('green', '100'); | ||||||
|  |  | ||||||
|  |       code { | ||||||
|  |         background-color: mc('green', '50'); | ||||||
|  |         color: mc('green', '800'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // --------------------------------- | ||||||
|  |   // CODE | ||||||
|  |   // --------------------------------- | ||||||
|  |  | ||||||
|  |   code { | ||||||
|  |     background-color: mc('indigo', '50'); | ||||||
|     padding: 0 5px; |     padding: 0 5px; | ||||||
|     color: mc('indigo', '800'); |     color: mc('indigo', '800'); | ||||||
|     font-family: 'Source Code Pro', monospace; |     font-family: 'Source Code Pro', monospace; | ||||||
| @@ -134,4 +198,41 @@ | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   // --------------------------------- | ||||||
|  |   // TASK LISTS | ||||||
|  |   // --------------------------------- | ||||||
|  |  | ||||||
|  |   .task-list-item { | ||||||
|  |     position: relative; | ||||||
|  |  | ||||||
|  |     &-checkbox[disabled] { | ||||||
|  |       display: none; | ||||||
|  |  | ||||||
|  |       & + label { | ||||||
|  |         padding-left: 1.4rem; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       & + label::before { | ||||||
|  |         position: absolute; | ||||||
|  |         left: 1rem; | ||||||
|  |         top: 2px; | ||||||
|  |         content: ' '; | ||||||
|  |         display: block; | ||||||
|  |         width: 1.1rem; | ||||||
|  |         height: 1.1rem; | ||||||
|  |         background-color: #FFF; | ||||||
|  |         border: 1px solid mc('grey', '400'); | ||||||
|  |         border-radius: 2px; | ||||||
|  |         font-weight: bold; | ||||||
|  |         font-size: .8rem; | ||||||
|  |         line-height: 1rem; | ||||||
|  |         text-align: center; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       &[checked] + label::before  { | ||||||
|  |         content: '✓'; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| const md = require('markdown-it') | const md = require('markdown-it') | ||||||
| const mdAnchor = require('markdown-it-anchor') | const mdAnchor = require('markdown-it-anchor') | ||||||
|  | const mdAttrs = require('markdown-it-attrs') | ||||||
| const _ = require('lodash') | const _ = require('lodash') | ||||||
| const uslug = require('uslug') | const uslug = require('uslug') | ||||||
|  |  | ||||||
| @@ -39,6 +40,8 @@ module.exports = { | |||||||
|       permalinkBefore: true |       permalinkBefore: true | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|  |     mkdown.use(mdAttrs) | ||||||
|  |  | ||||||
|     for (let child of this.children) { |     for (let child of this.children) { | ||||||
|       const renderer = require(`../${_.kebabCase(child.key)}/renderer.js`) |       const renderer = require(`../${_.kebabCase(child.key)}/renderer.js`) | ||||||
|       renderer.init(mkdown, child.config) |       renderer.init(mkdown, child.config) | ||||||
|   | |||||||
| @@ -6,6 +6,6 @@ const mdTaskLists = require('markdown-it-task-lists') | |||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|   init (md, conf) { |   init (md, conf) { | ||||||
|     md.use(mdTaskLists) |     md.use(mdTaskLists, {label: true, labelAfter: true}) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user