Greasy Fork

Greasy Fork is available in English.

sciDownload

修复bug

目前为 2021-09-02 提交的版本。查看 最新版本

// ==UserScript==
// @name        sciDownload
// @namespace   http://tampermonkey.net/
// @version     0.6
// @description 修复bug
// @author      Polygon
// @icon        data:image/png;base64,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
// @match       *://*/*
// @grant       unsafeWindow
// @grant       GM_xmlhttpRequest
// @grant       GM_download
// @grant       GM_addStyle
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       unsafeWindow
// @connect     *
// @run-at      document-end
// ==/UserScript==
(function() {
    'use strict'
    const utils = {
        api: 'https://service-lephiw86-1256272652.hk.apigw.tencentcs.com/sciDownload',
        doiRegex: new RegExp(/10\.\d{4,9}\/[-\._;\(\)\/:A-z0-9]+/),
        timeout: 25,
        height: 40,
        autoMax: {b: true, time: 1},
        // 如果缩小状态下,sciState内容改变是否自动最大化以及弹出后自动收回的时间
        // 这个b会自动记忆,如果最后一次运行状态是min,下次自动min
        get switchState() {
            return GM_getValue('sciDownload-state', 'max')
        },
        set switchState(value) {
            GM_setValue('sciDownload-state', value)
        },
        color:
        {
            success: '#e74c3c',
            flash: '#00b894',
            fail: '#2c3e50'
        },
        svg:
        {
            doi: `<svg class="progressBox" width="25" height="25">
            <circle class="progress-background" cx="12.5" cy="12.5" r="10" fill="transparent" stroke="rgba(255,255,255,0.15)" stroke-width="2"/>
            <circle class="progress" cx="12.5" cy="12.5" r="10" fill="transparent" stroke="white" stroke-width="2"/>
            </svg>`,
            url: `<svg width="25" height="25">
            <circle cx="12.5" cy="12.5" r="10" fill="transparent" stroke="white" stroke-width="2"/>
            </svg>`,
            pdf: `<svg t="1629675437209" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2519" width="25" height="25"><path d="M478.08 192.192a58.88 58.88 0 0 1 46.208 23.168c23.104 32.064 21.312 99.84-8.832 199.68A536.832 536.832 0 0 0 625.664 557.44c37.312-7.04 74.688-12.416 112-12.416 83.52 1.792 96 41.024 94.144 64.128 0 60.544-58.688 60.544-88.896 60.544v0.064a226.048 226.048 0 0 1-131.52-53.504c-72.832 16-142.144 39.168-211.456 67.712C344.96 782.08 293.312 832 248.96 832c-8.96 0-19.584-1.792-26.752-7.168A52.48 52.48 0 0 1 192 776.704c0-16 3.52-60.608 172.352-133.568a1267.776 1267.776 0 0 0 94.208-221.056c-21.312-42.752-67.584-147.84-35.584-201.344 10.688-19.648 32-30.272 55.168-28.544z m-118.4 475.84c-42.688 20.736-95.232 58.368-90.112 82.368 3.392 16 21.888 10.56 55.424-16.384 21.056-27.072 24.512-41.088 34.688-65.984z m386.304-79.808c-17.152 0-32.384 0-49.536 7.68 19.072 19.2 29.504 28.608 48.64 32.448 13.312 3.84 39.104 10.752 46.72-9.28 7.68-19.968-7.616-30.848-45.824-30.848zM494.08 492.8a2572.16 2572.16 0 0 1-46.592 104.704l104.704-34.88c-21.76-22.272-41.344-43.392-58.112-69.824z m-16.64-223.488c-10.496 1.664-16.192 15.04-18.88 24.512-5.504 27.008 8.96 57.088 27.072 78.528 14.912-22.528 18.688-43.328 12.928-73.92-6.976-20.48-14.016-30.208-21.12-29.12z" fill="#ffffff" p-id="2520"></path></svg>`,
            switch: `<svg t="1629798290236" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5684" width="40" height="40">
            <path d="M715 547.2H310c-19.3 0-35-15.7-35-35s15.7-35 35-35h405c19.3 0 35 15.7 35 35s-15.7 35-35 35z" p-id="5685" fill="#ffffff"></path>
            <path class="switch" d="M715 547.2H310c-19.3 0-35-15.7-35-35s15.7-35 35-35h405c19.3 0 35 15.7 35 35s-15.7 35-35 35z" p-id="5685" fill="#ffffff"></path>
            </svg>`
        },
        style() {
            let div = document.createElement('div')
            div.innerHTML = this.svg.doi
            div.style.opacity = '0'
            document.body.appendChild(div)
            const total = div.querySelector('.progress').getTotalLength()
            this.log('total=' + total)
            document.body.removeChild(div)
            return `
            .sciTool {
                display: flex;
                position: fixed;
                height: ${this.height}px;
                bottom: 75px;
                font-family: NexusSans,Arial,Helvetica,Lucida Sans Unicode,Microsoft Sans Serif,Segoe UI Symbol,STIXGeneral,Cambria Math,Arial Unicode MS,sans-serif;
                font-size: 18px;
                cursor: pointer;
                box-shadow: 0px 0px 20px rgba(0, 0, 0, .1);
                transition: left .23s ease-out, opacity .23s, right .23s ease-out;
                z-index: 9999999999;
            }
            .sciTool * {
                box-sizing: border-box;
            }
            #sciContent {
                box-sizing: border-box;
                display: flex;
                align-items: center;
                justify-content: space-around;
                vertical-align: middle;
                white-space: nowrap;
                color: white;
                background-color: ${this.color.fail};
                opacity: 0.72;
                transition: width .23s ease-out, opacity .23s;
            }
            #sciSwitch {
                width: ${this.height}px;
                height: ${this.height}px;
                color: white;
                background-color: #00b894;
                opacity: 0.72;
                transition: width .23s ease-out, opacity .23s;
                z-index: 1;
            }
            #sciContent #sciState {
                display: flex;
                align-items: center;
                justify-content: center;
                width: ${this.height}px;
                height: ${this.height}px;
                opacity: 1;
            }
            #sciContent #sciText {
                display: flex;
                align-items: center;
                justify-content: center;
                color: white;
                padding-left: 5px;
                padding-right: 10px;
                opacity: 1;
                text-decoration: none;
                transition: width .23s ease-out;
            }
            #sciContent:hover {
                opacity: 1 !important;
            }
            #sciSwitch:hover {
                opacity: 1 !important;
            }
            /* left svg progress */
            #sciContent #sciState .progressBox {
                transform: rotate(-90deg);
            }
            #sciContent #sciState .progress {
                stroke-dasharray: ${total};
                animation: progressOffset ${this.timeout}s linear;
            }
            @keyframes progressOffset {
                from {
                    stroke-dashoffset: ${total};
                }
                to {
                    stroke-dashoffset: 0;
                }
            }
            /* right div progress */
            #sciProgressBox {
                right: 0px;
            }
            #sciProgress {
                position: relative;
                display: flex;
                justify-content: center;
                align-items: center;
                width: 0px;
                background-color: ${this.color.flash};
                height: 40px;
                overflow: hidden;
                transition: width ${this.timeout}s linear;
            }
            #sciProgressText {
                position: absolute;
                color: white;
                right: 0px;
                padding-left: 5px;
                padding-right: 10px;
            }
            /* flash */
            @keyframes sciFlash {
                from {
                    opacity: 1;
                    background-color: ${this.color.success};
                }
                50% {
                    opacity: 0.72;
                    background-color: ${this.color.flash};
                }
                to {
                    opacity: 1;
                    background-color: ${this.color.success};
                }
            }
            #sciDownloadBox .loading {
                animation: sciFlash 1.2s infinite !important;
            }
            /* switch button animation */
            #sciSwitch svg .switch {
                transform: rotate(0deg);
                transform-origin: center center;
                transition: transform .23s ease-out .15s;
            }
            `
        },
        initBox(doi) {
            if (this.sciContent) {
                if (this.sciContent.classList.contains('loading')) {this.sciContent.classList.remove('loading')}
                let sciProgressBox = document.querySelector('#sciProgressBox')
                if (sciProgressBox) {sciProgressBox.parentNode.removeChild(sciProgressBox)}
                this.sciContent.style['background-color'] = this.color.fail
                this.sciText.setAttribute('href', '')
                this.changeContent(this.svg.doi, doi, () => {
                    this.startProgress()
                })
            } else {
                this.sciDownloadBox = document.createElement('div')
                this.sciDownloadBox.setAttribute('id', 'sciDownloadBox')
                this.sciDownloadBox.setAttribute('class', 'sciTool')
                this.sciDownloadBox.innerHTML = `
                                                <div id="sciSwitch">${this.svg.switch}</div>
                                                <div id="sciContent">
                                                    <div id="sciState">${this.svg.doi}</div>
                                                    <a href="" id="sciText" target="_blank">${doi}</a>
                                                </div>
                                                `
                document.body.appendChild(this.sciDownloadBox)
                this.sciContent = this.sciDownloadBox.querySelector('#sciContent')
                this.sciState = this.sciDownloadBox.querySelector('#sciState')
                this.sciText = this.sciDownloadBox.querySelector('#sciText')
                this.sciDownloadBox.style.right = -this.getElementWidth(this.sciDownloadBox) + 'px'
                setTimeout(() => {
                    this.sciDownloadBox.style.right = '0px'
                    setTimeout(() => {
                        this.startProgress()
                    }, 230*2)
                }, 230)
                this.sciSwitch = this.sciDownloadBox.querySelector('#sciSwitch')
                this.sciSwitch.onclick = this.switchEvent
                window.onresize = () => {
                    setTimeout(() => {
                        this.sciSwitch.click()
                        this.sciSwitch.click()
                    })
                }
            }
        },
        switchEvent(event) {
            console.log(utils.switchState)
            if (utils.switchState == 'max') {
                utils.sciDownloadBox.style.left = getComputedStyle(utils.sciDownloadBox).left
                utils.sciDownloadBox.style.left = document.body.clientWidth - utils.height * 2 + 'px'
                utils.sciDownloadBox.style.right = -utils.getElementWidth(utils.sciDownloadBox) + 'px'
                let sciProgressBox = document.querySelector('#sciProgressBox')
                if (sciProgressBox) {
                    sciProgressBox.style.right = -utils.getElementWidth(utils.sciState) + 'px'
                    sciProgressBox.style.left = document.body.clientWidth + 'px'
                }
                utils.sciSwitch.querySelector('svg .switch').style.transform = 'rotate(90deg)'
                utils.switchState = 'min'
            } else if (utils.switchState == 'min') {
                utils.sciDownloadBox.style.left = ''
                utils.sciDownloadBox.style.right = '0px'
                let sciProgressBox = document.querySelector('#sciProgressBox')
                if (sciProgressBox) {
                    sciProgressBox.style.left = ''
                    sciProgressBox.style.right = '0px'
                }
                utils.sciSwitch.querySelector('svg .switch').style.transform = 'rotate(0deg)'
                utils.switchState = 'max'
            }
        },
        startProgress() {
            let ele = this.sciText
            let sciProgressBox = document.createElement('div')
            sciProgressBox.setAttribute('id', 'sciProgressBox')
            sciProgressBox.setAttribute('class', 'sciTool')
            let totalWidth = this.getElementWidth(ele)
            sciProgressBox.innerHTML = `
                <div id="sciProgress">
                    <div id="sciProgressText">${ele.innerHTML}</div>
                </div>
                `
            document.body.appendChild(sciProgressBox)
            let sciProgress = sciProgressBox.querySelector('#sciProgress')
            sciProgressBox.querySelector('#sciProgressText').style.width = `${totalWidth}px`
            setTimeout(() => {
                sciProgress.style.width = `${totalWidth}px`
                if (this.switchState == 'min') {this.switchState = 'max'; this.sciSwitch.click()}
            }, 100)
        },
        getContentWidth(ele, content) {
            let oldContent = ele.innerHTML
            ele.innerHTML = content
            let width = this.getElementWidth(ele)
            ele.innerHTML = oldContent
            return width
        },
        getElementWidth(ele) {
            return parseFloat(window.getComputedStyle(ele).width.replace('px', ''))
        },
        changeContent(state, text, callback=null) {
            this.sciState.innerHTML = state
            let ele = this.sciText
            let sciProgressBox = document.querySelector('#sciProgressBox')
            if (sciProgressBox) {sciProgressBox.parentNode.removeChild(sciProgressBox)}
            let oldWidth = this.getElementWidth(ele)
            let newWidth = this.getContentWidth(ele, text)
            utils.log(`newWidth=${newWidth}, oldWidth=${oldWidth}`)
            ele.style.width = oldWidth + 'px'
            setTimeout(() => {
                ele.style.width = newWidth + 'px'
                ele.innerHTML = text
                setTimeout(() => {
                    ele.style.width = 'fit-content'
                    if (callback) {callback()}
                }, 230)
                if (this.switchState == 'min' & this.autoMax.b){
                    this.sciSwitch.click()
                    setTimeout(() => {
                        this.sciSwitch.click()
                    }, this.autoMax.time * 1000)
                }
            }, 230)
        },
        getDoi() {
            let selection = window.getSelection().toString()
            let sourceText = document.body.innerHTML
            let matches = selection.match(this.doiRegex) || sourceText.match(this.doiRegex)
            let doi = null
            if (matches) {
                doi = matches[0].replace('.pdf', '')
            }
            return doi
        },
        getApi(doi) {
            this.log('初始化sciDownloadBox')
            this.initBox(doi)
            this.log('初始化sciDownloadBox完成')
            GM_xmlhttpRequest({
                method: 'POST',
                url: this.api,
                responseType: 'json',
                headers: {"Content-Type": "application/x-www-form-urlencoded"},
                data: `doi=${doi}&timeout=${this.timeout}`,
                onload: (res) => {
                    console.log(res.response)
                    utils.getPdf(res.response, doi)
                }
            })
        },
        getPdf(data, doi) {
            this.changeContent(this.svg.url, data.message)
            this.sciState.setAttribute('href', data.url)
            let exit = true
            switch (data.message) {
                case 'NotSupport':
                    this.log('不支持该文章,退出...')
                    break
                case 'Timeout':
                    this.log('请求超时,退出...')
                    break
                case 'DoiError':
                    this.log('doi错误,退出...')
                    break
                default:
                    this.log('请求pdf中...')
                    exit = false
            }
            if (exit) { return }
            let pdfURL = location.protocol + '//' + data.url.split('://')[1]
            this.sciText.setAttribute('href', pdfURL)
            this.sciContent.classList.add('loading')
            // 开始缓存同时尝试打开链接,可将下行反注释即可
            // window.open(pdfURL)
            GM_xmlhttpRequest({
                method: 'GET',
                url: pdfURL,
                responseType: 'blob',
                onload: function(res) {
                    console.log(res.response)
                    let fileURL = URL.createObjectURL(new Blob([res.response], {type: 'application/pdf'}))
                    let title = doi.split('/').slice(1).join('/')
                    utils.log('res.responseHeaders')
                    console.log(res.responseHeaders)
                    if (res.responseHeaders.search('application') !== -1) {
                        let titleRes = res.responseHeaders.match(/filename=(.+)/)
                        if (titleRes) {
                            title = titleRes[1].replace(';', '').replace('.pdf', '').replace('"', '').replace('"', '')
                        }
                    } else {
                        utils.sciContent.classList.remove('loading')
                        return
                    }
                    utils.sciText.removeAttribute('href')
                    utils.sciText.onclick = () => {
                        let win = window.open()
                        win.document.write(`<iframe name="${title}" src="${fileURL}" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen></iframe>`)
                        win.document.title = title
                    }
                    utils.log('缓存pdf成功')
                    utils.sciContent.classList.remove('loading')
                    utils.sciContent.style['background'] = utils.color.success
                    utils.changeContent(utils.svg.pdf, title)
                    utils.sciState.onclick = (event) => {
                        let aTag = document.createElement('a')
                        aTag.setAttribute('href', fileURL)
                        aTag.setAttribute('download', `${title}.pdf`)
                        aTag.click()
                    }
                }
            })
        },
        log(text) {
            console.log(`[sciDownload] ${text}`)
        }
    }
    try{
        GM_addStyle(utils.style())
    } catch {
        utils.log('添加style失败,退出...')
        return
    }
    let lastDoi = ''
    setInterval(function () {
        let doi = utils.getDoi()
        if (doi == lastDoi | doi == null) {
            return
        }
        lastDoi = doi
        utils.log('发现doi = ' + doi)
        utils.getApi(doi)
    }, 500)
})();