您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Download PDF from lecturenotes
// ==UserScript== // @name lecturenotes-dl // @version 0.1 // @description Download PDF from lecturenotes // @author nithin005 // @include https://lecturenotes.in/* // @require https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js // @resource IMPORTED_CSS https://raw.githubusercontent.com/Nithin005/lecturenotes.in-chrome-extension/master/styles.css // @grant GM_getResourceText // @grant GM_addStyle // @namespace https://greasyfork.org/users/696953 // ==/UserScript== (function () { 'use strict'; // Your code here... let doc; let i; let reader; let pageNodes; const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; const observer = new MutationObserver(main); const config = { attributes: true, childList: true, subtree: true }; let inserted = false; const my_css = GM_getResourceText("IMPORTED_CSS"); GM_addStyle(my_css); /** * sanitize filename * https://gist.github.com/barbietunnie/7bc6d48a424446c44ff4 */ var illegalRe = /[\/\?<>\\:\*\|":]/g; var controlRe = /[\x00-\x1f\x80-\x9f]/g; var reservedRe = /^\.+$/; var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i; function sanitize(input, replacement) { var sanitized = input .replace(illegalRe, replacement) .replace(controlRe, replacement) .replace(reservedRe, replacement) .replace(windowsReservedRe, replacement); return sanitized.split("").splice(0, 255).join("") } /** */ function main() { let imgElement = pageNodes[i].querySelector("div.MuiPaper-root > div > img"); const button = document.querySelector('.dl-button'); if (imgElement === null) { pageNodes[i].scrollIntoView(true); observer.observe(pageNodes[i], config); return; } observer.disconnect(); let url = imgElement.src; if (i === 0) { const width = imgElement.naturalWidth; const height = imgElement.naturalHeight; const orientation = width > height ? 'l' : 'p'; doc = jspdf.jsPDF({ orientation, unit: "px", format: [width, height] }); } let imgProp = doc.getImageProperties(url); doc.addImage(imgProp.data, 'JPEG', 0, 0, imgProp.width, imgProp.height); button.innerText = `${i + 1} pages loaded out of ${pageNodes.length - 1}`; i++; if (i >= pageNodes.length - 1) { let titleElement = document.querySelector("head > title"); const filename = sanitize(titleElement.innerText || 'notes', '_'); doc.save(filename); return; } doc.addPage(); main(); } function randomScroll() { const button = document.querySelector('.dl-button'); const handler = setInterval(() => { let scrollLen = -window.innerHeight; reader.scrollBy(0, scrollLen); if (i === (pageNodes.length - 1)) { clearInterval(handler); button.innerHTML = ` <div class="plugin-flex"> <div class="check"></div> <div style="margin-left:9px">Downloaded</div> </div> ` setTimeout(() => { button.innerText = 'Download'; }, 3000) } }, 1000) } function buttonClicked() { const button = document.querySelector('.dl-button'); i = 0; button.innerText = 'Loading please wait...'; //setTimeout(() => { reader = document.querySelector("main"); pageNodes = reader.querySelector("div").children; reader.scroll(0, 0); main(); randomScroll(); // }, 1000); } function constructButton() { inserted = true; const dom = document.querySelector('body'); const button = document.createElement('button'); //clean this button.style.display = "flex"; button.setAttribute('class', 'dl-button'); button.innerHTML = ` <div>Download PDF</div> `; button.onclick = buttonClicked; dom.appendChild(button); } // A helper to listen for params change (function (history) { var pushState = history.pushState; history.pushState = function (state) { if (typeof history.onpushstate == "function") { history.onpushstate({ state: state }); } return pushState.apply(history, arguments); }; })(window.history); if ((/\breading=true\b/.test(location.search))) { // GM_log("triggered") constructButton(); } window.onpopstate = history.onpushstate = () => { if (!(/\breading=true\b/.test(location.search))) { if (!inserted) { constructButton(); } document.querySelector('.dl-button').style.display = 'flex'; //GM_log("triggered") } else { if (inserted) { document.querySelector('.dl-button').style.display = 'none'; } } } })();