Browse Source

feat: editor preview styling + code highlighting

pull/621/head
NGPixel 6 years ago
parent
commit
a3948c7f45
9 changed files with 294 additions and 11 deletions
  1. 13
      client/components/editor-code.vue
  2. 0
      client/libs/animate/animate.scss
  3. 172
      client/libs/prism/prism.css
  4. 47
      client/libs/prism/prism.js
  5. 0
      client/libs/twemoji/twemoji-awesome.scss
  6. 7
      client/scss/app.scss
  7. 61
      client/scss/components/markdown-content.scss
  8. 1
      package.json
  9. 4
      yarn.lock

13
client/components/editor-code.vue

@ -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)
} }
} }

client/scss/libs/animate.scss → client/libs/animate/animate.scss

172
client/libs/prism/prism.css

@ -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
File diff suppressed because it is too large
View File

client/scss/libs/twemoji-awesome.scss → client/libs/twemoji/twemoji-awesome.scss

7
client/scss/app.scss

@ -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 '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 'node_modules/diff2html/dist/diff2html.min';
@import 'pages/welcome'; @import 'pages/welcome';

61
client/scss/components/markdown-content.scss

@ -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;
}
}
}
}

1
package.json

@ -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",

4
yarn.lock

@ -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…
Cancel
Save