Save baidu wenku doc, press Ctrl-S after page load done.

Save baidu wenku doc as html. Need to Scroll down the web page to load all pages before press Ctrl-S to save, don't scroll too fast to ensure page of doc load complete, prefer use key <Page Down> on your keyboard. Save to PDF in chrome if you can, chrome can not load saved html since chrome blocked some offline js script.

As of 2018-11-28. See the latest version.

// ==UserScript==
// @namespace ATGT
// @name            Save baidu wenku doc, press Ctrl-S after page load done.
// @name:zh-CN      保存百度文库中的文档,页面加载完后按Ctrl-S。
// @description     Save baidu wenku doc as html. Need to Scroll down the web page to load all pages before press Ctrl-S to save, don't scroll too fast to ensure page of doc load complete, prefer use key <Page Down> on your keyboard. Save to PDF in chrome if you can, chrome can not load saved html since chrome blocked some offline js script.
// @description:zh-CN 	将百度文库中的文档保存为html。保存前需要滚动页面到底部,不要滚太快以确保页面加载成功,最好用键盘上的<Page Down>键。在chrome中尽量保存成PDF,因为chrome屏蔽了部分离线js脚本,导致chrome无法加载保存的html。
// @version  1.2
// @icon       https://www.baidu.com/cache/icon/favicon.ico
// @include    http*://wenku.baidu.com/*

// @run-at   document-start
// ==/UserScript==

/*
ChangeLog:
v1.2:
    28 Nov 2018, update descript for chrome, need to save as pdf.
v1.1:
    28 Nov 2018, remove copy limit.
v1:
    28 Nov 2018, Remove ads and show all pages.
*/

