// ==UserScript== // @name 💡WebPreview - 信息直达 // @namespace https://ez118.github.io/ // @version 0.2 // @description 支持国内主流搜索引擎的搜索结果快速预览(直达网页文本大纲) // @author ZZY_WISU // @match https://*.bing.com/* // @match https://www.baidu.com/* // @match https://www.so.com/* // @connect * // @license GNU GPLv3 // @icon https://cn.bing.com/sa/simg/favicon-trans-bg-blue-mg.ico // @run-at document-end // @grant GM_xmlhttpRequest // @grant GM_download // @grant GM_registerMenuCommand // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== var ReaderFlag1 = false; /* 用于存储阅读器元素是否被创建 */ var ReaderFlag2 = false; /* 用于存储阅读器是否为开启状态 */ function runAsync(url,send_type,data_ry) { var p = new Promise((resolve, reject)=> { GM_xmlhttpRequest({ method: send_type, url: url, headers: {"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"}, data: data_ry, onload: function(response){resolve(response.responseText);}, onerror: function(response){reject("请求失败");} }); }); return p; } function escapeHtml(str) { return str.replace(/[&<>"']/g, function(match) { switch (match) { case '&': //return '&'; return '&'; case '<': return '<'; case '>': return '>'; case '"': return '"'; case '\'': return '''; default: return ''; } }); } function getWebContents(txt) { var links; var images; var content; /* 获取所有链接 */ /*links = txt.match(/href\=\"(https?|http|ftp|file):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]/g); for(let i = 0; i < links.length; i ++) { links[i] = links[i].replace("href=\"", ""); }*/ links = []; txt.replace(/]*href=['"]([^'"]+)[^>]*>/g,function(match, capture){ links.push(capture); }); //console.log(links); /* 获取所有图片 */ //images = txt.match(/]*src=[\"]([^\"]+)[\"][^<>]*>/im); images = []; txt.replace(/]*src=['"]([^'"]+)[^>]*>/g,function(match, capture){ images.push(capture); }); //console.log(images); /* 获取文本 */ content = txt.replace(/<\/div>/g, "\n").replace(/<\/table>/g, "\n") content = content.replace(/<\/h3>/g, "\n").replace(/<\/p>/g, "

\n") content = content.replace(/<\/li>/g, "\n").replace(/
/g, "\n") content = content.replace(//g, "\n").replace(//gis, "") content = content.replace(//gis, "").replace(//gis, ""); content = content.replace(//gis, ""); content = content.replace(/<[^>]+>/g, "") content = escapeHtml(content); var content_len = content.length; content = content.substring(0, content_len); const search_txt = [" ", "  ", "\n\n", "\r\r", "\t\t", "\n\r\n\r", "\r\n\r\n", "\t\r\n"]; const replace_txt = ["", "", "", "", "", "", "", ""]; for (let i = 0; i < search_txt.length; i++) { content = content.split(search_txt[i]).join(replace_txt[i]); } content = content.replace(/\r\n/g,"
").replace(/\n/g,"
").replace(//g, ""); //console.log(content); return {"link":links,"image":images,"content":content}; } function openReader(url) { if (ReaderFlag1 == false) { let previewReader = document.createElement("div"); previewReader.setAttribute("class", "userscript-webPreviewReader"); previewReader.setAttribute("style", "display:block;"); previewReader.setAttribute("id", "userscript-webPreviewReader"); document.body.appendChild(previewReader); ReaderFlag1 = true; ReaderFlag2 = true; } else { let previewReader = document.getElementById("userscript-webPreviewReader"); previewReader.setAttribute("style", "display:block;"); ReaderFlag2 = true; } var previewReader = document.getElementById("userscript-webPreviewReader"); previewReader.innerHTML = "加载中..."; runAsync(url, "GET", "").then((result)=>{ return result; }).then(function(result){ let reslist = getWebContents(result); let linkhtml = "", imghtml = ""; for(let i = 0; i < reslist.link.length; i ++){ let link_tmp = reslist.link[i]; if(link_tmp.includes("https://") || link_tmp.includes("http://")){ linkhtml += "
🔗 " + link_tmp + "
"; } } for(let i = 0; i < reslist.image.length; i ++){ imghtml += ""; } previewReader.innerHTML = `

所有图片

` + imghtml + `
文本: ` + reslist.content + `
`; }); } (function() { 'use strict'; var url = window.location.href; var paths = url.split("/"); GM_addStyle(`.userscript-webPreviewBtn { background:#FFF; padding:3px 13px; margin-left:5px; border-radius:15px; border:1px solid #666; cursor:pointer; } .userscript-webPreviewBtn:active { background:#eee; } .userscript-webPreviewReader { position:fixed; top:0; right:0; z-index:9999; width:40%; height:100%; min-width:350px; background:#FFF; overflow:auto; } .ShowImgList{ margin:0;padding:0;width:100%;cursor:pointer;color:#138AF1;user-select:none; } .image{ height:85px; margin-bottom:8px; margin-right:5px; border-radius:15px; object-fit:contain; max-width:calc(100% - 20px); } .link{ text-decoration:none; color:#001ba0; } .link:hover{ text-decoration:underline; } .ImageList{ padding:10px; margin:5px; border:2px solid #f4effb; background:#f4effb; border-radius:15px; overflow:hidden; } .LinkList{ padding:10px; margin:5px; border:2px solid #f4f1f6; background:#f4f1f6; border-radius:15px; overflow:hidden; } .ContentShow{ padding:10px; margin:5px; border:2px solid #f2f2f2; background:#f2f2f2; border-radius:15px; } .CloseButton{ background:#FFF; color:#000; padding:3px 13px; margin:5px 5px; margin-bottom:0px; border-radius:15px; border:1px solid #666; cursor:pointer; } .CloseButton:hover{ background:#138AF1; border:1px solid #138AF1; color:#FFF; } `); if (paths[2].includes("bing.com") && paths[3].includes("search")) { let resultItems = document.getElementsByClassName("b_algo"); for(let i = 0; i < resultItems.length; i ++) { let resultItemLink = resultItems[i].getElementsByTagName("a")[0].href; let resultItemTitleEle = resultItems[i].getElementsByTagName("h2")[0]; /* 向每一个搜索结果的标题部分添加按钮 */ let previewBtn = document.createElement("button"); let previewBtnTxt = document.createTextNode("💡"); previewBtn.setAttribute("class", "userscript-webPreviewBtn"); previewBtn.setAttribute("link-data", resultItemLink); resultItemTitleEle.appendChild(previewBtn); previewBtn.appendChild(previewBtnTxt); previewBtn.addEventListener("click", function(evt){ let linkData = previewBtn.getAttribute("link-data"); openReader(linkData); }, true); } } })();