在SAGE期刊新版页面的文章工具栏中,添加一个指向“中图易阅通”平台的直接PDF下载按钮。
// ==UserScript==
// @name SAGE to CNPeReading Direct PDF Button
// @namespace https://greasyfork.org/zh-CN/users/1335433
// @version 2.0
// @description 在SAGE期刊新版页面的文章工具栏中,添加一个指向“中图易阅通”平台的直接PDF下载按钮。
// @author wakewon
// @match https://journals.sagepub.com/doi/*
// @grant none
// @run-at document-idle
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// 1. 获取文章DOI
const getDOI = () => {
let doiMeta = document.querySelector('meta[name="dc.Identifier"][scheme="doi"]');
if (doiMeta && doiMeta.content) return doiMeta.content;
doiMeta = document.querySelector('meta[name="publication_doi"]');
if (doiMeta && doiMeta.content) return doiMeta.content;
const pathParts = window.location.pathname.split('/');
const doiIndex = pathParts.indexOf('doi');
if (doiIndex !== -1 && doiIndex + 2 < pathParts.length) {
const doiFromPath = pathParts.slice(doiIndex + 1).join('/');
if (doiFromPath && doiFromPath.includes('/')) {
return doiFromPath;
}
}
console.warn('SAGE to CNPeReading: DOI could not be reliably extracted.');
return null;
};
// 2. 创建并注入新按钮的函数
const createAndInjectButton = () => {
const buttonId = 'cnpereading-pdf-script-container';
// 检查按钮是否已存在,防止重复添加
if (document.getElementById(buttonId)) {
return;
}
const doi = getDOI();
if (!doi) {
console.error('SAGE to CNPeReading: DOI not found, cannot create button.');
return;
}
// *** 使用中图易阅通下载链接 ***
const newPdfUrl = `https://sage.cnpereading.com/paragraph/download/?doi=${doi}`;
// 寻找一个稳定的位置来放置我们的按钮。
const anchor = document.querySelector('.core-nav-wrapper .core-sections-menu');
if (!anchor) {
// 如果页面结构变化导致找不到锚点,则优雅地退出
return;
}
// 创建按钮的容器 div,并模仿原有 class 以便匹配样式
const buttonContainer = document.createElement('div');
buttonContainer.id = buttonId;
buttonContainer.className = 'collateral-middle';
// 创建链接 (a 标签)
const newButton = document.createElement('a');
newButton.href = newPdfUrl;
newButton.target = '_blank';
newButton.title = '通过中图易阅通下载PDF';
// 创建内部结构,模仿原生按钮,并明确指出平台
newButton.innerHTML = `🚀 <span class="link-text">中图易阅通PDF</span>`;
// 添加样式,使其醒目且融入工具栏
Object.assign(newButton.style, {
cursor: 'pointer',
color: '#007bff', // 蓝色,与“中图”平台风格更接近
fontWeight: 'bold',
textDecoration: 'none'
});
newButton.onmouseover = () => { newButton.style.textDecoration = 'underline'; };
newButton.onmouseout = () => { newButton.style.textDecoration = 'none'; };
buttonContainer.appendChild(newButton);
// 将新按钮插入到“Contents”按钮的正后方
anchor.insertAdjacentElement('afterend', buttonContainer);
console.log(`SAGE to CNPeReading: Injected button for DOI: ${doi}`);
};
// 3. 使用 MutationObserver 监视页面动态变化
const observer = new MutationObserver(() => {
createAndInjectButton();
});
observer.observe(document.body, {
childList: true,
subtree: true
});
// 页面加载完成后立即执行一次
createAndInjectButton();
// 在一段时间后停止监视,以节省资源
setTimeout(() => {
observer.disconnect();
}, 20000);
})();