// ==UserScript==
// @name Github Find Active Forks [Embeded Edition]
// @version 1.2
// @description Find most active fork of a github repository.
// @author J.H
// @match *://github.com/*/network/members
// @icon https://github.githubassets.com/favicons/favicon-dark.png
// @grant GM_getResourceText
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery-footable/3.1.6/footable.min.js
// @resource CSS https://cdnjs.cloudflare.com/ajax/libs/jquery-footable/3.1.6/footable.bootstrap.min.css
// @run-at document-end
// @namespace https://greasyfork.dpdns.org/users/448067
// ==/UserScript==
GM_addStyle(GM_getResourceText("CSS"));
GM_addStyle(`
@font-face {
font-family: "Glyphicons Halflings";
font-style: normal;
font-weight: normal;
src: local("Glyphicons Halflings"),
url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/fonts/glyphicons-halflings-regular.ttf")
format("truetype");
}
table {
border-spacing: 0;
border-collapse: separate;
background-color: var(--color-bg-primary);
border: 1px solid var(--color-border-primary);
border-radius: 6px;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border-bottom-left-radius: 6px;
margin-bottom: 16px;
}
table.footable, table.footable-details {
border-collapse: separate;
}
table {
background-color: transparent;
}
caption {
padding-top: 8px;
padding-bottom: 8px;
color: #777;
text-align: left;
}
th {
text-align: left;
}
.table {
width: 100%;
max-width: 100%;
margin-bottom: 20px;
}
.table > thead > tr > th,
.table > tbody > tr > th,
.table > tfoot > tr > th,
.table > thead > tr > td,
.table > tbody > tr > td,
.table > tfoot > tr > td {
padding: 8px;
line-height: 1.42857143;
vertical-align: top;
border-top: 1px solid var(--color-border-secondary);
}
.table > thead > tr > th {
vertical-align: bottom;
border-bottom: 2px solid var(--color-border-secondary);
}
.table > caption + thead > tr:first-child > th,
.table > colgroup + thead > tr:first-child > th,
.table > thead:first-child > tr:first-child > th,
.table > caption + thead > tr:first-child > td,
.table > colgroup + thead > tr:first-child > td,
.table > thead:first-child > tr:first-child > td {
border-top: 0;
}
.table > tbody + tbody {
border-top: 2px solid #ddd;
}
.table .table {
background-color: #fff;
}
.table-condensed > thead > tr > th,
.table-condensed > tbody > tr > th,
.table-condensed > tfoot > tr > th,
.table-condensed > thead > tr > td,
.table-condensed > tbody > tr > td,
.table-condensed > tfoot > tr > td {
padding: 5px;
}
.table-bordered {
border: 1px solid #ddd;
}
.table-bordered > thead > tr > th,
.table-bordered > tbody > tr > th,
.table-bordered > tfoot > tr > th,
.table-bordered > thead > tr > td,
.table-bordered > tbody > tr > td,
.table-bordered > tfoot > tr > td {
border: 1px solid #ddd;
}
.table-bordered > thead > tr > th,
.table-bordered > thead > tr > td {
border-bottom-width: 2px;
}
.table-striped > tbody > tr:nth-of-type(odd) {
background-color: #f9f9f9;
}
.table-hover > tbody > tr:hover {
background-color: #f5f5f5;
}
table col[class*="col-"] {
position: static;
display: table-column;
float: none;
}
table td[class*="col-"],
table th[class*="col-"] {
position: static;
display: table-cell;
float: none;
}
.table > thead > tr > td.active,
.table > tbody > tr > td.active,
.table > tfoot > tr > td.active,
.table > thead > tr > th.active,
.table > tbody > tr > th.active,
.table > tfoot > tr > th.active,
.table > thead > tr.active > td,
.table > tbody > tr.active > td,
.table > tfoot > tr.active > td,
.table > thead > tr.active > th,
.table > tbody > tr.active > th,
.table > tfoot > tr.active > th {
background-color: #f5f5f5;
}
.table-hover > tbody > tr > td.active:hover,
.table-hover > tbody > tr > th.active:hover,
.table-hover > tbody > tr.active:hover > td,
.table-hover > tbody > tr:hover > .active,
.table-hover > tbody > tr.active:hover > th {
background-color: #e8e8e8;
}
.table > thead > tr > td.success,
.table > tbody > tr > td.success,
.table > tfoot > tr > td.success,
.table > thead > tr > th.success,
.table > tbody > tr > th.success,
.table > tfoot > tr > th.success,
.table > thead > tr.success > td,
.table > tbody > tr.success > td,
.table > tfoot > tr.success > td,
.table > thead > tr.success > th,
.table > tbody > tr.success > th,
.table > tfoot > tr.success > th {
background-color: #dff0d8;
}
.table-hover > tbody > tr > td.success:hover,
.table-hover > tbody > tr > th.success:hover,
.table-hover > tbody > tr.success:hover > td,
.table-hover > tbody > tr:hover > .success,
.table-hover > tbody > tr.success:hover > th {
background-color: #d0e9c6;
}
.table > thead > tr > td.info,
.table > tbody > tr > td.info,
.table > tfoot > tr > td.info,
.table > thead > tr > th.info,
.table > tbody > tr > th.info,
.table > tfoot > tr > th.info,
.table > thead > tr.info > td,
.table > tbody > tr.info > td,
.table > tfoot > tr.info > td,
.table > thead > tr.info > th,
.table > tbody > tr.info > th,
.table > tfoot > tr.info > th {
background-color: #d9edf7;
}
.table-hover > tbody > tr > td.info:hover,
.table-hover > tbody > tr > th.info:hover,
.table-hover > tbody > tr.info:hover > td,
.table-hover > tbody > tr:hover > .info,
.table-hover > tbody > tr.info:hover > th {
background-color: #c4e3f3;
}
.table > thead > tr > td.warning,
.table > tbody > tr > td.warning,
.table > tfoot > tr > td.warning,
.table > thead > tr > th.warning,
.table > tbody > tr > th.warning,
.table > tfoot > tr > th.warning,
.table > thead > tr.warning > td,
.table > tbody > tr.warning > td,
.table > tfoot > tr.warning > td,
.table > thead > tr.warning > th,
.table > tbody > tr.warning > th,
.table > tfoot > tr.warning > th {
background-color: #fcf8e3;
}
.table-hover > tbody > tr > td.warning:hover,
.table-hover > tbody > tr > th.warning:hover,
.table-hover > tbody > tr.warning:hover > td,
.table-hover > tbody > tr:hover > .warning,
.table-hover > tbody > tr.warning:hover > th {
background-color: #faf2cc;
}
.table > thead > tr > td.danger,
.table > tbody > tr > td.danger,
.table > tfoot > tr > td.danger,
.table > thead > tr > th.danger,
.table > tbody > tr > th.danger,
.table > tfoot > tr > th.danger,
.table > thead > tr.danger > td,
.table > tbody > tr.danger > td,
.table > tfoot > tr.danger > td,
.table > thead > tr.danger > th,
.table > tbody > tr.danger > th,
.table > tfoot > tr.danger > th {
background-color: #f2dede;
}
.table-hover > tbody > tr > td.danger:hover,
.table-hover > tbody > tr > th.danger:hover,
.table-hover > tbody > tr.danger:hover > td,
.table-hover > tbody > tr:hover > .danger,
.table-hover > tbody > tr.danger:hover > th {
background-color: #ebcccc;
}
.table-responsive {
min-height: .01%;
overflow-x: auto;
}
`);
function httpFetch(url, func) {
GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function (response) {
func(response);
},
});
}
function restInit(user, repo) {
httpFetch(
"https://api.github.com/repos/" + user + "/" + repo,
function (resp) {
const json1 = JSON.parse(resp.responseText);
httpFetch(
"https://api.github.com/repos/" +
user +
"/" +
repo +
"/forks?sort=newest&per_page=100",
function (resp) {
const json2 = JSON.parse(resp.responseText);
createTable(user, repo, json2, json1);
}
);
}
);
}
function createTable(user, repo, rJson, cJson) {
var rowsData = [];
var ev = {};
ev.repoName =
'<img id="1337" src="' +
cJson.owner.avatar_url +
'&s=48" width="24" height="24" class="avatar rounded-1 avatar-user" title="" style="margin-right: .5rem!important;"><a href="' +
cJson.html_url +
'">' +
cJson.full_name +
"</a>";
ev.repoStars = cJson?.stargazers_count ?? -1;
ev.repoForks = cJson?.forks_count ?? -1;
ev.repoOpenIssue = cJson?.open_issues_count ?? -1;
ev.repoSize = cJson?.size ?? -1;
ev.repoModified = Number(moment(cJson?.pushed_at ?? "NULL").format("x"));
rowsData.push(ev);
for (const [k, v] of Object.entries(rJson)) {
var ec = {};
ec.repoName =
'<img src="' +
v.owner.avatar_url +
'&s=48" width="24" height="24" class="avatar rounded-1 avatar-user" title="" style="margin-right: .5rem!important;"><a href="' +
v.html_url +
'">' +
v.full_name +
"</a>";
ec.repoStars = v?.stargazers_count ?? -1;
ec.repoForks = v?.forks_count ?? -1;
ec.repoOpenIssue = v?.open_issues_count ?? -1;
ec.repoSize = v?.size ?? -1;
ec.repoModified = Number(moment(v?.pushed_at ?? "NULL").format("x"));
rowsData.push(ec);
}
jQuery(function ($) {
$(".table").footable({
columns: [
{ name: "repoName", title: "Repo" },
{
name: "repoStars",
title: "Stars",
breakpoints: "xs",
type: "number",
},
{
name: "repoForks",
title: "Forks",
breakpoints: "xs",
type: "number",
},
{
name: "repoOpenIssue",
title: "Open Issues",
breakpoints: "xs",
type: "number",
},
{
name: "repoSize",
title: "Size",
breakpoints: "xs",
type: "number",
},
{
name: "repoModified",
title: "Modified",
type: "date",
breakpoints: "xs sm md",
formatter: function (value) {
return moment().to(moment(value, "YYYYMMDD"));
},
},
],
rows: rowsData,
});
});
document.querySelector(
'img[id="1337"]'
).parentElement.parentElement.style.backgroundImage =
"linear-gradient(var(--color-alert-warn-bg),var(--color-alert-warn-bg))";
document.querySelector(
'img[id="1337"]'
).parentElement.lastElementChild.style.color = "var(--color-alert-warn-text)";
}
var pathComponents = window.location.pathname.split("/");
if (pathComponents.length >= 3) {
var user = pathComponents[1],
repo = pathComponents[2];
var divForks = document.querySelector('div[id="network"]');
divForks.innerHTML =
'<table class="table" data-paging="true" data-sorting="true"></table>';
restInit(user, repo);
}