Skip to content

Commit

Permalink
feat: 在綫聊天新增facebook洽談外掛程式 closed jerryc127#918
Browse files Browse the repository at this point in the history
feat: 添加artalk評論 closed jerryc127#933
fix: 修復 開啟 archor 後, facebook評論加載不正確的 bug
fix: 修復 facebook 評論數無法加載的 bug
  • Loading branch information
jerryc127 committed Jul 16, 2022
1 parent dbb31de commit a36c9ca
Show file tree
Hide file tree
Showing 17 changed files with 281 additions and 23 deletions.
23 changes: 20 additions & 3 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ addtoany:

comments:
# Up to two comments system, the first will be shown as default
# Choose: Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo/Giscus/Remark42
# Choose: Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo/Giscus/Remark42/Artalk
use: # Valine,Disqus
text: true # Display the comment name next to the button
# lazyload: The comment system will be load when comment element enters the browser's viewport.
Expand Down Expand Up @@ -333,7 +333,7 @@ facebook_comments:
user_id: # optional
pageSize: 10 # The number of comments to show
order_by: social # social/time/reverse_time
lang: en_US # Language en_US/zh_CN/zh_TW and so on
lang: zh_TW # Language en_US/zh_CN/zh_TW and so on

# Twikoo
# https://github.com/imaegoo/twikoo
Expand Down Expand Up @@ -361,6 +361,14 @@ remark42:
siteId: # Your Site ID
option:

# Artalk
# https://artalk.js.org/guide/frontend/config.html
artalk:
server:
site:
visitor: false
option:

# Chat Services
# --------------------------------------

Expand Down Expand Up @@ -401,6 +409,13 @@ crisp:
enable: false
website_id:

# messenger
# https://developers.facebook.com/docs/messenger-platform/discovery/facebook-chat-plugin/
messenger:
enable: false
pageID:
lang: zh_TW # Language en_US/zh_CN/zh_TW and so on

# Footer Settings
# --------------------------------------
footer:
Expand Down Expand Up @@ -911,4 +926,6 @@ CDN:
# meting_js:
# prismjs_js:
# prismjs_lineNumber_js:
# prismjs_autoloader:
# prismjs_autoloader:
# artalk_js:
# artalk_css:
10 changes: 9 additions & 1 deletion layout/includes/header/post-info.pug
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@
+pvBlock('','','')
span#twikoo_visitors
i.fa-solid.fa-spinner.fa-spin
else if commentUse[0] === 'Artalk' && theme.artalk.visitor
+pvBlock('','','')
span#ArtalkPV
i.fa-solid.fa-spinner.fa-spin
else if theme.busuanzi.page_pv
+pvBlock('','post-meta-pv-cv','')
span#busuanzi_value_page_pv
Expand Down Expand Up @@ -130,9 +134,13 @@
+countBlock
a(href=url_for(page.path) + '#post-comment')
span.fb-comments-count(data-href=urlNoIndex())
i.fa-solid.fa-spinner.fa-spin
when 'Remark42'
+countBlock
a(href=url_for(page.path) + '#post-comment')
span.remark42__counter(data-url=urlNoIndex())
i.fa-solid.fa-spinner.fa-spin
when 'Artalk'
+countBlock
a(href=url_for(page.path) + '#post-comment')
span.artalk-count
i.fa-solid.fa-spinner.fa-spin
6 changes: 5 additions & 1 deletion layout/includes/mixins/post-ui.pug
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,16 @@ mixin postUI(posts)
+countBlockInIndex
a(href=url_for(link) + '#post-comment')
span.fb-comments-count(data-href=urlNoIndex(article.permalink))
i.fa-solid.fa-spinner.fa-spin
when 'Remark42'
+countBlockInIndex
a(href=url_for(link) + '#post-comment')
span.remark42__counter(data-url=urlNoIndex(article.permalink))
i.fa-solid.fa-spinner.fa-spin
when 'Artalk'
+countBlockInIndex
a(href=url_for(link) + '#post-comment')
span.artalk-count(data-page-key=url_for(link))
i.fa-solid.fa-spinner.fa-spin

//- Display the article introduction on homepage
case theme.index_post_content.method
Expand Down
20 changes: 20 additions & 0 deletions layout/includes/third-party/card-post-count/artalk.pug
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
- const { server, site } = theme.artalk

script.
(() => {
const getArtalkCount = () => {
const runWidget = () => {
Artalk.LoadCountWidget({
server: '!{server}',
site: '!{site}',
countEl: '.artalk-count'
})
}

if (typeof Artalk === 'function') runWidget()
else getScript('!{theme.asset.artalk_js}').then(runWidget)
}


window.pjax ? getArtalkCount() : window.addEventListener('load', getArtalkCount)
})()
7 changes: 5 additions & 2 deletions layout/includes/third-party/card-post-count/fb.pug
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
- const fbSDKVer = 'v14.0'
- const fbSDK = theme.messenger.enable ? `https://connect.facebook.net/${theme.facebook_comments.lang}/sdk/xfbml.customerchat.js#xfbml=1&version=${fbSDKVer}` : `https://connect.facebook.net/${theme.facebook_comments.lang}/sdk.js#xfbml=1&version=${fbSDKVer}`

