diff --git a/scripts/tags/friends.js b/scripts/tags/friends.js index 313026b..db0e1aa 100644 --- a/scripts/tags/friends.js +++ b/scripts/tags/friends.js @@ -3,64 +3,74 @@ * 格式与官方标签插件一致使用空格分隔,中括号内的是可选参数(中括号不需要写出来) * * {% friends [style:rect] [group:name] %} + * {% friends [api:https://issues-api.vercel.app] [repo:xaoxuu/friends] %} */ 'use strict'; hexo.extend.tag.register('friends', function(args) { - args = hexo.args.map(args, ['style', 'group']); + args = hexo.args.map(args, ['style', 'group', 'repo']); var friends = hexo.locals.get('data').friends; if (friends == undefined) { - return; + friends = {}; } - var el = '
0) { el += args.style; } else { - el += ' round'; + el += 'round'; } - el += '">'; - function groupHeader(group) { - var header = '
'; - if (!!group.title) { - header += '

' + group.title + '

'; - } - if (!!group.description) { - header += '

' + group.description + '

'; - } - header += '
'; - return header; + el += '"'; + if (args.repo) { + el += ' id="issues-api"'; + el += ' api="' + (args.api || 'https://issues-api.vercel.app') + '/' + args.repo + '"'; } - function cell(friend) { - if (friend.url && friend.title) { - var cell = '
'; - cell += ''; - cell += ''; - cell += '
' + friend.title + '
'; - cell += '
' - return cell; - } else { - return ''; + el += '>'; + if (args.repo) { + el += '
'; + } else { + function groupHeader(group) { + var header = '
'; + if (!!group.title) { + header += '

' + group.title + '

'; + } + if (!!group.description) { + header += '

' + group.description + '

'; + } + header += '
'; + return header; } - } - for (let groupId of Object.keys(friends)) { - function f() { - if (groupId in friends) { - let group = friends[groupId]; - el += groupHeader(group); - el += '
'; - group.items.forEach((friend, i) => { - el += cell(friend); - }); - el += '
'; + function cell(friend) { + if (friend.url && friend.title) { + var cell = '
'; + cell += ''; + cell += ''; + cell += '
' + friend.title + '
'; + cell += '
' + return cell; + } else { + return ''; } } - if (args.group && args.group.length > 0) { - if (args.group == groupId) { + for (let groupId of Object.keys(friends)) { + function f() { + if (groupId in friends) { + let group = friends[groupId]; + el += groupHeader(group); + el += '
'; + group.items.forEach((friend, i) => { + el += cell(friend); + }); + el += '
'; + } + } + if (args.group && args.group.length > 0) { + if (args.group == groupId) { + f(); + } + } else { f(); } - } else { - f(); } } el += '
'; diff --git a/source/js/issues.js b/source/js/issues.js index deb0def..697ae1f 100644 --- a/source/js/issues.js +++ b/source/js/issues.js @@ -1,6 +1,6 @@ const IssuesAPI = { requestIssuesAPI(url, callback, timeout) { - let retryTimes = 10; + let retryTimes = 5; function request() { return new Promise((resolve, reject) => { let status = 0; // 0 等待 1 完成 2 超时 @@ -42,144 +42,45 @@ const IssuesAPI = { } request(); }, - parseIssueStrToJson(str) { - let jsonStr = str.match(/```json[\s|\S]*```/); - if (jsonStr && jsonStr.length > 0) { - jsonStr = jsonStr[0]; - } - if (jsonStr) { - jsonStr = jsonStr.split('```json')[1].split('```')[0]; - if (jsonStr) { - return JSON.parse(jsonStr); - } - } - return undefined; - }, - groupIssuesData(cfg, data) { - var groups = new Object(); - if (data.length > 0) { - if (cfg.group != undefined) { - const arr = cfg.group.split('='); - if (arr.length > 1) { - const groupKey = arr[0]; - let groupList = arr[1]; - if (groupKey && groupList) { - groupList = groupList.split(','); - } - cfg.group = groupList; - for (i = 0; i < data.length; i++) { - const obj = this.parseIssueStrToJson(data[i].body); - if (obj && (groupKey in obj)) { - let tmp = obj[groupKey]; - tmp = tmp.replace(', ', ',').split(','); - for (var j = 0; j < tmp.length; j++) { - if (groupList.includes(tmp[j])) { - let arr = groups[tmp[j]]; - if (arr == undefined) { - arr = new Array(); - } - arr.push(obj); - groups[tmp[j]] = arr; - } - } - } - } - } - } else { - cfg.group = ['']; - for (i = 0; i < data.length; i++) { - const obj = this.parseIssueStrToJson(data[i].body); - if (obj) { - let arr = groups['']; - if (arr == undefined) { - arr = new Array(); - } - arr.push(obj); - groups[''] = arr; - } - } - } - } - return groups; - }, - getIssuesAPIForSites(cfg) { + getIssuesAPIForFriends(cfg) { const el = $(cfg.el)[0]; - $(el).append('

正在加载

'); + $(el).append('

正在加载

'); this.requestIssuesAPI(cfg.api, function(data) { $(el).find('.loading').remove(); - const dt = IssuesAPI.groupIssuesData(cfg, data); - const groupTitles = Object.keys(dt); - cfg.group.forEach((groupTitle, i) => { - const issues = dt[groupTitle]; - if (issues && issues.length > 0) { - if (groupTitle.length > 0) { - $(el).append('

' + groupTitle + '

'); - } else if (name == '' && groupTitles.length > 1) { - $(el).append('

' + '未分组' + '

'); - } - $(el).append('
'); - // layout items - for (j = 0; j < issues.length; j++) { - const issue = issues[j]; - let imgTag = ''; - if (issue.screenshot && issue.screenshot.length > 0) { - imgTag = '
'; - } else { - imgTag = '
'; - } - let infoTag = '
'; - if (issue.avatar && issue.avatar.length > 0) { - infoTag += ''; - } - infoTag += '' + issue.title + '' + issue.description + '
'; - const cardTag = '
' + imgTag + infoTag + '
'; - $(el).find('.site-card-group.' + i).append(cardTag); - } - } + const arr = data.content; + arr.forEach((item, i) => { + var user = '
'; + user += ''; + user += ''; + user += '
' + item.title + '
'; + user += '
'; + user += '
'; + $(el).find('.group-body').append(user); }); }, function() { $(el).find('.loading i').remove(); $(el).find('.loading p').text('加载失败,请稍后重试。'); }); }, - getIssuesAPIForTimeline(cfg) { - const el = $(cfg.el)[0]; - $(el).append('

正在加载

'); - this.requestIssuesAPI(cfg.api, function(data) { - $(el).find('.loading').remove(); - if (data.length > 0) { - for (i = 0; i < data.length; i++) { - const a = '  ' + data[i].comments + ''; - const header = '

' + data[i].title + a + '

'; - const body = '

' + data[i].body + '

'; - const tag = '
' + header + body + '
'; - $(el).append(tag); - } - } - }, function() { - $(el).find('.loading i').remove(); - $(el).find('.loading p').text('加载失败,请稍后重试。'); - }); - }, request() { const els = document.getElementsByClassName('issues-wrap'); for (var i = 0; i < els.length; i++) { const el = els[i]; const api = el.getAttribute('api'); const group = el.getAttribute('group'); + if (api == null) { + continue; + } var cfg = new Object(); cfg.class = el.getAttribute('class'); cfg.el = el; cfg.api = api; cfg.group = group; - if (cfg.class.split(' ').includes('sites')) { - this.getIssuesAPIForSites(cfg); - } else if (cfg.class.split(' ').includes('timeline')) { - this.getIssuesAPIForTimeline(cfg); - } + this.getIssuesAPIForFriends(cfg); } } }; $(function () { IssuesAPI.request(); -}); \ No newline at end of file +});