Greasy Fork

愉快地阅读 Nodejs API

View the Nodejs API more comfortably

// ==UserScript==
// @name         愉快地阅读 Nodejs API
// @version      1.0.5
// @description  View the Nodejs API more comfortably
// @author       You
// @require      https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.18.2/babel.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.16.0/polyfill.js
// @match        https://nodejs.org/docs/*
// @grant        GM_addStyle
// @namespace 
// ==/UserScript==
(()=>{
    const apiContainer = document.querySelector('#toc')

    if (!isInPage(apiContainer)){
        return;
    }

    const apiTree = apiContainer.querySelector('ul')

    if(!isInPage(apiTree)){
        return;
    }

    const handShank = document.createElement('div')
    const arrowRight = document.createTextNode('>>')

    let status = true // true:open; false:close
    let apiContainerWidth = 0
    let handShankWidth = 32

    let apiContainerStyle = `
    position:fixed;
    z-index:10;
    right:0;
    top:0;
    height:100%;
    padding:10px;
    background-color:#fff;
    padding-bottom:60px;
    box-shadow:-20px 20px 60px #bebebe;
`

    let apiTreeStyle = `
    height:100%;
    overflow-y:scroll;
`

    let handShankStyle = `
    position:absolute;
    top:50%;
    left:0;
    margin-top:-150px;
    width:2rem;
    height:300px;
    line-height:300px;
    text-align:center;
    cursor:pointer;
    background-color:rgb(255, 153, 0);
    -webkit-font-smoothing: antialiased;
    border-radius:0 10px 10px 0;
    color:#fff;
`
    const scrollbarStyle = `
      .scrollbar::-webkit-scrollbar {
        width: 10px;
      }
      .scrollbar::-webkit-scrollbar-track{
          background:rgba(213, 222, 255,0.3);
          border-radius:8px;
      }
      .scrollbar::-webkit-scrollbar-thumb{
          background: rgba(213, 222, 255,0.8);
          border-radius:8px;
      }
    `

    GM_addStyle(scrollbarStyle)

    handShank.style.cssText = handShankStyle
    apiContainer.style.cssText = apiContainerStyle
    apiTree.style.cssText = apiTreeStyle
    apiTree.className = 'scrollbar'

    handShank.appendChild(arrowRight)
    apiContainer.appendChild(handShank)

    // after position:fixed get the real width
    apiContainerWidth = apiContainer.clientWidth

    handShank.addEventListener('click', function (params) {
        if (status) {
            apiContainer.style.cssText = `${apiContainerStyle};right:-${apiContainerWidth - handShankWidth}px`
            handShank.textContent = '<<'
            status = false
        } else {
            apiContainer.style.cssText = apiContainerStyle
            handShank.textContent = '>>'
            status = true
        }
    }, true)

})()

// check node is exist
function isInPage(node){
    return document.body.contains(node)
}