// ==UserScript== // @id MyNovelReaderDB@gmail.com // @name My Novel Reader.db // @version 1.4 // @namespace MyNovelReaderDB@gmail.com // @author ywzhaiqi@gmail.com // @description 这是 小说阅读脚本 的自定义配置文件,脚本地址:https://greasyfork.org/scripts/292/ // @grant none // @include http*://*.htm // @include http*://*.html // @include http*://*.shtm // @include http*://*.shtml // @include http*://*.aspx // @include http://www.jjwxc.net/onebook.php* // @include http://www.wcxiaoshuo.com/wcxs-* // @include http://www.shuhe.cc/*/*/ // @include http://www.zhuzhudao.com/txt/*/*/ // @include http://www.tadu.com/book/* // @include http://www.qishuwu.com/* // @include http://www.3gsc.com.cn/* // @include http://xs321.net/* // @include http://www.zhaoxiaoshuo.com/chapter-* // @exclude */List.html // @exclude */List.shtml // @exclude */index.html // @exclude */index.shtml // @exclude http*://bbs* // @exclude http*://*/viewforum* // @exclude http*://*/viewtopic* // @run-at document-end // @downloadURL https://update.greasyfork.icu/scripts/20053/My%20Novel%20Readerdb.user.js // @updateURL https://update.greasyfork.icu/scripts/20053/My%20Novel%20Readerdb.meta.js // ==/UserScript== /* 部分代码来自 Super_preloader */ var config = { soduso: false, // www.sodu.so 跳转 content_replacements: true, // 小说屏蔽字修复 fixImageFloats: true, // 图片居中修正 paragraphBlank: true, // 统一段落开头的空格为 2个全角空格 end_color: "#666666", // 最后一页的 链接颜色 }; /** * 注意: * 1、自定义规则,优先级最高。 * 2、小说阅读脚本只限定在一些网站(非全局),故你所添加的规则可能无法生效。 * 解决方法:反馈给作者或在 Greasemonkey/Scriptish 脚本管理处加入。 * 3、如果定义了站点规则会让内置的同个站点的规则失效 * 4、格式要正确,后面要有, */ var SITE_INFO = [ // 极简版规则 { name: "纵横中文网", url: "^http://book\\.zongheng\\.com/\\S+\\/\\d+\\.html$", contentPatch: function(fakeStub){ // 去除隐藏文字 fakeStub.find('.watermark').remove(); } }, /** * 特殊规则,内容用js生成。需要用 iframe 方式或补丁方式(二选一)。 * 下面的起点中文也是如此,但采用另一种补丁的方式。 * iframe方式简单,补丁方式需要分析代码(绿色无污染)。 */ // { // name: "读读看", // url: "^http://www\\.dudukan\\.net/html/.*\\.html$", // exampleUrl: "http://www.dudukan.net/html/90/90733/19323854.html", // contentReplace: "看小说.*|binhuo|www\\.92to\\.com", // useiframe: true, // timeout: 500 // 要等待js把内容生成出来,单位毫秒 // }, // 详细版规则 { // 没什么作用,随意起名 name: "起点中文网", // 匹配的地址,正则。2种形式都可以 url: "^http://read\\.qidian\\.com/\\S+/\\d+,\\d+.aspx$", // (可选)标题正则 titleReg: "小说:(.*?)独家首发\\/(.*?)\\/.*", // (可选)0或1,代表书名的位置,另一个是章节位置 titlePos: 0, // (可选)首页jQuery选择器 indexSelector: ".pageopt a:contains('回目录')", // (可选)上一页jQuery选择器 prevSelector: "a#PrevLink", // (可选)下一页jQuery选择器 nextSelector: "a#NextLink", // (可选)内容jQuery选择器 contentSelector: "#content", // (可选)内容移除,正则表达式 contentReplace: "起点中文网|www\\.qidian\\.com|欢迎广大书友.*", // (可选)下面2个一起。如果加载的下一页没有成功,则设置这个为true或用下面的补丁。 useiframe: false, timeout: 0, // 延迟(毫秒),要等页面的js运行完毕才能获取到内容。 // (可选)补丁,对页面的提前处理,fakeStub 为 $(document) 对象 contentPatch: function(fakeStub){ fakeStub.find('div#content script:first').addClass('reader-ajax'); } }, ]; // 自定义到此为止,下面的不要修改 var readerData = { config: config, SITE_INFO: SITE_INFO }; var JSONString = xToString(readerData); var postString = 'MyNovelReader.db' + JSONString; postData(); window.addEventListener('message', function(e) { var data = e.data; switch (data) { case 'fromeMyNovelReader.post': postData(); break; case 'fromeMyNovelReader.remove': // alert('remove'); window.removeEventListener('message', arguments.callee, false); //释放闭包. break; default: break; } }, false); function postData() { window.postMessage(postString, '*'); } function xToString(x) { //任何转字符串. function toStr(x) { //alert(typeof x); switch (typeof x) { case 'undefined': { return Str(x); } break; case 'boolean': { return Str(x); } break; case 'number': { return Str(x); } break; case 'string': { return ('"' + (x.replace(/(?:\r\n|\n|\r|\t|\\|")/g, function(a) { var ret; switch (a) { //转成字面量 case '\r\n': { ret = '\\r\\n' } break; case '\n': { ret = '\\n'; } break; case '\r': { ret = '\\r' } break; case '\t': { ret = '\\t' } break; case '\\': { ret = '\\\\' } break; case '"': { ret = '\\"' } break; default: {} break; }; return ret; })) + '"'); //'"'+x.replace(/\\/g,'\\\\').replace(/"/g,'\\"')+'"'; } break; case 'function': { /* var fnName=x.name; if(fnName && fnName!='anonymous'){ return x.name; }else{ var fnStr=Str(x); return fnStr.indexOf('native code')==-1? fnStr : 'function(){}'; }; */ var fnStr = Str(x); return fnStr.indexOf('native code') == -1 ? fnStr : 'function(){}'; } break; case 'object': { //注,object的除了单纯{},其他的对象的属性会造成丢失.. if (x === null) { return Str(x); }; //alert(x.constructor); switch (x.constructor) { case Object: { var i; var rStr = ''; for (i in x) { //alert(i); if (!x.hasOwnProperty(i)) { //去掉原型链上的属性. //alert(i); continue; }; rStr += toStr(i) + ':' + toStr(x[i]) + ','; }; return ('{' + rStr.replace(/,$/i, '') + '}'); } break; case Array: { var i; var rStr = ''; for (i in x) { //alert(i); if (!x.hasOwnProperty(i)) { //去掉原型链上的属性. //alert(i); continue; }; rStr += toStr(x[i]) + ','; }; return '[' + rStr.replace(/,$/i, '') + ']'; } break; case String: { return toStr(Str(x)); } break; case RegExp: { return Str(x); } break; case Number: { return Str(x); } break; case Boolean: { return Str(x); } break; default: { //alert(x.constructor);//漏了什么类型么? } break; }; } break; default: break; }; }; var Str = String; return toStr(x); }