// ==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: 0.5},
// 如果缩小状态下,sciState内容改变是否自动最大化以及弹出后自动收回的时间
// 这个b会自动记忆,如果最后一次运行状态是min,下次自动min
get switchState() {
return GM_getValue('sciDownload-state')
},
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.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'
this.startProgress()
}, 10)
this.sciSwitch = this.sciDownloadBox.querySelector('#sciSwitch')
this.sciSwitch.onclick = this.switchEvent
window.onresize = () => {
this.sciSwitch.click()
this.sciSwitch.click()
}
}
},
switchEvent(event) {
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) { clearInterval(id); return }
let pdfURL = location.protocol + '//' + data.url.split('://')[1]
this.sciText.setAttribute('href', pdfURL)
let cookie = (data.method == 'Safari') ? '' : data.method
this.log('cookie: ' + cookie)
this.sciContent.classList.add('loading')
GM_xmlhttpRequest({
method: 'GET',
url: pdfURL,
responseType: 'blob',
cookie: cookie,
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)
})();