您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
12/9/2019, 5:20:26 PM
当前为
- // ==UserScript==
- // @name github outline - github.com
- // @namespace Violentmonkey Scripts
- // @match https://github.com/*
- // @grant none
- // @version 1.01
- // @author TianyiLi-e0991100238@gmail.com
- // @description 12/9/2019, 5:20:26 PM
- // ==/UserScript==
- if (document.querySelector('#readme article')) {
- const canvas = document.createElement('div')
- canvas.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)
- }