Browse Source

feat: save rendering configuration

pull/1336/head
NGPixel 4 years ago
parent
commit
3b347f262c
8 changed files with 33 additions and 120 deletions
  1. 30
      client/components/admin/admin-rendering.vue
  2. 4
      server/graph/resolvers/rendering.js
  3. 1
      server/graph/schemas/rendering.graphql
  4. 8
      server/models/renderers.js
  5. 9
      server/modules/rendering/html-mathjax/definition.yml
  6. 82
      server/modules/rendering/html-mathjax/mathjax.js
  7. 8
      server/modules/rendering/markdown-mathjax/definition.yml
  8. 11
      server/modules/rendering/markdown-mathjax/renderer.js

30
client/components/admin/admin-rendering.vue

@ -20,7 +20,6 @@
flat
dark
)
v-icon.mr-2 mdi-creation
.subtitle-1 Pipeline
v-expansion-panels.adm-rendering-pipeline(
v-model='selectedCore'
@ -132,6 +131,7 @@ import { get } from 'vuex-pathify'
import { StatusIndicator } from 'vue-status-indicator'
import renderersQuery from 'gql/admin/rendering/rendering-query-renderers.gql'
import renderersSaveMutation from 'gql/admin/rendering/rendering-mutation-save-renderers.gql'
export default {
components: {
@ -164,18 +164,34 @@ export default {
})
},
async refresh () {
await this.$apollo.queries.renderers.refetch()
this.$store.commit('showNotification', {
style: 'indigo',
message: `Coming soon...`,
icon: 'directions_boat'
message: 'Rendering active configuration has been reloaded.',
style: 'success',
icon: 'cached'
})
},
async save () {
this.$store.commit(`loadingStart`, 'admin-rendering-saverenderers')
await this.$apollo.mutate({
mutation: renderersSaveMutation,
variables: {
renderers: _.reduce(this.renderers, (result, core) => {
result = _.concat(result, core.children.map(rd => ({
key: rd.key,
isEnabled: rd.isEnabled,
config: rd.config.map(cfg => ({ key: cfg.key, value: JSON.stringify({ v: cfg.value.value }) }))
})))
return result
}, [])
}
})
this.$store.commit('showNotification', {
style: 'indigo',
message: `Coming soon...`,
icon: 'directions_boat'
message: 'Rendering configuration saved successfully.',
style: 'success',
icon: 'check'
})
this.$store.commit(`loadingStop`, 'admin-rendering-saverenderers')
}
},
apollo: {

4
server/graph/resolvers/rendering.js

@ -41,10 +41,10 @@ module.exports = {
async updateRenderers(obj, args, context) {
try {
for (let rdr of args.renderers) {
await WIKI.models.storage.query().patch({
await WIKI.models.renderers.query().patch({
isEnabled: rdr.isEnabled,
config: _.reduce(rdr.config, (result, value, key) => {
_.set(result, `${value.key}`, value.value)
_.set(result, `${value.key}`, _.get(JSON.parse(value.value), 'v', null))
return result
}, {})
}).where('key', rdr.key)

1
server/graph/schemas/rendering.graphql

@ -50,6 +50,5 @@ type Renderer {
input RendererInput {
isEnabled: Boolean!
key: String!
mode: String!
config: [KeyValuePairInput]
}

8
server/models/renderers.js

@ -90,6 +90,14 @@ module.exports = class Renderer extends Model {
} else {
WIKI.logger.info(`No new renderers found: [ SKIPPED ]`)
}
// -> Delete removed Renderers
for (const renderer of dbRenderers) {
if (!_.some(WIKI.data.renderers, ['key', renderer.key])) {
await WIKI.models.renderers.query().where('key', renderer.key).del()
WIKI.logger.info(`Removed renderer ${renderer.key} because it is no longer present in the modules folder: [ OK ]`)
}
}
} catch (err) {
WIKI.logger.error(`Failed to scan or load new renderers: [ FAILED ]`)
WIKI.logger.error(err)

9
server/modules/rendering/html-mathjax/definition.yml

@ -1,9 +0,0 @@
key: htmlMathjax
title: Mathjax Processor
description: TeX/MathML Math Equations Parser
author: requarks.io
icon: mdi-function-variant
enabledDefault: false
dependsOn: htmlCore
step: pre
props: {}

82
server/modules/rendering/html-mathjax/mathjax.js

@ -1,82 +0,0 @@
const mathjax = require('mathjax-node')
const _ = require('lodash')
// ------------------------------------
// Mathjax
// ------------------------------------
/* global WIKI */
const mathRegex = [
{
format: 'TeX',
regex: /\\\[([\s\S]*?)\\\]/g
},
{
format: 'inline-TeX',
regex: /\\\((.*?)\\\)/g
},
{
format: 'MathML',
regex: /<math([\s\S]*?)<\/math>/g
}
]
module.exports = {
init ($, config) {
mathjax.config({
MathJax: {
jax: ['input/TeX', 'input/MathML', 'output/SVG'],
extensions: ['tex2jax.js', 'mml2jax.js'],
TeX: {
extensions: ['AMSmath.js', 'AMSsymbols.js', 'noErrors.js', 'noUndefined.js']
},
SVG: {
scale: 120,
font: 'STIX-Web'
}
}
})
},
async render (content) {
let matchStack = []
let replaceStack = []
let currentMatch
let mathjaxState = {}
_.forEach(mathRegex, mode => {
do {
currentMatch = mode.regex.exec(content)
if (currentMatch) {
matchStack.push(currentMatch[0])
replaceStack.push(
new Promise((resolve, reject) => {
mathjax.typeset({
math: (mode.format === 'MathML') ? currentMatch[0] : currentMatch[1],
format: mode.format,
speakText: false,
svg: true,
state: mathjaxState,
timeout: 30 * 1000
}, result => {
if (!result.errors) {
resolve(result.svg)
} else {
resolve(currentMatch[0])
WIKI.logger.warn(result.errors.join(', '))
}
})
})
)
}
} while (currentMatch)
})
return (matchStack.length > 0) ? Promise.all(replaceStack).then(results => {
_.forEach(matchStack, (repMatch, idx) => {
content = content.replace(repMatch, results[idx])
})
return content
}) : Promise.resolve(content)
}
}

8
server/modules/rendering/markdown-mathjax/definition.yml

@ -1,8 +0,0 @@
key: markdownMathjax
title: Mathjax Preprocessor
description: Prepare TeX blocks for Mathjax
author: requarks.io
icon: mdi-function-variant
enabledDefault: false
dependsOn: markdownCore
props: {}

11
server/modules/rendering/markdown-mathjax/renderer.js

@ -1,11 +0,0 @@
const mdMathjax = require('markdown-it-mathjax')()
// ------------------------------------
// Markdown - Mathjax Preprocessor
// ------------------------------------
module.exports = {
init (md, conf) {
md.use(mdMathjax)
}
}
Loading…
Cancel
Save