// ==UserScript== // @name 文档在线预览与下载更名 // @namespace Violentmonkey Scripts // @match *://*/* // @grant none // @version 1.0 // @author - // @description 2021/3/29 上午12:53:16 // @downloadURL none // ==/UserScript== /** * @file * Checks for document links in web pages and inserts * an icon beside the links to enable opening with * online services like Google Docs viewer. * * @author Deekshith Allamaneni * @copyright 2015 Docs Online Viewer */ (function(){ var docLinks = document.links; const supportedFileExtList = ["doc","docx","xls","xlsx","ppt","pps","pptx","xps","odt","odp","rtf","ods","wpd"]; var doCheck = true; const dov_host_exclude =/(docs\.google\.com|sourceforge\.net|adf\.ly|mediafire\.com|springerlink\.com|ziddu\.com|ieee\.org|issuu\.com|asaha\.com|office\.live\.com)$/ // Include paths to exclude showing icon const dov_href_exclude = /(https:\/\/github.com\/.*\/.*\/blob\/.*|file:\/\/\/.*)/ const dovIconImgPath = "https://dov.parishod.com/assets/images/beside-link-icon.svg"; var DocLink = function (docLink) { this._docLink = docLink; }; DocLink.prototype = { get hasSupportedExtension () { return supportedFileExtList.some( thisFileType => { var url = this._docLink.pathname.toLowerCase(); if (url.endsWith('.' + thisFileType)) return true; }); }, get isSupported () { return (!((this._docLink.host).match(dov_host_exclude)) && !((this._docLink.href).match(dov_href_exclude)) && this.hasSupportedExtension && this._docLink.textContent.trim().length > 0); // Issue #6: No blank innerText }, get isProcessed () { return this._docLink.docView; }, get iconLink () { var viewLink = document.createElement('a'); //这个预览地址不好用了viewLink.href = `http://view.xdocin.com/xdoc?_xdoc=${encodeURIComponent(this._docLink.href)}`; //谷歌预览是备用的 viewLink.href = `https://docs.google.com/viewer?url=${encodeURIComponent(this._docLink.href)}&embedded=true`; viewLink.href = `https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(this._docLink.href)}`; /* Parameter description: embedded= : to open google docs in embedded mode dov=1: If opened by Docs Online Viewer. Set by this script. */ //viewLink.docView=true; -> This line is removed in this version but still doubt if it can really be removed. viewLink.title=`View this ${this.fileExtension} file`; var ico = document.createElement("img"); ico.src = "https://dov.parishod.com/assets/images/beside-link-icon.svg"; // Adjusts the margin of the icon to the given number of pixels (3 to 5px is advisable) ico.style.marginLeft = "3px"; ico.style.width = "16px"; ico.style.height = "16px"; viewLink.appendChild(ico); // Disabled opening link in new tab by default. viewLink.setAttribute("target", "_blank"); return viewLink; }, get fileExtension () { var fUrl = this._docLink.pathname; fUrl=fUrl.toUpperCase(); // Returns file extension. Returns "" if no valid extension // Ref: http://stackoverflow.com/a/1203361/3439460 return fUrl.substr((~-fUrl.lastIndexOf(".") >>> 0) + 2); }, get queryStripped() { // remove any ?query in the URL return `${this._docLink.origin}${this._docLink.pathname}`; } }; function checkLinks() { for (var i = 0; i < docLinks.length; ++i) { var thisDocLink = new DocLink(docLinks[i]); if ( thisDocLink.isSupported && !thisDocLink.isProcessed) { // Append the icon beside the link docLinks[i].download=docLinks[i].text+docLinks[i].href.substring(docLinks[i].href.lastIndexOf(".")); //这一条是我加的,用于把下载文件名改为链接文字加扩展名,因为原先的下载文件名总是全数字 docLinks[i].parentNode.insertBefore(thisDocLink.iconLink , docLinks[i].nextSibling); } // The link which is checked is flagged so that it is not repeatedly checked again. docLinks[i].docView=true; } } // Execute these functions // to append icon beside document links and // add listener for new nodes checkLinks(); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (doCheck) { doCheck = false; setTimeout(function(){checkLinks();doCheck = true;}, 1000); } }); }); // pass in the target node, as well as the observer options observer.observe(document.body, { attributes: true, childList: true, characterData: true, subtree:true }); })();