Last active
December 11, 2019 04:18
-
-
Save TianyiLi/971bcfdd00b8d55fc92b9f1d62f0ebdf to your computer and use it in GitHub Desktop.
github readme outline - violent monkey
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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 ? ' '.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