From 11cc3c95f73f071a2fdc04fdbdc0814382a78d8c Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Tue, 31 Mar 2015 16:57:00 +0200 Subject: [PATCH 01/28] Animate avatars; --- Github_User_Info/Github_User_Info.user.js | 56 ++++++++++++++++------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index a2d1b6a..f56e9a3 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -24,18 +24,22 @@ var userMenu = document.createElement('div'); userMenu.style = + 'display: none;' + 'border-radius: 3px;' + 'border: 1px solid #DDDDDD;' + 'background-color: #F5F5F5;' + 'padding: 10px;' + 'position: absolute;' + 'box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);' + - 'width: 320px;' + - 'font-size: 11px;'; - userMenu.style.display = 'none'; + 'font-size: 11px;'+ + 'transition-property: width;'+ + 'transition-duration: 0.5s;'; + userMenu.addEventListener('mouseleave', function() { userMenu.style.display = 'none'; + userMenu.style.width = '1px'; }); + document.body.appendChild(userMenu); var userAvatar = document.createElement('a'); @@ -46,9 +50,13 @@ 'margin-bottom: 10px;'; userMenu.appendChild(userAvatar); var userAvatarImg = document.createElement('img'); - userAvatarImg.style = 'border-radius: 3px;'; - userAvatarImg.width = '96'; - userAvatarImg.height = '96'; + userAvatarImg.style = + 'border-radius: 3px;' + + //'transition: width 1s ease 1s, height 1s ease 1s;'; + 'transition-property: height, width;'+ + 'transition-duration: 0.5s;'; + // userAvatarImg.width = '96'; + // userAvatarImg.height = '96'; userAvatar.appendChild(userAvatarImg); @@ -158,14 +166,14 @@ userJoined.appendChild(userJoinedText); - var userInfo2 = document.createElement('div'); - userInfo2.style = + var userCounts = document.createElement('div'); + userCounts.style = 'text-align: center;' + 'border-top: 1px solid #EEE;' + 'padding-top: 5px;' + 'margin-top: 10px;' + 'clear: left;'; - userMenu.appendChild(userInfo2); + userMenu.appendChild(userCounts); var userFollowers = document.createElement('a'); userFollowers.style = @@ -175,6 +183,7 @@ 'font-size: 11px;' + 'text-decoration: none;'; userFollowers.setAttribute('target', '_blank'); + userCounts.appendChild(userFollowers); var userFollowersCount = document.createElement('strong'); userFollowersCount.style = 'display:block;' + @@ -184,7 +193,6 @@ userFollowersText.appendChild(document.createTextNode('Followers')); userFollowersText.style = 'color: #999;'; userFollowers.appendChild(userFollowersText); - userInfo2.appendChild(userFollowers); var userFollowing = document.createElement('a'); userFollowing.style = @@ -193,6 +201,7 @@ 'width: 25%;' + 'text-decoration: none;'; userFollowing.setAttribute('target', '_blank'); + userCounts.appendChild(userFollowing); var userFollowingCount = document.createElement('strong'); userFollowingCount.style = 'display:block;' + @@ -202,7 +211,6 @@ userFollowingText.appendChild(document.createTextNode('Following')); userFollowingText.style = 'color: #999;'; userFollowing.appendChild(userFollowingText); - userInfo2.appendChild(userFollowing); var userRepos = document.createElement('a'); userRepos.style = @@ -211,6 +219,7 @@ 'width: 25%;' + 'text-decoration: none;'; userRepos.setAttribute('target', '_blank'); + userCounts.appendChild(userRepos); var userReposCount = document.createElement('strong'); userReposCount.style = 'display:block;' + @@ -220,7 +229,6 @@ userReposText.appendChild(document.createTextNode('Repos')); userReposText.style = 'color: #999;'; userRepos.appendChild(userReposText); - userInfo2.appendChild(userRepos); var userGists = document.createElement('a'); userGists.style = @@ -229,6 +237,7 @@ 'width: 25%;' + 'text-decoration: none;'; userGists.setAttribute('target', '_blank'); + userCounts.appendChild(userGists); var userGistsCount = document.createElement('strong'); userGistsCount.style = 'display:block;' + @@ -238,10 +247,8 @@ userGistsText.appendChild(document.createTextNode('Gists')); userGistsText.style = 'color: #999;'; userGists.appendChild(userGistsText); - userInfo2.appendChild(userGists); - document.body.appendChild(userMenu); var avatars = document.querySelectorAll('.avatar[alt^="@"], .timeline-comment-avatar[alt^="@"]'); Array.prototype.forEach.call(avatars, function(avatar) { @@ -331,13 +338,17 @@ function fillData(data, position, avatarSize) { userAvatar.setAttribute('href', 'https://github.com/' + data.username); - //userAvatarImg.height = avatarSize.height; - //userAvatarImg.width = avatarSize.width; + userAvatarImg.style.height = avatarSize.height + 'px'; + userAvatarImg.style.width = avatarSize.width + 'px'; + window.setTimeout(function() { + userAvatarImg.style.height = '96px'; + userAvatarImg.style.width = '96px'; + }, 13); userAvatarImg.setAttribute('src', ''); userAvatarImg.setAttribute('src', data.avatar); userName.setAttribute('title', data.username); - userName.textContent = data.name; + userName.textContent = data.name || data.username; if (hasValue(data.company, userCompany)) { userCompanyText.textContent = data.company; @@ -358,33 +369,44 @@ userJoinedText.setAttribute('datetime', data.created_at); } + var userCountsHasValue = false; if (hasValue(data.followers, userFollowers)) { + userCountsHasValue = true; userFollowers.setAttribute('href', 'https://github.com/' + data.username + '/followers'); userFollowersCount.textContent = data.followers; } if (hasValue(data.following, userFollowing)) { + userCountsHasValue = true; userFollowing.setAttribute('href', 'https://github.com/' + data.username + '/following'); userFollowingCount.textContent = data.following; } if (hasValue(data.repos, userRepos)) { + userCountsHasValue = true; userRepos.setAttribute('href', 'https://github.com/' + data.username + '?tab=repositories'); userReposCount.textContent = data.repos; } if (hasValue(data.gists, userGists)) { + userCountsHasValue = true; userGists.setAttribute('href', 'https://gist.github.com/' + data.username); userGistsCount.textContent = data.gists; } + userCounts.style.display = userCountsHasValue ? 'block' : 'none'; //if (data.type === 'Organization' || data.type === 'User') {} userMenu.style.top = Math.max(position.top - 10 - 1, 2) + 'px'; userMenu.style.left = Math.max(position.left - 10 - 1, 2) + 'px'; userMenu.style.display = 'block'; + userMenu.style.width = '1px'; + window.setTimeout(function() { +userMenu.style.width = '320px'; +},13); } function hasValue(property, elm) { elm.style.display = property ? 'block' : 'none'; return !!property; } +} })(); From 631ba42c3cd4420313c13fb8f40a95834f728da7 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Tue, 31 Mar 2015 16:57:22 +0200 Subject: [PATCH 02/28] test; --- Github_User_Info/Github_User_Info.user.js | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index f56e9a3..be1a8f7 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -12,6 +12,7 @@ // @updateURL https://github.com/jerone/UserScripts/raw/master/Github_User_Info/Github_User_Info.user.js // @supportURL https://github.com/jerone/UserScripts/issues // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VCYMHWQ7ZMBKW +// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js // @version 0.1.0 // @grant GM_xmlhttpRequest // @grant GM_setValue @@ -21,6 +22,8 @@ // ==/UserScript== (function() { +/* + function init(){ var userMenu = document.createElement('div'); userMenu.style = @@ -408,5 +411,35 @@ userMenu.style.width = '320px'; return !!property; } } +*/ + + +window.setTimeout(function(){ + + + console.log(window.jQuery, unsafeWindow.jQuery); + console.log( $); +console.log(unsafeWindow.$(document)); +console.log(unsafeWindow); +console.log(unsafeWindow.document.body); +/* +unsafeWindow.$(unsafeWindow.document).on("pjax:end", function(){ + alert('Github User Info', '1'); + console.log('Github User Info', '1'); +}); +unsafeWindow.$(unsafeWindow.document.body).on("pjax:end", function(){ + alert('Github User Info', '1b'); + console.log('Github User Info', '1b'); +}); +unsafeWindow.$(document).on("pjax:end", function(){ + alert('Github User Info', '2'); + console.log('Github User Info', '2'); +});*/ +unsafeWindow.$('body').on("pjax:end", function(){ + alert('Github User Info', '3'); + console.log('Github User Info', '3'); +}); + +}, 2000); })(); From a73d1fb0b5e88b6ebf73bc47ac135d29ed464f17 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 11:56:20 +0200 Subject: [PATCH 03/28] Revert "test;" This reverts commit 631ba42c3cd4420313c13fb8f40a95834f728da7. --- Github_User_Info/Github_User_Info.user.js | 33 ----------------------- 1 file changed, 33 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index be1a8f7..f56e9a3 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -12,7 +12,6 @@ // @updateURL https://github.com/jerone/UserScripts/raw/master/Github_User_Info/Github_User_Info.user.js // @supportURL https://github.com/jerone/UserScripts/issues // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VCYMHWQ7ZMBKW -// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js // @version 0.1.0 // @grant GM_xmlhttpRequest // @grant GM_setValue @@ -22,8 +21,6 @@ // ==/UserScript== (function() { -/* - function init(){ var userMenu = document.createElement('div'); userMenu.style = @@ -411,35 +408,5 @@ userMenu.style.width = '320px'; return !!property; } } -*/ - - -window.setTimeout(function(){ - - - console.log(window.jQuery, unsafeWindow.jQuery); - console.log( $); -console.log(unsafeWindow.$(document)); -console.log(unsafeWindow); -console.log(unsafeWindow.document.body); -/* -unsafeWindow.$(unsafeWindow.document).on("pjax:end", function(){ - alert('Github User Info', '1'); - console.log('Github User Info', '1'); -}); -unsafeWindow.$(unsafeWindow.document.body).on("pjax:end", function(){ - alert('Github User Info', '1b'); - console.log('Github User Info', '1b'); -}); -unsafeWindow.$(document).on("pjax:end", function(){ - alert('Github User Info', '2'); - console.log('Github User Info', '2'); -});*/ -unsafeWindow.$('body').on("pjax:end", function(){ - alert('Github User Info', '3'); - console.log('Github User Info', '3'); -}); - -}, 2000); })(); From d3d33ca2531467c60abddafc6cd04b0f0cbe8624 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 11:56:57 +0200 Subject: [PATCH 04/28] Revert "Animate avatars;" This reverts commit 11cc3c95f73f071a2fdc04fdbdc0814382a78d8c. --- Github_User_Info/Github_User_Info.user.js | 56 +++++++---------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index f56e9a3..a2d1b6a 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -24,22 +24,18 @@ var userMenu = document.createElement('div'); userMenu.style = - 'display: none;' + 'border-radius: 3px;' + 'border: 1px solid #DDDDDD;' + 'background-color: #F5F5F5;' + 'padding: 10px;' + 'position: absolute;' + 'box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);' + - 'font-size: 11px;'+ - 'transition-property: width;'+ - 'transition-duration: 0.5s;'; - + 'width: 320px;' + + 'font-size: 11px;'; + userMenu.style.display = 'none'; userMenu.addEventListener('mouseleave', function() { userMenu.style.display = 'none'; - userMenu.style.width = '1px'; }); - document.body.appendChild(userMenu); var userAvatar = document.createElement('a'); @@ -50,13 +46,9 @@ 'margin-bottom: 10px;'; userMenu.appendChild(userAvatar); var userAvatarImg = document.createElement('img'); - userAvatarImg.style = - 'border-radius: 3px;' + - //'transition: width 1s ease 1s, height 1s ease 1s;'; - 'transition-property: height, width;'+ - 'transition-duration: 0.5s;'; - // userAvatarImg.width = '96'; - // userAvatarImg.height = '96'; + userAvatarImg.style = 'border-radius: 3px;'; + userAvatarImg.width = '96'; + userAvatarImg.height = '96'; userAvatar.appendChild(userAvatarImg); @@ -166,14 +158,14 @@ userJoined.appendChild(userJoinedText); - var userCounts = document.createElement('div'); - userCounts.style = + var userInfo2 = document.createElement('div'); + userInfo2.style = 'text-align: center;' + 'border-top: 1px solid #EEE;' + 'padding-top: 5px;' + 'margin-top: 10px;' + 'clear: left;'; - userMenu.appendChild(userCounts); + userMenu.appendChild(userInfo2); var userFollowers = document.createElement('a'); userFollowers.style = @@ -183,7 +175,6 @@ 'font-size: 11px;' + 'text-decoration: none;'; userFollowers.setAttribute('target', '_blank'); - userCounts.appendChild(userFollowers); var userFollowersCount = document.createElement('strong'); userFollowersCount.style = 'display:block;' + @@ -193,6 +184,7 @@ userFollowersText.appendChild(document.createTextNode('Followers')); userFollowersText.style = 'color: #999;'; userFollowers.appendChild(userFollowersText); + userInfo2.appendChild(userFollowers); var userFollowing = document.createElement('a'); userFollowing.style = @@ -201,7 +193,6 @@ 'width: 25%;' + 'text-decoration: none;'; userFollowing.setAttribute('target', '_blank'); - userCounts.appendChild(userFollowing); var userFollowingCount = document.createElement('strong'); userFollowingCount.style = 'display:block;' + @@ -211,6 +202,7 @@ userFollowingText.appendChild(document.createTextNode('Following')); userFollowingText.style = 'color: #999;'; userFollowing.appendChild(userFollowingText); + userInfo2.appendChild(userFollowing); var userRepos = document.createElement('a'); userRepos.style = @@ -219,7 +211,6 @@ 'width: 25%;' + 'text-decoration: none;'; userRepos.setAttribute('target', '_blank'); - userCounts.appendChild(userRepos); var userReposCount = document.createElement('strong'); userReposCount.style = 'display:block;' + @@ -229,6 +220,7 @@ userReposText.appendChild(document.createTextNode('Repos')); userReposText.style = 'color: #999;'; userRepos.appendChild(userReposText); + userInfo2.appendChild(userRepos); var userGists = document.createElement('a'); userGists.style = @@ -237,7 +229,6 @@ 'width: 25%;' + 'text-decoration: none;'; userGists.setAttribute('target', '_blank'); - userCounts.appendChild(userGists); var userGistsCount = document.createElement('strong'); userGistsCount.style = 'display:block;' + @@ -247,8 +238,10 @@ userGistsText.appendChild(document.createTextNode('Gists')); userGistsText.style = 'color: #999;'; userGists.appendChild(userGistsText); + userInfo2.appendChild(userGists); + document.body.appendChild(userMenu); var avatars = document.querySelectorAll('.avatar[alt^="@"], .timeline-comment-avatar[alt^="@"]'); Array.prototype.forEach.call(avatars, function(avatar) { @@ -338,17 +331,13 @@ function fillData(data, position, avatarSize) { userAvatar.setAttribute('href', 'https://github.com/' + data.username); - userAvatarImg.style.height = avatarSize.height + 'px'; - userAvatarImg.style.width = avatarSize.width + 'px'; - window.setTimeout(function() { - userAvatarImg.style.height = '96px'; - userAvatarImg.style.width = '96px'; - }, 13); + //userAvatarImg.height = avatarSize.height; + //userAvatarImg.width = avatarSize.width; userAvatarImg.setAttribute('src', ''); userAvatarImg.setAttribute('src', data.avatar); userName.setAttribute('title', data.username); - userName.textContent = data.name || data.username; + userName.textContent = data.name; if (hasValue(data.company, userCompany)) { userCompanyText.textContent = data.company; @@ -369,44 +358,33 @@ userJoinedText.setAttribute('datetime', data.created_at); } - var userCountsHasValue = false; if (hasValue(data.followers, userFollowers)) { - userCountsHasValue = true; userFollowers.setAttribute('href', 'https://github.com/' + data.username + '/followers'); userFollowersCount.textContent = data.followers; } if (hasValue(data.following, userFollowing)) { - userCountsHasValue = true; userFollowing.setAttribute('href', 'https://github.com/' + data.username + '/following'); userFollowingCount.textContent = data.following; } if (hasValue(data.repos, userRepos)) { - userCountsHasValue = true; userRepos.setAttribute('href', 'https://github.com/' + data.username + '?tab=repositories'); userReposCount.textContent = data.repos; } if (hasValue(data.gists, userGists)) { - userCountsHasValue = true; userGists.setAttribute('href', 'https://gist.github.com/' + data.username); userGistsCount.textContent = data.gists; } - userCounts.style.display = userCountsHasValue ? 'block' : 'none'; //if (data.type === 'Organization' || data.type === 'User') {} userMenu.style.top = Math.max(position.top - 10 - 1, 2) + 'px'; userMenu.style.left = Math.max(position.left - 10 - 1, 2) + 'px'; userMenu.style.display = 'block'; - userMenu.style.width = '1px'; - window.setTimeout(function() { -userMenu.style.width = '320px'; -},13); } function hasValue(property, elm) { elm.style.display = property ? 'block' : 'none'; return !!property; } -} })(); From 6b297c2ff0700b926dfd7d52d8a70e4fa23b9db9 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 12:00:00 +0200 Subject: [PATCH 05/28] :bug: Added username fallback when no name; --- Github_User_Info/Github_User_Info.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index a2d1b6a..42ebfbc 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -337,7 +337,7 @@ userAvatarImg.setAttribute('src', data.avatar); userName.setAttribute('title', data.username); - userName.textContent = data.name; + userName.textContent = data.name || data.username; if (hasValue(data.company, userCompany)) { userCompanyText.textContent = data.company; From 8809ab096633aa0827cf062533b8f8ffa5e9c690 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 12:01:57 +0200 Subject: [PATCH 06/28] :bug: Added class to identify element; --- Github_User_Info/Github_User_Info.user.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 42ebfbc..125ef01 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -33,6 +33,7 @@ 'width: 320px;' + 'font-size: 11px;'; userMenu.style.display = 'none'; + userMenu.classList.add('GithubUserInfo'); userMenu.addEventListener('mouseleave', function() { userMenu.style.display = 'none'; }); From d158f2b7f2aff6cfcb4b95f5fc53812a8d8276e3 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 12:03:13 +0200 Subject: [PATCH 07/28] :art: Clean up; --- Github_User_Info/Github_User_Info.user.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 125ef01..3e6c208 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -24,6 +24,7 @@ var userMenu = document.createElement('div'); userMenu.style = + 'display: none;' + 'border-radius: 3px;' + 'border: 1px solid #DDDDDD;' + 'background-color: #F5F5F5;' + @@ -32,11 +33,11 @@ 'box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);' + 'width: 320px;' + 'font-size: 11px;'; - userMenu.style.display = 'none'; userMenu.classList.add('GithubUserInfo'); userMenu.addEventListener('mouseleave', function() { userMenu.style.display = 'none'; }); + document.body.appendChild(userMenu); var userAvatar = document.createElement('a'); @@ -159,14 +160,14 @@ userJoined.appendChild(userJoinedText); - var userInfo2 = document.createElement('div'); - userInfo2.style = + var userCounts = document.createElement('div'); + userCounts.style = 'text-align: center;' + 'border-top: 1px solid #EEE;' + 'padding-top: 5px;' + 'margin-top: 10px;' + 'clear: left;'; - userMenu.appendChild(userInfo2); + userMenu.appendChild(userCounts); var userFollowers = document.createElement('a'); userFollowers.style = @@ -176,6 +177,7 @@ 'font-size: 11px;' + 'text-decoration: none;'; userFollowers.setAttribute('target', '_blank'); + userCounts.appendChild(userFollowers); var userFollowersCount = document.createElement('strong'); userFollowersCount.style = 'display:block;' + @@ -185,7 +187,6 @@ userFollowersText.appendChild(document.createTextNode('Followers')); userFollowersText.style = 'color: #999;'; userFollowers.appendChild(userFollowersText); - userInfo2.appendChild(userFollowers); var userFollowing = document.createElement('a'); userFollowing.style = @@ -194,6 +195,7 @@ 'width: 25%;' + 'text-decoration: none;'; userFollowing.setAttribute('target', '_blank'); + userCounts.appendChild(userFollowing); var userFollowingCount = document.createElement('strong'); userFollowingCount.style = 'display:block;' + @@ -203,7 +205,6 @@ userFollowingText.appendChild(document.createTextNode('Following')); userFollowingText.style = 'color: #999;'; userFollowing.appendChild(userFollowingText); - userInfo2.appendChild(userFollowing); var userRepos = document.createElement('a'); userRepos.style = @@ -212,6 +213,7 @@ 'width: 25%;' + 'text-decoration: none;'; userRepos.setAttribute('target', '_blank'); + userCounts.appendChild(userRepos); var userReposCount = document.createElement('strong'); userReposCount.style = 'display:block;' + @@ -221,7 +223,6 @@ userReposText.appendChild(document.createTextNode('Repos')); userReposText.style = 'color: #999;'; userRepos.appendChild(userReposText); - userInfo2.appendChild(userRepos); var userGists = document.createElement('a'); userGists.style = @@ -230,6 +231,7 @@ 'width: 25%;' + 'text-decoration: none;'; userGists.setAttribute('target', '_blank'); + userCounts.appendChild(userGists); var userGistsCount = document.createElement('strong'); userGistsCount.style = 'display:block;' + @@ -239,10 +241,8 @@ userGistsText.appendChild(document.createTextNode('Gists')); userGistsText.style = 'color: #999;'; userGists.appendChild(userGistsText); - userInfo2.appendChild(userGists); - document.body.appendChild(userMenu); var avatars = document.querySelectorAll('.avatar[alt^="@"], .timeline-comment-avatar[alt^="@"]'); Array.prototype.forEach.call(avatars, function(avatar) { From 3b956d20b3d653d82a289f7cbf210b247bb1c55b Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 12:03:44 +0200 Subject: [PATCH 08/28] :mag: Added some logging; --- Github_User_Info/Github_User_Info.user.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 3e6c208..6181190 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -271,14 +271,14 @@ var date = new Date(users[userName].checked_at), now = new Date(); if (date > now.setDate(now.getDate() - UPDATE_INTERVAL_DAYS)) { - console.log('CACHED'); + console.log('GithubUserInfo:getData', 'CACHED'); fillData(users[userName].data, position, avatarSize); } else { - console.log('AJAX - OUTDATED'); + console.log('GithubUserInfo:getData', 'AJAX - OUTDATED'); fetchData(userName, position, avatarSize); } } else { - console.log('AJAX - NON-EXISTING'); + console.log('GithubUserInfo:getData', 'AJAX - NON-EXISTING'); fetchData(userName, position, avatarSize); } } @@ -290,7 +290,7 @@ onload: function(response) { var dataRaw = JSON.parse(response.responseText); if (dataRaw.message && dataRaw.message.startsWith('API rate limit exceeded')) { - console.log('API RATE LIMIT EXCEEDED'); + console.log('GithubUserInfo:fetchData', 'API RATE LIMIT EXCEEDED'); return; } var dataNormalized = normalizeData(dataRaw); From e0a14dadd45e69e113b7d8cc5b05ff178ef3edfe Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 12:04:17 +0200 Subject: [PATCH 09/28] :bug: Hide user counts when no counts are available; --- Github_User_Info/Github_User_Info.user.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 6181190..811a70f 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -359,22 +359,28 @@ userJoinedText.setAttribute('datetime', data.created_at); } + var userCountsHasValue = false; if (hasValue(data.followers, userFollowers)) { + userCountsHasValue = true; userFollowers.setAttribute('href', 'https://github.com/' + data.username + '/followers'); userFollowersCount.textContent = data.followers; } if (hasValue(data.following, userFollowing)) { + userCountsHasValue = true; userFollowing.setAttribute('href', 'https://github.com/' + data.username + '/following'); userFollowingCount.textContent = data.following; } if (hasValue(data.repos, userRepos)) { + userCountsHasValue = true; userRepos.setAttribute('href', 'https://github.com/' + data.username + '?tab=repositories'); userReposCount.textContent = data.repos; } if (hasValue(data.gists, userGists)) { + userCountsHasValue = true; userGists.setAttribute('href', 'https://gist.github.com/' + data.username); userGistsCount.textContent = data.gists; } + userCounts.style.display = userCountsHasValue ? 'block' : 'none'; //if (data.type === 'Organization' || data.type === 'User') {} From 32204d733716787ad46b26c0f6437aad38765e97 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 12:04:54 +0200 Subject: [PATCH 10/28] :sparkles: Animate avatar; --- Github_User_Info/Github_User_Info.user.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 811a70f..2bdb24c 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -48,9 +48,10 @@ 'margin-bottom: 10px;'; userMenu.appendChild(userAvatar); var userAvatarImg = document.createElement('img'); - userAvatarImg.style = 'border-radius: 3px;'; - userAvatarImg.width = '96'; - userAvatarImg.height = '96'; + userAvatarImg.style = + 'border-radius: 3px;' + + 'transition-property: height, width;' + + 'transition-duration: 0.5s;'; userAvatar.appendChild(userAvatarImg); @@ -332,8 +333,12 @@ function fillData(data, position, avatarSize) { userAvatar.setAttribute('href', 'https://github.com/' + data.username); - //userAvatarImg.height = avatarSize.height; - //userAvatarImg.width = avatarSize.width; + userAvatarImg.style.height = avatarSize.height + 'px'; + userAvatarImg.style.width = avatarSize.width + 'px'; + window.setTimeout(function() { + userAvatarImg.style.height = '96px'; + userAvatarImg.style.width = '96px'; + }, 13); userAvatarImg.setAttribute('src', ''); userAvatarImg.setAttribute('src', data.avatar); From 6aec55b91f076218ea0108a65e87bf33e00ecb58 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 12:30:47 +0200 Subject: [PATCH 11/28] :bug: Fixed running code when pjax is done; --- Github_User_Info/Github_User_Info.user.js | 49 +++++++++++++++++++---- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 2bdb24c..88ab625 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -16,6 +16,7 @@ // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue +// @grant unsafeWindow // @run-at document-end // @include https://github.com/* // ==/UserScript== @@ -244,14 +245,6 @@ userGists.appendChild(userGistsText); - - var avatars = document.querySelectorAll('.avatar[alt^="@"], .timeline-comment-avatar[alt^="@"]'); - Array.prototype.forEach.call(avatars, function(avatar) { - avatar.addEventListener('mouseenter', function() { - getData(this); - }); - }); - var UPDATE_INTERVAL_DAYS = 7; function getData(elm) { @@ -399,4 +392,44 @@ return !!property; } + function init() { + var avatars = document.querySelectorAll('.avatar[alt^="@"], .timeline-comment-avatar[alt^="@"]'); + Array.prototype.forEach.call(avatars, function(avatar) { + avatar.addEventListener('mouseenter', function() { + getData(this); + }); + }); + } + + // Page load; + console.log('GithubUserInfo', 'page load'); + init(); + + try { + // On pjax; + unsafeWindow.$(document).on("pjax:end", function() { + console.log('GithubUserInfo', 'pjax'); + init(); + }); + } catch (ex) { + // Fallback when pjax isn't allowed; + var pjaxContainer = document.getElementById('js-repo-pjax-container'); + new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.addedNodes.length > 0 && + !Array.prototype.some.call(mutation.addedNodes, function(elm) { + // Ignore changes from Github Pages Linker + // https://github.com/jerone/UserScripts/tree/master/Github_Pages_Linker + return elm.classList && elm.classList.contains('GithubPagesLinker'); + })) { + console.log('GithubUserInfo', 'MutationObserver'); + console.log(mutation); + init(); + } + }); + }).observe(pjaxContainer, { + childList: true + }); + } + })(); From 6e5be7e54c9dc2007fa46c0003033f46ad97ada1 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 12:32:09 +0200 Subject: [PATCH 12/28] :art: Forgot to remove extra console.log; --- Github_User_Info/Github_User_Info.user.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 88ab625..689bd25 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -423,7 +423,6 @@ return elm.classList && elm.classList.contains('GithubPagesLinker'); })) { console.log('GithubUserInfo', 'MutationObserver'); - console.log(mutation); init(); } }); From 5480e24a9ee6307b5fccf01351759d247149c79b Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 13:53:45 +0200 Subject: [PATCH 13/28] :bug: Really fixing pjax events now; https://gist.github.com/jerone/e38e8637887559870d84 --- Github_User_Info/Github_User_Info.user.js | 30 ++++------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 689bd25..0b0da74 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -405,30 +405,10 @@ console.log('GithubUserInfo', 'page load'); init(); - try { - // On pjax; - unsafeWindow.$(document).on("pjax:end", function() { - console.log('GithubUserInfo', 'pjax'); - init(); - }); - } catch (ex) { - // Fallback when pjax isn't allowed; - var pjaxContainer = document.getElementById('js-repo-pjax-container'); - new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - if (mutation.addedNodes.length > 0 && - !Array.prototype.some.call(mutation.addedNodes, function(elm) { - // Ignore changes from Github Pages Linker - // https://github.com/jerone/UserScripts/tree/master/Github_Pages_Linker - return elm.classList && elm.classList.contains('GithubPagesLinker'); - })) { - console.log('GithubUserInfo', 'MutationObserver'); - init(); - } - }); - }).observe(pjaxContainer, { - childList: true - }); - } + // On pjax; + unsafeWindow.$(document).on("pjax:end", exportFunction(function() { + console.log('GithubUserInfo', 'pjax'); + init(); + }, unsafeWindow)); })(); From e3aac022a4259706edfcd453ba453079cce59a61 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 13:54:42 +0200 Subject: [PATCH 14/28] :bug: Also run on homepage news feed; --- Github_User_Info/Github_User_Info.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 0b0da74..d3e68e3 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -393,7 +393,7 @@ } function init() { - var avatars = document.querySelectorAll('.avatar[alt^="@"], .timeline-comment-avatar[alt^="@"]'); + var avatars = document.querySelectorAll('.avatar[alt^="@"], .gravatar[alt^="@"], .timeline-comment-avatar[alt^="@"]'); Array.prototype.forEach.call(avatars, function(avatar) { avatar.addEventListener('mouseenter', function() { getData(this); From fd1a872f89ed08789b45acb0ed577eeeca8b0db2 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Wed, 1 Apr 2015 21:04:36 +0200 Subject: [PATCH 15/28] :bug: Better shadow; --- Github_User_Info/Github_User_Info.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index d3e68e3..431c935 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -31,7 +31,7 @@ 'background-color: #F5F5F5;' + 'padding: 10px;' + 'position: absolute;' + - 'box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);' + + 'box-shadow: 0 0 10px rgba(0, 0, 1, 0.1);' + 'width: 320px;' + 'font-size: 11px;'; userMenu.classList.add('GithubUserInfo'); From 491c74a4e68f576ee180922cd817ffe3610c3850 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 00:16:39 +0200 Subject: [PATCH 16/28] :bug: Added missing hover effect on counts; --- Github_User_Info/Github_User_Info.user.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 431c935..c2dc5f3 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -176,18 +176,18 @@ 'display: none;' + 'float: left;' + 'width: 25%;' + - 'font-size: 11px;' + 'text-decoration: none;'; + userFollowers.classList.add('vcard-stat'); userFollowers.setAttribute('target', '_blank'); userCounts.appendChild(userFollowers); var userFollowersCount = document.createElement('strong'); userFollowersCount.style = - 'display:block;' + + 'display: block;' + 'font-size: 28px;'; userFollowers.appendChild(userFollowersCount); var userFollowersText = document.createElement('span'); userFollowersText.appendChild(document.createTextNode('Followers')); - userFollowersText.style = 'color: #999;'; + userFollowersText.classList.add('text-muted'); userFollowers.appendChild(userFollowersText); var userFollowing = document.createElement('a'); @@ -196,16 +196,17 @@ 'float: left;' + 'width: 25%;' + 'text-decoration: none;'; + userFollowing.classList.add('vcard-stat'); userFollowing.setAttribute('target', '_blank'); userCounts.appendChild(userFollowing); var userFollowingCount = document.createElement('strong'); userFollowingCount.style = - 'display:block;' + + 'display: block;' + 'font-size: 28px;'; userFollowing.appendChild(userFollowingCount); var userFollowingText = document.createElement('span'); userFollowingText.appendChild(document.createTextNode('Following')); - userFollowingText.style = 'color: #999;'; + userFollowingText.classList.add('text-muted'); userFollowing.appendChild(userFollowingText); var userRepos = document.createElement('a'); @@ -214,16 +215,17 @@ 'float: left;' + 'width: 25%;' + 'text-decoration: none;'; + userRepos.classList.add('vcard-stat'); userRepos.setAttribute('target', '_blank'); userCounts.appendChild(userRepos); var userReposCount = document.createElement('strong'); userReposCount.style = - 'display:block;' + + 'display: block;' + 'font-size: 28px;'; userRepos.appendChild(userReposCount); var userReposText = document.createElement('span'); userReposText.appendChild(document.createTextNode('Repos')); - userReposText.style = 'color: #999;'; + userReposText.classList.add('text-muted'); userRepos.appendChild(userReposText); var userGists = document.createElement('a'); @@ -232,16 +234,17 @@ 'float: left;' + 'width: 25%;' + 'text-decoration: none;'; + userGists.classList.add('vcard-stat'); userGists.setAttribute('target', '_blank'); userCounts.appendChild(userGists); var userGistsCount = document.createElement('strong'); userGistsCount.style = - 'display:block;' + + 'display: block;' + 'font-size: 28px;'; userGists.appendChild(userGistsCount); var userGistsText = document.createElement('span'); userGistsText.appendChild(document.createTextNode('Gists')); - userGistsText.style = 'color: #999;'; + userGistsText.classList.add('text-muted'); userGists.appendChild(userGistsText); From 7abcd00a1b114675132f8b3aaff774d3f0b332c1 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 00:24:44 +0200 Subject: [PATCH 17/28] :bug: Fixed z-index; --- Github_User_Info/Github_User_Info.user.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index c2dc5f3..276fe36 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -26,14 +26,15 @@ var userMenu = document.createElement('div'); userMenu.style = 'display: none;' + + 'background-color: #F5F5F5;' + 'border-radius: 3px;' + 'border: 1px solid #DDDDDD;' + - 'background-color: #F5F5F5;' + + 'box-shadow: 0 0 10px rgba(0, 0, 1, 0.1);' + + 'font-size: 11px;' + 'padding: 10px;' + 'position: absolute;' + - 'box-shadow: 0 0 10px rgba(0, 0, 1, 0.1);' + 'width: 320px;' + - 'font-size: 11px;'; + 'z-index: 99;'; userMenu.classList.add('GithubUserInfo'); userMenu.addEventListener('mouseleave', function() { userMenu.style.display = 'none'; From 644068fd41f7a651a9538067e4e7d3516a2dc7cc Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 10:29:49 +0200 Subject: [PATCH 18/28] :sparkles: Show popup after a small timeout; This required the avatar animation to increase a little; --- Github_User_Info/Github_User_Info.user.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 276fe36..5ece074 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -23,6 +23,8 @@ (function() { + var _timer; + var userMenu = document.createElement('div'); userMenu.style = 'display: none;' + @@ -37,6 +39,8 @@ 'z-index: 99;'; userMenu.classList.add('GithubUserInfo'); userMenu.addEventListener('mouseleave', function() { + console.log('GithubUserInfo:userMenu', 'mouseleave'); + window.clearTimeout(_timer); userMenu.style.display = 'none'; }); document.body.appendChild(userMenu); @@ -335,7 +339,7 @@ window.setTimeout(function() { userAvatarImg.style.height = '96px'; userAvatarImg.style.width = '96px'; - }, 13); + }, 50); userAvatarImg.setAttribute('src', ''); userAvatarImg.setAttribute('src', data.avatar); @@ -396,11 +400,20 @@ return !!property; } + function init() { var avatars = document.querySelectorAll('.avatar[alt^="@"], .gravatar[alt^="@"], .timeline-comment-avatar[alt^="@"]'); Array.prototype.forEach.call(avatars, function(avatar) { avatar.addEventListener('mouseenter', function() { - getData(this); + console.log('GithubUserInfo:avatar', 'mouseenter'); + _timer = window.setTimeout(function() { + console.log('GithubUserInfo:avatar', 'timeout'); + getData(this); + }.bind(this), 500); + }); + avatar.addEventListener('mouseleave', function() { + console.log('GithubUserInfo:avatar', 'mouseleave'); + window.clearTimeout(_timer); }); }); } From d3a962d059aa92fa50a549c35da535c9bab48ee0 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 10:35:47 +0200 Subject: [PATCH 19/28] :bug: Perhaps smoother avatar animation; First show and then animate avatar. --- Github_User_Info/Github_User_Info.user.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 5ece074..29238c2 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -333,6 +333,10 @@ } function fillData(data, position, avatarSize) { + userMenu.style.top = Math.max(position.top - 10 - 1, 2) + 'px'; + userMenu.style.left = Math.max(position.left - 10 - 1, 2) + 'px'; + userMenu.style.display = 'block'; + userAvatar.setAttribute('href', 'https://github.com/' + data.username); userAvatarImg.style.height = avatarSize.height + 'px'; userAvatarImg.style.width = avatarSize.width + 'px'; @@ -389,10 +393,6 @@ userCounts.style.display = userCountsHasValue ? 'block' : 'none'; //if (data.type === 'Organization' || data.type === 'User') {} - - userMenu.style.top = Math.max(position.top - 10 - 1, 2) + 'px'; - userMenu.style.left = Math.max(position.left - 10 - 1, 2) + 'px'; - userMenu.style.display = 'block'; } function hasValue(property, elm) { From 1a88566965c5d84ee9ba43e5b3e33001c1583893 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 11:26:28 +0200 Subject: [PATCH 20/28] :sparkles: Added organization count; --- Github_User_Info/Github_User_Info.user.js | 110 +++++++++++++++++----- 1 file changed, 84 insertions(+), 26 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 29238c2..c34a4f7 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -23,6 +23,17 @@ (function() { + function proxy(fn) { + return function() { + var that = this; + return function(e) { + var args = that.slice(0); // clone; + args.unshift(e); // prepend event; + fn.apply(this, args); + }; + }.call([].slice.call(arguments, 1)); + } + var _timer; var userMenu = document.createElement('div'); @@ -180,7 +191,7 @@ userFollowers.style = 'display: none;' + 'float: left;' + - 'width: 25%;' + + 'width: 20%;' + 'text-decoration: none;'; userFollowers.classList.add('vcard-stat'); userFollowers.setAttribute('target', '_blank'); @@ -199,7 +210,7 @@ userFollowing.style = 'display: none;' + 'float: left;' + - 'width: 25%;' + + 'width: 20%;' + 'text-decoration: none;'; userFollowing.classList.add('vcard-stat'); userFollowing.setAttribute('target', '_blank'); @@ -218,7 +229,7 @@ userRepos.style = 'display: none;' + 'float: left;' + - 'width: 25%;' + + 'width: 20%;' + 'text-decoration: none;'; userRepos.classList.add('vcard-stat'); userRepos.setAttribute('target', '_blank'); @@ -233,11 +244,30 @@ userReposText.classList.add('text-muted'); userRepos.appendChild(userReposText); + var userOrgs = document.createElement('a'); + userOrgs.style = + 'display: none;' + + 'float: left;' + + 'width: 20%;' + + 'text-decoration: none;'; + userOrgs.classList.add('vcard-stat'); + userOrgs.setAttribute('target', '_blank'); + userCounts.appendChild(userOrgs); + var userOrgsCount = document.createElement('strong'); + userOrgsCount.style = + 'display: block;' + + 'font-size: 28px;'; + userOrgs.appendChild(userOrgsCount); + var userOrgsText = document.createElement('span'); + userOrgsText.appendChild(document.createTextNode('Orgs')); + userOrgsText.classList.add('text-muted'); + userOrgs.appendChild(userOrgsText); + var userGists = document.createElement('a'); userGists.style = 'display: none;' + 'float: left;' + - 'width: 25%;' + + 'width: 20%;' + 'text-decoration: none;'; userGists.classList.add('vcard-stat'); userGists.setAttribute('target', '_blank'); @@ -256,7 +286,7 @@ var UPDATE_INTERVAL_DAYS = 7; function getData(elm) { - var userName = elm.getAttribute('alt').replace('@', ''); + var username = elm.getAttribute('alt').replace('@', ''); var rect = elm.getBoundingClientRect(); var position = { top: rect.top + window.scrollY, @@ -269,39 +299,61 @@ var usersString = GM_getValue('users', '{}'); var users = JSON.parse(usersString); - if (users[userName]) { - var date = new Date(users[userName].checked_at), + if (users[username]) { + var date = new Date(users[username].checked_at), now = new Date(); if (date > now.setDate(now.getDate() - UPDATE_INTERVAL_DAYS)) { console.log('GithubUserInfo:getData', 'CACHED'); - fillData(users[userName].data, position, avatarSize); + fillData(users[username].data, position, avatarSize); } else { console.log('GithubUserInfo:getData', 'AJAX - OUTDATED'); - fetchData(userName, position, avatarSize); + fetchData(username, position, avatarSize); } } else { console.log('GithubUserInfo:getData', 'AJAX - NON-EXISTING'); - fetchData(userName, position, avatarSize); + fetchData(username, position, avatarSize); } } - function fetchData(userName, position, avatarSize) { + function fetchData(username, position, avatarSize) { + console.log('GithubUserInfo:fetchData', username); GM_xmlhttpRequest({ method: 'GET', - url: 'https://api.github.com/users/' + userName, - onload: function(response) { - var dataRaw = JSON.parse(response.responseText); - if (dataRaw.message && dataRaw.message.startsWith('API rate limit exceeded')) { - console.log('GithubUserInfo:fetchData', 'API RATE LIMIT EXCEEDED'); - return; - } - var dataNormalized = normalizeData(dataRaw); - fillData(dataNormalized, position, avatarSize); - setData(dataNormalized, userName); - } + url: 'https://api.github.com/users/' + username, + onload: proxy(parseUserData, position, avatarSize) + }); + } + + function parseUserData(response, position, avatarSize) { + var dataParsed = parseRawData(response.responseText); + var dataNormalized = normalizeData(dataParsed); + console.log('GithubUserInfo:parseUserData', dataNormalized.username); + + GM_xmlhttpRequest({ + method: 'GET', + url: 'https://api.github.com/users/' + dataNormalized.username + '/orgs', + onload: proxy(parseOrgsData, position, avatarSize, dataNormalized) }); } + function parseOrgsData(response, position, avatarSize, dataNormalized) { + var dataParsed = parseRawData(response.responseText); + dataNormalized.orgs = dataParsed.length; + console.log('GithubUserInfo:parseOrgsData', dataNormalized.username, dataNormalized.orgs); + + fillData(dataNormalized, position, avatarSize); + setData(dataNormalized, username); + } + + function parseRawData(data) { + data = JSON.parse(data); + if (data.message && data.message.startsWith('API rate limit exceeded')) { + console.log('GithubUserInfo:parseRawData', 'API RATE LIMIT EXCEEDED'); + return; + } + return data; + } + function normalizeData(data) { return { 'username': data.login, @@ -316,15 +368,16 @@ 'gists': data.public_gists, 'followers': data.followers, 'following': data.following, - 'created_at': data.created_at + 'created_at': data.created_at, + 'orgs': 0 // This will be filled via another AJAX call; }; } - function setData(data, userName) { + function setData(data, username) { var usersString = GM_getValue('users', '{}'); var users = JSON.parse(usersString); - if (!users[userName]) { - users[userName] = { + if (!users[username]) { + users[username] = { checked_at: (new Date()).toJSON(), data: data }; @@ -385,6 +438,11 @@ userRepos.setAttribute('href', 'https://github.com/' + data.username + '?tab=repositories'); userReposCount.textContent = data.repos; } + if (hasValue(data.orgs, userOrgs)) { + userCountsHasValue = true; + userOrgs.setAttribute('href', 'https://github.com/' + data.username); + userOrgsCount.textContent = data.orgs; + } if (hasValue(data.gists, userGists)) { userCountsHasValue = true; userGists.setAttribute('href', 'https://gist.github.com/' + data.username); From 50d9a52b4b780d769605c372e059f5e4cd029272 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 11:29:22 +0200 Subject: [PATCH 21/28] :bug: Always fill name; --- Github_User_Info/Github_User_Info.user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index c34a4f7..d490d22 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -359,7 +359,7 @@ 'username': data.login, 'avatar': data.avatar_url, 'type': data.type, - 'name': data.name, + 'name': data.name || data.login, 'company': data.company, 'blog': data.blog, 'location': data.location, @@ -401,7 +401,7 @@ userAvatarImg.setAttribute('src', data.avatar); userName.setAttribute('title', data.username); - userName.textContent = data.name || data.username; + userName.textContent = data.name; if (hasValue(data.company, userCompany)) { userCompanyText.textContent = data.company; From e901a0db29a2ea1d96aa0220fb74dbc39a1e6aa4 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 11:45:32 +0200 Subject: [PATCH 22/28] :bug: Fixed not saving data; --- Github_User_Info/Github_User_Info.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index d490d22..d0d7013 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -342,7 +342,7 @@ console.log('GithubUserInfo:parseOrgsData', dataNormalized.username, dataNormalized.orgs); fillData(dataNormalized, position, avatarSize); - setData(dataNormalized, username); + setData(dataNormalized, dataNormalized.username); } function parseRawData(data) { From 8e361937625ca9d741c933d3402f4aa779216ddc Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 11:46:34 +0200 Subject: [PATCH 23/28] :bug: Don't error on API limit exceeded; --- Github_User_Info/Github_User_Info.user.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index d0d7013..7ce3980 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -326,6 +326,9 @@ function parseUserData(response, position, avatarSize) { var dataParsed = parseRawData(response.responseText); + if (!dataParsed) { + return; + } var dataNormalized = normalizeData(dataParsed); console.log('GithubUserInfo:parseUserData', dataNormalized.username); @@ -338,6 +341,9 @@ function parseOrgsData(response, position, avatarSize, dataNormalized) { var dataParsed = parseRawData(response.responseText); + if (!dataParsed) { + return; + } dataNormalized.orgs = dataParsed.length; console.log('GithubUserInfo:parseOrgsData', dataNormalized.username, dataNormalized.orgs); From c726613e2bc42da73f6da157905f5d5d7bc898a3 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 12:02:01 +0200 Subject: [PATCH 24/28] :bug: User with all counts and 4 digit numbers, stretching popup; --- Github_User_Info/Github_User_Info.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 7ce3980..e16889f 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -46,7 +46,7 @@ 'font-size: 11px;' + 'padding: 10px;' + 'position: absolute;' + - 'width: 320px;' + + 'width: 335px;' + 'z-index: 99;'; userMenu.classList.add('GithubUserInfo'); userMenu.addEventListener('mouseleave', function() { From 62a98bd975ee89f84fa53de81af48fb78104de6d Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 12:07:45 +0200 Subject: [PATCH 25/28] :sparkles: Added admin/staff recognition; --- Github_User_Info/Github_User_Info.user.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index e16889f..877df19 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -102,6 +102,21 @@ userCompany.appendChild(userCompanyIcon); var userCompanyText = document.createElement('span'); userCompany.appendChild(userCompanyText); + var userCompanyAdmin = document.createElement('span'); + userCompanyAdmin.style = + 'display: none;' + + 'margin-left: 5px;' + + 'position: relative;' + + 'top: -1px;' + + 'padding: 2px 5px;' + + 'font-size: 10px;' + + 'font-weight: bold;' + + 'color: #FFF;' + + 'text-transform: uppercase;' + + 'background-color: #4183C4;' + + 'border-radius: 3px;'; + userCompanyAdmin.appendChild(document.createTextNode('Staff')); + userCompany.appendChild(userCompanyAdmin); var userLocation = document.createElement('div'); userLocation.style = @@ -366,7 +381,7 @@ 'avatar': data.avatar_url, 'type': data.type, 'name': data.name || data.login, - 'company': data.company, + 'company': data.site_admin ? 'GitHub' : data.company, 'blog': data.blog, 'location': data.location, 'mail': data.email, @@ -375,7 +390,8 @@ 'followers': data.followers, 'following': data.following, 'created_at': data.created_at, - 'orgs': 0 // This will be filled via another AJAX call; + 'orgs': 0, // This will be filled via another AJAX call; + 'admin': !!data.site_admin }; } @@ -411,6 +427,7 @@ if (hasValue(data.company, userCompany)) { userCompanyText.textContent = data.company; + userCompanyAdmin.style.display = data.admin ? 'inline' : 'none'; } if (hasValue(data.location, userLocation)) { userLocationText.textContent = data.location; From 649090466cfa7fcdd6fcc7023697fe159f7d99f9 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Thu, 2 Apr 2015 12:15:12 +0200 Subject: [PATCH 26/28] :sparkles: Make location linkable to Google Maps; --- Github_User_Info/Github_User_Info.user.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Github_User_Info/Github_User_Info.user.js b/Github_User_Info/Github_User_Info.user.js index 877df19..48595cb 100644 --- a/Github_User_Info/Github_User_Info.user.js +++ b/Github_User_Info/Github_User_Info.user.js @@ -132,7 +132,8 @@ 'text-align: center;' + 'color: #CCC;'; userLocation.appendChild(userLocationIcon); - var userLocationText = document.createElement('span'); + var userLocationText = document.createElement('a'); + userLocationText.setAttribute('target', '_blank'); userLocation.appendChild(userLocationText); var userMail = document.createElement('div'); @@ -430,6 +431,7 @@ userCompanyAdmin.style.display = data.admin ? 'inline' : 'none'; } if (hasValue(data.location, userLocation)) { + userLocationText.setAttribute('href', 'https://maps.google.com/maps?q=' + encodeURIComponent(data.location)); userLocationText.textContent = data.location; } if (hasValue(data.mail, userMail)) { From 568030035fa58da4d319fa5384dfe3dc14a22514 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Fri, 3 Apr 2015 16:52:36 +0200 Subject: [PATCH 27/28] :memo: Readme updated; --- Github_User_Info/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Github_User_Info/README.md b/Github_User_Info/README.md index 21050fa..14ffda1 100644 --- a/Github_User_Info/README.md +++ b/Github_User_Info/README.md @@ -25,13 +25,17 @@ Show inline user information on avatar hover. ## Version History +* **vNext** + * **0.1.0** * Initial version; ## Resources -* https://github.com/jerone -* https://developer.github.com/v3/ -* https://api.github.com/users/jerone -* https://api.github.com/rate_limit +* https://github.com/jerone (User) +* https://api.github.com/users/jerone (API user) +* https://github.com/github (Organisation with admin users) +* https://github.com/benbalter (User with all counts and 4 digit numbers, stretching popup) +* https://api.github.com/rate_limit (Read your API limit) +* https://developer.github.com/v3/ (API Documentation) From f8c47d18dfb20aba8f2334fefb394a3f54196344 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Sat, 4 Apr 2015 20:41:44 +0200 Subject: [PATCH 28/28] :clapper: New release of Github User Info; --- Github_User_Info/README.md | 28 +++++++++++++++++++++++++--- Github_User_Info/screenshot.jpg | Bin 0 -> 59339 bytes README.md | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 Github_User_Info/screenshot.jpg diff --git a/Github_User_Info/README.md b/Github_User_Info/README.md index 14ffda1..0527652 100644 --- a/Github_User_Info/README.md +++ b/Github_User_Info/README.md @@ -8,7 +8,7 @@ ## Description -Show inline user information on avatar hover. +Show user information on avatar hover. ## Screenshot @@ -25,8 +25,24 @@ Show inline user information on avatar hover. ## Version History -* **vNext** - +* **0.2.0** + * Make location linkable to Google Maps; + * Added admin/staff recognition; + * User with all counts and 4 digit numbers, stretching popup; + * Don't error on API limit exceeded; + * Fixed not saving data; + * Always fill name; + * Added organization count; + * Fixed z-index; + * Added missing hover effect on counts; + * Better shadow; + * Also run on homepage news feed; + * Really fixing pjax events now; https://gist.github.com/jerone/e38e8637887559870d84 + * Animate avatar; + * Hide user counts when no counts are available; + * Added some logging; + * Added class to identify element; + * Added username fallback when no name; * **0.1.0** * Initial version; @@ -39,3 +55,9 @@ Show inline user information on avatar hover. * https://github.com/benbalter (User with all counts and 4 digit numbers, stretching popup) * https://api.github.com/rate_limit (Read your API limit) * https://developer.github.com/v3/ (API Documentation) + + +## External links + +* [Greasy Fork](https://greasyfork.org/en/scripts/8989-github-user-info) +* [OpenUserJS](https://openuserjs.org/scripts/jerone/Github_User_Info) diff --git a/Github_User_Info/screenshot.jpg b/Github_User_Info/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..329582518fcb2758000a5348824e2683d91d8a98 GIT binary patch literal 59339 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
qsJ3Q^RDMwZdeY zNw8e+ji9m)#b{*h>7dkRx&Z$~PP(44L9ZTN9#1(!7j7}$77(c5)<1pRWKyQ8YGM^& zFMhcOmll@f6g=_%X4h2tR)bYo33-YXSwRX&f8! zd3W7IR!LtAAz=?|zmDy|C(#xyhBz;ZEa9-_XcQ94d8V`bxhl?%#OhP#oX;d#D|L0w zjUq5bw#M%jg|aYn+`}QT8{t=B*`k4)okarb!Tm3U)hPTY zBv0_+7)LNo#F=1hqQ#7>Sjq!%tkGM89LLzw*p*V1rsQYo!XqVfzi?5l!ss+E&nyF@ z?0~d4^P{yoqHjx9z%0MgidVLsoZ-rgttoHQPFg&dq@u`1IM2u#yD$JJVmK`2dv@;l z=3qd5a!7ygps`jgF55b8fK!JE09I5!+b#6U9w&WD)^F|V$6*Axcq0Zv;tJEUOHFXDxw?44zwg%(lK(Ut9Mc zFOy5aDfH{S;g#yXq%uu=bywc2WFH^iq&p#Z4cwp36z|#)(;@~u}AfU#&@z9I<=ioKB~m?Db2^`;za_b;@%8KR#HbF8z$11 zT}pQSiv&0_bkVLo^RlZRx*l_VRUB3IuB0cy%0@NrZ)eT6hgep&O7#tN0CzCKp~t0S z@R)MRR>Q1?$XrsegyNL1!KJ7(_c#(uyF;a?JT-bNX#)&BnIR6QqpvgxA(2S$DtX`z z**Us}j4Rc{=SM6ui<9;7`kw6>(zk)cQ-zpm@KkXVyHuFv! zD_<0gM=Alfqu^vKU4;oI4lo62~*N{nh^u@+S`!esliLp+I-12Y_OC<@nNEszBDzU ziTUi#DG)E9LLw>dAcWV7ctE)TfR^&F{M5k%Sgl_C(8a~yd5R5joue)@{HLd+lD)Cc z)4MfeP7`E?l1<_!%PIFxCcbw|mQ%?yYF(eXFsHS;a%;A;=e8+-;fC)0P7NKc!5n0C zzW8#bc~fhTVy}*fF~ZP3m{yOLWj2%Fc`$rg5I!)tatINPbw})sx=H|xmA^XLbcqTb zi_zxFJxOx2*1%NVm4|0MRDxvOdCW`mW~b%4Qwe0h<5VkZDO%FQy|#Z|nfKQ3rmni$ zqU;gJ5d6H9-lRKJ`ILJgJ-x1FrsLdA^VYFwcQt95`EuUZ>Q0=u`hkDu?)|h0IApIc zbQi?Gr1pG?!Y;q4BQQb5JBuii`b=#%s02P1>kyIe;M)Y(I1lg+SyFH=BBpz0{D|9^goo5)iHsO2x zB|;^FWL!~y8boI3!NN!e==qoXOXjm}JbLF}K0sB+4`?tIT2{cj=k#5)k#p znQ9fj^#Huz`xS8&l5; znlePx4);W^%1L_i zyH8~rJ+YHjqc7p^3v^7!Y&SI>JF+9?gSu>0N~$VDLrA3n(x=ry{|nC@LL>3Y3M!n! zJF5@4_2x0{=jH~$%p+5)mXy!5=t>G$Mn1rXQW4eD;R-Pa@NxH1&kKe(Gljr}$U={8 z$3&GW`zxxZu+k0CEapaGh@llAGRNtSOQ~{~k#6WUye1gN_$k#I-UuTq0}V;ikd*y1 z0aYQjg{Wm3qd zP|yyyz_KL2*h(`pS8DA4RGh7QWTszMyy6I7@o=%~|J2Nnz9(&DW?nA~uflNUWVIdX zPuuPE+SdE`2^SUvZcJgS|9bq7EX!n<11XB~7suN9yF<|Vy}ZAbcj;g~mApGi=hrLh z;&$lwf10!6R_;ymU;@VKbpB9*bhlIgDXAR3R0gan=~aU!)yO=r-imOWMy*~`4^uim zK*mPCx|u}T^xkYghvia1#;iA$-%Mp3vB)z=C(BVz92a{A#_ySbV?V>ZCRb~@#gAZ?ig_=! z{52+-#8VXdTrqX)m}T$zjwto___t4%6;aFi%lX?EfJ-zNsnmMR-ET9_{ocY}ux8>Y znEyk8n4qmibs0$NJGDXUX2E%uI;fvuWveA&C4$=CnV9K&ZS1u%3agBL^&v%P5Nw!D zl{*)&@Vfz+v(#j!Xt1W^y$&BJ>89oJRN8zl8_?{nP*gHdofUCkg)W$OTWb7R(UvQS z$++^!#iXP5dJ|B-@izYC`NZMM;&)2(b6|F#LB5n}>3&hiW9v{>z>227!Z|iw@y@pP z^PpSuzuwa+p>zOw*B!t_A?MQpX#T*Dtngminx0_J$D@h@8j5v&1W=RVXF0MW)Ph*m zxV*?~3)vXNZ)(hnM;RnezK(r@e?2#(K1sv({Vx?ZW|Ipc`k~=~2u_h9rFOw?`AX41 zqMn^WGqUEfhrmgE;?WT*xL8>cR0JoOgbIuzo^`7N>8snuM2a2 z-W2mXx((%v{MzJkN#i;FaPqDhWf~7Ur2-5xc)-VyX8IE%(?uU4dkO7RGRqTohOycM z@j#yd@SNM;S;#|K18Xfr8vl9&@s?O9cAfM>=jMdq@F?Zvia8j^P9;cl-8>jBcWT}=zA60vdl zHJQSEDOVQw(*LIID`@w)I+sAR7=IjOKeO68MxE*I$%MM~&Qv>BD(&4X_IcsE$32bF z!qjQS>3k{H$7!M7{%*Va(0n~xAF*lIt-M^gTc|foZc1ac?O*?)Nk~m6?BGH*;4JL| zW;((Z{afntbHXjD;IY`wOc6Ja0oS``fvG zp5NM?o-qr3I(Oy-1c!cK0B|0tARkl`2I_C=ux; z5I}l}Z{Ihr=RVIFUEW?A3(1FM^>YP)*%<_5NvFTc4B|+S{MXJ=K*|}^Elqb$9 zYGK7Cb~S6?bXBW=^YmBKmuofDn(bDmyJq4fHWAB(qGtu}K7)uS; z>Q!n7dQ3!{n>9yB!VfQ5-p%OcLYnL_KOrD*5>y!>WS4T;84+3H{@(q1E$5lF|V*=AGv z29%m3#=i)z^qa3fnMdHy)(}a!(7Fg-^v&M*)R1)%HmmTNz}Nd3S%$o4RnKPo*aP`7 z2difqvg(!lX5?GU3R|sLw05J~v4Tf^pDHIm>Ohqe;N3~U3(4m>feIswk5fqg03xE9 zxF&!7AFc4AYA?pct$cj!fmOeW*1)NS!<%S2s|;z)%U5O+>KLP$6C%t~2KTmFq0{PD z(uE#o3=7_9b`NeM^1(S`$3xd@MRvpGN>-cryZl_NbUOGO zKP1V8*tdwYj1d!~TjNVpwHut@GMvYGV5gF_`;o}G+`5!Xzpp^2E!4^@3Yuv51OB_y z{YCf7=XbtLD4$-;5$%5)d5Y`U5Vt>9Nz+I0uG%c5EzG@ODR;0QYQL?PeDr%jDgMhI zHz@N9f~>`Lz+=GXafbz);F&u-x_{aC1;1;-47GFWC#W8Bg(~@LEXYgyAGfSGc9fU8 zND15P|8wZEImkZ?Nc{KnsQr8B7rOszS*`%Zw*MUmr7FYSeZ0_1=y4GdpV4f>{Ji4b z?`wu6q%QZo5LmNHHKE{zVb_F^{*`cZ3BRW{i{3&Me6!STqtYL+b}+Safe;{MgUGQC zl?C*cdv0X{`212PU_X2~UZDO70H|$J8fi7}0N?F*Xr-t#@Oom$U`gff#iL=WYQVM8 zqtB2jaA(uAqZ0TFl>AN%*{?4YxELBFv4oG!q@iZ_l~3vD33upa&PpuQ_}#LW)Tlb? z%rrfsl;TD@`xDfs0<8AN^mZb^dL4|O<`-%jFh*`#0o_~Z@7iu8qLY?!;GQfb<>Cr? z>Wu2lWB6Iy0jQh82x}V9v-(>@Z*RMuMkkZu%q2+nYz|qOIjl+}?x?OfAjI+lX>^G+ z57#!PMl1C*Q+~j<_8#wq!x!>_Bg0Qku?iL~@j)SOPjw>4d>$xG5);kBQjfxtr+~ty z=Azvi*)md7w%XQvAf(c8k%Pv@bjm-H8W8>vYhXKm2bY9ByJsZ_m5@?%Vrj29^cD^597T*eS7$d5 zF`-**W}the5~@2 zz8|+4OCA6FqHIPo9%WxASIRu_6+mERM^tpKb?%Vt;7cNFYYDR);FAgvHq4 zmQL7u+zLy4#ZryPe5aSx6J72TqP{$vI3uchayn287F2JO{h+W;wR>YC_xQcE0@Hvd zm*&gO$8aSpL<041UY3%Qh>6k!G};3j@elUK5O6*?FOyAug#vAWcyx3uO0i?3IPJIv z#>=hF>sZI(*y8J0)L_GPGF&53jrHM$lcAgvPof%}Z=zkAw4~?!E$gZqo1UHqn;zbW zZ1uzYrq%uwR202QO+{5ucSQKBFh4<2&?D0I+D(+@w0KOJF=4#pJ-E8N`kC@&Xh)}| zu;pb6POb9}P4S#7RIS99f3T7lt1b}BEc_%bw4HH2mNU02k<;pI%elH(FV5|pU*5v@ z%Z-ZwsPTuoMm|&}RikNo+=*}GGm%1^I?Q%K`AQAe_?;h7OZl1~#Cy6#xcZ*UMOGtI ze@A+;uZAFR50t6=$MgCZ*wSVGFnsVXf=$A(`yNXOZ57+|T3Y{&58JCvf74=ErQ-I2 z2O`Sg)%tE(7yuM?o8Iid{u!R#v2lG*2P0tg!tM)KwzbOR%R1JkRdfoLik@eJv_zzt zgU=Hl)nKceo4I&T@uj-r%2*TzSr=YR(Tikee+4dEldHRE1+sAzQS|MDLFz0dl{TOeVKdto39d&GX@DJRsUxTGnQIiLl-60$F z8g}lHQ-h8M(G`Yh@43DH>5|ShQ54Wb7iU$knHFh+c=YjZUF^NuqK)0q#fUDeq>rQ@ z#1Mpj46<`DX1KUD@U*G1K2cblp5{Dn*33nNbyvHQzk6i*;7CULy3d%JHeVutt2Dam z@m$ro&*c8p+TrqT&css%p*O<6tHjXd=Q2Q)b@U*ARgp>?y5Alxke~NUXaDg)P3Pf)ADv|>&h zEMg6p({hs~`n^yy==8#owY~NDMy2RR4#@$a8cqtguaR5(%1v)|R`bTn)+He85xy=b zsNmXSK9UjLLpEekB62)_T$CP_Oo+r`Mu`4lW+s8{)|_wN{Hxl~Gc-f5xIG;zMs#YR zMs5`W@7N*m-Z?NpWv%rXS;v57xy2KSWl8i8xFLW)=F5Mm=6i3$F_Y3B8)Rq+ck=kUWo)eeiOIzaLq5ShyqWcaeHf zutyP=F@;B|*uaDoW}x*sY!$l4MU&NyS3jZL0##_63|Dhdx{J5K53! z1fBVI8~qHMROQ(9S!UKx^S9+;aq&Ppt4z^mj+nzX^siZdx!NrC8F7t|OYR9vnbHh) zo%W{m9n+BXLjVZvL^?MOi+;^OaGy}!Fl^B~TRu>6Pj!Q=^Dy}16S?JJ1+P&hk&YXC z4FYtGY16jfH%1xc5a**sbTa{F+kcg3s6w|qqQ07XD5g`SvL1CoFxG(;n|-#$4fYm- z%6iFqGdw=mBgLeAyv7#&=zn`oGnNgzodELsr^8}27VD>Nkl>MF*ky6@CVRuX-luWX zClq*?PI{f;*eNHsmE@i=UeL;c{xNy+xn}%|)0IaLGx*HklG=`m1^Jid%NxF;lOg)CK5cRB7XF*VNWNI{m}xa5?UM^CEHg>oYUY zu1^>q*tpcu&54I6?pxJI(;)zsC2)NqB5l2Q$IVaj z%Bx+}jLxTZ$kVh8mFttG!y}1imsFB=wek{GtlSm92GSU`LN2n1N@aAA`k#QEt#~h| zI6tZVIC0afSFx6Tp9r?#7p;gFc19uH_um0knb)4 z>a9J!krGC~ZJ!~E6y$Py^!8|I;K3%&Zso|)*P3HER3u`{duV8eBL;O5iWC^ie3~Pk zPFPq62jge;zu;Fd(NTk8i9}3$^L2(jj~2l;|Et3@9N2NvYCf(WE_~zFAwt%nZH|N0 z0R$E^0Sm$ZNH`e$w!Y7fzJ5rj3>-U-0JShV00P}tom{Tgvg09hhG}ft$0zWFiej}> zkd?qS5JDz~%Y=(o^|k?wWzNudMyU0h3#YHr)mudq*S_b^-OKX5nXCh61o&RHdU*V` zBRwDbF~sx$)%(Jww&J?T>yhVkaQyrQ(dfkfUDz8X(G62XloiHcbJQ>P`!!=O(!_qg z>{cV64cu$Kw1j4j*ID*Cjll@<9VDE8gE=mr=UnKEFS&;owB6Vo-zj!h)1T`ml!=xq zyyra~pi5g-PS*`1cf$aVvG3uz!|T2lCFAW71Y%d|Y67ao0<$WCs#0B6JAKK-S@5-o zG~5gSTss)TOy$~>?)T*{;Ezx*h`AK)*olLOSv?j~aAzD!iv5Ek66DMIS%QnibLF7- zcI@+HYxf&QubfAhE9ph+D`@*mf?FSD3EOI~u$Ji4%M}+weE=Md(~dvi%miPpk{7qL zVVb2&c3*aRp$6i3CU2L`-4J1DXH{ghUY&X3Jl3+s|9VDF7!hnwajW$7pK0OY`5b>I zet$Y8UnIro-ra6w={w7`iwvHVy`HjcBF8r zOT908f&N|$=L z$|caF;~PWV)(Q&(7=ZmzxoF=-X|ju?Nz~OiMAbQ9ubV7Cv~lg!nfKqORZ+3wJZy+5 zCY9orUQhmb4U4Fk2~ra9q>NW!OFVNlZ@ZV1xWd=QU3TtY&Xva&++tPwA>4s{$$oH* ztkl=CgFoSGT4;O5pAhp_=8=)YT=Xgpgtr7>hI0$~(ME(-d?ODB+K=ZB*yr<~wkj9C z8DdHEO2L`_V!)z`Sy{EyOUOUOkDle4z@=sg((jk_p)Zn0(>t6bN~fI zR~m;xQulcD;@?_1-jRide2YK-v>?;`gc;Nlwc=eF;ci%7NzwKAE~1ILDXpG)@nwNX zM;+6NWCfB{ciLu^OB3E}4JdWpiAx2I#p1Ds)Y|Y68?wwJ)0(DE zw_l~uMob1STN37M`zQllxH@DtiIQ`Z5y09msa2^Ll8+y1A(|gzaJ7x_vuftw)z^%) zCMA>kmj7RB+2z>`s7dm$zz+1WHR&-1Gu%N6|~_CWB~?ILp1PXiqxBw5|Yj;v^v14i1`A*>tZPeq5OdV%@6W( G?7sk7hrM$E literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 2daab2a..df6a02e 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ This repo contains a few of my UserScripts that I've build (in no particular ord * [Github News Feed Filter](https://github.com/jerone/UserScripts/tree/master/Github_News_Feed_Filter) - Add filters for Github homepage news feed items. * [Github Commit Diff](https://github.com/jerone/UserScripts/tree/master/Github_Commit_Diff) - Adds button to show diff (or patch) file for commit. * [Github Commit Whitespace](https://github.com/jerone/UserScripts/tree/master/Github_Commit_Whitespace) - Adds button to hide whitespaces from commit. + * [Github User Info](https://github.com/jerone/UserScripts/tree/master/Github_User_Info) - Show user information on avatar hover. * [Github Image Viewer](https://github.com/jerone/UserScripts/tree/master/Github_Image_Viewer) - Preview images from within the listing. * [Github Pull Request From](https://github.com/jerone/UserScripts/tree/master/Github_Pull_Request_From) - Make pull request original branch linkable. * [Github Pages Linker](https://github.com/jerone/UserScripts/tree/master/Github_Pages_Linker) - Add a link to Github Pages (gh-pages) when available.