console.log("!!!!!!!!!!!!!!!!!!!!!save-baidu-wenku-doc!!!!!!!!!!!!!!!!!!!!!!!!");
(function () {

    function injectFunction(func) {
        var script = document.createElement('script');
        //script.className = "injectFunction";
        //script.appendChild(document.createTextNode('('+ func +')();'));
        script.appendChild(document.createTextNode('(function (){' + '(' + func + ')();' + '})();'));
        try {
            (document.body || document.head || document.documentElement).appendChild(script);
        } catch(e) {
            console.error("Can not inject function ", func);
        }
    }
    function injectFunctionContent(func) {
        var script = document.createElement('script');
        //script.className = "injectFunction";
        //script.appendChild(document.createTextNode('('+ func +')();'));
        var funcContent = func.toSource();
        if (/^function\s*[\w\d_$]*\(.*\)\s*\{/.test(funcContent)) {
            funcContent = funcContent.replace(/^function\s*[\w\d_$]*\(.*\)\s*\{/, '');
            funcContent = funcContent.replace(/}$/g, '');
        }
        script.appendChild(document.createTextNode(funcContent));
        (document.body || document.head || document.documentElement).appendChild(script);
    }

    function saveConsole() {
        window.console_debug = console.debug;
        window.console_log = console.log;
        window.console_info = console.info;
        window.console_error = console.error;

    }
    injectFunction(saveConsole);

    function hookModJS() {
        console_info("--------> hookModJS");
        var require,
        define;
    !function (obj) {
        function create_async_script(script_src, load_fail_handler) {
            console_info("create_async_script", script_src);
            function load_ok() {
                clearTimeout(scriptLoadTimer)
            }
            if (!(script_src in async_script_list)) {
                async_script_list[script_src] = !0;
                var script = document.createElement('script');
                if (load_fail_handler) {
                    var scriptLoadTimer = setTimeout(load_fail_handler, require.timeout);
                    script.onerror = function () {
                        clearTimeout(scriptLoadTimer),
                        load_fail_handler()
                    },
                    'onload' in script ? script.onload = load_ok : script.onreadystatechange = function () {
                        ('loaded' == this.readyState || 'complete' == this.readyState) && load_ok()
                    }
                }
                return script.type = 'text/javascript',
                    script.src = script_src,
                    head.appendChild(script),
                    script
            }
        }
        function async_load_script(libName, fn_clean_up, fn_fail_handler) {
            var cleanUpHandlerList = libCleanUpHandlerList_Map[libName] || (libCleanUpHandlerList_Map[libName] = []);
            cleanUpHandlerList.push(fn_clean_up);
            var script_src,
                libAttr = libAttr_Map[libName] || {},
                pkg = libAttr.pkg;
            script_src = pkg ? libPkgNameList_Map[pkg].url : libAttr.url || libName,
                create_async_script(script_src, fn_fail_handler && function () {
                    fn_fail_handler(libName)
                })
        }
        var head = document.getElementsByTagName('head')[0],
            libCleanUpHandlerList_Map = {
            },
            libFunc_Map = {
            },
            libMod_Map = {
            },
            async_script_list = {
            },
            libAttr_Map = {
            },
            libPkgNameList_Map = {
            };
        define = function (libName, func) {
            console_info("define ", libName);
            libFunc_Map[libName] = func;
            var cleanUpHandlerList = libCleanUpHandlerList_Map[libName];
            if (cleanUpHandlerList) {
                for (var n = 0, o = cleanUpHandlerList.length; o > n; n++)
                    cleanUpHandlerList[n]();
                delete libCleanUpHandlerList_Map[libName]
            }
        },
            require = function (libName) {
                //console_info("require ", libName);
                if (libName && libName.splice) {
                    //console_info("call require.async");
                    return require.async.apply(this, arguments);
                }
                libName = require.alias(libName);
                //console_info("alias", libName);
                var module = libMod_Map[libName];
                if (module) {
                    //console_info("found in libModMap, return.");
                    return module.exports;
                }
                var modImplFunc = libFunc_Map[libName];
                if (!modImplFunc) {
                    //console_info("Can not found module");
                    throw '[ModJS] Cannot find module `' + libName + '`';
                }
                module = libMod_Map[libName] = {
                    exports: {
                    }
                };
                //console_info("modImplFunc", modImplFunc);
                var n = 'function' == typeof modImplFunc ? modImplFunc.apply(module, [
                    require,
                    module.exports,
                    module
                ]) : modImplFunc;
                //console_info("n", n, "module", module);
                if (libName === 'wkcommon:widget/ui/reader/view/doc/view.js') {
                    console_info('++++++++++++++++++ hook doc/view.js');
                    module.exports.view.prototype._recycleView = function(e) {
                        console_info("hooked _recycleView called");
                     };
                } else if (libName == "wkcommon:widget/ui/reader_plugin/copylimit/copylimit.js") {
                    console_info('++++++++++++++++++ hook copylimit/copylimit.js');
                    module.exports.prototype.isCanCopy = function(e) {
                        console_info("hooked isCanCopy called");
                        return true;
                     };
                }
                return n && (module.exports = n),
                    module.exports
            },
            require.async = function (libList_param, fn_clean_up_handler, fn_fail_handler) {
                function async_load_script_list(libList_tmp) {
                    for (var r = 0, n = libList_tmp.length; n > r; r++) {
                        var libName = libList_tmp[r];
                        if (libName in libFunc_Map) {
                            var libAttr = libAttr_Map[libName];
                            libAttr && 'deps' in libAttr && async_load_script_list(libAttr.deps)
                        } else if (!(libName in loading_status)) {
                            loading_status[libName] = !0,
                            load_cnt++ ,
                            async_load_script(libName, fn_clean_up, fn_fail_handler);
                            var libAttr = libAttr_Map[libName];
                            libAttr && 'deps' in libAttr && async_load_script_list(libAttr.deps)
                        }
                    }
                }
                function fn_clean_up() {
                    if (0 == load_cnt--) {
                        for (var modList = [], i = 0, a = libList_param.length; a > i; i++)
                            modList[i] = require(libList_param[i]);
                        fn_clean_up_handler && fn_clean_up_handler.apply(obj, modList)
                    }
                }
                'string' == typeof libList_param && (libList_param = [libList_param]);
                for (var c = 0, f = libList_param.length; f > c; c++)
                    libList_param[c] = require.alias(libList_param[c]);
                var loading_status = {},
                    load_cnt = 0;
                async_load_script_list(libList_param),
                    fn_clean_up()
            },
            require.resourceMap = function (resMap) {
                var r,
                    tmp_list;
                tmp_list = resMap.res;
                for (r in tmp_list)
                    tmp_list.hasOwnProperty(r) && (libAttr_Map[r] = tmp_list[r]);
                tmp_list = resMap.pkg;
                for (r in tmp_list)
                    tmp_list.hasOwnProperty(r) && (libPkgNameList_Map[r] = tmp_list[r])
            },
            require.loadJs = function (e) {
                create_async_script(e)
            },
            require.loadCss = function (e) {
                if (e.content) {
                    var style = document.createElement('style');
                    style.type = 'text/css',
                        style.styleSheet ? style.styleSheet.cssText = e.content : style.innerHTML = e.content,
                        head.appendChild(style)
                } else if (e.url) {
                    var link = document.createElement('link');
                    link.href = e.url,
                        link.rel = 'stylesheet',
                        link.type = 'text/css',
                        head.appendChild(link)
                }
            },
            require.alias = function (libName) {
                return libName
            },
            require.timeout = 5000
    }(this);
    
        Object.defineProperty(window, 'require', {
            get: function () { return require; },
            set: function (v) {
                //console_info('RO Value! New value: ' + v);
            }
        });
        Object.defineProperty(window, 'define', {
            get: function () { return define; },
            set: function (v) {
                //console_info('RO Value! New value: ' + v);
            }
        });
        /* IMPORTANT
         * must freeze `require', otherwize require.alias/.async/.resouceMap will be modified.
         */
        Object.freeze(define);
        Object.freeze(require);
    }
    injectFunction(hookModJS);

    function tunePage() {
        function continueRead() {
            try {
                /* _recycleView hooked in hookModJS() */
                var v = require('wkcommon:widget/ui/reader/view/doc/view.js').view.prototype._recycleView;
            } catch(e) {
                console_error(e.toString());
                var v = e.toString();
            }
            console_info("doc/view.js ... _recycleView:", v.toSource());
            console_info("continueRead >>> ");
            $('.doc-reader').attr('oncopy', "");
            $(".goBtn").click();
        }

        function removeUseless() {
            var rmNodes = [
                '.fix-searchbar-wrap',
                '.doc-tag',
                '.reader-tools-bar-wrap',
                '#Zuniqueid__3',
                '[id^=html-reader-AD]',
                '.banner-core-wrap',
                '.fc-container',
                '.fc-ppt',
                '#ggbtm-ads',
                '.banner-ad',
            ];
            for (var node of rmNodes) {
                var tmpNodes = $(node);
                if (tmpNodes.length == 0)
                    console_info("No node found for " + node);
                else {
                    $(node).hide();
                    $(node).remove();
                }
            }
        }

        window.addEventListener("load", function () {
            console_info("ready!");
            continueRead();
            removeUseless();
        });
    };
    injectFunction(tunePage);
})();

console.log("!!!!!!!!!!!!!!!!!!!!!/save-baidu-wenku-doc!!!!!!!!!!!!!!!!!!!!!!!!");