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); } } if (imgs.length > 0) { cell += '
'; for (let img of imgs) { if (img.externalLink?.length > 0) { cell += `
`; } else { 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.12/avatar/round/3442075.svg'; } MemosJS.layoutDiv(cfg); } });