diff --git a/_config.yml b/_config.yml index 793bd32..1b1afc5 100755 --- a/_config.yml +++ b/_config.yml @@ -290,6 +290,7 @@ plugins: linkcard: /js/plugins/linkcard.js fcircle: /js/plugins/fcircle.js weibo: /js/plugins/weibo.js + memos: /js/plugins/memos.js marked: https://cdn.bootcdn.net/ajax/libs/marked/4.0.18/marked.min.js diff --git a/scripts/tags/lib/timeline.js b/scripts/tags/lib/timeline.js index ff800e8..ca05df5 100644 --- a/scripts/tags/lib/timeline.js +++ b/scripts/tags/lib/timeline.js @@ -1,5 +1,5 @@ /** - * timeline.js v2 | https://github.com/xaoxuu/hexo-theme-stellar/ + * timeline.js v2.1 | https://github.com/xaoxuu/hexo-theme-stellar/ * * {% timeline %} * @@ -35,14 +35,14 @@ function layoutNodeContent(ctx, content) { } module.exports = ctx => function(args, content = '') { - args = ctx.args.map(args, ['api', 'user', 'type', 'limit', 'hide']) + args = ctx.args.map(args, ['api', 'user', 'type', 'limit', 'hide', 'avatar']) var el = '' if (!args.type) { args.type = 'timeline' } if (args.api && args.api.length > 0) { el += '
0) { stellar.jQuery(() => { stellar.loadScript(js, { defer: true }); - if (key == 'timeline') { + if (key == 'timeline' || 'memos') { stellar.loadScript(stellar.plugins.marked); } }) @@ -299,13 +299,36 @@ if (stellar.plugins.preload) { } } +function loadFancybox() { + stellar.loadCSS(stellar.plugins.fancybox.css); + stellar.loadScript(stellar.plugins.fancybox.js, { defer: true }).then(function () { + Fancybox.bind(selector, { + groupAll: true, + hideScrollbar: false, + Thumbs: { + autoStart: false, + }, + caption: function (fancybox, carousel, slide) { + return slide.$trigger.alt || null + } + }); + }) +} // fancybox if (stellar.plugins.fancybox) { let selector = 'img[fancybox]:not(.error)'; if (stellar.plugins.fancybox.selector) { selector += `, ${stellar.plugins.fancybox.selector}` } - if (document.querySelectorAll(selector).length !== 0) { + var needFancybox = document.querySelectorAll(selector).length !== 0; + if (!needFancybox) { + const els = document.getElementsByClassName('stellar-memos-api'); + console.log('els', els); + if (els != undefined && els.length > 0) { + needFancybox = true; + } + } + if (needFancybox) { stellar.loadCSS(stellar.plugins.fancybox.css); stellar.loadScript(stellar.plugins.fancybox.js, { defer: true }).then(function () { Fancybox.bind(selector, { diff --git a/source/js/plugins/memos.js b/source/js/plugins/memos.js new file mode 100644 index 0000000..07af2bf --- /dev/null +++ b/source/js/plugins/memos.js @@ -0,0 +1,129 @@ +const MemosJS = { + requestAPI: (url, callback, timeout) => { + let retryTimes = 5; + function request() { + return new Promise((resolve, reject) => { + let status = 0; // 0 等待 1 完成 2 超时 + let timer = setTimeout(() => { + if (status === 0) { + status = 2; + timer = null; + reject('请求超时'); + if (retryTimes == 0) { + timeout(); + } + } + }, 5000); + fetch(url).then(function(response) { + if (status !== 2) { + clearTimeout(timer); + resolve(response); + timer = null; + status = 1; + } + if (response.ok) { + return response.json(); + } + throw new Error('Network response was not ok.'); + }).then(function(data) { + retryTimes = 0; + callback(data); + }).catch(function(error) { + if (retryTimes > 0) { + retryTimes -= 1; + setTimeout(() => { + request(); + }, 5000); + } else { + timeout(); + } + }); + }); + } + request(); + }, + layoutDiv: (cfg) => { + const el = $(cfg.el)[0]; + $(el).append('
'); + MemosJS.requestAPI(cfg.api, function(data) { + $(el).find('.loading-wrap').remove(); + var users = []; + const filter = el.getAttribute('user'); + if (filter && filter.length > 0) { + users = filter.split(","); + } + var hide = []; + const hideStr = el.getAttribute('hide'); + if (hideStr && hideStr.length > 0) { + hide = hideStr.split(","); + } + data.forEach((item, i) => { + if (cfg.limit && i >= cfg.limit) { + return; + } + if (item.user && item.user.login && users.length > 0) { + if (!users.includes(item.user.login)) { + return; + } + } + let date = new Date(item.createdTs * 1000) + var cell = '
'; + cell += '
'; + if (!users.length && !hide.includes('user')) { + cell += ''; + } + cell += '

' + date.toLocaleString() + '

'; + cell += '
'; + cell += '
'; + cell += marked.parse(item.content || ''); + var imgs = []; + for (let res of item.resourceList) { + if (res.type?.includes('image/')) { + imgs.push(res.id); + console.log('type', res.type); + } + } + if (imgs.length > 0) { + cell += '
'; + for (let id of imgs) { + cell += `
`; + } + cell += '
'; + } + cell += '
'; + cell += '
'; + $(el).append(cell); + }); + }, function() { + $(el).find('.loading-wrap svg').remove(); + $(el).find('.loading-wrap').append(''); + $(el).find('.loading-wrap').addClass('error'); + }); + }, +} + +$(function () { + const els = document.getElementsByClassName('stellar-memos-api'); + for (var i = 0; i < els.length; i++) { + const el = els[i]; + const api = el.getAttribute('api'); + if (api == null) { + continue; + } + var cfg = new Object(); + cfg.el = el; + cfg.api = api; + cfg.limit = el.getAttribute('limit'); + cfg.host = api.replace(/https:\/\/(.*?)\/(.*)/i, '$1'); + cfg.avatar = el.getAttribute('avatar'); + if (!cfg.avatar) { + cfg.avatar = 'https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.4/avatar/round/3442075.svg'; + } + MemosJS.layoutDiv(cfg); + } +}); diff --git a/source/js/plugins/timeline.js b/source/js/plugins/timeline.js index 02c8883..89a70d3 100644 --- a/source/js/plugins/timeline.js +++ b/source/js/plugins/timeline.js @@ -84,7 +84,7 @@ const StellarTimeline = { cell += ''; } let date = new Date(item.created_at); - cell += '

' + date.toString().replace(/\sGMT([^.]*)/i, "") + '

'; + cell += '

' + date.toLocaleString() + '

'; cell += '
'; cell += '
'; if (!hide.includes('title')) {