Greasy Fork

文档在线预览与下载更名

2021/3/29 上午12:53:16

目前为 2021-05-06 提交的版本。查看 最新版本

// ==UserScript==
// @name        文档在线预览与下载更名
// @namespace   Violentmonkey Scripts
// @match       *://*/*
// @grant       none
// @version     1.0
// @author      -
// @description 2021/3/29 上午12:53:16
// ==/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= <true>: 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
    });
})();