Skip to content

Instantly share code, notes, and snippets.

@TianyiLi
Last active December 11, 2019 04:18
Show Gist options
  • Save TianyiLi/971bcfdd00b8d55fc92b9f1d62f0ebdf to your computer and use it in GitHub Desktop.
Save TianyiLi/971bcfdd00b8d55fc92b9f1d62f0ebdf to your computer and use it in GitHub Desktop.
github readme outline - violent monkey
// ==UserScript==
// @name New script - github.com
// @namespace Violentmonkey Scripts
// @match https://github.com/*
// @grant none
// @version 1.0
// @author [email protected]
// @description 12/9/2019, 5:20:26 PM
// ==/UserScript==
if (document.querySelector('#readme article')) {
const canvas = document.createElement('div')
canvas.style = /* style */ `
position: fixed;
top: 10vh;
right: 8vw;
width: 300px;
border-radius: 5px;
background: white;
border: solid 1px #e0e0e0;
overflow-y: auto;
max-height: 60vh;
`
const markdownDOM = document.querySelector('#readme article')
function recursiveNodeReader(node, nodeLevel = 1) {
let n = node.querySelector('h1, h2, h3, h4, h5')
let result = []
do {
if (['h1', 'h2', 'h3', 'h4', 'h5'].includes(n.tagName.toLowerCase())) {
result.push({
text: n.textContent,
level:
['h1', 'h2', 'h3', 'h4', 'h5'].indexOf(n.tagName.toLowerCase()) + 1,
link: n.querySelector('a').href,
})
}
} while ((n = n.nextElementSibling))
return result
}
function renderDOM(domTree) {
return domTree
.map(
node =>
`<a style="display:block" href="${node.link}" level="${node.level}">${
node.level > 1 ? '&nbsp;'.repeat(node.level - 2) + '└' : '─'
}${node.text}</a>`
)
.join('')
}
const body = document.createElement('div')
const header = document.createElement('div')
header.textContent = 'Outline'
header.style = `
padding: .5rem .7rem;
font-size: 2rem;
position: sticky;
top: 0px;
background: white;
`
body.style = `
padding: .2rem .3rem;
`
body.addEventListener('mousedown', e => e.stopPropagation(), {
capture: true,
})
body.addEventListener('click', e => e.stopPropagation(), { capture: true })
let isMove = false
let position = {
x: 0,
y: 0,
}
let target = null
function eleMove(e) {
if (!isMove) return
target.style.top = e.clientY - position.y + 'px'
target.style.left = e.clientX - position.x + 'px'
target.style.right = ''
}
canvas.addEventListener(
'mousedown',
function(e) {
isMove = true
position.x = e.offsetX
position.y = e.offsetY
target = this
window.addEventListener('mousemove', eleMove, true)
}
)
canvas.addEventListener(
'mouseup',
() => {
isMove = false
window.removeEventListener('mousemove', eleMove, true)
}
)
body.innerHTML = renderDOM(recursiveNodeReader(markdownDOM))
canvas.appendChild(header)
canvas.appendChild(body)
document.body.appendChild(canvas)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment