Browse Source

feat: editor preview styling + code highlighting

NGPixel 7 years ago
parent
commit
a3948c7f45

+ 10 - 3
client/components/editor-code.vue

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

+ 0 - 0
client/scss/libs/animate.scss → client/libs/animate/animate.scss


+ 172 - 0
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;
+		}

File diff suppressed because it is too large
+ 2 - 0
client/libs/prism/prism.js


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


+ 4 - 3
client/scss/app.scss

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

+ 0 - 1
package.json

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

+ 0 - 4
yarn.lock

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

Some files were not shown because too many files changed in this diff