feat: editor preview styling + code highlighting
This commit is contained in:
parent
4fa7ed4e93
commit
a3948c7f45
@ -65,7 +65,7 @@
|
|||||||
codemirror(ref='cm', v-model='code', :options='cmOptions', @ready='onCmReady', @input='onCmInput')
|
codemirror(ref='cm', v-model='code', :options='cmOptions', @ready='onCmReady', @input='onCmInput')
|
||||||
.editor-code-preview
|
.editor-code-preview
|
||||||
.editor-code-preview-title Preview
|
.editor-code-preview-title Preview
|
||||||
.editor-code-preview-content(v-html='previewHTML')
|
.editor-code-preview-content.markdown-content(ref='editorPreview', v-html='previewHTML')
|
||||||
v-speed-dial(v-model='fabInsertMenu', :open-on-hover='true', direction='top', transition='slide-y-reverse-transition', :fixed='true', :right='!isMobile', :left='isMobile', :bottom='true')
|
v-speed-dial(v-model='fabInsertMenu', :open-on-hover='true', direction='top', transition='slide-y-reverse-transition', :fixed='true', :right='!isMobile', :left='isMobile', :bottom='true')
|
||||||
v-btn(color='blue', fab, dark, v-model='fabInsertMenu', slot='activator')
|
v-btn(color='blue', fab, dark, v-model='fabInsertMenu', slot='activator')
|
||||||
v-icon add_circle
|
v-icon add_circle
|
||||||
@ -111,12 +111,16 @@ import 'codemirror/addon/search/match-highlighter.js'
|
|||||||
|
|
||||||
// Markdown-it
|
// Markdown-it
|
||||||
import MarkdownIt from 'markdown-it'
|
import MarkdownIt from 'markdown-it'
|
||||||
|
import Prism from '../libs/prism/prism.js'
|
||||||
|
|
||||||
const md = new MarkdownIt({
|
const md = new MarkdownIt({
|
||||||
html: true,
|
html: true,
|
||||||
breaks: true,
|
breaks: true,
|
||||||
linkify: true,
|
linkify: true,
|
||||||
typography: true
|
typography: true,
|
||||||
|
highlight(str, lang) {
|
||||||
|
return `<pre class="line-numbers"><code class="language-${lang}">${str}</code></pre>`
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -127,7 +131,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
fabMainMenu: false,
|
fabMainMenu: false,
|
||||||
fabInsertMenu: false,
|
fabInsertMenu: false,
|
||||||
code: '# Header 1\n\nSample **Text**\n\n## Header 2\nSample Text',
|
code: '# Header 1\n\nSample **Text**\nhttp://wiki.js.org\n\n## Header 2\nSample Text\n\n```javascript\nvar test = require("test");\n\n// some comment\nconst foo = bar(\'param\') + 1.234;\n```',
|
||||||
cmOptions: {
|
cmOptions: {
|
||||||
tabSize: 2,
|
tabSize: 2,
|
||||||
mode: 'text/markdown',
|
mode: 'text/markdown',
|
||||||
@ -174,6 +178,9 @@ export default {
|
|||||||
},
|
},
|
||||||
onCmInput: _.debounce(function (newContent) {
|
onCmInput: _.debounce(function (newContent) {
|
||||||
this.previewHTML = md.render(newContent)
|
this.previewHTML = md.render(newContent)
|
||||||
|
this.$nextTick(function() {
|
||||||
|
Prism.highlightAllUnder(this.$refs.editorPreview)
|
||||||
|
})
|
||||||
}, 500)
|
}, 500)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
172
client/libs/prism/prism.css
Normal file
172
client/libs/prism/prism.css
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/* PrismJS 1.11.0
|
||||||
|
http://prismjs.com/download.html?themes=prism-dark&languages=markup+css+clike+javascript+c+bash+basic+cpp+csharp+arduino+ruby+elixir+fsharp+go+graphql+handlebars+haskell+ini+java+json+kotlin+latex+less+makefile+markdown+matlab+nginx+objectivec+perl+php+powershell+pug+python+typescript+rust+scss+scala+smalltalk+sql+stylus+swift+vbnet+yaml&plugins=line-numbers */
|
||||||
|
/**
|
||||||
|
* prism.js Dark theme for JavaScript, CSS and HTML
|
||||||
|
* Based on the slides of the talk “/Reg(exp){2}lained/”
|
||||||
|
* @author Lea Verou
|
||||||
|
*/
|
||||||
|
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
color: white;
|
||||||
|
background: none;
|
||||||
|
text-shadow: 0 -.1em .2em black;
|
||||||
|
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||||
|
text-align: left;
|
||||||
|
white-space: pre;
|
||||||
|
word-spacing: normal;
|
||||||
|
word-break: normal;
|
||||||
|
word-wrap: normal;
|
||||||
|
line-height: 1.5;
|
||||||
|
|
||||||
|
-moz-tab-size: 4;
|
||||||
|
-o-tab-size: 4;
|
||||||
|
tab-size: 4;
|
||||||
|
|
||||||
|
-webkit-hyphens: none;
|
||||||
|
-moz-hyphens: none;
|
||||||
|
-ms-hyphens: none;
|
||||||
|
hyphens: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[class*="language-"],
|
||||||
|
:not(pre) > code[class*="language-"] {
|
||||||
|
background: hsl(30, 20%, 25%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code blocks */
|
||||||
|
pre[class*="language-"] {
|
||||||
|
padding: 1em;
|
||||||
|
margin: .5em 0;
|
||||||
|
overflow: auto;
|
||||||
|
border: .3em solid hsl(30, 20%, 40%);
|
||||||
|
border-radius: .5em;
|
||||||
|
box-shadow: 1px 1px .5em black inset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inline code */
|
||||||
|
:not(pre) > code[class*="language-"] {
|
||||||
|
padding: .15em .2em .05em;
|
||||||
|
border-radius: .3em;
|
||||||
|
border: .13em solid hsl(30, 20%, 40%);
|
||||||
|
box-shadow: 1px 1px .3em -.1em black inset;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.comment,
|
||||||
|
.token.prolog,
|
||||||
|
.token.doctype,
|
||||||
|
.token.cdata {
|
||||||
|
color: hsl(30, 20%, 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.punctuation {
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.namespace {
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.property,
|
||||||
|
.token.tag,
|
||||||
|
.token.boolean,
|
||||||
|
.token.number,
|
||||||
|
.token.constant,
|
||||||
|
.token.symbol {
|
||||||
|
color: hsl(350, 40%, 70%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.selector,
|
||||||
|
.token.attr-name,
|
||||||
|
.token.string,
|
||||||
|
.token.char,
|
||||||
|
.token.builtin,
|
||||||
|
.token.inserted {
|
||||||
|
color: hsl(75, 70%, 60%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.operator,
|
||||||
|
.token.entity,
|
||||||
|
.token.url,
|
||||||
|
.language-css .token.string,
|
||||||
|
.style .token.string,
|
||||||
|
.token.variable {
|
||||||
|
color: hsl(40, 90%, 60%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.atrule,
|
||||||
|
.token.attr-value,
|
||||||
|
.token.keyword {
|
||||||
|
color: hsl(350, 40%, 70%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.regex,
|
||||||
|
.token.important {
|
||||||
|
color: #e90;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.important,
|
||||||
|
.token.bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.token.italic {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.entity {
|
||||||
|
cursor: help;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.deleted {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.line-numbers {
|
||||||
|
position: relative;
|
||||||
|
padding-left: 3.8em;
|
||||||
|
counter-reset: linenumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.line-numbers > code {
|
||||||
|
position: relative;
|
||||||
|
white-space: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-numbers .line-numbers-rows {
|
||||||
|
position: absolute;
|
||||||
|
pointer-events: none;
|
||||||
|
top: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
left: -3.8em;
|
||||||
|
width: 3em; /* works for line-numbers below 1000 lines */
|
||||||
|
letter-spacing: -1px;
|
||||||
|
border-right: 1px solid #999;
|
||||||
|
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-numbers-rows > span {
|
||||||
|
pointer-events: none;
|
||||||
|
display: block;
|
||||||
|
counter-increment: linenumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-numbers-rows > span:before {
|
||||||
|
content: counter(linenumber);
|
||||||
|
color: #999;
|
||||||
|
display: block;
|
||||||
|
padding-right: 0.8em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
47
client/libs/prism/prism.js
Normal file
47
client/libs/prism/prism.js
Normal file
File diff suppressed because one or more lines are too long
@ -2,17 +2,18 @@
|
|||||||
|
|
||||||
@import 'base/icons';
|
@import 'base/icons';
|
||||||
|
|
||||||
@import "libs/animate";
|
@import "../libs/animate/animate";
|
||||||
|
|
||||||
@import 'components/button';
|
@import 'components/button';
|
||||||
|
@import 'components/markdown-content';
|
||||||
@import 'components/navigator';
|
@import 'components/navigator';
|
||||||
@import 'components/panel';
|
@import 'components/panel';
|
||||||
@import 'components/setup';
|
@import 'components/setup';
|
||||||
@import 'components/toggle';
|
@import 'components/toggle';
|
||||||
@import 'components/typography';
|
@import 'components/typography';
|
||||||
|
|
||||||
@import 'libs/twemoji-awesome';
|
@import '../libs/twemoji/twemoji-awesome';
|
||||||
@import 'node_modules/highlight.js/styles/atom-one-dark';
|
@import '../libs/prism/prism.css';
|
||||||
@import 'node_modules/diff2html/dist/diff2html.min';
|
@import 'node_modules/diff2html/dist/diff2html.min';
|
||||||
|
|
||||||
@import 'pages/welcome';
|
@import 'pages/welcome';
|
||||||
|
61
client/scss/components/markdown-content.scss
Normal file
61
client/scss/components/markdown-content.scss
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
.markdown-content {
|
||||||
|
font-size: 1rem;
|
||||||
|
color: mc('blue-grey', '900');
|
||||||
|
|
||||||
|
// --------------------------------------------
|
||||||
|
// Headers
|
||||||
|
// --------------------------------------------
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
color: mc('blue-grey', '800');
|
||||||
|
}
|
||||||
|
|
||||||
|
> * + h1, > * + h2, > * + h3, > * + h4 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
border-bottom: 1px solid mc('blue-grey', '100');
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
border-bottom: 1px dotted mc('blue-grey', '100');
|
||||||
|
margin-bottom: .75rem;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: 1.15rem;
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
h5 {
|
||||||
|
font-size: 1.05rem;
|
||||||
|
}
|
||||||
|
h6 {
|
||||||
|
font-size: 1.025rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
&:after, &:before {
|
||||||
|
content: initial;
|
||||||
|
letter-spacing: initial;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -67,7 +67,6 @@
|
|||||||
"fs-extra": "5.0.0",
|
"fs-extra": "5.0.0",
|
||||||
"graphql": "0.13.1",
|
"graphql": "0.13.1",
|
||||||
"graphql-tools": "2.21.0",
|
"graphql-tools": "2.21.0",
|
||||||
"highlight.js": "9.12.0",
|
|
||||||
"i18next": "10.4.1",
|
"i18next": "10.4.1",
|
||||||
"i18next-express-middleware": "1.0.10",
|
"i18next-express-middleware": "1.0.10",
|
||||||
"i18next-localstorage-cache": "1.1.1",
|
"i18next-localstorage-cache": "1.1.1",
|
||||||
|
@ -4666,10 +4666,6 @@ hex-color-regex@^1.1.0:
|
|||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
|
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
|
||||||
|
|
||||||
highlight.js@9.12.0:
|
|
||||||
version "9.12.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
|
|
||||||
|
|
||||||
hmac-drbg@^1.0.0:
|
hmac-drbg@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
|
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
|
||||||
|
Loading…
Reference in New Issue
Block a user