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')
|
||||
.editor-code-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-btn(color='blue', fab, dark, v-model='fabInsertMenu', slot='activator')
|
||||
v-icon add_circle
|
||||
@ -111,12 +111,16 @@ import 'codemirror/addon/search/match-highlighter.js'
|
||||
|
||||
// Markdown-it
|
||||
import MarkdownIt from 'markdown-it'
|
||||
import Prism from '../libs/prism/prism.js'
|
||||
|
||||
const md = new MarkdownIt({
|
||||
html: true,
|
||||
breaks: true,
|
||||
linkify: true,
|
||||
typography: true
|
||||
typography: true,
|
||||
highlight(str, lang) {
|
||||
return `<pre class="line-numbers"><code class="language-${lang}">${str}</code></pre>`
|
||||
}
|
||||
})
|
||||
|
||||
export default {
|
||||
@ -127,7 +131,7 @@ export default {
|
||||
return {
|
||||
fabMainMenu: 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: {
|
||||
tabSize: 2,
|
||||
mode: 'text/markdown',
|
||||
@ -174,6 +178,9 @@ export default {
|
||||
},
|
||||
onCmInput: _.debounce(function (newContent) {
|
||||
this.previewHTML = md.render(newContent)
|
||||
this.$nextTick(function() {
|
||||
Prism.highlightAllUnder(this.$refs.editorPreview)
|
||||
})
|
||||
}, 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 "libs/animate";
|
||||
@import "../libs/animate/animate";
|
||||
|
||||
@import 'components/button';
|
||||
@import 'components/markdown-content';
|
||||
@import 'components/navigator';
|
||||
@import 'components/panel';
|
||||
@import 'components/setup';
|
||||
@import 'components/toggle';
|
||||
@import 'components/typography';
|
||||
|
||||
@import 'libs/twemoji-awesome';
|
||||
@import 'node_modules/highlight.js/styles/atom-one-dark';
|
||||
@import '../libs/twemoji/twemoji-awesome';
|
||||
@import '../libs/prism/prism.css';
|
||||
@import 'node_modules/diff2html/dist/diff2html.min';
|
||||
|
||||
@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",
|
||||
"graphql": "0.13.1",
|
||||
"graphql-tools": "2.21.0",
|
||||
"highlight.js": "9.12.0",
|
||||
"i18next": "10.4.1",
|
||||
"i18next-express-middleware": "1.0.10",
|
||||
"i18next-localstorage-cache": "1.1.1",
|
||||
|
@ -4666,10 +4666,6 @@ hex-color-regex@^1.1.0:
|
||||
version "1.1.0"
|
||||
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:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
|
||||
|
Loading…
Reference in New Issue
Block a user