NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name react中文文档目录补全
// @version 0.0.6
// @description 展示react中文文档右侧目录,支持2、3、4级目录
// @author jade qiu
// @match https://zh-hans.reactjs.org/docs/*
// @match https://react.docschina.org/docs/*
// @icon https://zh-hans.reactjs.org/favicon.ico
// @grant GM_addStyle
// @require https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.3/moment.min.js
// @license MIT
// @namespace https://greasyfork.org/users/909394
// ==/UserScript==
;(function () {
'use strict'
const style = `
.custom-ul {
padding: 10px 0 10px 20px;
font-size: 10px;
background: #dadada;
}
.custom-li {
font-family: source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace;
font-size: 14px;
font-weight: 100;
min-width: 36em;
padding-top: 3px;
}
.custom-li-h3 {
padding-left: 20px;
}
.custom-li-h4 {
padding-left: 20px;
}
.custom-li:hover {
backgound-color: #61dafb;
}
.custom-li:first-child {
padding-top: 0;
}
`
GM_addStyle(style)
let timer = null
const insertMenus = (subMenus, target) => {
const ul = document.createElement('ul')
ul.classList.add('custom-ul')
subMenus.map((second) => {
const co = second.cloneNode(true)
co.classList.add('custom-li', 'custom-li-' + co.nodeName.toLowerCase())
ul.appendChild(co)
})
if (target.parentNode.children.length >= 2) {
target.parentNode.removeChild(target.parentNode.childNodes[1])
}
target.parentNode.appendChild(ul)
console.log(ul, target.parentNode)
return true
}
const render = function (target) {
let a = 0
timer = setInterval(() => {
a++
if (a === 2) {
clearInterval(timer)
return false
}
const currentPageTitle = document.querySelector('article header h1')
const allPageTitle = Array.from(document.querySelectorAll('ul[id^="section_"] a'))
const currentPageSecondLevelTitle = Array.from(
document.querySelectorAll('article>div>div>h2,article>div>div>h3,article>div>div>h4')
)
// if (target) {
// insertMenus(currentPageSecondLevelTitle, target)
// return true
// }
allPageTitle.map((page) => {
const pageInnerText = page.innerText.replace(/^[0-9]{1,2}\.\s/, '')
let run = undefined
if (target && page.innerText === target.innerText) {
run = true
} else if (pageInnerText === 'React' && currentPageTitle.innerText === 'React 顶层 API') {
run = true
} else if (pageInnerText === currentPageTitle.innerText) {
run = true
}
if (run) {
insertMenus(currentPageSecondLevelTitle, page)
}
})
}, 200)
}
// 监听浏览器的返回上一页事件
window.addEventListener('popstate', function () {
clearInterval(timer)
render()
})
window.addEventListener('load', function () {
clearInterval(timer)
render()
})
window.addEventListener('click', (e, a) => {
const isA = e.path.find((path) => path.nodeName === 'A')
if (!isA) {
return true
}
console.log(e, 'e')
clearInterval(timer)
render(e.target)
})
})()