'
diff --git a/source/css/_layout/tag-plugins/timeline.styl b/source/css/_layout/tag-plugins/timeline.styl
index 74fe1d1..8cb6bfb 100644
--- a/source/css/_layout/tag-plugins/timeline.styl
+++ b/source/css/_layout/tag-plugins/timeline.styl
@@ -206,4 +206,17 @@
h5,h6
font-size: $fs-15
margin: 0.5rem 0
- line-height: 1.2
\ No newline at end of file
+ line-height: 1.2
+
+.tag-plugin.timeline.stellar-memos-api .body
+ p:first-child
+ margin-top: 2px
+ p:last-child
+ margin-bottom: 2px
+ img
+ margin: 0
+ max-height: 128px
+ .tag-plugin.image
+ display: flex
+ .image-bg+.image-bg
+ margin-left: 4px
\ No newline at end of file
diff --git a/source/js/main.js b/source/js/main.js
index 540cf61..c1f2350 100644
--- a/source/js/main.js
+++ b/source/js/main.js
@@ -245,7 +245,7 @@ if (stellar.plugins.stellar) {
if (els != undefined && els.length > 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 += '';
+ 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 += '