use issues api

This commit is contained in:
xaoxuu 2021-03-02 23:53:51 +08:00
parent d218fef18d
commit f8747a726b
2 changed files with 68 additions and 157 deletions

View File

@ -3,23 +3,32 @@
* 格式与官方标签插件一致使用空格分隔中括号内的是可选参数中括号不需要写出来 * 格式与官方标签插件一致使用空格分隔中括号内的是可选参数中括号不需要写出来
* *
* {% friends [style:rect] [group:name] %} * {% friends [style:rect] [group:name] %}
* {% friends [api:https://issues-api.vercel.app] [repo:xaoxuu/friends] %}
*/ */
'use strict'; 'use strict';
hexo.extend.tag.register('friends', function(args) { 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; var friends = hexo.locals.get('data').friends;
if (friends == undefined) { if (friends == undefined) {
return; friends = {};
} }
var el = '<div class="tag-plugin friends-wrap '; var el = '<div class="tag-plugin friends-wrap issues-wrap ';
if (args.style && args.style.length > 0) { if (args.style && args.style.length > 0) {
el += args.style; el += args.style;
} else { } else {
el += ' round'; el += 'round';
} }
el += '">'; el += '"';
if (args.repo) {
el += ' id="issues-api"';
el += ' api="' + (args.api || 'https://issues-api.vercel.app') + '/' + args.repo + '"';
}
el += '>';
if (args.repo) {
el += '<div class="group-body"></div>';
} else {
function groupHeader(group) { function groupHeader(group) {
var header = '<div class="group-header">'; var header = '<div class="group-header">';
if (!!group.title) { if (!!group.title) {
@ -63,6 +72,7 @@ hexo.extend.tag.register('friends', function(args) {
f(); f();
} }
} }
}
el += '</div>'; el += '</div>';
return el; return el;
}); });

View File

@ -1,6 +1,6 @@
const IssuesAPI = { const IssuesAPI = {
requestIssuesAPI(url, callback, timeout) { requestIssuesAPI(url, callback, timeout) {
let retryTimes = 10; let retryTimes = 5;
function request() { function request() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let status = 0; // 0 等待 1 完成 2 超时 let status = 0; // 0 等待 1 完成 2 超时
@ -42,141 +42,42 @@ const IssuesAPI = {
} }
request(); request();
}, },
parseIssueStrToJson(str) { getIssuesAPIForFriends(cfg) {
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) {
const el = $(cfg.el)[0]; const el = $(cfg.el)[0];
$(el).append('<div class="loading"><i class="fa fa-cog fa-2x fa-spin"></i><p>正在加载</p></div>'); $(el).append('<div class="loading"><p>正在加载</p></div>');
this.requestIssuesAPI(cfg.api, function(data) { this.requestIssuesAPI(cfg.api, function(data) {
$(el).find('.loading').remove(); $(el).find('.loading').remove();
const dt = IssuesAPI.groupIssuesData(cfg, data); const arr = data.content;
const groupTitles = Object.keys(dt); arr.forEach((item, i) => {
cfg.group.forEach((groupTitle, i) => { var user = '<div class="user-simple">';
const issues = dt[groupTitle]; user += '<a class="user-link" target="_blank" rel="external nofollow noopener noreferrer"';
if (issues && issues.length > 0) { user += ' href="' + item.url + '">';
if (groupTitle.length > 0) { user += '<img src="' + item.avatar + '" onerror="javascript:this.src=\'https://image.thum.io/get/width/1024/crop/768/' + item.url + '\';"/>';
$(el).append('<h2>' + groupTitle + '</h2>'); user += '<div class="name"><span>' + item.title + '</span></div>';
} else if (name == '' && groupTitles.length > 1) { user += '</a>';
$(el).append('<h2>' + '未分组' + '</h2>'); user += '</div>';
} $(el).find('.group-body').append(user);
$(el).append('<div class="site-card-group ' + i + '"></div>');
// layout items
for (j = 0; j < issues.length; j++) {
const issue = issues[j];
let imgTag = '';
if (issue.screenshot && issue.screenshot.length > 0) {
imgTag = '<div class="img"><img src="' + issue.screenshot + '" onerror="javascript:this.src=\'https://image.thum.io/get/width/1024/crop/768/' + issue.url + '\';"/></div>';
} else {
imgTag = '<div class="img"></div>';
}
let infoTag = '<div class="info">';
if (issue.avatar && issue.avatar.length > 0) {
infoTag += '<img src="' + issue.avatar + '" onerror="javascript:this.src=\'https://image.thum.io/get/width/1024/crop/768/' + issue.url + '\';"/>';
}
infoTag += '<span class="title">' + issue.title + '</span><span class="desc">' + issue.description + '</span></div>';
const cardTag = '<div><a class=\'site-card\' target=\'_blank\' href=\'' + issue.url + '\'>' + imgTag + infoTag + '</a></div>';
$(el).find('.site-card-group.' + i).append(cardTag);
}
}
}); });
}, function() { }, function() {
$(el).find('.loading i').remove(); $(el).find('.loading i').remove();
$(el).find('.loading p').text('加载失败,请稍后重试。'); $(el).find('.loading p').text('加载失败,请稍后重试。');
}); });
}, },
getIssuesAPIForTimeline(cfg) {
const el = $(cfg.el)[0];
$(el).append('<div class="loading"><i class="fa fa-cog fa-2x fa-spin"></i><p>正在加载</p></div>');
this.requestIssuesAPI(cfg.api, function(data) {
$(el).find('.loading').remove();
if (data.length > 0) {
for (i = 0; i < data.length; i++) {
const a = '&nbsp;&nbsp;<a class="comments" target="_blank" href="' + data[i].html_url + '"><i class="fa fa-comment-dots fa-fw"></i>' + data[i].comments + '</a>';
const header = '<div class="header"><p></p><p>' + data[i].title + a + '</p><p></p></div>';
const body = '<div class="body"><p>' + data[i].body + '</p></div>';
const tag = '<div class="timenode">' + header + body + '</div>';
$(el).append(tag);
}
}
}, function() {
$(el).find('.loading i').remove();
$(el).find('.loading p').text('加载失败,请稍后重试。');
});
},
request() { request() {
const els = document.getElementsByClassName('issues-wrap'); const els = document.getElementsByClassName('issues-wrap');
for (var i = 0; i < els.length; i++) { for (var i = 0; i < els.length; i++) {
const el = els[i]; const el = els[i];
const api = el.getAttribute('api'); const api = el.getAttribute('api');
const group = el.getAttribute('group'); const group = el.getAttribute('group');
if (api == null) {
continue;
}
var cfg = new Object(); var cfg = new Object();
cfg.class = el.getAttribute('class'); cfg.class = el.getAttribute('class');
cfg.el = el; cfg.el = el;
cfg.api = api; cfg.api = api;
cfg.group = group; cfg.group = group;
if (cfg.class.split(' ').includes('sites')) { this.getIssuesAPIForFriends(cfg);
this.getIssuesAPIForSites(cfg);
} else if (cfg.class.split(' ').includes('timeline')) {
this.getIssuesAPIForTimeline(cfg);
}
} }
} }
}; };