Greasy Fork is available in English.
Find most active fork of a github repository.
- // ==UserScript==// @name Github Find Active Forks [Embeded Edition]// @version 1.4.1// @description Find most active fork of a github repository.// @description:de Finden Sie die aktivsten Forks eines Github-Repositorys.// @description:fr Trouver les forks les plus actifs d'un dépôt github.// @description:it Trova i fork più attivi di un repository github.// @author J.H// @match *://github.com/*// @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 footable.bootstrap.min.css https://cdnjs.cloudflare.com/ajax/libs/jquery-footable/3.1.6/footable.bootstrap.min.css// @resource custom.css https://pastebin.com/raw/ReyeKaAm// @run-at document-end// @license MIT// @namespace https://gfork.dahi.icu/users/448067// ==/UserScript==GM_addStyle(GM_getResourceText("footable.bootstrap.min.css"));GM_addStyle(GM_getResourceText("custom.css"));const customInnerHTML = '<table class="table" data-paging="true" data-sorting="true"></table>';const SIZE_KILO = ####;const UNITS = ['Bytes','KB','MB','GB','TB','PB'];const httpFetch = function (url, func) {GM_xmlhttpRequest({method: "GET",url: url,onload: function (response) {func(response);},});}const restInit = function (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(json2, json1);});});}const getHumanFileSize = function(size){if (size === 0) {return {size: '0',unit: UNITS[0],}} else if (size === -1) {return {size: '-1',unit: UNITS[0],}}size = size * SIZE_KILO;const order = Math.floor(Math.log(size) / Math.log(SIZE_KILO));return {size: (size / Math.pow(SIZE_KILO, order)).toFixed(2),unit: UNITS[order],}}const createTable = function (rJson, cJson) {const humanSize = getHumanFileSize(cJson?.size ?? -1);const rowsData = [];const 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 = humanSize;ev.repoModified = Number(moment(cJson?.pushed_at ?? "NULL").format("x"));rowsData.push(ev);for (const [_, v] of Object.entries(rJson)) {const humanSize = getHumanFileSize(v?.size ?? -1);const 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 = humanSize;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: "object",direction: "DESC",formatter: function(value){if (value){return value.size + value.unit;}return -1;},sortValue: function(value){if (value){// return value by it's UNIT value (PB, TB, GB, MB, KB, Bytes) in order to sort itreturn value.size * Math.pow(SIZE_KILO, UNITS.indexOf(value.unit)); // in test..// return UNITS.indexOf(value.unit) + Number(value.size); // should be OK}return null}},{name: "repoModified",title: "Last Push",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-checks-logline-warning-bg),var(--color-checks-logline-warning-bg))";document.querySelector('img[id="1337"]').parentElement.lastElementChild.style.color = "var(--color-checks-logline-warning-num-text)";}// loadMain function is called when the page is loaded, and it is the main function of the scriptconst loadMain = function () {const pathComponents = window.location.pathname.split("/");if (pathComponents.length >= 3) {const user = pathComponents[1],repo = pathComponents[2];const divForks = document.querySelector('div[id="network"]');divForks.innerHTML = customInnerHTML;restInit(user, repo);}}// use turbo to loadMain when the page is loaded via ajax requestdocument.addEventListener('turbo:render', function () {if (location.pathname.endsWith("/network/members")) {loadMain();}});// loadMain when url ends with /network/membersif (location.pathname.endsWith("/network/members")) {loadMain();}