script.
(()=>{
function loadFBComment () {
if (typeof FB === 'object') FB.XFBML.parse()
if (typeof FB === 'object') FB.XFBML.parse(document.getElementById('recent-posts'))
else {
let ele = document.createElement('script')
ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v9.0')
ele.setAttribute('src','!{fbSDK}')
ele.setAttribute('async', 'true')
ele.setAttribute('defer', 'true')
ele.setAttribute('crossorigin', 'anonymous')
Expand Down
4 changes: 3 additions & 1 deletion layout/includes/third-party/card-post-count/index.pug
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ case theme.comments.use[0]
when 'Facebook Comments'
include ./fb.pug
when 'Remark42'
include ./remark42.pug
include ./remark42.pug
when 'Artalk'
include ./artalk.pug
4 changes: 3 additions & 1 deletion layout/includes/third-party/chat/index.pug
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ else if theme.daovoice && theme.daovoice.enable
else if theme.gitter && theme.gitter.enable
include ./gitter.pug
else if theme.crisp && theme.crisp.enable
include ./crisp.pug
include ./crisp.pug
else if theme.messenger && theme.messenger.enable
include ./messenger.pug
42 changes: 42 additions & 0 deletions layout/includes/third-party/chat/messenger.pug
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
- let { pageID, lang } = theme.messenger
- lang = theme.comments.use && theme.comments.use.includes('Facebook Comments') ? theme.facebook_comments.lang : lang

#fb-customer-chat.fb-customerchat(page_id=pageID attribution='biz_inbox')

script.
document.getElementById('fb-root') ? '' : document.body.insertAdjacentHTML('afterend', '<div id="fb-root"></div>')

window.fbAsyncInit = function() {
FB.init({
xfbml: true,
version: 'v14.0'
});
};

(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = 'https://connect.facebook.net/!{lang}/sdk/xfbml.customerchat.js';
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

if (!{theme.chat_btn}) {
var chatBtnFn = () => {
var chatBtn = document.getElementById("chat_btn")
chatBtn.addEventListener("click", function(){
FB.CustomerChat.show();
});
}
chatBtnFn()
} else {
if (!{theme.chat_hide_show}) {
function chatBtnHide () {
FB.CustomerChat.hide()
}
function chatBtnShow () {
FB.CustomerChat.show(false)
}
}
}

45 changes: 45 additions & 0 deletions layout/includes/third-party/comments/artalk.pug
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
- const { server, site } = theme.artalk

script.
function addArtalkSource () {
const ele = document.createElement('link')
ele.rel = 'stylesheet'
ele.href= '!{theme.asset.artalk_css}'
document.getElementsByTagName('head')[0].appendChild(ele)
}

function loadArtalk () {
function initArtalk () {
window.artalkItem = new Artalk({
el: '#artalk-wrap',
server: '!{server}',
site: '!{site}',
pageKey: location.pathname,
darkMode: document.documentElement.getAttribute('data-theme') === 'dark',
countEl: '.artalk-count'
})
}

if (typeof window.artalkItem === 'object') setTimeout(()=>{initArtalk()},200)
else {
addArtalkSource()
typeof Artalk !== 'function' ? getScript('!{theme.asset.artalk_js}').then(initArtalk)
: setTimeout(()=>{initArtalk()},200)
}
}

document.getElementById('darkmode').addEventListener('click',()=> {
if (typeof window.artalkItem !== 'object') return
let isDark = document.documentElement.getAttribute('data-theme') === 'dark'
window.artalkItem.setDarkMode(!isDark)
})


if ('!{theme.comments.use[0]}' === 'Artalk' || !!{theme.comments.lazyload}) {
if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('artalk-wrap'), loadArtalk)
else loadArtalk()
} else {
function loadOtherComment () {
loadArtalk()
}
}
20 changes: 15 additions & 5 deletions layout/includes/third-party/comments/facebook_comments.pug
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
#fb-root
- const fbSDKVer = 'v14.0'
- const fbSDK = theme.messenger.enable ? `https://connect.facebook.net/${theme.facebook_comments.lang}/sdk/xfbml.customerchat.js#xfbml=1&version=${fbSDKVer}` : `https://connect.facebook.net/${theme.facebook_comments.lang}/sdk.js#xfbml=1&version=${fbSDKVer}`

script.
function loadFBComment () {
var themeNow = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
document.getElementsByClassName('fb-comments')[0].setAttribute('data-colorscheme',themeNow)
document.getElementById('fb-root') ? '' : document.body.insertAdjacentHTML('afterend', '<div id="fb-root"></div>')

const themeNow = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
const $fbComment = document.getElementsByClassName('fb-comments')[0]
$fbComment.setAttribute('data-colorscheme',themeNow)
$fbComment.setAttribute('data-href', '!{urlNoIndex(page.permalink)}')

if (typeof FB === 'object') FB.XFBML.parse()
if (typeof FB === 'object') {
FB.XFBML.parse(document.getElementsByClassName('post-meta-commentcount')[0])
FB.XFBML.parse(document.getElementById('post-comment'))
}
else {
let ele = document.createElement('script')
ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v13.0&appId=!{theme.facebook_comments.app_id}&autoLogAppEvents=1')
ele.setAttribute('src','!{fbSDK}')
ele.setAttribute('async', 'true')
ele.setAttribute('defer', 'true')
ele.setAttribute('crossorigin', 'anonymous')
ele.setAttribute('id', 'facebook-jssdk')
document.getElementById('fb-root').insertAdjacentElement('afterbegin',ele)
}
}
Expand Down
2 changes: 2 additions & 0 deletions layout/includes/third-party/comments/index.pug
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,5 @@ hr
data-width="100%")
when 'Remark42'
#remark42
when 'Artalk'
#artalk-wrap
4 changes: 3 additions & 1 deletion layout/includes/third-party/comments/js.pug
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ each name in theme.comments.use
when 'Giscus'
!=partial('includes/third-party/comments/giscus', {}, {cache: true})
when 'Facebook Comments'
!=partial('includes/third-party/comments/facebook_comments', {}, {cache: true})
include ./facebook_comments.pug
when 'Remark42'
!=partial('includes/third-party/comments/remark42', {}, {cache: true})
when 'Artalk'
!=partial('includes/third-party/comments/artalk', {}, {cache: true})
82 changes: 82 additions & 0 deletions layout/includes/third-party/newest-comments/artalk.pug
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
- const { server, option } = theme.artalk
- const avatarCdn = option !== null && option.gravatar ? option.gravatar.mirror : 'https://sdn.geekzu.org/avatar/'
- const avatarDefault = option !== null && option.gravatar ? option.gravatar.default : 'mp'

script.
window.addEventListener('load', () => {
const changeContent = (content) => {
if (content === '') return content

content = content.replace(/<img.*?src="(.*?)"?[^\>]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link
content = content.replace(/<a[^>]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url
content = content.replace(/<pre><code>.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
content = content.replace(/<[^>]+>/g,"") // remove html tag

if (content.length > 150) {
content = content.substring(0,150) + '...'
}
return content
}

const generateHtml = array => {
let result = ''

if (array.length) {
for (let i = 0; i < array.length; i++) {
result += '<div class=\'aside-list-item\'>'

if (!{theme.newest_comments.avatar}) {
const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}'
result += `<a href='${array[i].url}' class='thumbnail'><img ${name}='${array[i].avatar}' alt='${array[i].nick}'></a>`
}

result += `<div class='content'>
<a class='comment' href='${array[i].url}' title='${array[i].content}'>${array[i].content}</a>
<div class='name'><span>${array[i].nick} / </span><time datetime="${array[i].date}">${btf.diffDate(array[i].date, true)}</time></div>
</div></div>`
}
} else {
result += '!{_p("aside.card_newest_comments.zero")}'
}

let $dom = document.querySelector('#card-newest-comments .aside-list')
$dom.innerHTML= result
window.lazyLoadInstance && window.lazyLoadInstance.update()
window.pjax && window.pjax.refresh($dom)
}

const getComment = () => {
fetch('!{server}/api/stat?type=latest_comments&limit=!{theme.newest_comments.limit}',{method: "POST"})
.then(response => response.json())
.then(d => {
const artalk = d.data.map(function (e) {
return {
'avatar': '!{avatarCdn}' + e.email_encrypted + '?d=!{avatarDefault}',
'content': changeContent(e.content_marked),
'nick': e.nick,
'url': e.page_url,
'date': e.date,
}
})
saveToLocal.set('artalk-newest-comments', JSON.stringify(artalk), !{theme.newest_comments.storage}/(60*24))
generateHtml(artalk)
}).catch(e => {
const $dom = document.querySelector('#card-newest-comments .aside-list')
$dom.innerHTML= "!{_p('aside.card_newest_comments.error')}"
})
}

const newestCommentInit = () => {
if (document.querySelector('#card-newest-comments .aside-list')) {
const data = saveToLocal.get('artalk-newest-comments')
if (data) {
generateHtml(JSON.parse(data))
} else {
getComment()
}
}
}

newestCommentInit()
document.addEventListener('pjax:complete', newestCommentInit)
})
4 changes: 3 additions & 1 deletion layout/includes/third-party/newest-comments/index.pug
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,6 @@ if use
- userRepo = theme.utterances.repo
include ./github-issues.pug
when 'Remark42'
include ./remark42.pug
include ./remark42.pug
when 'Artalk'
include ./artalk.pug
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "hexo-theme-butterfly",
"version": "4.3.1",
"version": "4.4.0-b1",
"description": "A Simple and Card UI Design theme for Hexo",
"main": "package.json",
"scripts": {
Expand Down
Loading

0 comments on commit a36c9ca

Please sign in to comment.