feat: comments disqus + commento
This commit is contained in:
@@ -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')
|
||||
|
@@ -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()
|
||||
|
@@ -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')
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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
|
||||
|
11
server/modules/comments/default/comment.js
Normal file
11
server/modules/comments/default/comment.js
Normal file
@@ -0,0 +1,11 @@
|
||||
/* global WIKI */
|
||||
|
||||
// ------------------------------------
|
||||
// Default Comment Provider
|
||||
// ------------------------------------
|
||||
|
||||
module.exports = {
|
||||
add (args) {
|
||||
|
||||
}
|
||||
}
|
@@ -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:
|
||||
|
@@ -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);
|
||||
})();
|
||||
|
@@ -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
|
||||
|
@@ -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`
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user