您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
read mark
// ==UserScript== // @name read_mark // @include *wikipedia* // @include http://readonlinefreebook.com/* // @include https://readonlinefreebook.com/* // @supportURL https://github.com/sxlgkxk/browser_script/issues // @version 0.2 // @description read mark // @namespace http://sxlgkxk.github.io/ // @author sxlgkxk // @icon http://sxlgkxk.github.io/im/avatar.jpg // @license MIT // @grant GM_getValue // @grant GM_setValue // @grant GM_xmlhttpRequest // ==/UserScript== (function () { //-------------------------------- common functions -------------------------------- function addScript(src) { var scripts_dom = document.createElement('script'); scripts_dom.src = src; scripts_dom.type = 'text/javascript'; document.getElementsByTagName('head')[0].appendChild(scripts_dom); } addScript('https://unpkg.com/axios/dist/axios.min.js') function addStyle(html) { style = document.createElement("div") document.body.before(style) style.innerHTML = `<style>` + html + `</style>` } //-------------------------------- code snippets -------------------------------- addStyle(` #markPanel{ color: #fff; background-color: #333; position: fixed; bottom: 100px; right: 0px; width: 250px; opacity: 0.9; z-index: 3000; padding: 5px; } a.markUrl{ font-weight: bold; color: #8bdb81; padding-right: 10px; font-size: 12px; } a:visited{ color: #f5de19 !important; } button.markBtn, button.highlightBtn{ background-color: #fff; color: #333; padding-top: 4px; padding-bottom: 4px; padding-left: 9px; padding-right: 9px; margin-right: 5px; margin-bottom: 3px; margin-top: 3px; border:0px; } [hidden] { display: none !important; } `) //-------------------------------- markPanel -------------------------------- mark_panel = document.createElement('div') document.body.before(mark_panel) mark_panel_list_html = "" for (let i = 0; i < 10; i++) { data = localStorage.getItem("mark" + i) data = data ? JSON.parse(data) : {} url = data.url title = data.title mark_panel_list_html += ` <div> <button onclick="document.setMark(`+ i + `)" class="markBtn">+</button> <a href="`+ url + `" class="markUrl" id="mark` + i + `">` + title + `</a> </div> ` } mark_panel.innerHTML = `<div id="markPanel" hidden>` + mark_panel_list_html + `<button class="highlightBtn" onclick="document.promptHighlight()">highlight</button>` + `<button class="highlightBtn" id="readlaterBtn" onclick="document.addToReadlater()">readlater</button>` + `</div>` document.toggleMarkPanel = () => { markPanel = document.querySelector("#markPanel"); if (markPanel.hidden) { markPanel.hidden = false } else { markPanel.hidden = true } } document.setMark = function (val) { data = { title: document.title.replace(" - Wikipedia", ''), url: window.location.href } localStorage.setItem("mark" + val, JSON.stringify(data)) document.querySelector("#mark" + val).innerHTML = data.title document.querySelector("#mark" + val).href = data.url } //-------------------------------- mark_button -------------------------------- body = document.querySelector('body') mark_button = document.createElement('button') document.body.before(mark_button) // move button style mark_button.innerHTML = `<style> .float_btn{ font-weight: bold; color: #fff; background-color: #333; position: fixed; width: 50px; height: 50px; opacity: 0.8; z-index: 1; } </style` // mark_button mark_button.innerHTML += 'mark' mark_button.id = 'read_mark_btn' mark_button.classList.add("float_btn") mark_button.style.bottom = '50px' mark_button.style.right = '50px' mark_button.onclick = () => { document.toggleMarkPanel() } //-------------------------------- highlight -------------------------------- // style function addStyle(html) { style = document.createElement("div") document.body.before(style) style.innerHTML = `<style>` + html + `</style>` } addStyle(` span.highlight{ color: #555555; font-weight:bold; background-color: #8bdb81; } `) function doHighlight(el = document.body) { var keywords = localStorage.getItem("highlight") if (!keywords) return; keywords = JSON.parse(keywords).join() var rQuantifiers = /[-\/\\^$*+?.()|[\]{}]/g; keywords = keywords.replace(rQuantifiers, '\\$&').split(',').join('|'); var pat = new RegExp('(' + keywords + ')', 'gi'); var span = document.createElement('span'); // getting all text nodes with a few exceptions var snapElements = document.evaluate( './/text()[normalize-space() != "" ' + 'and not(ancestor::style) ' + 'and not(ancestor::script) ' + 'and not(ancestor::textarea) ' + 'and not(ancestor::code) ' + 'and not(ancestor::pre)]', el, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); if (!snapElements.snapshotItem(0)) { return; } // end execution if not found for (var i = 0, len = snapElements.snapshotLength; i < len; i++) { var node = snapElements.snapshotItem(i); // check if it contains the keywords if (pat.test(node.nodeValue)) { // check that it isn't already highlighted if (node.className != "highlight" && node.parentNode.className != "highlight") { // create an element, replace the text node with an element var sp = span.cloneNode(true); sp.innerHTML = node.nodeValue.replace(pat, '<span class="highlight" title="highlight">$1</span>'); node.parentNode.replaceChild(sp, node); } } } } doHighlight(); function promptHighlight() { text = prompt("请输入需要高亮的关键词") if (text) { keywords = [text] localStorage.setItem("highlight", JSON.stringify(keywords)) doHighlight() } } document.promptHighlight = promptHighlight //-------------------------------- readlater -------------------------------- addStyle(` table#readlater_table { border-collapse: collapse; width: 100%; background-color: #222; } #readlater_table th, #readlater_table td { text-align: left; padding: 8px; } button.pagiBtn{ background-color: #333; color: #fff; margin: 4px; padding-left: 15px; padding-right: 15px; padding-top: 9px; padding-bottom: 9px; } button#readlaterBtn.added{ background-color: #8bdb81; } `) for (let i = 1; i <= 31; i++) { addStyle(`td.readlaterDay` + i + `{background-color: rgba(` + Math.floor(Math.random() * 255) + `,` + Math.floor(Math.random() * 255) + `,` + Math.floor(Math.random() * 255) + `, 0.5);}`) } function getReadlaterDateStr(date = null) { date = new Date(date) month = String(date.getMonth() + 1) day = String(date.getDate()) return month + "." + day } chapter_dom = document.querySelector("div.chapter-detail") if (!chapter_dom) chapter_dom = document.body readlater_panel = document.createElement("div") chapter_dom.before(readlater_panel) readlater_panel.innerHTML = `<div> <table id="readlater_table"> </table> <button id="readlater_prev" class="pagiBtn">\<</button> <button id="readlater_next" class="pagiBtn">\></button> <input id="readlater_input" type="text" value="1" size="3"> <button id="readlater_go" class="pagiBtn">go</button> </div>` readlater_data = localStorage.getItem('readlater_data') readlater_data = readlater_data ? JSON.parse(readlater_data) : {} if (readlater_data[location.href]) { document.querySelector("#readlaterBtn").classList.add("added") } function addToReadlater() { readlater_data=localStorage.getItem('readlater_data') readlater_data = readlater_data ? JSON.parse(readlater_data) : {} if (!readlater_data[location.href]) { readlater_data[location.href] = { date: new Date().getTime(), title: document.title.replace(" - Wikipedia", ''), url: location.href } localStorage.setItem('readlater_data', JSON.stringify(readlater_data)) btn = document.querySelector('button#readlaterBtn') btn.classList.add('added') } else { delete readlater_data[location.href]; localStorage.setItem('readlater_data', JSON.stringify(readlater_data)) btn = document.querySelector('button#readlaterBtn') btn.classList.remove('added') } setReadlaterTable(1) } document.addToReadlater = addToReadlater function setReadlaterTable(page) { page = page ? page : 1 readlater_pageSize = 10 readlater_table = document.querySelector("#readlater_table") readlater_table.innerHTML = "" readlater_list = Object.values(readlater_data).sort((a, b) => { return b.date - a.date }) start = (page - 1) * readlater_pageSize end = Math.min(start + readlater_pageSize, readlater_list.length) for (i = start; i < end; i++) { day = new Date(readlater_list[i].date).getDate() readlater_table.innerHTML += `<tr>` // + `<td class="readlaterDay` + day + `">` + getReadlaterDateStr(readlater_list[i].date) + `</td>` + `<td><a href="` + readlater_list[i].url + `">` + readlater_list[i].title + `</a></td> </tr>` } } setReadlaterTable(1) document.querySelector('#readlater_prev').onclick = () => { readlater_page = document.querySelector('#readlater_input').value; setReadlaterTable(--readlater_page); document.querySelector('#readlater_input').value = readlater_page } document.querySelector('#readlater_next').onclick = () => { readlater_page = document.querySelector('#readlater_input').value; setReadlaterTable(++readlater_page); document.querySelector('#readlater_input').value = readlater_page } document.querySelector('#readlater_go').onclick = () => { readlater_page = document.querySelector('#readlater_input').value; setReadlaterTable(readlater_page); } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址