feat: html code highlighter

pull/662/head
Nicolas Giard 6 years ago
parent 2c6a95f900
commit 578ea577f0

@ -4,9 +4,9 @@
color: mc('grey', '800');
h1 {
padding-left: 16px;
padding-left: 24px;
color: mc('blue', '800');
margin-top: 16px;
margin-top: 1rem;
position: relative;
&::after {
@ -19,12 +19,12 @@
background: linear-gradient(to right, mc('theme', 'primary'), rgba(mc('theme', 'primary'), 0));
}
& + h2 {
& + h2, & + h3 {
margin-top: 8px;
}
}
h2 {
margin-left: 16px;
margin-left: 24px;
padding: 8px 0 0 0;
color: mc('grey', '800');
position: relative;
@ -38,11 +38,114 @@
height: 1px;
background: linear-gradient(to right, mc('grey', '700'), rgba(mc('grey', '700'), 0));
}
& + h3 {
margin-top: 8px;
}
}
h3 {
margin-left: 24px;
padding: 8px 0 0 0;
color: mc('grey', '700');
position: relative;
&::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background: linear-gradient(to right, mc('grey', '500'), rgba(mc('grey', '500'), 0));
}
}
p {
padding: 16px 16px 0 16px;
padding: 1rem 24px 0 24px;
margin: 0;
text-align: justify;
}
code {
background-color: transparent;
font-family: 'Source Code Pro', monospace;
font-weight: normal;
font-size: 1rem;
&::before, &::after {
display: none;
}
}
.hljs{
display: block;
overflow-x: auto;
padding: 1rem;
background: #232323;
color: #e6e1dc;
margin: 1rem 24px;
border-radius: .5rem;
}
.hljs-comment,.hljs-quote{
color:#bc9458;
font-style:italic
}
.hljs-keyword,.hljs-selector-tag{
color:#c26230
}
.hljs-string,.hljs-number,.hljs-regexp,.hljs-variable,.hljs-template-variable{
color:#a5c261
}
.hljs-subst{
color:#519f50
}
.hljs-tag,.hljs-name{
color:#e8bf6a
}
.hljs-type{
color:#da4939
}
.hljs-symbol,.hljs-bullet,.hljs-built_in,.hljs-builtin-name,.hljs-attr,.hljs-link{
color:#6d9cbe
}
.hljs-params{
color:#d0d0ff
}
.hljs-attribute{
color:#cda869
}
.hljs-meta{
color:#9b859d
}
.hljs-title,.hljs-section{
color:#ffc66d
}
.hljs-addition{
background-color:#144212;
color:#e6e1dc;
display:inline-block;
width:100%
}
.hljs-deletion{
background-color:#600;
color:#e6e1dc;
display:inline-block;
width:100%
}
.hljs-selector-class{
color:#9b703f
}
.hljs-selector-id{
color:#8b98ab
}
.hljs-emphasis{
font-style:italic
}
.hljs-strong{
font-weight:bold
}
.hljs-link{
text-decoration:underline
}
}

@ -75,6 +75,7 @@
"graphql": "14.0.2",
"graphql-list-fields": "2.0.2",
"graphql-tools": "3.1.1",
"highlight.js": "9.12.0",
"i18next": "11.7.0",
"i18next-express-middleware": "1.3.2",
"i18next-localstorage-cache": "1.1.1",

@ -129,7 +129,12 @@ module.exports = class Page extends Model {
publishStartDate: opts.publishStartDate,
title: opts.title
})
const page = await WIKI.models.pages.getPageFromDb(opts)
const page = await WIKI.models.pages.getPageFromDb({
path: opts.path,
locale: opts.locale,
userId: opts.authorId,
isPrivate: opts.isPrivate
})
await WIKI.models.pages.renderPage(page)
await WIKI.models.storage.pageEvent({
event: 'created',
@ -153,7 +158,12 @@ module.exports = class Page extends Model {
publishStartDate: opts.publishStartDate,
title: opts.title
}).where('id', ogPage.id)
const page = await WIKI.models.pages.getPageFromDb(opts)
const page = await WIKI.models.pages.getPageFromDb({
path: ogPage.path,
locale: ogPage.localeCode,
userId: ogPage.authorId,
isPrivate: ogPage.isPrivate
})
await WIKI.models.pages.renderPage(page)
await WIKI.models.storage.pageEvent({
event: 'updated',

@ -1 +1,5 @@
module.exports = {}
module.exports = {
init($, config) {
}
}

@ -1 +1,5 @@
module.exports = {}
module.exports = {
init($, config) {
}
}

@ -0,0 +1,17 @@
const hljs = require('highlight.js')
module.exports = {
async init($, config) {
$('pre > code').each((idx, elm) => {
const lang = $(elm).attr('lang')
if (lang) {
$(elm).html(hljs.highlight(lang, $(elm).text(), true).value)
} else {
const result = hljs.highlightAuto($(elm).text())
$(elm).html(result.value)
$(elm).attr('lang', result.language)
}
$(elm).parent().addClass('hljs')
})
}
}

@ -1,5 +1,19 @@
const _ = require('lodash')
const cheerio = require('cheerio')
module.exports = {
async render() {
return this.input
const $ = cheerio.load(this.input)
if ($.root().children().length < 1) {
return ''
}
for (let child of this.children) {
const renderer = require(`../${_.kebabCase(child.key)}/renderer.js`)
renderer.init($, child.config)
}
return $.html()
}
}

@ -23,11 +23,7 @@ const mathRegex = [
]
module.exports = {
key: 'common/mathjax',
title: 'Mathjax',
dependsOn: [],
props: [],
init (conf) {
init ($, config) {
mathjax.config({
MathJax: {
jax: ['input/TeX', 'input/MathML', 'output/SVG'],

@ -1,4 +1,4 @@
key: htmlMedia
key: htmlMediaplayers
title: Media Players
description: Embed players such as Youtube, Vimeo, Soundcloud, etc.
author: requarks.io

@ -1 +1,5 @@
module.exports = {}
module.exports = {
init($, config) {
}
}

@ -1 +1,5 @@
module.exports = {}
module.exports = {
init($, config) {
}
}

@ -1 +1,5 @@
module.exports = {}
module.exports = {
init($, config) {
}
}

@ -1 +1,5 @@
module.exports = {}
module.exports = {
init($, config) {
}
}

@ -25,12 +25,11 @@ module.exports = {
typographer: this.config.typographer,
quotes: _.get(quoteStyles, this.config.quotes, quoteStyles.English),
highlight(str, lang) {
return '<pre><code>' + _.escape(str) + '</code></pre>'
return `<pre><code lang="${lang}">${_.escape(str)}</code></pre>`
}
})
for (let child of this.children) {
console.info(child)
const renderer = require(`../${_.kebabCase(child.key)}/renderer.js`)
renderer.init(mkdown, child.config)
}

@ -5753,6 +5753,10 @@ 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…
Cancel
Save