NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name github-top
// @namespace github-top
// @version 0.0.6
// @description See top-rated comments in the issue
// @homepageURL https://github.com/0xC0FFEEC0DE/github-top-comments
// @supportURL https://github.com/0xC0FFEEC0DE/github-top-comments/issues
// @downloadURL https://raw.githubusercontent.com/0xC0FFEEC0DE/github-top-comments/master/github-top.user.js
// @updateURL https://raw.githubusercontent.com/0xC0FFEEC0DE/github-top-comments/master/github-top.user.js
// @author 0xC0FFEEC0DE
// @include /^https://github.com/(.*)/(.*)/(issues|pull)/(.*)/
// @license MIT
// ==/UserScript==
(function() {
'use strict'
const TOP_LIMIT = 15
;(function main() {
let ui = new UI()
let header = document.querySelector('.sticky-content div')
let btn = document.createElement('button')
btn.className = 'btn btn-sm btn-info ml-2 mr-2'
btn.textContent = 'Show comment top'
header.appendChild(btn)
let data
btn.onclick = () => {
ui.drawTop()
data = getData()
//console.table(data)
if (data.length === 0) {
return ui.msg('no reactions')
}
ui.msg(`posts with reactions: ${data.length}`)
data.slice(0, TOP_LIMIT)
.forEach(d => ui.append(d))
}
})()
function UI() { }
UI.prototype.drawTop = function() {
let body = document.querySelector('body')
let panel = document.createElement('div')
panel.style.position = 'fixed'
panel.style.right = '4px'
panel.style.bottom = 0
panel.style['background-color'] = '#f6f8fa'
panel.style.border = '1px solid #d1d5da'
panel.style['border-radius'] = '3px'
panel.style['z-index'] = 42
panel.style.margin = '5px'
body.appendChild(panel)
this.top = document.createElement('ul')
this.top.style.margin = '5px'
this.top.style['list-style-type'] = 'none'
panel.appendChild(this.top)
let footer = document.createElement('div')
panel.appendChild(footer)
this.status = document.createElement('span')
this.status.style.margin = '5px'
this.status.textContent = 'loading...'
footer.appendChild(this.status)
let closeBtn = document.createElement('span')
closeBtn.textContent = '╳ close'
closeBtn.style.cursor = 'pointer'
closeBtn.style.display = 'block'
closeBtn.style['text-align'] = 'right'
footer.appendChild(closeBtn)
closeBtn.onclick = () => {
panel.parentNode.removeChild(panel)
}
}
UI.prototype.append = function(post) {
let newLi = document.createElement('li')
let permalink = document.createElement('a')
permalink.textContent = '🔗'
permalink.href = post.link
permalink.title = 'Go to'
newLi.appendChild(permalink)
let div = document.createElement('span')
post.reactions.forEach(r => (div.textContent += ` ${r.react}${r.count} `))
newLi.appendChild(div)
this.top.appendChild(newLi)
}
UI.prototype.msg = function(m) {
this.status.textContent = m
}
function getData() {
let posts = document.querySelectorAll('.comment')
let postsWithReactions = Array.prototype.filter.call(posts, p => {
return p.querySelector('.has-reactions')
})
let data = postsWithReactions.map(p => {
let post = {
link: p.querySelector('a.link-gray').href,
reactions: [],
}
let reactionSection = p.querySelector('.comment-reactions-options')
post.reactions = Array.prototype.map.call(reactionSection.children, r => {
let [react, count] = r.innerText.split(' ')
count = Number.parseInt(count)
return {
react,
count,
}
})
return post
})
let getLike = d => d.reactions.find(r => r.react === '👍')
data = data.filter(d => getLike(d))
.sort((a, b) => {
a = getLike(a)
b = getLike(b)
return b.count - a.count
})
return data
}
})()