feat: comments disqus + commento

This commit is contained in:
NGPixel
2020-05-16 22:46:05 -04:00
committed by Nicolas Giard
parent f6bad765a2
commit 887e8a0f5a
20 changed files with 1292 additions and 1067 deletions

View File

@@ -366,6 +366,7 @@ router.get('/*', async (req, res, next) => {
req.i18n.changeLanguage(pageArgs.locale)
try {
// -> Get Page from cache
const page = await WIKI.models.pages.getPage({
path: pageArgs.path,
locale: pageArgs.locale,
@@ -374,6 +375,7 @@ router.get('/*', async (req, res, next) => {
})
pageArgs.tags = _.get(page, 'tags', [])
// -> Check User Access
if (!WIKI.auth.checkAccess(req.user, ['read:pages'], pageArgs)) {
if (req.user.id === 2) {
res.cookie('loginRedirect', req.path, {
@@ -396,6 +398,7 @@ router.get('/*', async (req, res, next) => {
_.set(res.locals, 'pageMeta.title', page.title)
_.set(res.locals, 'pageMeta.description', page.description)
// -> Build sidebar navigation
let sdi = 1
const sidebar = (await WIKI.models.navigation.getTree({ cache: true, locale: pageArgs.locale, groups: req.user.groups })).map(n => ({
i: `sdi-${sdi++}`,
@@ -406,20 +409,46 @@ router.get('/*', async (req, res, next) => {
t: n.target
}))
// -> Build theme code injection
const injectCode = {
css: WIKI.config.theming.injectCSS,
head: WIKI.config.theming.injectHead,
body: WIKI.config.theming.injectBody
}
// -> Convert page TOC
if (!_.isString(page.toc)) {
page.toc = JSON.stringify(page.toc)
}
if (req.query.legacy || req.get('user-agent').indexOf('Trident') >= 0) {
res.render('legacy/page', { page, sidebar, injectCode, isAuthenticated: req.user && req.user.id !== 2 })
// -> Render legacy view
res.render('legacy/page', {
page,
sidebar,
injectCode,
isAuthenticated: req.user && req.user.id !== 2
})
} else {
res.render('page', { page, sidebar, injectCode })
// -> Inject comments variables
if (WIKI.config.features.featurePageComments && WIKI.data.commentProvider.codeTemplate) {
[
{ key: 'pageUrl', value: `${WIKI.config.host}/i/${page.id}` },
{ key: 'pageId', value: page.id }
].forEach((cfg) => {
WIKI.data.commentProvider.head = _.replace(WIKI.data.commentProvider.head, new RegExp(`{{${cfg.key}}}`, 'g'), cfg.value)
WIKI.data.commentProvider.body = _.replace(WIKI.data.commentProvider.body, new RegExp(`{{${cfg.key}}}`, 'g'), cfg.value)
WIKI.data.commentProvider.main = _.replace(WIKI.data.commentProvider.main, new RegExp(`{{${cfg.key}}}`, 'g'), cfg.value)
})
}
// -> Render view
res.render('page', {
page,
sidebar,
injectCode,
comments: WIKI.data.commentProvider
})
}
} else if (pageArgs.path === 'home') {
_.set(res.locals, 'pageMeta.title', 'Welcome')

View File

@@ -77,6 +77,7 @@ module.exports = {
await WIKI.models.storage.refreshTargetsFromDisk()
await WIKI.auth.activateStrategies()
await WIKI.models.commentProviders.initProvider()
await WIKI.models.searchEngines.initEngine()
await WIKI.models.storage.initTargets()
WIKI.scheduler.start()

View File

@@ -38,7 +38,7 @@ module.exports = {
async updateProviders(obj, args, context) {
try {
for (let provider of args.providers) {
await WIKI.models.providers.query().patch({
await WIKI.models.commentProviders.query().patch({
isEnabled: provider.isEnabled,
config: _.reduce(provider.config, (result, value, key) => {
_.set(result, `${value.key}`, _.get(JSON.parse(value.value), 'v', null))
@@ -46,6 +46,7 @@ module.exports = {
}, {})
}).where('key', provider.key)
}
await WIKI.models.commentProviders.initProvider()
return {
responseResult: graphHelper.generateSuccess('Comment Providers updated successfully')
}

View File

@@ -51,38 +51,38 @@ module.exports = class CommentProvider extends Model {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', dir, 'definition.yml'), 'utf8')
diskProviders.push(yaml.safeLoad(def))
}
WIKI.data.commentProviders = diskProviders.map(engine => ({
...engine,
props: commonHelper.parseModuleProps(engine.props)
WIKI.data.commentProviders = diskProviders.map(provider => ({
...provider,
props: commonHelper.parseModuleProps(provider.props)
}))
let newProviders = []
for (let engine of WIKI.data.commentProviders) {
if (!_.some(dbProviders, ['key', engine.key])) {
for (let provider of WIKI.data.commentProviders) {
if (!_.some(dbProviders, ['key', provider.key])) {
newProviders.push({
key: engine.key,
isEnabled: engine.key === 'default',
config: _.transform(engine.props, (result, value, key) => {
key: provider.key,
isEnabled: provider.key === 'default',
config: _.transform(provider.props, (result, value, key) => {
_.set(result, key, value.default)
return result
}, {})
})
} else {
const engineConfig = _.get(_.find(dbProviders, ['key', engine.key]), 'config', {})
const providerConfig = _.get(_.find(dbProviders, ['key', provider.key]), 'config', {})
await WIKI.models.commentProviders.query().patch({
config: _.transform(engine.props, (result, value, key) => {
config: _.transform(provider.props, (result, value, key) => {
if (!_.has(result, key)) {
_.set(result, key, value.default)
}
return result
}, engineConfig)
}).where('key', engine.key)
}, providerConfig)
}).where('key', provider.key)
}
}
if (newProviders.length > 0) {
trx = await WIKI.models.Objection.transaction.start(WIKI.models.knex)
for (let engine of newProviders) {
await WIKI.models.commentProviders.query(trx).insert(engine)
for (let provider of newProviders) {
await WIKI.models.commentProviders.query(trx).insert(provider)
}
await trx.commit()
WIKI.logger.info(`Loaded ${newProviders.length} new comment providers: [ OK ]`)
@@ -97,4 +97,41 @@ module.exports = class CommentProvider extends Model {
}
}
}
static async initProvider() {
const commentProvider = await WIKI.models.commentProviders.query().findOne('isEnabled', true)
if (commentProvider) {
WIKI.data.commentProvider = {
..._.find(WIKI.data.commentProviders, ['key', commentProvider.key]),
head: '',
bodyStart: '',
bodyEnd: '',
main: '<comments></comments>'
}
if (WIKI.data.commentProvider.codeTemplate) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', commentProvider.key, 'code.yml'), 'utf8')
let code = yaml.safeLoad(def)
code.head = _.defaultTo(code.head, '')
code.body = _.defaultTo(code.body, '')
code.main = _.defaultTo(code.main, '')
_.forOwn(commentProvider.config, (value, key) => {
code.head = _.replace(code.head, new RegExp(`{{${key}}}`, 'g'), value)
code.body = _.replace(code.body, new RegExp(`{{${key}}}`, 'g'), value)
code.main = _.replace(code.main, new RegExp(`{{${key}}}`, 'g'), value)
})
WIKI.data.commentProvider.head = code.head
WIKI.data.commentProvider.body = code.body
WIKI.data.commentProvider.main = code.main
} else {
WIKI.data.commentProvider = {
...WIKI.data.commentProvider,
...require(`../modules/comments/${commentProvider.key}/comment`)
}
}
WIKI.data.commentProvider.config = commentProvider.config
}
}
}

View File

@@ -1,4 +1,12 @@
main: |
<div id="commento"></div>
bodyEnd: |
<script defer src="{{instanceUrl}}/js/commento.js"></script>
body: |
<script>
window.onload = function() {
var d = document, s = d.createElement('script');
s.src = '{{instanceUrl}}/js/commento.js';
s.defer = true
s.setAttribute('data-auto-init', true);
(d.head || d.body).appendChild(s);
};
</script>

View File

@@ -4,9 +4,8 @@ description: A fast, privacy-focused commenting platform.
author: requarks.io
logo: https://static.requarks.io/logo/commento.svg
website: https://commento.io/
displayMode: footer
codeTemplate: true
isAvailable: false
isAvailable: true
props:
instanceUrl:
type: String

View File

@@ -0,0 +1,11 @@
/* global WIKI */
// ------------------------------------
// Default Comment Provider
// ------------------------------------
module.exports = {
add (args) {
}
}

View File

@@ -4,7 +4,6 @@ description: Built-in advanced comments tool.
author: requarks.io
logo: https://static.requarks.io/logo/wikijs-butterfly.svg
website: https://wiki.js.org
displayMode: dynamic
codeTemplate: false
isAvailable: true
props:

View File

@@ -1,14 +1,14 @@
main: |
<div id="disqus_thread"></div>
bodyEnd: |
body: |
<script>
var disqus_config = function () {
this.page.url = {{pageUrl}};
this.page.identifier = {{pageId}};
this.page.url = '{{pageUrl}}';
this.page.identifier = '{{pageId}}';
};
(function() {
var d = document, s = d.createElement('script');
s.src = 'https://{{shortName}}.disqus.com/embed.js';
s.src = 'https://{{accountName}}.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();

View File

@@ -4,9 +4,8 @@ description: Disqus help publishers power online discussions with comments.
author: requarks.io
logo: https://static.requarks.io/logo/disqus.svg
website: https://disqus.com/
displayMode: footer
codeTemplate: true
isAvailable: false
isAvailable: true
props:
accountName:
type: String

View File

@@ -12,7 +12,7 @@ module.exports = {
md.renderer.rules.emoji = (token, idx) => {
return twemoji.parse(token[idx].content, {
callback (icon, opts) {
return `/svg/twemoji/${icon}.svg`
return `/_assets/svg/twemoji/${icon}.svg`
}
})
}

View File

@@ -5,6 +5,8 @@ block head
style(type='text/css')!= injectCode.css
if injectCode.head
!= injectCode.head
if config.features.featurePageComments
!= comments.head
block body
#root
@@ -23,8 +25,15 @@ block body
:page-id=page.id
sidebar=Buffer.from(JSON.stringify(sidebar)).toString('base64')
nav-mode=config.nav.mode
comments-enabled=config.features.featurePageComments
comments-provider=comments.key
comments-external=comments.codeTemplate
)
template(slot='contents')
div!= page.render
template(slot='comments')
div!= comments.main
if injectCode.body
!= injectCode.body
if config.features.featurePageComments
!= comments.body