My Novel Reader

小说阅读脚本,统一阅读样式,内容去广告、修正拼音字、段落整理,自动下一页

Mint 2017.10.01.. Lásd a legutóbbi verzió

  1. /* This script build by rollup. */
  2. (function () {
  3. 'use strict';
  4.  
  5. function __$styleInject( css ) {
  6. if(!css) return ;
  7.  
  8. if(typeof(window) == 'undefined') return ;
  9. let style = document.createElement('style');
  10. style.setAttribute('media', 'screen');
  11. style.setAttribute('class', 'noRemove');
  12.  
  13. style.innerHTML = css;
  14. document.head.appendChild(style);
  15. return css;
  16. }
  17.  
  18. // ==UserScript==
  19. // @id mynovelreader@ywzhaiqi@gmail.com
  20. // @name My Novel Reader
  21. // @name:zh-CN 小说阅读脚本
  22. // @name:zh-TW 小說閱讀腳本
  23. // @version 6.1.3
  24. // @namespace https://github.com/ywzhaiqi
  25. // @author ywzhaiqi
  26. // @contributor Roger Au, shyangs, JixunMoe、akiba9527 及其他网友
  27. // @description 小说阅读脚本,统一阅读样式,内容去广告、修正拼音字、段落整理,自动下一页
  28. // @description:zh-CN 小说阅读脚本,统一阅读样式,内容去广告、修正拼音字、段落整理,自动下一页
  29. // @description:zh-TW 小說閱讀腳本,統一閱讀樣式,內容去廣告、修正拼音字、段落整理,自動下一頁
  30. // @license GPL version 3
  31. // @grant GM_xmlhttpRequest
  32. // @grant GM_addStyle
  33. // @grant GM_getValue
  34. // @grant GM_setValue
  35. // @grant GM_getResourceURL
  36. // @grant GM_openInTab
  37. // @grant GM_setClipboard
  38. // @grant GM_registerMenuCommand
  39. // @grant GM_info
  40. // @grant unsafeWindow
  41. // @homepageURL https://greasyfork.org/scripts/292/
  42. // @require https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js
  43. // @require https://cdn.staticfile.org/underscore.js/1.7.0/underscore-min.js
  44. // @require https://cdn.staticfile.org/keymaster/1.6.1/keymaster.min.js
  45. // @require https://greasyfork.org/scripts/2672-meihua-cn2tw/code/Meihua_cn2tw.js?version=7375
  46.  
  47. // @connect *
  48. // @connect *://*.qidian.com/
  49.  
  50. // @include *://read.qidian.com/*,*.aspx
  51. // @include *://readbook.qidian.com/bookreader/*,*.html
  52. // @include *://read.qidian.com/BookReaderOld/*,*.aspx
  53. // @include *://read.qidian.com/BookReader/*,*.aspx
  54. // @exclude http://read.qidian.com/BookReader/vol,*,*.aspx
  55. // @include *://wwwploy.qidian.com/BookReader/*,*.aspx
  56. // @include *://free.qidian.com/Free/ReadChapter.aspx?*
  57. // @include *://vipreader.qidian.com/chapter/*/*
  58. // @include *://www.qdmm.com/BookReader/*,*.aspx
  59. // @include *://www.qdwenxue.com/BookReader/*,*.aspx
  60. // @include *://chuangshi.qq.com/read/bookreader/*.html*
  61. // @include *://chuangshi.qq.com/*bk/*/*-r-*.html*
  62. // @include *://yunqi.qq.com/*bk/*/*.html
  63. // @include *://dushu.qq.com/read.html?bid=*
  64. // @include *://www.jjwxc.net/onebook.php?novelid=*
  65. // @include *://my.jjwxc.net/onebook_vip.php?novelid=*&chapterid=*
  66. // @include *://book.zongheng.com/chapter/*/*.html
  67. // @include *://www.xxsy.net/books/*/*.html
  68. // @include *://book.zhulang.com/*/*.html
  69. // @include *://www.17k.com/chapter/*/*.html
  70. // @include *://mm.17k.com/chapter/*/*.html
  71. // @include *://www.kanxia.net/k/*/*/*.html
  72. // @include *://www.qingdi.com/files/article/html/*/*/*.html
  73. // @include *://www.xkzw.org/*/*.html
  74. // @include *://shouda8.com/*/*.html
  75. // @include *://novel.hongxiu.com/*/*/*.shtml
  76. // @include *://www.readnovel.com/novel/*.html
  77. // http://www.tianyabook.com/*/*.htm
  78.  
  79. // @include *://tieba.baidu.com/p/*
  80. // @include *://booklink.me/*
  81. // @include *://2.booklink.me/*
  82.  
  83. // booklink.me
  84. // @include *://www.shumil.com/*/*.html
  85. // @include *://www.wcxiaoshuo.com/wcxs-*-*/
  86. // @include *://www.xiaoshuoz.com/wcxs-*-*/
  87. // @include *://www.quledu.com/wcxs-*-*/
  88. // @include *://www.ranwen.cc/*/*/*/*.html
  89. // @include *://www.ranwen.net/files/article/*/*/*.html
  90. // @include *://www.ranwena.com/files/article/*/*/*.html
  91. // @include *://www.64mi.com/*/*/*/*.html
  92. // @include *://www.bxs.cc/*/*.html*
  93. // @include *://www.laishuwu.com/html/*/*/*.html
  94. // @include *://www.binhuo.com/html/*/*/*.html
  95. // @include *://www.haoqi99.com/haoqi99/*/*/*.shtml
  96. // @include *://www.shuhe.cc/*/*/
  97. // @include *://www.dudukan.net/html/*/*/*.html
  98. // @include *://www.hahawx.com/*/*/*.htm
  99. // @include *://www.zhuzhudao.com/txt/*/*/
  100. // @include *://www.zhuzhudao.cc/txt/*/*/
  101. // @include *://www.dahaomen.net/txt/*/*/
  102. // @include *://www.tadu.com/book/*/*/
  103. // @exclude *://www.tadu.com/book/*/toc/
  104. // @include *://www.aishoucang.com/*/*.html
  105. // @include *://www.wanshuba.com/Html/*/*/*.html
  106. // @include *://www.zhuishu.net/files/article/html/*/*/*.html
  107. // @include *://www.sqsxs.com/*/*/*.html*
  108. // @include *://www.caiwei.tw/html/*/*.html
  109. // @include *://www.hotsk.com/Html/Book/*/*/*.shtml
  110. // @include *://www.92to.com/*/*/*.html
  111. // @include *://www.qirexs.com/read-*-chapter-*.html
  112. // @include *://www.du00.com/read/*/*/*.html
  113. // @include *://www.qishuwu.com/*/*/
  114. // @include *://www.wandoou.com/book/*/*.html
  115. // @include *://www.6yzw.org/*/*.html
  116. // @include *://www.6yzw.com/*/*.html
  117. // @include *://www.daomengren.com/*/*.html
  118. // @include *://muyuge.com/*/*.html
  119. // @include *://www.muyuge.net/*/*.html
  120. // @include *://bbs.vyming.com/novel-read-*-*.html
  121. // @include *://www.9imw.com/novel-read-*-*.html
  122. // @include *://www.23zw.com/olread/*/*/*.html
  123. // @include *://www.50zw.com/book_*/*.html
  124. // @include *://www.xiangcunxiaoshuo.com/shu/*/*.html
  125. // @include *://www.lwxs520.com/books/*/*/*.html
  126. // @include *://www.zashu.net/books/*/*/*.html
  127. // @include *://www.yunlaige.com/html/*/*/*.html
  128. // @include *://www.cfwx.net/files/article/html/*/*/*.html
  129. // @include *://www.qiuwu.net/html/*/*/*.html
  130. // @include *://www.fengwu.org/html/*/*/*.html
  131. // @include *://www.wenxue8.org/html/*/*/*.html
  132.  
  133. // @include *://www.xs84.com/*_*/*
  134. // @include *://www.geiliwx.com/GeiLi/*/*/*.shtml*
  135. // @include *://www.123yq.com/read/*/*/*.shtml
  136. // @include *://www.123yq.org/read/*/*/*.shtml
  137. // @include *://www.dhzw.com/book/*/*/*.html
  138. // *://www.du00.cc/read/*/*/*.html
  139. // @include *://www.aszw.com/book/*/*/*.html
  140. // @include *://www.xsbashi.com/*_*/
  141. // @include *://www.vodtw.com/Html/Book/*/*/*.html
  142. // @include *://www.fhxs.com/read/*/*/*.shtml
  143. // @include *://www.snwx.com/book/*/*/*.html
  144.  
  145. // www.sodu.so
  146. // @include *://www.jiaodu8.com/*/*/*/*.html
  147. // @include *://www.fktxt.com/book/*/*.html
  148. // @include *://www.186s.cn/files/article/html/*/*/*.html
  149. // @include *://www.6xs.cn/xs/*/*/*.html
  150. // @include *://www.chaojiqiangbing.com/book/*/*/*.html
  151. // @include *://book.moka123.com/book/*/*/*.html
  152. // @include *://www.suimeng.com/files/article/html/*/*/*.html
  153. // @include *://www.hao662.com/haoshu/*/*/*.html
  154.  
  155. //www.verydu.net
  156. // http://www.yawen8.com/*/*/*.html
  157. // @include *://www.tsxs.cc/files/article/html/*/*/*.html
  158. // @include *://www.ziyuge.com/*/*/*/*/*.html
  159.  
  160. // 其它网站
  161. // @include *://book.sfacg.com/Novel/*/*/*/
  162. // @include *://www.7dsw.com/book/*/*/*.html
  163. // @include *://www.d586.com/*/*/
  164. // @include *://www.bookgew.com/Html/Book/*/*/*.htm
  165. // @include *://read.shuhaha.com/Html/Book/*/*/*.html
  166. // @include *://www.shuhaha.com/Html/Book/*/*/*.html
  167. // @include *://www.biqi.me/files/article/html/*/*/*.html
  168. // @include *://www.ttzw.com/book/*/*.html
  169. // @include *://www.uukanshu.com/*/*/*.html
  170. // @include *://www.uukanshu.net/*/*/*.html
  171. // @include *://www.173ed.com/read/*/*.html
  172. // @include *://www.a240.com/read/*/*.html
  173. // @include *://www.zhuishu.com/*/*.html
  174. // @include *://www.shuangde.cc/*/*.html
  175. // @include *://www.shenmaxiaoshuo.com/ml-*-*/
  176. // @include *://www.86kankan.com/read/*/*.html
  177. // @include *://www.fkzww.com/*/*/*.html
  178. // @include *://www.151kan.com/*/*/*/*.html
  179. // @include *://www.bookabc.net/*/*/*.html
  180. // @include *://www.xshuotxt.com/*/*/*/*.html
  181. // @include *://www.doulaidu.com/*/*/*.html
  182. // @include *://www.d586.com/*/*/
  183. // @include *://www.kanshu.la/book/*/*html
  184. // @include *://www.wtcxs.com/files/article/html/*/*/*.html
  185. // @include *://www.5du5.com/book/*/*/*.html
  186. // @include *://book.kanunu.org/*/*/*.html
  187. // @include *://www.kanunu8.com/book*/*.html
  188. // @include *://paitxt.com/*/*/*.html
  189. // @include *://www.shunong.com/yuedu/*/*/*.html
  190. // @include *://book.yayacms.com/*/book_*_*.html
  191. // @include *://www.yqhhy.cc/*/*/*.html
  192. // @include *://www.nuoqiu.com/static/*/*.html
  193. // @include *://www.17yue.com/*/*/*.html
  194. // @include *://dukeba.com/book/*/*/*.shtml
  195. // @include *://www.wenchangshuyuan.com/html/*/*/*.html
  196. // @include *://www.pofeng.net/xiaoshuo/*/*.html
  197. // @include *://www.epzww.com/book/*/*
  198. // @include *://*.xiaoshuokan.com/haokan/*/*.html
  199. // @include *://www.wobudu.com/*/*.html
  200. // @include *://www.qb5.com/xiaoshuo/*/*/*.html
  201. // @include *://www.x23us.com/html/*/*/*.html
  202. // @include *://www.23us.com/html/*/*/*.html
  203. // @include *://www.23us.cc/html/*/*/*.html
  204. // @include *://www.23wx.com/html/*/*/*.html
  205. // @include *://www.xs222.com/html/*/*/*.html
  206. // @include *://www.bixiage.com/*/*/*/*.html
  207. // @include *://www.ranwenxiaoshuo.com/files/article/html/*/*/*.html
  208. // @include *://www.ranwenxiaoshuo.com/*/*-*-*.html
  209. // @include *://www.bjxiaoshuo.com/bjxs-*-*/
  210. // @include *://www.59shuku.com/xiaoshuo/*/*.htm
  211. // @include *://www.16kbook.org/Html/Book/*/*/*.shtml
  212. // @include *://www.dixiaoshuo.com/Html/*/*.html
  213. // @include *://www.nieshu.com/Book/*/*/*.shtml
  214. // @include *://www.tlxsw.com/files/article/html/*/*/*.html
  215. // @include *://www.1kanshu.com/files/article/html/*/*/*.html
  216. // @include *://www.uutxt.org/book/*/*/*.html
  217. // @include *://www.5800.cc/*/*/*/*.html
  218. // @include *://www.biquge.com/*/*.html
  219. // @include *://www.biquge.la/book/*/*.html
  220. // @include *://www.biquge.com.tw/*/*.html
  221. // @include *://www.biquge.tw/*_*/*.html
  222. // @include *://www.biqugezw.com/*/*.html
  223. // @include *://www.biquzi.com/*_*/*.html
  224. // @include *://www.qududu.com/book/*/*/*.html
  225. // @include *://www.free97.cn/book/*/*/*.html
  226. // @include *://www.122s.com/book/*/*.html
  227. // @include *://www.123du.net/dudu-*/*/*.html
  228. // @include *://www.123du.cc/dudu-*/*/*.html
  229. // @include *://www.123du.net/book/*/*.html
  230. // @include *://www.hwafa.com/*/*.html
  231. // @include *://www.qmshu.com/html/*/*/*.html
  232. // @include *://dlzw.cc/article-*-*.html
  233. // @include *://www.shushu5.com/read/*/*.html
  234. // @include *://www.xiaoyanwenxue.com/files/article/html/*/*/*.html
  235. // @include *://www.3gsc.com.cn/bookcon/*_*_*
  236. // @include *://www.bj-ibook.cn/book/*/*/*.htm
  237. // @include *://www.baoliny.com/*/*.html
  238. // @include *://www.dajiadu.net/files/article/html/*/*/*.html
  239. // @include *://www.yankuai.com/files/article/html/*/*/*.html
  240. // @include *://www.docin.net/*/*.html
  241. // @include *://www.dushuge.net/html/*/*/*.html
  242. // @include *://www.xunshu.org/xunshu/*/*/*.html
  243. // @include *://www.moneyren.com/book/*/*/*.shtml
  244. // @include *://wemaxfilipino.com/*/*/*.html
  245. // @include *://www.85618892.cn/xiaoshuo/*/*/*.shtml
  246. // @include *://www.bookba.net/Html/Book/*/*/*.html
  247. // @include *://www.moksos.com/*/*/*.html
  248. // @include *://dudu8.net/novel/*/*/*.html
  249. // @include *://www.dawenxue.net/html/*/*/*.html
  250. // @include *://www.yanmoxuan.org/book/*/*/*.html
  251. // @include *://www.duyidu.com/xiaoshuo/*/*/*.html
  252. // @include *://www.69zw.com/xiaoshuo/*/*/*.html
  253. // @include *://www.kan7.com/xiaoshuo/*/*/*.html
  254. // @include *://www.laishu.com/book/*/*/*.shtml
  255. // @include *://www.bxwx.org/b/*/*/*.html
  256. // @include *://www.bxzw.org/*/*/*/*.shtml
  257. // @include *://www.360118.com/html/*/*/*.html
  258. // @include *://www.59to.com/files/article/xiaoshuo/*/*/*.html
  259. // @include *://www.dyzww.com/cn/*/*/*.html
  260. // @include *://www.9wh.net/*/*/*.html
  261. // @include *://www.luoqiu.net/html/*/*/*.html
  262. // @include *://www.luoqiu.com/html/*/*/*.html
  263. // @include *://www.epzw.com/files/article/html/*/*/*.html
  264. // @include *://www.dashubao.co/book/*/*/*.html
  265. // @include *://b.faloo.com/p/*/*.html
  266. // @include *://www.baikv.com/*/*.html
  267. // @include *://www.66721.com/*/*/*.html
  268. // @include *://www.3dllc.com/html/*/*/*.html
  269. // @include *://www.xstxt.com/*/*/
  270. // @include *://www.zzzcn.com/3z*/*/
  271. // @include *://www.zzzcn.com/modules/article/App.php*
  272. // @include *://www.nilongdao.com/book/*/*/*.html
  273. // @include *://xs321.net/*/*/
  274. // @include *://read.guanhuaju.com/files/article/html/*/*/*.html
  275. // @include *://www.book108.com/*/*/*.html
  276. // @include *://5ycn.com/*/*/*.html
  277. // @include *://www.zhaoxiaoshuo.com/chapter-*-*-*/
  278. // @include *://*zbzw.com/*/*.html
  279. // @include *://manghuangji.cc/*/*.html
  280. // @include *://www.aiqis.com/*/*.html
  281. // @include *://www.fftxt.net/book/*/*.html
  282. // @include *://www.5kwx.com/book/*/*/*.html
  283. // @include *://www.uuxiaoshuo.net/html/*/*/*.html
  284. // @include *://www.sanyyo.org/*.html
  285. // @include *://www.chinaisbn.com/*/*/*.html
  286. // @include *://www.caihongwenxue.com/Html/Book/*/*/*.html
  287. // @include *://www.shushuw.cn/shu/*/*.html
  288. // @include *://www.78xs.com/article/*/*/*.shtml
  289. // @include *://www.woaixiaoshuo.com/xiaoshuo/*/*/*.html
  290. // @include *://www.ty2016.com/book/*/*.html
  291. // @include *://wx.ty2016.com/*/*/*.html
  292. // @include *://www.my285.com/*/*/*/*.htm
  293. // @include *://www.5858xs.com/html/*/*/*.html
  294. // @include *://book.58xs.com/html/*/*/*.html
  295. // @include *://book.mihua.net/*/*/*/*.html
  296. // @include *://www.hjwzw.com/Book/Read/*,*
  297. // @include *://www.hjwzw.com/Book/Read/*_*
  298. // @include *://www.365essay.com/*/*.htm
  299. // @include *://www.gengxin8.com/read/*/*.html
  300. // @include *://www.365xs.org/books/*/*/*.html
  301. // @include *://www.wuruo.com/files/article/html/*/*/*.html
  302. // @include *://*.8shuw.net/book/*/*.html
  303. // @include *://www.pashuw.com/BookReader/*/*.html
  304. // @include *://read.shanwen.com/html/*/*/*.html
  305. // @include *://www.qqxs.cc/xs/*/*/*.html
  306. // @include *://www.69shu.com/txt/*/*
  307. // @include *://www.e8zw.com/book/*/*/*.html
  308. // @include *://www.8535.org/*/*/*.html*
  309. // @include *://www.yfzww.com/books/*/*/*.htm
  310. // @include *://www.lewen8.com/lw*/*.html
  311. // @include *://www.pinwenba.com/read/*/*.html
  312. // @include *://down1.qidian.com/bookall/*.htm*
  313. // @include *://www.77nt.com/*/*.html
  314. // @include *://www.quanbenba.com/yuedu/*/*/*.html
  315. // @include *://www.sto.cc/book-*-*.html
  316. // @include *://www.151xs.com/wuxiazuoxiong/*/chapter/*/
  317. // @include *://www.qududu.net/book/*/*/*.html
  318. // @include *://www.qingdou.cc/chapter*
  319. // @include *://www.shuyuewu.com/kan*
  320. // @include *://www.1553.net/*/*
  321. // @include *://www.269s.com/*/*/*
  322. // @include *://www.33yq.com/read/*/*/*.shtml
  323. // @include *://233yq.com/xiaoshuo/*.html
  324. // @include *://www.50zw.co/book_*/*.html
  325. // @include *://www.bqg5200.com/xiaoshuo/*/*/*.html
  326. // @include *://www.50zw.la/book_*/*.html
  327. // @include *://www.qu.la/book/*/*.html
  328. // @include *://www.luoqiu.com/read/*/*.html
  329. // @include *://www.54tushu.com/book_library/chaptershow/theId/*.html
  330. // @include *://www.snwx8.com/book/*/*/*.html
  331. // @include *://read.qidian.com/chapter/*
  332. // @include *://www.23zw.me/olread/*/*/*.html
  333. // @include *://www.piaotian.com/html/*/*/*.html
  334. // @include *://www.piaotian.net/html/*/*/*.html
  335. // @include *://www.dhzw.org/book/*/*/*.html
  336. // @include *://www.biqiuge.com/book/*/*.html
  337. // @include *://www.baquge.com/files/article/html/*/*/*.html
  338. // @include *://www.baquge.tw/files/article/html/*/*/*.html
  339. // @include *://www.qu.la/book/*/*.html
  340. // @include *://www.bxwx9.org/b/*/*/*.html
  341. // @include *://www.miaobige.com/*/*/*.html
  342. // @include *://www.52dsm.com/chapter/*/*.html
  343. // @include *://www.banfusheng.com/chapter/*/*.html
  344. // @include *://www.remenxs.com/du_*/*/
  345. // @include *://www.shuhai.com/read/*/*.html
  346. // @include *://www.hbooker.com/chapter/book_chapter_detail/*
  347. // @include *://www.mht.la/*/*/*.html
  348. // @include *://www.paomov.com/*/*/*.html
  349. // @include *://www.moyuanwenxue.com/xiaoshuo/*/*/*.htm
  350. // @include *://www.ggdown.com/modules/article/reader.php?aid=*
  351. // @include *://www.daizhuzai.com/*/*.html
  352. // @include *://www.mywenxue.com/xiaoshuo/*/*/*.htm
  353. // @include *://www.yueduyue.com/*/*.html
  354. // @include *://www.67shu.com/*/*/*.html
  355. // @include *://www.wangshuge.com/books/*/*/*.html
  356. // @include *://www.23sw.net/*/*/*.html
  357. // @include *://www.ybdu.com/xiaoshuo/*/*/*.html
  358. // @include *://www.shudaizi.org/book/*/*.html
  359. // @include *://www.ymoxuan.com/book/*/*/*.html
  360. // @include *://www.67shu.com/*/*/*.html
  361. // @include *://www.bookxuan.com/*/*.html
  362. // @include *://www.2kxs.com/xiaoshuo/*/*.html
  363. // @include *://www.88dushu.com/xiaoshuo/*/*/*.html
  364. // @include *://www.wutuxs.com/html/*/*/*.html
  365. // @include *://www.23qb.com/book/*/*.html
  366. // @include *://www.biqu6.com/*/*.html
  367. // @include *://www.niepo.net/html/*/*/*.html
  368. // @include *://www.booktxt.net/*/*.html
  369. // @include *://www.aszw.org/book/*/*/*.html
  370. // @include *://www.xiashu.cc/*/*.html
  371. // @include *://www.lewenxiaoshuo.com/books/*/*.html
  372. // @include *://www.heihei66.com/*/*/*.html
  373. // @include *://www.111bz.net/*/*.html
  374. // @include *://www.biquge5200.com/*/*.html
  375.  
  376. // 移动版
  377. // @include *://wap.yc.ireader.com.cn/book/*/*/
  378. // @include *://m.jjwxc.net/book2/*/*
  379.  
  380. // @exclude */List.htm
  381. // @exclude */List.html
  382. // @exclude */List.shtml
  383. // @exclude */index.htm
  384. // @exclude */index.html
  385. // @exclude */index.shtml
  386. // @exclude */Default.htm
  387. // @exclude */Default.html
  388. // @exclude */Default.shtml
  389.  
  390. // @run-at document-end
  391. // ==/UserScript==
  392.  
  393. // 其它设置
  394. const config = {
  395. lang: 'zh-CN',
  396.  
  397. soduso: false, // www.sodu.so 跳转
  398. // content_replacements: true, // 小说屏蔽字修复
  399. fixImageFloats: true, // 图片居中修正
  400. paragraphBlank: true, // 统一段落开头的空格为 2个全角空格
  401. end_color: "#666666", // 最后一页的链接颜色
  402. PRELOADER: true, // 提前预读下一页
  403.  
  404. xhr_time: 15 * 1000,
  405. download_delay: 100, // 毫秒。0 毫秒下载起点 vip 限时免费章节会被封
  406. dumpContentMinLength: 3, // 检测重复内容的最小行数
  407. };
  408.  
  409. var uiTrans = {
  410. "将小说网页文本转换为繁体。\n\n注意:内置的繁简转换表,只收录了简单的单字转换,启用本功能后,如有错误转换的情形,请利用脚本的自订字词取代规则来修正。\n例如:「千里之外」,会错误转换成「千里之外」,你可以加入规则「千里之外=千里之外」来自行修正。": "將小說網頁文字轉換為繁體。\n\n注意:內建的繁簡轉換表,只收錄了簡單的單字轉換,啟用本功能後,如有錯誤轉換的情形,請利用腳本的自訂字詞取代規則來修正。\n例如:「千里之外」,會錯誤轉換成「千裡之外」,你可以加入規則「千裡之外=千里之外」來自行修正。",
  411. "图片章节用夜间模式没法看,这个选项在启动时会自动切换到缺省皮肤": "圖片章節無法以夜間模式觀看,這個選項在啟動時會自動切換到預設佈景",
  412. "通过快捷键切换或在 Greasemonkey 用户脚本命令处打开设置窗口": "通過熱鍵切換或在 Greasemonkey 使用者腳本命令處開啟設定視窗",
  413. "隐藏后通过快捷键或 Greasemonkey 用户脚本命令处调用": "隱藏後通過熱鍵或 Greasemonkey 使用者腳本命令處調用",
  414. "一行一个,每行第一个 = 为分隔符\n需要刷新页面生效": "一行一條規則,每一行第一個 = 為分隔符\n(需重新載入頁面才能生效)",
  415. "错误:没有找到下一页的内容,使用右键翻到下一页": "錯誤:沒有找到下一頁的內容,使用右鍵翻到下一頁",
  416. "左键滚动,中键打开链接(无阅读模式)": "左鍵捲動畫面至該章節,中鍵開啟連結(無閱讀模式)",
  417. "请输入切换左侧章节列表的快捷键:": "請輸入切換左側章節列表的熱鍵:",
  418. "详见脚本代码的 Rule.specialSite": "詳見腳本代碼的 Rule.specialSite",
  419. "booklink.me 点击的网站强制启用": "booklink.me 點擊的網站強制啟用",
  420. "部分选项需要刷新页面才能生效": "部份選項需重新載入頁面才能生效",
  421. "取消本次设定,所有选项还原": "取消本次設定,所有選項還原",
  422. "不影响 booklink.me 的启用": "不影響 booklink.me 的啟用",
  423. "请输入打开设置的快捷键:": "請輸入開啟設定視窗的熱鍵:",
  424. "微软雅黑,宋体,黑体,楷体": "Microsoft YaHei,新細明體,PMingLiU,MingLiU,細明體,標楷體",
  425. "夜间模式的图片章节检测": "夜間模式的圖片章節檢測",
  426. "点击显示隐藏章节列表": "點此以顯示或隱藏章節列表",
  427. "添加下一页到历史记录": "加入下一頁到歷史記錄",
  428. "booklink 自动启用": "booklink 自動啟用",
  429. "Enter 键打开目录": "Enter 鍵開啟目錄",
  430. "隐藏左侧章节列表": "隱藏左側章節列表",
  431. "小说阅读脚本设置":"小說閱讀腳本設定",
  432. "已到达最后一页": "已到達最後一頁",
  433. "正在载入下一页": "正在載入下一頁",
  434. "通过快捷键切换": "通過熱鍵切換",
  435. "隐藏底部导航栏": "隱藏底部導航列",
  436. "隐藏左侧导航条": "隱藏左側章節列表彈出鈕",
  437. "主页链接没有找到": "未找到主頁連結",
  438. "自定义站点规则": "自訂網站規則",
  439. "自定义替换规则": "自訂字詞取代規則",
  440. "网页:转繁体": "網頁:轉繁體",
  441. "双击暂停翻页": "雙擊暫停翻頁",
  442. "隐藏设置按钮": "隱藏設定按鈕",
  443. "强制手动启用": "強制手動啟用",
  444. "调用阅读器": "調用閱讀器",
  445. "自定义样式": "自訂樣式",
  446. "界面语言": "介面語言",
  447. "打开目录": "開啟本書目錄頁",
  448. "自动翻页": "自動翻頁",
  449. "缺省皮肤": "預設佈景",
  450. "暗色皮肤": "暗色佈景",
  451. "夜间模式": "夜間模式",
  452. "夜间模式1": "夜間模式1",
  453. "夜间模式2": "夜間模式2",
  454. "橙色背景": "橙色背景",
  455. "绿色背景": "綠色背景",
  456. "绿色背景2": "綠色背景2",
  457. "蓝色背景": "藍色背景",
  458. "棕黄背景": "棕黃背景",
  459. "经典皮肤": "經典背景",
  460. "阅读模式": "閱讀模式",
  461. "调试模式": "偵錯模式",
  462. "反馈地址": "反饋與討論",
  463. "安静模式": "安靜模式",
  464. "√ 确认": "√ 確定",
  465. "X 取消": "X 取消",
  466. "上一页": "上一頁",
  467. "下一页": "下一頁",
  468. "状态": "狀態",
  469. "已经": "已經",
  470. "暂停": "暫停",
  471. "启用": "啟用",
  472. "退出": "離開",
  473. "测试": "測試",
  474. "距离": "距離",
  475. "加载": "載入",
  476. "字体": "字型",
  477. "行高": "行距",
  478. "行宽": "版面寬度",
  479. "目录": "目錄"
  480. };
  481.  
  482. if(!String.prototype.uiTrans){
  483. Object.defineProperty(String.prototype, 'uiTrans', {
  484. value: function(){
  485. var _this = this.valueOf(), key, regexp;
  486. if(config.lang !== 'zh-TW') return _this;
  487.  
  488. if(uiTrans.hasOwnProperty(_this)) return uiTrans[_this];
  489.  
  490. for (key in uiTrans) {
  491. regexp = new RegExp(key, 'g');
  492. _this = _this.replace(regexp, uiTrans[key]);
  493. }
  494. return _this;
  495. },
  496. enumerable: false
  497. });
  498. }
  499.  
  500. // 参考 https://github.com/madrobby/zepto/blob/master/src/detect.js
  501.  
  502. const ua = navigator.userAgent;
  503. const platform = navigator.platform;
  504.  
  505. const isFirefox = ua.match(/Firefox\/([\d.]+)/);
  506.  
  507. const isChrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/);
  508.  
  509. const isWindows = /Win\d{2}|Windows/.test(platform);
  510.  
  511. //------------------- 辅助函数 ----------------------------------------
  512. var nullFn = function() {};
  513.  
  514. // @require https://greasyfork.org/scripts/2599-gm-2-port-function-override-helper/code/GM%202%20port%20-%20Function%20Override%20Helper.js?version=184155
  515. // Check if is GM 2.x
  516. if (typeof window.exportFunction == 'undefined') {
  517. // For GM 1.x backward compatibility, should work.
  518. window.exportFunction = (function(foo, scope, defAs) {
  519. scope[defAs.defineAs] = foo;
  520. }).bind(unsafeWindow);
  521. }
  522.  
  523. var C;
  524.  
  525. function toggleConsole(debug) {
  526. if (debug) {
  527. C = console;
  528. } else {
  529. C = {
  530. log: nullFn,
  531. debug: nullFn,
  532. error: nullFn,
  533. group: nullFn,
  534. groupCollapsed: nullFn,
  535. groupEnd: nullFn,
  536. time: nullFn,
  537. timeEnd: nullFn,
  538. };
  539. }
  540. }
  541.  
  542. function L_getValue(key) { // 个别用户禁用本地存储会报错
  543. try {
  544. return localStorage.getItem(key);
  545. } catch (e) {}
  546. }
  547.  
  548. function L_setValue(key, value) {
  549. try {
  550. localStorage.setItem(key, value);
  551. } catch (e) {}
  552. }
  553.  
  554. function L_removeValue(key) {
  555. try {
  556. localStorage.removeItem(key);
  557. } catch (e) {}
  558. }
  559.  
  560.  
  561. function parseHTML$1(str) {
  562. var doc;
  563. try {
  564. // firefox and chrome 30+,Opera 12 会报错
  565. doc = new DOMParser().parseFromString(str, "text/html");
  566. } catch (ex) {}
  567.  
  568. if (!doc) {
  569. doc = document.implementation.createHTMLDocument("");
  570. doc.querySelector("html").innerHTML = str;
  571. }
  572. return doc;
  573. }
  574.  
  575. function toRE(obj, flag) {
  576. if (obj instanceof RegExp) {
  577. return obj;
  578. } else {
  579. return new RegExp(obj, (flag || 'ig'));
  580. }
  581. }
  582.  
  583. function toReStr(str) { // 处理字符串,否则可能会无法用正则替换
  584. return str.replace(/[()\[\]{}|+.,^$?\\*]/g, "\\$&");
  585. }
  586.  
  587. function wildcardToRegExpStr(urlstr) {
  588. if (urlstr.source) return urlstr.source;
  589. var reg = urlstr.replace(/[()\[\]{}|+.,^$?\\]/g, "\\$&").replace(/\*+/g, function(str){
  590. return str === "*" ? ".*" : "[^/]*";
  591. });
  592. return "^" + reg + "$";
  593. }
  594.  
  595. function getUrlHost(url) {
  596. var a = document.createElement('a');
  597. a.href = url;
  598. return a.host;
  599. }
  600.  
  601. // 模板
  602. $.nano = function(template, data) {
  603. return template.replace(/\{([\w\.]*)\}/g, function(str, key) {
  604. var keys = key.split("."),
  605. v = data[keys.shift()];
  606. try {
  607. for (var i = 0, l = keys.length; i < l; i++) v = v[keys[i]];
  608. } catch (e) {}
  609. return (typeof v !== "undefined" && v !== null) ? v : "";
  610. });
  611. };
  612.  
  613. // jQuery text 完全匹配. e.g. a:econtains('最新章节')
  614. $.expr[":"].econtains = function(obj, index, meta, stack) {
  615. return (obj.textContent || obj.innerText || $(obj).text() || "").toLowerCase() == meta[3].toLowerCase();
  616. };
  617.  
  618. /* jshint ignore: start */
  619.  
  620. function $x(aXPath, aContext) {
  621. var nodes = [];
  622. var doc = document;
  623. aContext = aContext || doc;
  624.  
  625. try {
  626. var results = doc.evaluate(aXPath, aContext, null,
  627. XPathResult.ANY_TYPE, null);
  628. var node;
  629. while (node = results.iterateNext()) {
  630. nodes.push(node);
  631. }
  632. } catch (ex) {}
  633.  
  634. return nodes;
  635. }
  636.  
  637. if (typeof String.prototype.startsWith != 'function') {
  638. String.prototype.startsWith = function(str) {
  639. return this.slice(0, str.length) == str;
  640. };
  641. }
  642.  
  643. if (typeof String.prototype.endsWith != 'function') {
  644. String.prototype.endsWith = function(str) {
  645. return this.slice(-str.length) == str;
  646. };
  647. }
  648.  
  649. if (!String.prototype.includes) {
  650. String.prototype.includes = function(search, start) {
  651. 'use strict';
  652. if (typeof start !== 'number') {
  653. start = 0;
  654. }
  655. if (start + search.length > this.length) {
  656. return false;
  657. } else {
  658. return this.indexOf(search, start) !== -1;
  659. }
  660. };
  661. }
  662.  
  663.  
  664. /*
  665. * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
  666. */
  667. jQuery.easing.jswing=jQuery.easing.swing,jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(a,b,c,d,e){return jQuery.easing[jQuery.easing.def](a,b,c,d,e)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return 0==b?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return 0==b?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;return 0==b?c:1==(b/=e)?c+d:(g||(g=.3*e),h<Math.abs(d)?(h=d,f=g/4):f=g/(2*Math.PI)*Math.asin(d/h),-(h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g))+c)},easeOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;return 0==b?c:1==(b/=e)?c+d:(g||(g=.3*e),h<Math.abs(d)?(h=d,f=g/4):f=g/(2*Math.PI)*Math.asin(d/h),h*Math.pow(2,-10*b)*Math.sin((b*e-f)*2*Math.PI/g)+d+c)},easeInOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;return 0==b?c:2==(b/=e/2)?c+d:(g||(g=e*.3*1.5),h<Math.abs(d)?(h=d,f=g/4):f=g/(2*Math.PI)*Math.asin(d/h),1>b?-.5*h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)+c:.5*h*Math.pow(2,-10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)+d+c)},easeInBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),d*(b/=e)*b*((f+1)*b-f)+c},easeOutBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),d*((b=b/e-1)*b*((f+1)*b+f)+1)+c},easeInOutBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),(b/=e/2)<1?d/2*b*b*(((f*=1.525)+1)*b-f)+c:d/2*((b-=2)*b*(((f*=1.525)+1)*b+f)+2)+c},easeInBounce:function(a,b,c,d,e){return d-jQuery.easing.easeOutBounce(a,e-b,0,d,e)+c},easeOutBounce:function(a,b,c,d,e){return(b/=e)<1/2.75?d*7.5625*b*b+c:2/2.75>b?d*(7.5625*(b-=1.5/2.75)*b+.75)+c:2.5/2.75>b?d*(7.5625*(b-=2.25/2.75)*b+.9375)+c:d*(7.5625*(b-=2.625/2.75)*b+.984375)+c},easeInOutBounce:function(a,b,c,d,e){return e/2>b?.5*jQuery.easing.easeInBounce(a,2*b,0,d,e)+c:.5*jQuery.easing.easeOutBounce(a,2*b-e,0,d,e)+.5*d+c}});
  668.  
  669. /* jshint ignore: end */
  670.  
  671. // ===== 自定义站点规则 =====
  672.  
  673. const sites = [
  674. // 详细版规则示例。注:该网站已无法访问。
  675. {siteName: "泡书吧", // 站点名字... (可选)
  676. url: "^https?://www\\.paoshu8\\.net/Html/\\S+\\.shtm$", // // 站点正则... (~~必须~~)
  677.  
  678. // 获取标题
  679. titleReg: /(.*?)最新章节 [-_\\\/](.*?)[-_\/].*/, // 书籍标题、章节标题正则 (可选)
  680. titlePos: 0, // 书籍标题位置:0 或 1 (可选,默认为 0)
  681. titleSelector: "#title h1",
  682.  
  683. indexSelector: "a:contains('回目录')", // 首页链接 jQuery 选择器 (不填则尝试自动搜索)
  684. prevSelector: "a:contains('翻上页')", // 上一页链接 jQuery 选择器 (不填则尝试自动搜索)
  685. nextSelector: "a:contains('翻下页')", // 下一页链接 jQuery 选择器 (不填则尝试自动搜索)
  686.  
  687. // nDelay: 500, // 延迟0.5秒加载下一页
  688.  
  689. // 获取内容
  690. contentSelector: "#BookText", // 内容 jQuery 选择器 (不填则尝试自动搜索)
  691. useiframe: false, // (可选)下一页加载是否使用 iframe
  692. // mutationSelector: "#chaptercontainer", // (可选)内容生成监视器
  693. // 对内容的处理
  694. contentHandle: false, // (可选)是否对内容进行特殊处理,诸如拼音字修复等,诸如起点等网站可禁用
  695. fixImage: true, // (可选),图片居中,不分大小
  696. contentReplace: /(\*W|(w|\(w).{10,25}(吧\*|)|\))|看小说就上|本书首发|泡.{1,6}吧|百度搜索阅读最新最全的小说|http:\/\/www.paoshu8.com\/|无弹窗/g, // 需要移除的内容正则 (可选)
  697. contentPatch: function(fakeStub){ // (可选)内容补丁。解决翻页是脚本的情况
  698. var $next = fakeStub.find('#LinkMenu');
  699. $next.html($next.html().replace(/<script>ShowLinkMenu.*?(<a.*?a>).*?(<a.*?a>).*?script>/,'$1$2') +
  700. '<a href=\'List.shtm\'>回目录</a>');
  701. }
  702. },
  703. {siteName: '起点新版-阅文',
  704. url: '^https?://(?:read|vipreader)\\.qidian\\.com/chapter/.*',
  705. exclude: ' /lastpage/',
  706. bookTitleSelector: '#bookImg',
  707. titleSelector: 'h3.j_chapterName',
  708.  
  709. prevSelector: '#j_chapterPrev',
  710. nextSelector: '#j_chapterNext',
  711. indexSelector: function(obj) {
  712. var url = obj.find(".chapter-control a:contains('目录')").attr('href');
  713. return url;
  714. },
  715.  
  716. contentSelector: '.read-content.j_readContent',
  717. contentRemove: '',
  718. contentReplace: [
  719. '手机用户请到m.qidian.com阅读。',
  720. '起点中文网www.qidian.com欢迎广大书友光临阅读,最新、最快、最火的连载作品尽在起点原创!.*'
  721. ],
  722. isVipChapter: function($doc) {
  723. if ($doc.find('.vip-limit-wrap').length) {
  724. return true;
  725. }
  726. }
  727. },
  728. // 特殊站点,需再次获取且跨域。添加 class="reader-ajax",同时需要 src, charset
  729. {siteName: '起点新版',
  730. url: '^https?://read\\.qidian\\.com/BookReader/.*\\.aspx',
  731. bookTitleSelector: '.story_title .textinfo a:nth-child(1)',
  732. titleSelector: '.story_title h1',
  733.  
  734. prevSelector: '#pagePrevRightBtn',
  735. nextSelector: '#pageNextRightBtn',
  736. indexSelector: function() {
  737. return location.href.replace(/,.*?\.aspx$/, '.aspx').replace('BookReaderNew', 'BookReader');
  738. },
  739.  
  740. mutationSelector: "#chaptercontainer", // 内容生成监视器
  741. mutationChildCount: 1,
  742. contentSelector: '#content, .bookreadercontent',
  743. contentRemove: 'a[href="http://www.qidian.com"]',
  744. contentReplace: [
  745. '手机用户请到m.qidian.com阅读。'
  746. ],
  747. contentPatch: function(fakeStub){
  748. fakeStub.find('script[src$=".txt"]').addClass('reader-ajax');
  749. },
  750. },
  751. {siteName: "起点中文、起点女生、起点文学",
  752. url: "^https?://(www|read|readbook|wwwploy|cga|big5ploy)\\.(qidian|qdmm|qdwenxue)\\.com/BookReader/.*",
  753. // titleReg: "小说:(.*?)(?:独家首发)/(.*?)/.*",
  754. titleSelector: "#lbChapterName",
  755. bookTitleSelector: ".page_site > a:last",
  756. // contentSelector: "#hdContent",
  757. nextUrl: function($doc){ // 为了避免起点某次改版后把1页拆成2页,然后造成重复载入第一页的情况
  758. var html = $doc.find('script:contains(nextpage=)').html();
  759. if (!html) return;
  760. var m = html.match(/nextpage='(.*?)'/);
  761. if (m) return m[1];
  762. },
  763. prevUrl: function($doc){
  764. var html = $doc.find('script:contains(prevpage=)').html();
  765. if (!html) return;
  766. var m = html.match(/prevpage='(.*?)'/);
  767. if (m) return m[1];
  768. },
  769. contentReplace: {
  770. "\\[img=(.*)\\]": "<p><img src='$1'></p><p>",
  771. "\\[+CP.*(http://file.*\\.jpg)\\]+": "<p><img src='$1'></p><p>",
  772. "\\[bookid=(\\d+),bookname=(.*?)\\]": "<a href='http://www.qidian.com/Book/$1.aspx'>$2</a>",
  773. "www.cmfu.com发布|起点中文网www.qidian.com欢迎广大书友光临阅读.*": "",
  774. '(<p>\\s+)?<a href="?http://www.(?:qidian|cmfu).com"?>起点中文网.*': '',
  775.  
  776. '([\\u4e00-\\u9fa5])[%¥]+([\\u4e00-\\u9fa5])': '$1$2', // 屏蔽词修正,例如:风%%骚
  777. },
  778. contentRemove: "span[id^='ad_'], .read_ma",
  779. contentPatch: function(fakeStub){
  780. fakeStub.find('script[src$=".txt"]').addClass('reader-ajax');
  781. },
  782. },
  783. {siteName: "起点中文网免费频道",
  784. url: "^https?://free\\.qidian\\.com/Free/ReadChapter\\.aspx",
  785. titleSelector: ".title > h3",
  786. bookTitleSelector: ".site_rect > a:last",
  787. contentSelector: "#chapter_cont, #content",
  788. contentRemove: ".nice_books",
  789. contentReplace: {
  790. "\\[img=(.*)\\]": "<p><img src='$1'></p><p>",
  791. "\\[+CP.*(http://file.*\\.jpg)\\]+": "<p><img src='$1'></p><p>",
  792. "\\[bookid=(\\d+),bookname=(.*?)\\]": "<a href='http://www.qidian.com/Book/$1.aspx'>$2</a>",
  793. "www.cmfu.com发布|起点中文网www.qidian.com欢迎广大书友光临阅读.*": "",
  794. '(<p>\\s+)?<a href="?http://www.(?:qidian|cmfu).com"?>起点中文网.*': ''
  795. },
  796. contentPatch: function(fakeStub) {
  797. fakeStub.find('#chapter_cont, #content > script:first').addClass('reader-ajax');
  798. }
  799. },
  800. {siteName: "创世中文网",
  801. url: "^https?://(?:chuangshi|yunqi)\\.qq\\.com/|^http://dushu\\.qq\\.com/read.html\\?bid=",
  802. bookTitleSelector: '.bookNav > a:last()',
  803. titleSelector: '.story_title > h1',
  804.  
  805. nextSelector: '#rightFloatBar_nextChapterBtn',
  806. prevSelector: '#rightFloatBar_preChapterBtn',
  807. indexSelector: function() {
  808. var m = location.href.match(/\/bk\/\w+\/(.*?)-r-\d+.html/);
  809. if (m) {
  810. return 'http://chuangshi.qq.com/bk/ls/' + m[1] + '-l.html';
  811. } else {
  812. return 'http://chuangshi.qq.com/bk/ls/' + unsafeWindow.bid + '-l.html';
  813. }
  814. },
  815.  
  816. contentSelector: ".bookreadercontent",
  817. contentHandle: false,
  818. mutationSelector: "#chaptercontainer", // 内容生成监视器,第一次运行用到,以后用下面的 getContent 函数
  819. mutationChildCount: 1,
  820. startFilter: function() {
  821. // 下一页需要提前加 1
  822. unsafeWindow.uuid = parseInt(unsafeWindow.uuid) + 1 + '';
  823. },
  824. getContent: function($doc, callback) { // this 指 parser
  825. function _getReadPageUrl(uuid) {
  826. if (!uuid) {
  827. return 'javascript:void(0);';
  828. }
  829. var url = location.href.replace(/[?|#].*/gi, '');
  830. return url.replace(/(\d)+\.html/, uuid + '.html');
  831. }
  832.  
  833. function getPageUrlHtml(preChapterUUID, nextChapterUUID) {
  834. var preReadUrl = _getReadPageUrl(preChapterUUID),
  835. nextReadUrl = _getReadPageUrl(nextChapterUUID);
  836.  
  837. return '<a id="rightFloatBar_preChapterBtn" href="' + preReadUrl + '">上一页</a>' +
  838. '<a id="rightFloatBar_nextChapterBtn" href="' + nextReadUrl + '">下一页</a>' + '\n';
  839. }
  840.  
  841. var done = function (data) {
  842. unsafeWindow.uuid = data.nextuuid; // 给下一页用
  843.  
  844. callback({
  845. html: getPageUrlHtml(data.preuuid, data.nextuuid) + data.Content
  846. });
  847. };
  848. exportFunction(done, unsafeWindow, { defineAs: "gm_mnr_cs_callback" });
  849.  
  850. unsafeWindow.CS.page.read.main.getChapterContent(unsafeWindow.bid, unsafeWindow.uuid,
  851. unsafeWindow.gm_mnr_cs_callback);
  852. },
  853. },
  854. {siteName: "纵横中文网",
  855. url: "^https?://book\\.zongheng\\.com/\\S+\\/\\d+\\.html$",
  856. contentHandle: false,
  857. // titleReg: "(.*?)-(.*)",
  858. titleSelector: "em[itemprop='headline']",
  859. bookTitleSelector: ".tc h2",
  860. contentSelector: '#readerFt',
  861. contentPatch: function(fakeStub){
  862. fakeStub.find('.watermark').remove();
  863. // 给第几章添加空格
  864. var chapterTitle = fakeStub.find(".tc > h2").text();
  865. var chapterTitle1 = fakeStub.find(".tc > h2 em").text();
  866. if(chapterTitle1) {
  867. chapterTitle = chapterTitle.replace(chapterTitle1, " ") + chapterTitle1;
  868. }
  869. fakeStub.find("title").text(
  870. fakeStub.find(".tc > h1").text() + "-" + chapterTitle
  871. );
  872. }
  873. },
  874. {siteName: "晋江文学网",
  875. url: /^https?:\/\/(www|my)\.jjwxc\.net\/onebook(|_vip)\.php\S*/,
  876. titleReg: /《(.*?)》.*[ˇ^](.*?)[ˇ^].*/,
  877. titlePos: 0,
  878. // titleSelector: 'h2',
  879. titleSelector: '#chapter_list > option:first',
  880. // bookTitleSelector: 'h1 .bigtext',
  881. indexSelector: ".noveltitle > h1 > a",
  882. contentSelector: '.noveltext',
  883. contentHandle: false,
  884. contentRemove: 'font[color], hr',
  885. contentPatch: function (fakeStub) {
  886. // 移除 h2 的标题
  887. fakeStub.find('div:has(>h2)').remove();
  888.  
  889. fakeStub.find('#six_list, #sendKingTickets').parent().remove();
  890. fakeStub.find("div.noveltext").find("div:first, h1").remove();
  891. },
  892. contentReplace: [
  893. '@无限好文,尽在晋江文学城'
  894. ]
  895. },
  896. {siteName: '晋江文学城_手机版',
  897. url: '^http://m\\.jjwxc\\.net/book2/\\d+/\\d+',
  898. titleReg: /《(.*?)》.*[ˇ^](.*?)[ˇ^].*/,
  899. titlePos: 0,
  900. titleSelector: 'h2',
  901. contentSelector: 'div.grid-c > div > .b.module > div:first',
  902. },
  903. {siteName: "潇湘书院",
  904. url: "^https?://www\\.xxsy\\.net/books/.*\\.html",
  905. titleReg: "(.*?) (.*)",
  906. contentSelector: "#zjcontentdiv",
  907. nextSelector: "a[title='阅读下一章节']",
  908. contentHandle: false,
  909. contentReplace: "本书由潇湘书院首发,请勿转载!",
  910. contentPatch: function(fakeStub){
  911. fakeStub.find("title").text(fakeStub.find('meta[name="keywords"]').attr("content"));
  912. }
  913. },
  914. {siteName: "逐浪",
  915. url: /^https?:\/\/book\.zhulang\.com\/.*\.html/,
  916. titleReg: /(.*?)-(.*)/,
  917. contentSelector: "#readpage_leftntxt",
  918. contentHandle: false,
  919. contentPatch: function(fakeStub){
  920. var title = fakeStub.find(".readpage_leftnzgx a:first").text() + "-" +
  921. fakeStub.find(".readpage_leftntit").text();
  922. fakeStub.find('title').html(title);
  923. }
  924. },
  925. {siteName: "小说阅读网",
  926. url: "^https?://www\\.readnovel\\.com/novel/.*\\.html",
  927. titleSelector: ".bgtop > h1",
  928. bookTitleSelector: ".nownav > a:eq(4)",
  929. contentSelector: "#article, .zhangjie",
  930. contentRemove: "div[style], .miaoshu, .zhichi, .bottomAdbanner",
  931. contentPatch: function(fakeStub) {
  932. // 删除标题不需要的部分
  933. fakeStub.find(".bgtop > h1 > span").remove();
  934. }
  935. },
  936. // {siteName: "磨铁",
  937. // url: '^https?://www.motie.com/book/\\d+_\\d+',
  938. // contentSelector: '.page-content'
  939. // },
  940.  
  941. {siteName: "百度贴吧(手动启用)",
  942. enable: false,
  943. url: /^https?:\/\/tieba\.baidu.com\/p\//,
  944. titleSelector: "h1.core_title_txt",
  945. bookTitleSelector: ".card_title_fname",
  946. nextSelector: false,
  947. indexSelector: 'a.card_title_fname',
  948. prevSelector: false,
  949.  
  950. contentSelector: "#j_p_postlist",
  951. contentRemove: "#sofa_post, .d_author, .share_btn_wrapper, .core_reply, .j_user_sign",
  952. style: ".clear { border-top:1px solid #cccccc; margin-bottom: 50px; visibility: visible !important;}", // 显示楼层的分割线
  953. },
  954. // {siteName: "天涯在线书库(部分支持)",
  955. // url: /www\.tianyabook\.com\/.*\.htm/,
  956. // titleSelector: ".max, h1:first",
  957. // bookTitleSelector: "td[width='70%'] > a[href$='index.htm']",
  958. // contentSelector: "div > span.middle, #texts",
  959. // contentHandle: false,
  960. // },
  961. {siteName: "天涯书库",
  962. url: /www\.ty2016\.com\/.+\.html$/,
  963. titleSelector: "h1",
  964. bookTitleSelector: ".crumb a[href='./']",
  965.  
  966. indexSelector: "td a[href='./']",
  967.  
  968. contentSelector: "#main",
  969. contentRemove: '.crumb, table',
  970. contentHandle: false,
  971. },
  972.  
  973. // {siteName: "易读",
  974. // url: "^https?://www.yi-see.com/read_\\d+_\\d+.html",
  975. // contentSelector: 'table[width="900px"][align="CENTER"]'
  976. // },
  977. {siteName: "燃文",
  978. url: /^https?:\/\/www\.(?:ranwena?\.(cc|net|com)|64mi\.com)\/.*\.html$/,
  979. titleReg: /(.*?)-(.*?)-燃文/,
  980. contentSelector: "#oldtext, #contents",
  981. contentRemove: "div[style], script",
  982. contentReplace: [
  983. /\((&nbsp;)*\)/g,
  984. /最快更新78小说|\(?百度搜.\)|访问下载tXt小说|百度搜\|索|文\|学|文学全文.字手打|\((&nbsp;)+|牛过中文..hjsm..首发.转载请保留|\[本文来自\]|♠思♥路♣客レ|※五月中文网 5y ※|无错不跳字|最快阅读小说大主宰.*|跟我读H-u-n 请牢记|非常文学|关闭&lt;广告&gt;|w w.*|”娱乐秀”|更多精彩小[说說].*|高速更新/g,
  985. /[\(\*◎]*(百度搜)?文.?[學学].?[馆館][\)\*)]*|\(百度搜\)/g,
  986. /提供无弹窗全文字在线阅读.*|高速首发.*如果你觉的本章节还不错的话.*/g,
  987. /书网∷更新快∷无弹窗∷纯文字∷.t!。/g,
  988. /一秒记住,本站为您提供热门小说免费阅读。/g,
  989. /\(更新速度最快记住即可找到\)|芒果直播网|.mgzhibo .|去 读 读|看小说就到/g,
  990. '火然\\?\\?\\? \\?文&nbsp;&nbsp;w\\?ww.ranwena.com',
  991. ]
  992. },
  993. {siteName: "燃文小说网",
  994. url: "^https?://www\\.ranwenxiaoshuo\\.com/files/article/html/\\d+/\\d+/\\d+\\.html|http://www\\.ranwenxiaoshuo\\.com/\\w+/\\w+-\\d+-\\d+\\.html",
  995. titleReg: /(.*?)最新章节(.*?)在线阅读.*/,
  996. contentSelector: "#fontsize",
  997. contentReplace: "天才一秒记住[\\s\\S]+为您提供精彩小说阅读。",
  998. },
  999. {siteName: "燃文小说",
  1000. url: "^https?://www\\.ranwen\\.net/files/article/\\d+/\\d+/\\d+\\.html",
  1001. titleReg: "(\\S+) (.*) - 燃文小说",
  1002. contentReplace: "\\(.*燃文小说.*\\)|【 注册会员可获私人书架,看书更方便!永久地址: 】 "
  1003. },
  1004. {siteName: "无错小说网",
  1005. url: /^https?:\/\/www\.(?:wcxiaoshuo|xiaoshuoz|quledu)\.com\/wcxs[-\d]+\//,
  1006. titleReg: /(.*?)最新章节.*?-(.*?)-.*/,
  1007. titlePos: 1,
  1008. nextSelector: "a#htmlxiazhang",
  1009. prevSelector: "a#htmlshangzhang",
  1010. indexSelector: "a#htmlmulu",
  1011. contentReplace: [
  1012. 'ilo-full-src="\\S+\\.jpg" ',
  1013. {
  1014. '(<center>)?<?img src..(http://www.wcxiaoshuo.com)?(/sss/\\S+\\.jpg).(>| alt."\\d+_\\d+_\\d*\\.jpg" />)(</center>)?': '$3',
  1015. "/sss/da.jpg": "打", "/sss/maws.jpg": "吗?", "/sss/baw.jpg": "吧?", "/sss/wuc.jpg": "无", "/sss/maosu.jpg": ":“", "/sss/cuow.jpg": "错", "/sss/ziji.jpg": "自己", "/sss/shenme.jpg": "什么", "/sss/huiqub.jpg": "回去", "/sss/sjian.jpg": "时间", "/sss/zome.jpg": "怎么", "/sss/zhido.jpg": "知道", "/sss/xiaxin.jpg": "相信", "/sss/faxian.jpg": "发现", "/sss/shhua.jpg": "说话", "/sss/dajiex.jpg": "大姐", "/sss/dongxi.jpg": "东西", "/sss/erzib.jpg": "儿子", "/sss/guolair.jpg": "过来", "/sss/xiabang.jpg": "下班", "/sss/zangfl.jpg": "丈夫", "/sss/dianhua.jpg": "电话", "/sss/huilaim.jpg": "回来", "/sss/xiawu.jpg": "下午", "/sss/guoquu.jpg": "过去", "/sss/shangba.jpg": "上班", "/sss/mingtn.jpg": "明天", "/sss/nvrenjj.jpg": "女人", "/sss/shangwo.jpg": "上午", "/sss/shji.jpg": "手机", "/sss/xiaoxinyy.jpg": "小心", "/sss/furene.jpg": "夫人", "/sss/gongzih.jpg": "公子", "/sss/xiansg.jpg": "先生", "/sss/penyouxi.jpg": "朋友", "/sss/xiaoje.jpg": "小姐", "/sss/xifup.jpg": "媳妇", "/sss/nvxudjj.jpg": "女婿", "/sss/xondi.jpg": "兄弟", "/sss/lagong.jpg": "老公", "/sss/lapo.jpg": "老婆", "/sss/meimeid.jpg": "妹妹", "/sss/jiejiev.jpg": "姐姐", "/sss/jiemeiv.jpg": "姐妹", "/sss/xianggx.jpg": "相公", "/sss/6shenumev.jpg": "什么", "/sss/cuoaw.jpg": "错", "/sss/fpefnyoturxi.jpg": "朋友", "/sss/vfsjgigarn.jpg": "时间", "/sss/zzhiedo3.jpg": "知道", "/sss/zibjib.jpg": "自己", "/sss/qdonglxi.jpg": "东西", "/sss/hxiapxint.jpg": "相信", "/sss/fezrormre.jpg": "怎么", "/sss/nvdrfenfjfj.jpg": "女人", "/sss/jhiheejeieev.jpg": "姐姐", "/sss/xdifagojge.jpg": "小姐", "/sss/gggugolgair.jpg": "过来", "/sss/maoashu.jpg": ":“", "/sss/gnxnifawhu.jpg": "下午", "/sss/rgtugoqgugu.jpg": "过去", "/sss/khjukilkaim.jpg": "回来", "/sss/gxhigfadnoxihnyy.jpg": "小心", "/sss/bkbskhhuka.jpg": "说话", "/sss/xeieavnfsg.jpg": "先生", "/sss/yuhhfuiuqub.jpg": "回去", "/sss/pdianphua.jpg": "电话", "/sss/fabxianr.jpg": "发现", "/sss/feilrpto.jpg": "老婆", "/sss/gxronfdri.jpg": "兄弟", "/sss/flfaggofng.jpg": "老公", "/sss/tymyigngtyn.jpg": "明天", "/sss/dfshfhhfjfi.jpg": "手机", "/sss/gstjhranjgwjo.jpg": "上午", "/sss/fmgeyimehid.jpg": "妹妹", "/sss/gxgihftutp.jpg": "媳妇", "/sss/cerztifb.jpg": "儿子", "/sss/gfxgigagbfadng.jpg":"下班", "/sss/gstjhranjg.jpg":"下午", "/sss/hjeirerm6eihv.jpg": "姐妹", "/sss/edajihexr.jpg": "大姐", "/sss/wesfhranrrgba.jpg": "上班", "/sss/gfognggzigh.jpg": "公子", "/sss/frurtefne.jpg": "夫人", "/sss/fzagnggfbl.jpg": "丈夫", "/sss/nvdxfudfjfj.jpg": "女婿", "/sss/xdidafnggx.jpg": "相公", "/sss/zenme.jpg": "怎么", "/sss/gongzi.jpg": "公子", "/sss/ddefr.jpg": "",
  1016. },
  1017. ".*ddefr\\.jpg.*|无(?:错|.*cuoa?w\\.jpg.*)小说网不[少跳]字|w[a-z\\.]*om?|.*由[【无*错】].*会员手打[\\s\\S]*",
  1018. "是 由",
  1019. "无错不跳字|无广告看着就是爽!|一秒记住.*|全文免费阅读.*|8 9 阅阅 读 网|看小说最快更新|“小#说看本书无广告更新最快”",
  1020. "[\\x20-\\x7e》]?无(?:.|&gt;)错.小说.{1,2}[Ww]+.*?[cC][oO][mM]",
  1021. "<无-错>",
  1022. "—无—错—小说",
  1023. "\\+无\\+错\\+",
  1024. "&amp;无&amp;错&amp;小说",
  1025. "无错小说 www.quled[Uu].com",
  1026. ],
  1027. contentPatch: function(fakeStub){
  1028. // 去除内容开头、结尾的重复标题
  1029. var title = fakeStub.find("#htmltimu").text().replace(/\s+/, "\\s*");
  1030. var content = fakeStub.find("#htmlContent");
  1031. content.find("div[align='center']").remove();
  1032. if(title.match(/第\S+章/)){
  1033. content.html(content.html().replace(new RegExp(title), "").replace(new RegExp(title), ""));
  1034. }
  1035. }
  1036. },
  1037. {siteName: '凤舞文学网',
  1038. url: '^https?://www\\.wenxue8\\.org/html/\\d+/\\d+/\\d+\\.html',
  1039. contentReplace: [
  1040. {
  1041. '<img src="/keywd/R43.gif">':'爱', '<img src="/keywd/A13.gif">': '情', '<img src="/keywd/D10.gif">': '床',
  1042. '<img src="/keywd/Y19.gif">': '奸', '<img src="/keywd/H21.gif">': '屁', '<img src="/keywd/Z23.gif">': '逼',
  1043. '<img src="/keywd/G42.gif">': '身', '<img src="/keywd/Y2.gif">':'性', '<img src="/keywd/D32.gif">':'热',
  1044. '<img src="/keywd/I44.gif">':'挺', '<img src="/keywd/H30.gif">':'贱', '<img src="/keywd/H25.gif">':'荡',
  1045. '<img src="/keywd/V7.gif">':'肉', '<img src="/keywd/O22.gif">':'吮', '<img src="/keywd/H9.gif">':'春',
  1046. '<img src="/keywd/K36.gif">':'日', '<img src="/keywd/O15.gif">':'胸', '<img src="/keywd/S31.gif">':'欲',
  1047. '<img src="/keywd/F20.gif">':'射', '<img src="/keywd/N12.gif">':'禁', '<img src="/keywd/R26.gif">':'殿',
  1048. '<img src="/keywd/X6.gif">':'诱', '<img src="/keywd/U46.gif">': '娇',
  1049. '<img src="/keywd/M24.gif">': '操', '<img src="/keywd/B4.gif">':'骚', '<img src="/keywd/O3.gif">':'阴',
  1050. }
  1051. ]
  1052. },
  1053. {siteName: "书迷楼",
  1054. url: /^https?:\/\/www\.shumil\.(?:co|us|com)\/.*html$/,
  1055. titleReg: /(.*) (.*?) 书迷楼/,
  1056. titlePos: 1,
  1057. contentSelector: "#content",
  1058. contentRemove: 'a, center',
  1059. contentReplace: [
  1060. 'div lign="ener"&gt;|.*更多章节请到网址隆重推荐去除广告全文字小说阅读器',
  1061. '起点中文网www.qidian.com欢迎广大书.*',
  1062. '书迷楼最快更新.*',
  1063. '更新最快最稳定',
  1064. '\\(\\.\\)R?U',
  1065. {'<p>\\?\\?': '<p>'},
  1066. '\\(www.\\)',
  1067. '章节更新最快',
  1068. '-乐-读-小-说--乐读x-',
  1069. '《乐》《读》小说.乐读.Com',
  1070. '纯文字在线阅读本站域名手机同步阅读请访问',
  1071. '-优-优-小-说-更-新-最-快-www.uuxs.cc-',
  1072. '\\(本章免费\\)',
  1073. '请大家搜索(书迷楼)看最全!更新最快的小说',
  1074. '书迷楼www.shumilou.co',
  1075. 'shumil.com',
  1076. '书迷楼 ()',
  1077. '书迷楼',
  1078. ],
  1079. fixImage: true,
  1080. contentPatch: function(fakeStub){
  1081. fakeStub.find("#content").find("div.title:last")
  1082. .appendTo(fakeStub.find('body'));
  1083. fakeStub.find("#content").find("div.title, p > b, div[style]").remove();
  1084. }
  1085. },
  1086. {siteName: "冰火中文",
  1087. url: /^https?:\/\/www\.binhuo\.com\/html\/[\d\/]+\.html$/,
  1088. titleReg: /(.*?)最新章节,(.*?)-.*/,
  1089. fixImage: true,
  1090. contentRemove: 'font[color="red"]',
  1091. contentReplace: {
  1092. "&lt;冰火#中文.*|冰火中文&nbsp;(www.)?binhuo.com(?:【首发】|)|冰.火.中文|绿色小说|lvsexs|冰火中文": "",
  1093. "LU5.coM|lU5.com|LU5.com":"",
  1094. "([^/])www\\.binhuo\\.com(?:\\.com|)": "$1",
  1095. "\\(.*?平南文学网\\)": "",
  1096. },
  1097. contentPatch: function(fakeStub){
  1098. fakeStub.find("#BookText").append(fakeStub.find("img.imagecontent"));
  1099. }
  1100. },
  1101. {siteName: "百晓生",
  1102. url: /^https?:\/\/www\.bxs\.cc\/\d+\/\d+\.html/,
  1103. titleReg: /(.*?)\d*,(.*)/,
  1104. contentRemove: 'a, #txtright',
  1105. contentReplace: [
  1106. /一秒记住【】www.zaidu.cc,本站为您提供热门小说免费阅读。/ig,
  1107. /(文&nbsp;學馆w&nbsp;ww.w&nbsp;xguan.c&nbsp;om)/ig,
  1108. /(百晓生更新最快最稳定\)/g,
  1109. /\((?:&nbsp;)*(?:无弹窗)?全文阅读\)/ig,
  1110. /\[<a.*?首发\[百晓生\] \S+/ig,
  1111. /高速首发.*本章节是地址为/ig,
  1112. /\/\/(?:&nbsp;|访问下载txt小说|高速更新)+\/\//ig,
  1113. /(www\.)?bxs\.cc|www\.bxs(\.com)?/ig,
  1114. /百晓生.不跳字|不跳字。|更新快纯文字/ig,
  1115. /\.\[,!\]/ig,
  1116. /(未完待续&nbsp;http:\/\/www.Bxs.cc&nbsp;89免费小说阅《百晓生文学网》)/g,
  1117. /〖百晓生∷.*〗|《?百晓生文学网》?|最快阅读小说大主宰,尽在百晓生文学网.*|ww.x.om|欢迎大家来到.*?bxs\.cc|百晓生阅读最新最全的小说.*|百晓生网不少字|站长推荐.*|文字首发|百.晓.生.|关闭.*广告.*|飘天文学|本站域名就是.*|\(.{0,5}小说更快更好.{0,5}\)|(请在)?百度搜索.*|一秒记住.*为您提供精彩小说阅读.|百晓生|¤本站网址:¤|\/\/&nbsp;访问下载txt小说\/\/◎◎|纯站点\\".*值得收藏的/ig,
  1118. /文[学學][馆館]|www\.biquge\.cc|(http:\/\/)?www\.Bxs\.cc|(请牢记)?soudu.org/ig,
  1119. /请搜索,小说更好更新更快!|最快文字更新无弹窗无广|\(即可找到本站\)|无广告看着就是爽!|更多全本txt小说请到下载|∷更新快∷∷纯文字∷/ig,
  1120. /永久网址,请牢记!/ig,
  1121. /&nbsp;&gt;<\/p>/ig,
  1122. ],
  1123. },
  1124. {siteName: "浩奇文学网",
  1125. url: /^https?:\/\/www\.haoqi99\.com\/.*\.shtml$/,
  1126. titleReg: /^(.*?)--(.*?)-/,
  1127. },
  1128. {siteName: "书河小说网",
  1129. url: /^https?:\/\/www\.shuhe\.cc\/\d+\/\d+/,
  1130. titleReg: "([^\\d]+)\\d*,(.*?)_",
  1131. contentSelector: "#TXT",
  1132. contentReplace: /一秒记住.*为您提供精彩小说阅读.|\{请在百度搜索.*首发阅读\}|(书河小说网.*?无弹窗)|wxs.o|ww.x.om|[\[【\(].{1,30}[\]\)】]|ff37;.*|书河小说网高速首发.*|TXT下载|全文阅读|第一书河小说网|百书斋.*|首发来自书河小说网|本书最新章节|书河小说网/ig,
  1133. },
  1134. {siteName: "爱收藏",
  1135. url: /^https?:\/\/www\.aishoucang\.com\/\w+\/\d+\.html/,
  1136. titleReg: "(.*?)-(.*?)-爱收藏",
  1137. contentSelector: "#zhutone",
  1138. contentReplace: {
  1139. "<a[^>]*>(.*?)</a>": "$1",
  1140. ".爱收藏[^<]*": ""
  1141. }
  1142. },
  1143. {siteName: "木鱼哥",
  1144. url: /^https?:\/\/(www\.)?muyuge\.(com|net)\/\w+\/\d+\.html/,
  1145. titleSelector: "#yueduye h1",
  1146. bookTitleSelector: ".readerNav > li > a:last",
  1147. indexSelector: ".readerFooterPage a[title='(快捷:回车键)']",
  1148. // useiframe: true,
  1149. // mutationSelector: "#content",
  1150. // mutationChildCount: 1,
  1151. nextSelector: 'a:contains(下章)',
  1152. prevSelector: 'a:contains(上章)',
  1153. indexSelector: 'a:contains(目录)',
  1154. contentRemove: ".vote",
  1155. contentReplace: {
  1156. "<a[^>]*>(.*?)</a>": "$1",
  1157. "看更新最快的小说就搜索—— 木鱼哥——无弹窗,全文字": "",
  1158. "【看最新小说就搜索.*全文字首发】": "",
  1159. "<p>.*?无弹窗</p>":"",
  1160. "bb\\.king|【木&nbsp;鱼&nbsp;哥&nbsp;.*?】|【一秒钟记住本站:muyuge.com.*木鱼哥】":"",
  1161. "——推荐阅读——[\\s\\S]+": "",
  1162. "【\\s*木\\s*鱼\\s*哥.*?】":"",
  1163. "div&gt;|&lt;-》": "",
  1164. "\\(.pn. 平南\\)": "",
  1165. },
  1166. startFilter: function() {
  1167. clearInterval(unsafeWindow.show);
  1168. }
  1169. },
  1170. {siteName: "追书网",
  1171. url: "^https?://www\\.zhuishu\\.net/files/article/html/.*\\.html",
  1172. titleReg: /(?:正文 )?(.*) (\S+) \S+ - .*/,
  1173. titlePos: 1,
  1174. indexSelector: ".pagebottom>a:contains('目录')",
  1175. nextSelector: ".pagebottom>a:contains('下一页')",
  1176. prevSelector: ".pagebottom>a:contains('上一页')",
  1177. fixImage: true,
  1178. contentSelector: "#content",
  1179. contentReplace: {
  1180. "([^/])www\\.ZhuisHu\\.net": "$1",
  1181. },
  1182. contentPatch: function(fakeStub){
  1183. fakeStub.find("#content > .title, #content > .pagebottom").appendTo(fakeStub.find("body"));
  1184.  
  1185. fakeStub.find("#content").find("center, b:contains('最快更新')").remove();
  1186. }
  1187. },
  1188. {siteName: "猪猪岛小说",
  1189. url: "^https?://www\\.zhuzhudao\\.(?:com|cc)/txt/",
  1190. titleReg: "(.*?)最新章节-(.*?)-",
  1191. contentReplace: /[“"”]?猪猪岛小说.*|<\/?a[^>]+>|w+\.zhuZhuDao\.com|看更新最快的.*/ig
  1192. },
  1193. {siteName: "逸名文学屋",
  1194. url: "^https?://(bbs\\.vyming|www\\.9imw)\\.com/novel-read-\\d+-\\d+\\.html",
  1195. contentSelector: "#showcontent",
  1196. bookTitleSelector: ".headinfo a:first",
  1197. contentRemove: "p:contains(精品推荐:), p:contains(,免费小说阅读基地!), a",
  1198. contentReplace: [
  1199. "逸名文学屋:"
  1200. ]
  1201. },
  1202. {siteName: "奇书屋",
  1203. url: "^https?://www.qishuwu.com/\\w+/\\d+/",
  1204. titleReg: "(.*)_(.*)_.*_奇书屋",
  1205. },
  1206. {siteName: "17k小说网",
  1207. url: /^https?:\/\/\S+\.17k\.com\/chapter\/\S+\/\d+\.html$/,
  1208. titleReg: /(.*?)-(.*?)-.*/,
  1209. contentSelector: "#chapterContent",
  1210. contentRemove: ".chapter_update_time, h1, .qrcode, #authorSpenk, .like_box, #hotRecommend, .ct0416, .recent_read, #miniVoteBox",
  1211. contentReplace: [
  1212. '本书首发来自17K小说网,第一时间看正版内容!'
  1213. ],
  1214. contentPatchAsync: function($doc, callback) {
  1215. if (unsafeWindow.console.clear) {
  1216. unsafeWindow.console.clear = null;
  1217. }
  1218.  
  1219. function waitFor(condition, callback, timeout, timeoutFn) {timeout = timeout || 30 * 1000;timeoutFn = timeoutFn || function() {};var startTime = Date.now();var timeId = setInterval(function() { if (condition()) { callback(); clearInterval(timeId); } else if ((Date.now() - startTime) > timeout) { timeoutFn(); clearInterval(timeId); }}, 500);}
  1220.  
  1221. var Q = unsafeWindow.Q;
  1222.  
  1223. // 计算上一章节下一章节
  1224. function calPages() {
  1225. var json = Q.bookBigData.json;
  1226. var bookId = Q.bookid;
  1227.  
  1228. for (var i=0, c; c = json.list[i]; i++) {
  1229. if (c == Q.chapterid) {
  1230. var prevChapter = (0 === i ? null : json.list[i - 1]);
  1231. var nextChapter = (i + 1 < json.list.length ? json.list[i + 1] : null);
  1232.  
  1233. if (nextChapter) {
  1234. var nextUrl = '/chapter/' + bookId + '/' + nextChapter + '.html';
  1235. $doc.find('a:contains(下一章)')
  1236. .attr('href', nextUrl);
  1237.  
  1238. Q.chapterid = nextChapter;
  1239. }
  1240. if (prevChapter) {
  1241. var prevUrl = '/chapter/' + bookId + '/' + prevChapter + '.html';
  1242. $doc.find('a:contains(上一章)')
  1243. .attr('href', prevUrl);
  1244. }
  1245.  
  1246. break;
  1247. }
  1248. }
  1249. }
  1250.  
  1251. if (!Q.bookBigData.json) {
  1252. waitFor(function() {
  1253. return !!Q.bookBigData.json;
  1254. }, function() {
  1255. calPages();
  1256. callback();
  1257. });
  1258. } else {
  1259. calPages();
  1260. callback();
  1261. }
  1262. }
  1263. },
  1264. {siteName: "看下文学",
  1265. url: "^https?://www\\.kanxia\\.net/k/\\d*/\\d+/\\d+\\.html$",
  1266. titleReg: /(.*?)-(.*)TXT下载_看下文学/,
  1267. contentReplace: /看下文学/g
  1268. },
  1269. {siteName: "青帝文学网",
  1270. url: /^https?:\/\/www\.qingdi\.com\/files\/article\/html\/\d+\/\d+\/\d+\.html$/,
  1271. titleReg: /(.*?)最新章节_(.*?)_青帝文学网_.*/
  1272. },
  1273. {siteName: "侠客中文网",
  1274. url: /^https?:\/\/www\.xkzw\.org\/\w+\/\d+\.html/,
  1275. contentSelector: ".readmain_inner .cont",
  1276. contentPatch: function(fakeStub){
  1277. fakeStub.find('title').html(fakeStub.find('.readmain_inner h2').text());
  1278. }
  1279. },
  1280. {siteName: "ChinaUnix.net",
  1281. url: /^https?:\/\/bbs\.chinaunix\.net\/thread-.*\.html/,
  1282. contentSelector: ".t_f:first"
  1283. },
  1284. {siteName: "123du 小说",
  1285. url: /^https?:\/\/www\.123du\.(?:net|cc)\//,
  1286. titleReg: "(.*)-(.*) 百家乐",
  1287. titlePos: 1,
  1288. contentSelector: "#content, #contents",
  1289. contentReplace: "一秒记住.www.*|小说最新更新,来123读书www.123du.net",
  1290. contentRemove: "a",
  1291. contentPatch: function(fakeStub){
  1292. var content = fakeStub.find("#DivContentBG").html().match(/第\d*页([\s\S]*)一秒记住/)[1];
  1293. $('<div id="content"/>').html(content).appendTo(fakeStub.find('body'));
  1294. }
  1295. },
  1296. {siteName: "动力中文",
  1297. url: "^https?://dlzw\\.cc/article.*\\.html",
  1298. nextSelector: "span:contains('下一篇') > a",
  1299. prevSelector: "span:contains('上一篇') > a",
  1300. indexSelector: "#pt a[href^='http']"
  1301. },
  1302. {siteName: "塔读文学",
  1303. url: "^https?://www\\.tadu\\.com/book/\\d+/\\d+/",
  1304. bookTitleSelector: '.book-name_ a:first',
  1305. nDelay: 2000, // 延迟2秒加载下一页
  1306. contentSelector: "#partContent",
  1307. contentPatch: function(fakeStub){
  1308. var m = fakeStub.find("body").html().match(/\.html\(unescape\("(.*)"\)/);
  1309. if(m){
  1310. var unescapeContent = m[1];
  1311. fakeStub.find("#partContent").html(unescape(unescapeContent));
  1312. }
  1313. }
  1314. },
  1315. {siteName: "第一中文",
  1316. url: "^https?://www\\.dyzww\\.com/cn/\\d+/\\d+/\\d+\\.html$" ,
  1317. contentReplace: {
  1318. '<img.*?ait="(.*?)".*?>': "$1",
  1319. 'www\\.dyzww\\.com.*|♂|шШщ.*': ""
  1320. }
  1321. },
  1322. {siteName: "来书屋",
  1323. url: "^https?://www.laishuwu.com/html/\\d+/\\d+/\\d+.html",
  1324. titleSelector: ".chaptertitle h2",
  1325. bookTitleSelector: ".chaptertitle h1",
  1326. contentReplace: "txt\\d+/",
  1327. },
  1328. {siteName: "万书吧",
  1329. url: "^https?://www\\.wanshuba\\.com/Html/\\d+/\\d+/\\d+\\.html",
  1330. titleReg: "(.*?),(.*?)-万书吧",
  1331. titlePos: 1,
  1332. contentSelector: ".yd_text2",
  1333. contentReplace: [
  1334. "\\[www.*?\\]",
  1335. "\\(&nbsp;&nbsp;\\)",
  1336. "提供无弹窗全文字在线阅读,更新速度更快文章质量更好,如果您觉得不错就多多分享本站!谢谢各位读者的支持!",
  1337. "高速首发.*?,本章节是.*?地址为如果你觉的本章节还不错的话请不要忘记向您qq群和微博里的朋友推荐哦!"
  1338. ]
  1339. },
  1340. {siteName: "大文学",
  1341. url: "^https?://www\\.dawenxue\\.net/html/\\d+/\\d+/\\d+\\.html",
  1342. titleReg: "(.*?)-(.*)-大文学",
  1343. contentSelector: "#clickeye_content",
  1344. contentReplace: "\\(?大文学\\s*www\\.dawenxue\\.net\\)?|\\(\\)",
  1345. },
  1346. {siteName: "奇热",
  1347. url: "^https?://www\\.qirexs\\.com/read-\\d+-chapter-\\d+\\.html",
  1348. titleReg: "(.*?)-(.*?)-",
  1349. titlePos: 1,
  1350. contentSelector: "div.page-content .note",
  1351. contentRemove: "a",
  1352. contentReplace: "”奇热小说小说“更新最快|首发,/.奇热小说网阅读网!|奇热小说网提供.*|\\(手机用户请直接访问.*"
  1353. },
  1354. {siteName: "热点",
  1355. url: "^https?://www\\.hotsk\\.com/Html/Book/\\d+/\\d+/\\d+\\.shtml",
  1356. titleReg: "(.*?) 正文 (.*?)- 热点书库 -",
  1357. contentReplace: "\\(热点书库首发:www.hotsk.com\\)|www.zhuZhuDao.com .猪猪岛小说."
  1358. },
  1359. {siteName: "落秋中文",
  1360. url: "^https?://www\\.luoqiu\\.(com|net)/html/\\d+/\\d+/\\d+\\.html",
  1361. titleReg: "(.*?)-(.*?)-",
  1362. contentReplace: "&lt;/p&gt;"
  1363. },
  1364. {siteName: "全本小说网",
  1365. url: "^https?://www\\.qb5\\.com/xiaoshuo/\\d+/\\d+/\\d+\\.html",
  1366. titleReg: "(.*)_(.*)_",
  1367. contentRemove: "div[class]",
  1368. contentReplace: "全.{0,2}本.{0,2}小.{0,2}说.{0,2}网.{0,2}|[wWw ]+.{1,10}[CccǒOmMМ ]+",
  1369. },
  1370. {siteName: "手牵手小说网",
  1371. url: "^https?://www\\.sqsxs\\.com/.*\\d+/\\d+/\\d+\\.html",
  1372. bookTitleSelector: '#sitebar a:last',
  1373. contentReplace: [
  1374. "◆免费◆",
  1375. "★百度搜索,免费阅读万本★|访问下载txt小说.百度搜.|免费电子书下载|\\(百度搜\\)|『文學吧x吧.』|¤本站网址:¤",
  1376. "[☆★◆〓『【◎◇].*?(?:yunlaige|云 来 阁|yunlaige|免费看).*?[☆◆★〓』】◎◇]",
  1377. "【手机小说阅读&nbsp;m.】",
  1378. "BAIDU_CLB_fillSlot.*",
  1379. "&nbsp;关闭</p>",
  1380. "&nbsp;&nbsp;&nbsp;&nbsp;\\?",
  1381. "\\[☆更.新.最.快☆无.弹.窗☆全.免.费\\]",
  1382. '\\(.*?平南文学网\\)',
  1383. '{首发}|【首发】',
  1384. '=长=风',
  1385. '-优-优-小-说-更-新-最-快-\\.',
  1386. '发现一家非常好吃的手工曲奇店铺,可搜索淘宝.*',
  1387. '强烈推荐一家手工曲奇店,在淘宝搜索.*',
  1388. { "。\\.": "。" },
  1389. ]
  1390. },
  1391. {siteName: "六月中文网,盗梦人小说网",
  1392. url: "^https?://www\\.(?:6yzw\\.org|6yzw\\.com|daomengren\\.com)/.*\\.html",
  1393. bookTitleSelector: ".con_top>a:last",
  1394. contentRemove: "a[href]",
  1395. contentReplace: [
  1396. "纯文字在线阅读本站域名 520xs.Com 手机同步阅读请访问 M.520xs.Com",
  1397. "{飘天文学[\\s\\S]*您的支持就是我们最大的动力}",
  1398. "((未完待续),|精彩推荐:,)?最新最快更新热门小说,享受无弹窗阅读就在:",
  1399. "一秒记住【】,本站为您提供热门小说免费阅读。",
  1400. "百度搜索 本书名.*",
  1401. "欢迎您的光临,任何搜索引擎搜索.*给大家带来的不便深感抱歉!!",
  1402. "\\(?&nbsp;&nbsp; ?提供』。如果您喜欢这部作品,欢迎您来创世中文网[\\s\\S]+",
  1403. "[\\((]未完待续.{1,2}本文字由.*",
  1404. "//添加开头|会员特权抢先体验",
  1405. "更新最快|更新快纯文字|看最新章节|六月中文网|78小说|h﹒c﹒d|穿越小说吧 sj131|\\*五月中文网5.c om\\*",
  1406. "\\d楼[\\d\\-: ]+(?:&nbsp;)+ \\|(?:&nbsp;)+|吧主\\d+(?:&nbsp;)+|支持威武,嘎嘎!",
  1407. "www,|&nbsp;\\\\|“梦”(&nbsp;| )*“小”(&nbsp;| )*(“说” )?“网”|“岛”(&nbsp;| )+“说”",
  1408. /(百度搜索 )?本书名 \+ 盗梦人 看最快更新/ig,
  1409. "520xs.com ”520小说“小说章节更新最快",
  1410. "看最新最全小说|最快更新,(?:无弹窗)?阅读请。",
  1411. "纯文字在线阅读本站域名  手机同步阅读请访问",
  1412. "本文由 …… 首发",
  1413. "(首发)|【首发】",
  1414. "&amp;nbsp",
  1415. ]
  1416. },
  1417. {siteName: "飞卢小说网",
  1418. url: "^https?://b\\.faloo\\.com/p/\\d+/\\d+\\.html",
  1419. titleSelector: "#title h1",
  1420. bookTitleSelector: "div.nav > a:last",
  1421. bookTitleReplace: '小说$',
  1422.  
  1423. nextSelector: "a#next_page",
  1424. prevSelector: "a#pre_page",
  1425. indexSelector: "a#huimulu",
  1426.  
  1427. contentSelector: "#main > .main0",
  1428. contentRemove: "> *:not(#con_imginfo, #content), .p_content_bottom",
  1429. contentReplace: [
  1430. "飞卢小说网 b.faloo.com 欢迎广大书友光临阅读,最新、最快、最火的连载作品尽在飞卢小说网!",
  1431. ],
  1432. contentPatch: function(fakeStub){
  1433. fakeStub.find("#content").find(".p_gonggao").remove();
  1434. // fakeStub.find("#con_imginfo").prependTo("#content");
  1435. }
  1436. },
  1437. {siteName: "顶点小说",
  1438. url: "^https?://www\\.(?:23us|x23us|23wx|xs222)\\.(?:com|cc)/html/\\d+/\\d+/\\d+\\.html$",
  1439. bookTitleSelector: '.crumbs > div > a:last, #amain > dl > dt > a:last',
  1440. indexSelector: "#footlink a:contains('返回目录')",
  1441. prevSelector: "#footlink a:contains('上一页')",
  1442. nextSelector: "#footlink a:contains('下一页')",
  1443. contentSelector: "#contents",
  1444. contentReplace: [
  1445. "\\(看小说到顶点小说网.*\\)|\\(\\)|【记住本站只需一秒钟.*】",
  1446. '一秒记住【.*读及下载。',
  1447. 'www.xstxt.org',
  1448. 'wenxuemi.com',
  1449. '23us.com',
  1450. '顶点小说 X23US.com更新最快',
  1451. ],
  1452. contentPatch: function(fakeStub){
  1453. var temp=fakeStub.find('title').text();
  1454. var realtitle = temp.replace(/第.*卷\s/,'');
  1455. fakeStub.find('title').html(realtitle);
  1456. }
  1457. },
  1458. {siteName: '23中文',
  1459. url: '^https?://www\\.23zw\\.(com|me)/.*\\.html',
  1460. contentSelector: '#chapter_content',
  1461. contentRemove: 'h1',
  1462. contentReplace: [
  1463. '的朋友,你可以即可第一时间找到本站哦。',
  1464. '手机看小说哪家强\\?手机阅读网',
  1465. ',最快更新.*?最新章节!',
  1466. '看.*?最新章节到长风文学',
  1467. '本文由首发',
  1468. '章节更新最快',
  1469. '顶点小说.23us.。',
  1470. '\\(顶点小说\\)',
  1471. '看最新最全',
  1472. 'R1152',
  1473. '\\.n√et',
  1474. '中文网',
  1475. '更新最快',
  1476. ]
  1477. },
  1478. {siteName: '笔下阁',
  1479. url: "^https?://www\\.bixiage\\.com/\\w+/\\d+/\\d+/\\d+\\.html",
  1480. titleReg: "(.*)最新章节免费在线阅读_(.*)_笔下阁",
  1481. indexSelector: ".read_tools a:contains('返回目录')",
  1482. prevSelector: ".read_tools a:contains('上一页')",
  1483. nextSelector: ".read_tools a:contains('下一页')",
  1484. contentReplace: [
  1485. "本书最新免费章节请访问|请记住本站的网址|请使用访问本站",
  1486. "看更新最快的.*www.bixiage.com",
  1487. "笔下阁为您提供全文字小说.*",
  1488. "如果你觉得笔下阁不错.*",
  1489. "本篇是小说.*章节内容,如果你发现内容错误.*"
  1490. ]
  1491. },
  1492. {siteName: '双德小说网',
  1493. url: "^https?://www\\.shuangde\\.cc/.*\\.html",
  1494. bookTitleSelector: '.title > h2 > a',
  1495. contentRemove: '.title, div[align="center"]',
  1496. },
  1497. {siteName: '爱尚小说网',
  1498. url: '^https?://www.a240.com/read/\\d+/\\d+.html',
  1499. titleReg: '(.*) - (.*?) - 爱尚小说网',
  1500. titlePos: 1,
  1501. contentRemove: '.bottem, center',
  1502. contentReplace: '<!--章节内容开始-->'
  1503. },
  1504. {siteName: 'E度文学网',
  1505. url: '^https?://www.173ed.com/read/\\d+/\\d+.html',
  1506. contentRemove: 'a[href*="173e"]',
  1507. contentReplace: [
  1508. '全文字小说W.*?\\.com',
  1509. 'E度文学网更新最快',
  1510. 'www\\.♀173ed.com♀'
  1511. ]
  1512. },
  1513. {siteName: "3Z中文网",
  1514. url: "^https?://www\\.zzzcn\\.com\\/(3z\\d+/\\d+\\/|modules\\/article\\/App\\.php\\?aid=\\d+&cid=\\d+){1}$",
  1515. // titleReg: "(.*?)-(.*)TXT下载",
  1516. contentSelector: "#content3zcn",
  1517. indexSelector: "a:contains('返回目录')",
  1518. prevSelector: "a:contains('上 一 页')",
  1519. nextSelector: "a:contains('下 一 页'), a:contains('返回书架')",
  1520. contentReplace: [
  1521. /[{(][a-z\/.]+(?:首发文字|更新超快)[})]/ig,
  1522. "手机小说站点(wap.zzzcn.com)",
  1523. "一秒记住.*为您提供精彩小说阅读。",
  1524. ],
  1525. contentPatch: function(fakeStub){
  1526. fakeStub.find("a:contains('返回书架')").html("下 一 页").attr("href", fakeStub.find("a:contains('返回目录')").attr("href"));
  1527. fakeStub.find("#content3zcn").find(".titlePos, font.tips, a").remove();
  1528. }
  1529. },
  1530. {siteName: "比奇中文网",
  1531. url: "^https?://www\\.biqi\\.me/files/article/html/\\d+/\\d+/\\d+\\.html",
  1532. titleSelector: "#lbChapterName",
  1533. bookTitleSelector: "#TOPNAV td:first > a:last",
  1534. contentReplace: [
  1535. "http://www.biqi.me比奇中文网永久网址,请牢记!",
  1536. "www.biqi.me比奇中文网一直在为提高阅读体验而努力,喜欢请与好友分享!",
  1537. "[{【]比奇中文网首发www.biqi.me[}】]",
  1538. ]
  1539. },
  1540. {siteName: "书哈哈小说网",
  1541. url: "^https?://(?:read|www)\\.shuhaha\\.com/Html/Book/\\d+/\\d+/\\d+\\.html",
  1542. titleSelector: "#htmltimu",
  1543. bookTitleSelector: [".srcbox > a:nth-child(2)", /目录$/],
  1544. contentSelector: "#BookText",
  1545. contentRemove: 'a[href*="www.shuhaha.com"]',
  1546. contentReplace: [
  1547. '‘‘', '’’',
  1548. '(\\.shuh&amp;n)',
  1549. /<p[^>]*>(&nbsp;){4}网<\/p>/gi
  1550. ]
  1551. },
  1552. {siteName: "SF 轻小说",
  1553. url: '^https?://book.sfacg.com/Novel/\\d+/\\d+/\\d+/',
  1554. titleReg: '(.*?)-(.*?)-.*',
  1555. contentSelector: '#ChapterBody',
  1556. },
  1557. {siteName: "武林中文网",
  1558. url: '^https?://www\\.50zw\\.(com|co|la)/book_\\d+/\\d+\\.html',
  1559. bookTitleSelector: '.srcbox > a:last',
  1560. contentReplace: [
  1561. '更新最快【】',
  1562. '&lt;/dd&gt;',
  1563. '&lt;center&gt; &lt;fon color=red&gt;',
  1564. '一秒记住【武林中文网.*',
  1565. '武林中文网 www.*',
  1566. ]
  1567. },
  1568. {siteName: "乡村小说网",
  1569. url: '^https?://www\\.xiangcunxiaoshuo\\.com/shu/\\d+/\\d+\\.html',
  1570. // bookTitleSelector: '.read_m > .list',
  1571. titleReg: '(.*?)_(.*?)_.*_.*',
  1572. contentSelector: '.yd_text2',
  1573. contentReplace: [
  1574. '[wWw]+.23uS.(?:coM|com)',
  1575. '乡&amp;村&amp;.*?\\.co[mM]',
  1576. ]
  1577. },
  1578. {siteName: "杂书网",
  1579. url: "^https?://www\\.zashu\\.net/books/\\d+/\\d+/\\d+\\.html",
  1580. contentReplace: [
  1581. "吋煜牝咱.*?杂书网(?:杠杠的)?",
  1582. "吋煜牝咱看书神器",
  1583. "(?:吋煜牝咱|飝现洅咱|茇阺畱匝).*?[Cc]om",
  1584. "吋煜牝咱",
  1585. "飝现洅咱", "殢萾嘎匝",
  1586. "看小说“杂书网zashu.net”",
  1587. "手机站:m.zashu.net 电脑站:www.zashu.net",
  1588. ]
  1589. },
  1590. {siteName: "小说巴士",
  1591. url: "^https?://www\\.xs84\\.com/\\d+_\\d+/",
  1592. bookTitleSelector: ".con_top a:last",
  1593. contentReplace: [
  1594. "§推荐一个无广告的小说站.*? §",
  1595. "☆本站最快更新.*?☆",
  1596. "纯文字在线阅读.*?</br>",
  1597. "www.X S 8 4.com",
  1598. "《》 www.obr />",
  1599. "。。 w.2.obr",
  1600. "\\[w w w.x s.*?.c o m 小说.*?\\]",
  1601. "╂上.*?╂",
  1602. "\\*\\*顶\\*\\*点.{0,3}小说",
  1603. "___小.说.巴.士 www.xS84.com___",
  1604. ],
  1605. contentPatch: function() {
  1606. $('<script>')
  1607. .text('clearInterval(show);')
  1608. .appendTo('body')
  1609. .remove();
  1610. }
  1611. },
  1612. {siteName: "123言情",
  1613. url: '^https?://www\\.123yq\\.(com|org)/read/\\d+/\\d+/\\d+\\.shtml',
  1614. bookTitleSelector: '.con_top > a:last',
  1615. contentSelector: "#TXT",
  1616. contentRemove: '.bottem, .red, .contads, a',
  1617. },
  1618. {siteName: "热门小说网",
  1619. url: '^https?://www.remenxs.com/du_\\d+/\\d+/',
  1620. bookTitleSelector: 'section.readhead > div.read_t > div.lf > a:nth-child(2)',
  1621. nextSelector: '.pagego > font:contains("下一章") + a',
  1622. prevSelector: '.pagego > font:contains("上一章") + a',
  1623. contentSelector: ".yd_text2",
  1624. contentRemove: '.adrs, .con_w, a',
  1625. contentReplace: [
  1626. '您可以在百度里搜索“.*',
  1627. '为了方便下次阅读,你可以点击下方的.*'
  1628. ]
  1629. },
  1630.  
  1631. // === 内容补丁
  1632. {siteName: "给力文学小说阅读网",
  1633. url: "^https?://www\\.geiliwx\\.com/.*\\.shtml",
  1634. titleReg: "-?(.*)_(.*)最新章节_给力",
  1635. titlePos: 1,
  1636. contentRemove: 'h1, font[color], center',
  1637. contentReplace: [
  1638. "网站升级完毕!感谢对给力文学网的支持!",
  1639. "(百度搜索给力文学网更新最快最稳定\\)",
  1640. "【sogou,360,soso搜免费下载小说】",
  1641. "\\[乐\\]\\[读\\]小说.23.[Cc]m",
  1642. "给力文学网",
  1643. "看最快更新",
  1644. "小说网不跳字",
  1645. "\\.com",
  1646. "BAIDU_CLB_fillSlot\\(.*",
  1647. "--小-说-www-23wx-com",
  1648. "&nbsp;&nbsp;,请",
  1649. '\\.www\\.GEILIWX开心阅读每一天',
  1650. ],
  1651. contentPatch: function(d) {
  1652. if (!d.find('#content').length) {
  1653. var html = d.find('body').html();
  1654. var content = html.match(/<!--go-->([\s\S]*?)<!--over-->/i)[1];
  1655.  
  1656. content = $('<div id="content">').html(content);
  1657. if (content.find('#adright').size()) {
  1658. content = content.find('#adright');
  1659. }
  1660. content.appendTo(d.find('body'));
  1661. }
  1662. }
  1663. },
  1664.  
  1665. // ================== 采用 iframe 方式获取的 ====================
  1666. {siteName: "16K小说网",
  1667. url: "^https?://www\\.16kbook\\.org/Html/Book/\\d+/\\d+/\\d+\\.shtml$",
  1668. titleReg: '(\\S+) (.*)- 16K小说网',
  1669. useiframe: true,
  1670. contentRemove: '.bdlikebutton',
  1671. contentReplace: {
  1672. '(<center>)?<?img src..(http://www.16kbook.org)?(/tu/\\S+\\.jpg).(>| alt."\\d+_\\d+_\\d*\\.jpg" />)(</center>)?': "$3",
  1673. "/tu/shijie.jpg":"世界", "/tu/xiangdao.jpg":"想到", "/tu/danshi.jpg":"但是", "/tu/huilai.jpg":"回来", "/tu/yijing.jpg":"已经", "/tu/zhende.jpg":"真的", "/tu/liliang.jpg":"力量", "/tu/le.jpg":"了", "/tu/da.jpg":"大", "/tu/shengli.jpg":"胜利", "/tu/xiwang.jpg":"希望", "/tu/wandan.jpg":"完蛋", "/tu/de.jpg":"的",
  1674. "16kbook\\s*(首发更新|小说网)": "",
  1675. }
  1676. },
  1677. {siteName: "读读看",
  1678. url: "^https?://www\\.dudukan\\.net/html/.*\\.html$",
  1679. contentReplace: "看小说“就爱读书”|binhuo|www\\.92to\\.com",
  1680. useiframe: true,
  1681. mutationSelector: "#main",
  1682. mutationChildCount: 0,
  1683. },
  1684. {siteName: "读零零(有问题,只显示一半内容)",
  1685. url: "https?://www\\.du00\\.(?:com|cc)/read/\\d+/\\d+/[\\d_]+\\.html",
  1686. titleReg: "(.*?)(?:第\\d+段)?,(.*) - 读零零小说网",
  1687. titlePos: 1,
  1688. // prevSelector: "#footlink a:first",
  1689. // indexSelector: "#footlink a:contains('目录')",
  1690. // nextSelector: "#footlink a:last",
  1691. // 内容
  1692. contentSelector: "#pagecontent, .divimage",
  1693. // useiframe: true,
  1694. // mutationSelector: "#pagecontent",
  1695. // mutationChildCount: 2,
  1696. contentRemove: "font",
  1697. contentReplace: [
  1698. "读零零小说网欢迎您的光临.*?txt格式下载服务",
  1699. ",好看的小说:|本书最新免费章节请访问。",
  1700. "\\*文學馆\\*",
  1701. "\\(未完待续请搜索,小说更好更新更快!",
  1702. "www\\.DU00\\.com",
  1703. ],
  1704. checkSection: true
  1705. },
  1706. {siteName: "78小说网",
  1707. url: "^https?://www\\.78xs\\.com/article/\\d+/\\d+/\\d+.shtml$",
  1708. contentHandle: false,
  1709. titleReg: "(.*?) (?:正文 )?(.*) 78小说网",
  1710. indexSelector: "a:contains('目 录')",
  1711. prevSelector: "a:contains('上一章')",
  1712. nextSelector: "a:contains('下一章')",
  1713. contentSelector: "#content",
  1714. useiframe: true,
  1715. contentReplace: [
  1716. "//.*?78xs.*?//",
  1717. "\\(全文字小说更新最快\\)",
  1718. ],
  1719. contentPatch: function(fakeStub){
  1720. fakeStub.find('p.title').empty(); // 去掉内容中带的章节标题
  1721. }
  1722. },
  1723. {siteName: "151看书网",
  1724. url: "^https?://www\\.151kan\\.com/kan/.*\\.html",
  1725. contentSelector: "#msg",
  1726. useiframe: true,
  1727. mutationSelector: "#msg",
  1728. contentReplace: [
  1729. /[\/|]?www\.151(?:看|kan)\.com[\/|]?/ig,
  1730. /151看书网(?:纯文字)?/ig,
  1731. ]
  1732. },
  1733. {siteName: "就爱读书",
  1734. url: "^https?://www\\.92to\\.com/\\w+/\\w+/\\d+\\.html$",
  1735. titleReg: "(.*?)-(.*?)-",
  1736. useiframe: true,
  1737. timeout: 500,
  1738. contentReplace: "看小说.就爱.*"
  1739. },
  1740. {siteName: "书书网",
  1741. url: "^https?://www\\.shushuw\\.cn/shu/\\d+/\\d+\\.html",
  1742. titleReg: "(.*) (.*?) 书书网",
  1743. titlePos: 1,
  1744. useiframe: true,
  1745. timeout: 500,
  1746. contentReplace: "!~![\\s\\S]*"
  1747. },
  1748. {siteName: "找小说网",
  1749. url: "^https?://www\\.zhaoxiaoshuo\\.com/chapter-\\d+-\\d+-\\w+/",
  1750. titleReg: "(.*) - (.*) - 找小说网",
  1751. titlePos: 1,
  1752. useiframe: true,
  1753. timeout: 500,
  1754. contentRemove: "div[style]"
  1755. },
  1756. {siteName: "ABC小说网",
  1757. url: "^https?://www\\.bookabc\\.net/.*\\.html",
  1758. useiframe: true
  1759. },
  1760.  
  1761. // ============== 内容需要2次获取的 =========================
  1762. {siteName: "手打吧",
  1763. url: /^https?:\/\/shouda8\.com\/\w+\/\d+\.html/,
  1764. contentReplace: /[w\s\[\/\\\(]*.shouda8.com.*|(\/\/)?[全文字]?首发|手打吧|www.shou.*|\(w\/w\/w.shouda8.c\/o\/m 手、打。吧更新超快\)|小说 阅读网 www.xiaoshuoyd .com/ig,
  1765. contentPatch: function(fakeStub){
  1766. var scriptSrc = fakeStub.find('body').html().match(/outputContent\('(.*txt)'\)/)[1];
  1767. scriptSrc = "http://shouda8.com/ajax.php?f=http://shouda8.com/read" + scriptSrc;
  1768. fakeStub.find('#content').attr({
  1769. "class": 'reader-ajax',
  1770. src: scriptSrc
  1771. });
  1772. }
  1773. },
  1774. {siteName: "哈哈文学",
  1775. url: /^https?:\/\/www\.hahawx\.com\/.*htm/,
  1776. titleReg: /(.*?)-(.*?)-.*/,
  1777. contentSelector: "#chapter_content",
  1778. contentReplace: /(?:好书推荐|书友在看|其他书友正在看|好看的小说|推荐阅读):。|(?:www|www|book).*(?:com|net|org|com|net)|全文字阅读|无弹窗广告小说网|哈哈文学\(www.hahawx.com\)|souDU.org|Soudu.org|jīng彩推荐:/ig,
  1779. contentPatch: function(fakeStub){
  1780. var $content = fakeStub.find("#chapter_content");
  1781. var m = $content.find("script").text().match(/output\((\d+), "(\d+\.txt)"\);/);
  1782. if(m && m.length == 3){
  1783. var aid = m[1],
  1784. files = m[2];
  1785. var subDir = "/" + (Math.floor(aid / 1000) + 1),
  1786. subDir2 = "/" + (aid - Math.floor(aid / 1000) * 1000);
  1787. $content.attr({
  1788. class: "reader-ajax",
  1789. src: "http://r.xsjob.net/novel" + subDir + subDir2 + "/" + files,
  1790. charset: "gbk"
  1791. });
  1792. }
  1793. }
  1794. },
  1795. {siteName: "天天中文",
  1796. url: "^https?://www\\.ttzw\\.com/book/\\d+/\\d+\\.html",
  1797. titleSelector: "#chapter_title",
  1798. bookTitleSelector: ".fl.pl20 a:last",
  1799. contentSelector: "#text_area",
  1800. contentReplace: /www.ttzw.com|www.c66c.com|手机用户请到阅读。|<p>\s*a<\/p>/ig,
  1801. contentPatch: function(fakeStub) {
  1802. var m = fakeStub.find('#text_area script').text().match(/outputTxt\("(.*)"\);/);
  1803. if (m) {
  1804. fakeStub.find('#text_area').attr({
  1805. class: "reader-ajax",
  1806. src: unsafeWindow.getServer() + m[1],
  1807. charset: "gbk"
  1808. });
  1809. }
  1810. }
  1811. },
  1812.  
  1813. // ===========================================================
  1814. {siteName: "好看小說網",
  1815. url: "^https?://tw\\.xiaoshuokan\\.com/haokan/\\d+/\\d+\\.html",
  1816. contentSelector: ".bookcontent",
  1817. prevSelector: "a.redbutt:contains('上一頁')",
  1818. indexSelector: "a.redbutt:contains('返回章節目錄')",
  1819. nextSelector: "a.redbutt:contains('下一頁')",
  1820. contentReplace: "[a-z;&]*w.[xx]iaoshuokan.com 好看小說網[a-z;&族】)]*"
  1821. },
  1822. {siteName: "E品中文网",
  1823. url: "^https?://www\\.epzww\\.com/book/\\d+/\\d+",
  1824. titleReg: "(.*?),(.*?),",
  1825. contentSelector: "#showcontent",
  1826. },
  1827. {siteName: "飘天文学",
  1828. url: "^https?://www\\.piaotian\\.(net|com)/html/\\d+/\\d+/\\d+\\.html",
  1829. // titleReg: "(.*)最新章节,(.*),飘天文学",
  1830. bookTitleSelector: '#content > h1 > a',
  1831. contentSelector: "#content",
  1832. useiframe: true, // 否则 content 在 body 下面
  1833. contentRemove: "h1, table, .toplink",
  1834. contentReplace: [
  1835. /[{〖]请在百度搜索.*[}〗]|.(?:百度搜索飄天|无弹窗小说网).*\.Net.|\[飄天.*无弹窗小说网\]/ig,
  1836. '\\{飘天文学www.piaotian.net感谢各位书友的支持,您的支持就是我们最大的动力\\}',
  1837. '章节更新最快',
  1838. '支持网站发展,逛淘宝买东西.*',
  1839. '天才壹秒記住,為您提供精彩閱讀。.*'
  1840. ],
  1841. },
  1842. {siteName: "天使小说网",
  1843. url: "^https?://www\\.tsxs\\.cc/files/article/html/\\d+/\\d+/\\d+\\.html",
  1844. contentSelector: "#content"
  1845. },
  1846. {siteName: "紫雨阁小说网",
  1847. url: "^https?://www\\.ziyuge\\.com/\\w+/\\w+/\\d+/\\d+/\\d+\\.html",
  1848. titleReg: "(.*?)-正文-(.*?)-紫雨阁小说网",
  1849. contentSelector: ".reader_content",
  1850. nextSelector: "#divNext a",
  1851. prevSelector: "#divPrev a",
  1852. contentReplace: "\\(.*www.ziyuge.com.*\\)"
  1853. },
  1854. {siteName: "破风中文网",
  1855. url: "^https?://www\\.pofeng\\.net/xiaoshuo/\\d+/\\d+\\.html",
  1856. useiframe: true
  1857. },
  1858. {siteName: "读客吧",
  1859. url: "^https?://dukeba\\.com/book/\\d+/\\d+/\\d+\\.shtml",
  1860. useiframe: true,
  1861. contentSelector: "#content > div[style]",
  1862. contentRemove: "a, div[align]:has(font)",
  1863. },
  1864. {siteName: "一起阅",
  1865. url: "^https?://www\\.17yue\\.com/\\w+/\\d+/\\d+\\.html",
  1866. useiframe: true,
  1867. },
  1868. {siteName: "诺秋网",
  1869. url: "^https?://www\\.nuoqiu\\.com/static/\\d+/\\d+\\.html",
  1870. titleReg: "(.*) (.*) 诺秋网",
  1871. titlePos: 1,
  1872. useiframe: true,
  1873. contentReplace: "┏━━━━━━━━━━━━━━━━━━━━━━━━━┓[\\s\\S]+诺秋网文字更新最快……】@!!"
  1874. },
  1875. {siteName: "言情后花园",
  1876. url: "^https?://www\\.yqhhy\\.cc/\\d+/\\d+/\\d+\\.html",
  1877. titleReg: "(.*)-(.*)-.*-言情后花园",
  1878. titlePos: 1,
  1879. contentSelector: "#content",
  1880. contentRemove: "a, span[style], script",
  1881. contentReplace: "请记住本站: www.yqhhy.cc|更多,尽在言情后花园。"
  1882. },
  1883. {siteName: "六九中文",
  1884. url: "^https?://www.(?:69zw|kan7).com/\\w+/\\d+/\\d+/\\d+.html",
  1885. titleSelector: ".chapter_title",
  1886. bookTitleSelector: ".readhead h1",
  1887. contentSelector: ".yd_text2",
  1888. // titleReg: "(.*)?_(.*)-六九中文",
  1889. contentReplace: [
  1890. "[\\*]+本章节来源六九中文.*请到六九中文阅读最新章节[\\*]+|-\\\\[wW]+.*书友上传/-",
  1891. "\\\\请到 www.69zw.com 六\\*九.*?/",
  1892. "【 注册会员可获私人书架,看书更方便!:】",
  1893. "首发<br />",
  1894. ]
  1895. },
  1896. {siteName: "免费小说阅读网",
  1897. titleReg: "(.*) , (.*) , 免费小说阅读网",
  1898. titlePos: 1,
  1899. url: "^https?://book\\.yayacms\\.com/\\w+/book_\\d+_\\d+.html",
  1900. contentRemove: "a, div[style]",
  1901. contentReplace: "http://book.YaYaCMS.com/.*|book.yayacms.com",
  1902. },
  1903. {siteName: "书农在线书库",
  1904. url: "^https?://www\\.shunong\\.com/yuedu/\\d+/\\d+/\\d+.html",
  1905. contentSelector: ".bookcontent",
  1906. },
  1907. {siteName: "努努书坊",
  1908. url: "^https?://(?:book\\.kanunu\\.org|www\\.kanunu8\\.com)/.*/\\d+\\.html",
  1909. titleReg: /(.*) - (.*) - 小说在线阅读 - .* - 努努书坊/,
  1910. titlePos: 1,
  1911. contentSelector: "table:eq(4) p",
  1912. indexSelector: "a[href^='./']",
  1913. },
  1914. {siteName: "五月中文网",
  1915. url: "^https?://5ycn\\.com/\\d+/\\d+/\\d+\\.html",
  1916. contentRemove: "div[align='center'], a",
  1917. },
  1918. {siteName: "笔下中文",
  1919. url: "^https?://www\\.bxzw\\.org/\\w+/\\d+/\\d+/\\d+\\.shtml",
  1920. contentRemove: "div[align='center'], center, #footlink1",
  1921. contentReplace: "www\\.bxzw\\.org|//无弹窗更新快//|\\(看精品小说请上.*\\)|\\(看.*最新更新章节.*\\)"
  1922. },
  1923. {siteName: "着笔中文网",
  1924. url: "^https?://.*zbzw\\.com/\\w+/\\d+\\.html",
  1925. contentReplace: "精彩小说尽在.*"
  1926. },
  1927. {siteName: "D586小说网",
  1928. url: '^https?://www\\.d586\\.com/',
  1929. contentSelector: ".yd_text2",
  1930. contentRemove: 'a',
  1931. contentReplace: [
  1932. '【www.13800100.com文字首发D586小说网】',
  1933. '【☆D586小说网☆//文字首发】.*'
  1934. ]
  1935. },
  1936. {siteName: "豌豆文学网",
  1937. url: "^https?://www.wandoou.com/book/\\d+/\\d+\\.html",
  1938. titleReg: '(.*?)最新章节-(.*)-.*无弹窗广告_豌豆文学网',
  1939. contentRemove: "center",
  1940. contentReplace: [
  1941. /[{(]<a href.*[})]|网欢迎广大书友光临阅读,.*/ig,
  1942. /[レ★]+.*(?:请支持)?豌(?:.|&amp;)?豆.?文.?学.*[レ★]+/ig,
  1943. /[((【]豌.?豆.?文.?学.*[))】]/ig,
  1944. /∷更新快∷∷纯文字∷|http:永久网址,请牢记!/ig,
  1945. /(?:{|\\|\/|\()*豌.?豆.?文.?学.?网.*?(?:高速更新|\\\/|})+/ig,
  1946. /更新最快最稳定|看小说“”/ig,
  1947. /&lt;strng&gt;.*?&lt;\/strng&gt;/ig,
  1948. /\(凤舞文学网\)|\( *\)|「启航文字」|79阅.读.网/ig,
  1949. /高速首发.*?本章节是.*/ig,
  1950. /百度搜索自从知道用百度搜索,妈妈再也不用担心我追不到最快更新了/ig,
  1951. ]
  1952. },
  1953. {siteName: "都来读小说网",
  1954. url: /^https?:\/\/www\.doulaidu\.com\/[^\/]+\/\d+\/\d+\.html/,
  1955. useiframe: true,
  1956. contentReplace: [
  1957. /www..+.(?:com|net)/ig,
  1958. /都来读小说网首发|www\.[a-z0-9]+\.(?:org|com)/ig,
  1959. ]
  1960. },
  1961. {siteName: "小说TXT",
  1962. url: /^https?:\/\/www\.xshuotxt\.com\//,
  1963. contentReplace: "\\(.*无弹窗全文阅读\\)",
  1964. contentPatch: function(fakeStub) {
  1965. fakeStub.find('#title a').remove();
  1966. }
  1967. },
  1968. {siteName: "疯狂中文网",
  1969. url: "^https?://www\\.fkzww\\.com/",
  1970. contentRemove: ".bottem, a[href='http://www.fkzww.com']",
  1971. contentReplace: [
  1972. /收藏【.*?疯狂中文网\)/ig,
  1973. ]
  1974. },
  1975. {siteName: "吾读小说网",
  1976. url: "^https?://www\\.5du5\\.com/book/.*\\.html",
  1977. contentReplace: '\\(吾读小说网 <a.*无弹窗全文阅读\\)'
  1978. },
  1979. {siteName: "UU看书",
  1980. url: "^https?://www\\.uukanshu\\.(?:com|net)/.*/\\d+/\\d+.html",
  1981. contentReplace: [
  1982. /* 替换以下
  1983. UU看书 www.uukanshu.net
  1984. 'UU看书 www.uukanshu.net '
  1985. 'UU看书 www.uukanshu.net'
  1986. 'UU看书 www.uukanshu.net'
  1987. 'UU看书 www.uukanshu.net '
  1988. 'UU看书www.uukanshu.net '
  1989. 'UU看书 www.uukanshu.net'
  1990. 'UU看书 www.uukanshu.net'
  1991. 'UU看书 www.uukanshu.net '
  1992. 'UU看书 www.uukanshu.net '
  1993. ‘UU看书 www.uukanshu.net ’
  1994. ‘UU看书 www.uukanshu.net ’
  1995. ‘UU看书 www.uukanshu.net ’
  1996. UU看书 www.uukanshu.net
  1997. */
  1998. /[UuUu]+看书\s*www.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[nn][ee][tt]/g,
  1999. '[UU]*看书[(\\(].*?[)\\)]文字首发。',
  2000. '请记住本书首发域名:。笔趣阁手机版阅读网址:',
  2001. '\\(\\)',
  2002. ]
  2003. },
  2004. {siteName: "长风文学网",
  2005. url: "^https?://www\\.cfwx\\.net/files/article/html/\\d+/\\d+/\\d+\\.html",
  2006. titleSelector: '.title',
  2007. bookTitleSelector: '.linkleft > a:last',
  2008. contentReplace: [
  2009. '([^\\u4E00-\\u9FFF]+)长\\1风\\1文\\1学[^\\n]+t',
  2010. ]
  2011. },
  2012. {siteName: "云来阁",
  2013. url: "^https?://www\\.yunlaige\\.com/html/\\d+/\\d+/\\d+\\.html",
  2014. titleSelector: '.ctitle',
  2015. bookTitleSelector: '#hlBookName',
  2016. contentSelector: '#content',
  2017. contentRemove: '.bottomlink, a, .cad, .footer, .adbottom',
  2018. contentReplace: [
  2019. '[☆★◆〓『【◎◇].*?(?:yunlaige|云 来 阁|yunlaige).*?[☆◆★〓』】◎◇]',
  2020. '《更新最快小说网站:雲来阁http://WWW.YunLaiGe.COM》',
  2021. '【當你閱讀到此章節,請您移步到雲來閣閱讀最新章節,或者,雲來閣】',
  2022. '【看恐怖小说、玄幻小说、请大家登陆黑岩居http://www.heiyanju.com万本小说免费看】',
  2023. '【本书作者推荐:(?:百度搜索)?云来閣,免费观看本书最快的VIP章节】',
  2024. '搜索引擎搜索关键词\\s*云.来.阁,各种小说任你观看,破防盗章节',
  2025. '搜索关键词 云.来.阁,各种小说任你观看,破防盗章节',
  2026. '◢百度搜索雲来阁,最新最快的小说更新◣',
  2027. '\\(云来阁小说文学网www.yunlaige.com\\)',
  2028. '如您已阅读到此章节,请移步到.*',
  2029. '《想看本书最新章节的书友们,百度搜索一下.*',
  2030. '===百!?度搜索.*?新章节===',
  2031. '【最新更新】',
  2032. '值得您收藏。。',
  2033. '小说“小说章节',
  2034. '纯文字在线阅读本站域名',
  2035. '手机同步阅读请访问',
  2036. '±顶±点±小±说,ww',
  2037. '■dingddian小说,ww∨23w→■m',
  2038. 'w∨23w',
  2039. 'www23wxcom',
  2040. '¥℉頂¥℉点¥℉小¥℉',
  2041. '£∝頂£∝点£∝小£∝',
  2042. '篮。色。书。巴,',
  2043. '<!--\\?[\\(<]', // 提取内容后出现的注释标志,造成后面的内容没了
  2044. '看书&nbsp;&nbsp; 要?',
  2045. '喜欢网就上。',
  2046. '无弹窗小说,.*',
  2047. '本书最快更新网站请:.*',
  2048. ]
  2049. },
  2050. {siteName: "乐文小说网",
  2051. url: /^https?:\/\/www\.lwxs520\.com\/books\/\d+\/\d+\/\d+.html/,
  2052. siteExample: 'http://www.lwxs520.com/books/2/2329/473426.html',
  2053. bookTitleSelector: 'h2',
  2054. chapterTitleReplace: 'WwW.lwxs520.Com|乐文小说网',
  2055.  
  2056. contentRemove: '#content>:not(p)',
  2057. contentReplace: [
  2058. '看小说到乐文小说网www.lwxs520.com',
  2059. '喜欢乐文小说网就上www.*(?:COM|com)',
  2060. '爱玩爱看就来乐文小说网.*',
  2061. '\\(LWXS520。\\)',
  2062. 'M.LWxS520.com&nbsp;乐文移动网',
  2063. /乐文小说网值得.+/g,
  2064. '乐\\+文\\+小说&nbsp;Www.しwXs520.Com',
  2065. '乐文\s*小说 www.lwxs520.com',
  2066. '&乐&文&小说 \\{www\\}.\\{lw\\}\\{xs520\\}.\\{com\\}',
  2067. '<乐-文>小说www.しWXS520.com',
  2068. '-乐-文-小-说-www-lwxs520-com',
  2069. '?乐?文?小说 wwW.lWXs520. COM',
  2070. ';乐;文;小说 www.lw+xs520.com',
  2071. '小说&nbsp;wWw.Lwxs520.cOm',
  2072. 'www.LWXS520.com',
  2073. 'www.lwxs520.com 首发哦亲',
  2074. '[wWw]+.[lし]w[xχX][sS]520.[cc][ooO][mM]',
  2075. 'lwxs520.com\\|?',
  2076. '[しlL][ωWw][χXXx][ssS]520',
  2077. /\(未完待续.+/g,
  2078. '\\P?[樂乐]\\P文\\P小\\P?说',
  2079. '》乐>文》小说',
  2080. '乐+文+小说',
  2081. '《乐<文《小说',
  2082. '樂文小說',
  2083. ':乐:文:小说',
  2084. '`乐`文`小说`',
  2085. '=乐=文=小说',
  2086. '@樂@文@小@说|',
  2087. ';乐;文;小说',
  2088. '︾樂︾文︾小︾说\\|',
  2089. '`乐`文`小说`',
  2090. '@乐@文@小说',
  2091. 'lw+xs520',
  2092. '♂!',
  2093. '3w.',
  2094. '\\(\\)',
  2095. ]
  2096. },
  2097. {siteName: '我爱小说',
  2098. url: '^https?://www\\.woaixiaoshuo\\.com/xiaoshuo/\\d+/\\d+/\\d+\\.html',
  2099. bookTitleSelector: '#lbox > b',
  2100. contentSelector: '#readbox',
  2101. contentRemove: '#papgbutton, #content',
  2102. },
  2103. {siteName: "米花在线书库",
  2104. url: /book\.mihua\.net\/\w+\/\d+\/\d+\/.+\.html/,
  2105. titleSelector: "#title",
  2106. contentSelector: "#viewbook"
  2107. },
  2108. {siteName: "58小说网",
  2109. url: /^https?:\/\/(www|book)\.(58)?58xs\.com\/html\/\d+\/\d+\/\d+\.html/,
  2110. titleSelector: "h1",
  2111. indexSelector: "#footlink > a:eq(1)",
  2112. prevSelector: "#footlink > a:eq(0)",
  2113. nextSelector: "#footlink > a:eq(2)",
  2114. contentSelector: "#content",
  2115. contentRemove: ".f1, .c1"
  2116. },
  2117. {siteName: "天天美文网",
  2118. url: /www\.365essay\.com\/\w+\/.+.htm/,
  2119. titleSelector: ".title > h1",
  2120. contentSelector: "#zoomc td",
  2121. contentRemove: ".page-bottomc"
  2122. },
  2123. {siteName: "天涯武库",
  2124. url: /wx\.ty2016\.com\/.+\.html$/,
  2125. bookTitleSelector: "td[width='800'][height='25']>a[href='./']",
  2126. titleSelector: "strong>font",
  2127. indexSelector: "td a[href='./']",
  2128. nextSelector: "td[width='28%'] a",
  2129.  
  2130. contentSelector: "td[width='760'] p",
  2131. contentHandle: false,
  2132. },
  2133. {siteName: "黄金屋中文网",
  2134. url: /www\.hjwzw\.com\/Book\/Read\/\d+[,_]\d+$/,
  2135. titleSelector: "h1",
  2136. indexSelector: "td a[href='./']",
  2137. contentSelector: "#AllySite+div",
  2138. contentRemove: "b, b+p",
  2139. contentReplace: [
  2140. "请记住本站域名:"
  2141. ]
  2142. },
  2143. {siteName: "梦远书城",
  2144. url: /www\.my285\.com(?:\/\w+){3,5}\/\d+\.htm$/,
  2145. useiframe: true,
  2146. contentSelector: "table:eq(2) tr:eq(3)",
  2147. },
  2148. {siteName: "更新吧",
  2149. url: "^https?://www\\.gengxin8\\.com/read/\\d+/\\d+.html$",
  2150. bookTitleSelector: '.left a:last',
  2151. contentSelector: "#chaptertxt",
  2152. useiframe: true,
  2153. },
  2154. {siteName: "乐文小说网",
  2155. url: "^https?://www\\.365xs\\.org/books/\\d+/\\d+/\\d+\\.html",
  2156. titleSelector: ".kfyd h1",
  2157. bookTitleSelector: "ul.bread-crumbs a:last",
  2158. contentSelector: "#content",
  2159. // contentReplace: []
  2160. },
  2161. {siteName: "舞若小说网",
  2162. url: "^https?://www\\.wuruo\\.com/files/article/html/\\d+/\\d+/\\d+\\.html",
  2163. bookTitleSelector: ".text a:eq(1)",
  2164. contentSelector: "#zhengwen",
  2165. contentReplace: [
  2166. '【更多精彩小说请访问www.wuruo.com】',
  2167. '(www.wuruo.com舞若小说网首发)',
  2168. '【舞若小说网首发】',
  2169. ]
  2170. },
  2171. {siteName: "大书包小说网",
  2172. url: "^https?://www\\.dashubao\\.com?/book/\\d+/\\d+/\\d+\\.html",
  2173. bookTitleSelector: ".read_t > .lf > a:nth-child(3)",
  2174. contentSelector: ".yd_text2",
  2175. contentReplace: [
  2176. ]
  2177. },
  2178. {siteName: "爬书网",
  2179. url: "^https?://www\\.pashuw\\.com/BookReader/\\d+-\\d+/\\d+\\.html",
  2180. bookTitleSelector: "#paihangbang_select > a:last()",
  2181. nextSelector: "#next2 a",
  2182. prevSelector: "#prev2 a",
  2183. indexSelector: "#fhml2 a",
  2184. contentRemove: '.novel_bot',
  2185. },
  2186. {siteName: "闪文书库",
  2187. url: "^https?://read\\.shanwen\\.com/html/\\d+/\\d+/\\d+\\.html",
  2188. titleSelector: '.newstitle',
  2189. contentRemove: '#titlebottom',
  2190. contentReplace: [
  2191. '闪文网址中的.*?注册会员</a>'
  2192. ]
  2193. },
  2194. {siteName: "品书网",
  2195. url: "^https?://www\\.vodtw\\.com/Html/Book/\\d+/\\d+/\\d+\\.html",
  2196. bookTitleSelector: '.srcbox > a:last()',
  2197. contentRemove: 'a',
  2198. contentReplace: [
  2199. '品书网 www.voDtw.com◇↓',
  2200. '品书网 www.vodtW.com',
  2201. '品 书 网 (w W W . V o Dtw . c o M)',
  2202. '复制网址访问\\s*http://[%\\d\\w]+'
  2203. ]
  2204. },
  2205. {siteName: "凤凰小说网",
  2206. url: "^https?://www\\.fhxs\\.com/read/\\d+/\\d+/\\d+\\.shtml",
  2207. bookTitleSelector: '.con_top > a:last()',
  2208. contentRemove: '.bottem',
  2209. contentReplace: [
  2210. ]
  2211. },
  2212. {siteName: "小说巴士",
  2213. url: "^https?://www\\.xsbashi\\.com/\\d+_\\d+/",
  2214. contentReplace: [
  2215. '全文阅读如您已阅读到此章[節节].*?,,,,',
  2216. '看小说首发推荐去眼快看书',
  2217. '最快更新,阅读请。___小/说/巴/士 Www.XSBASHI.coM___',
  2218. '___小/说/巴/士 www.XSBASHI.com___',
  2219. 'lala如您已阅读到此章節,請移步到.*?速记方法:,\\]',
  2220. 'lala如您已阅读到此章節.*?敬請記住我們新的網址筆-趣-閣',
  2221. '起舞电子书访问:. 。',
  2222. '≧哈,m\\.',
  2223. '\\[\\s*超多好看\\]',
  2224. '热门【首发】',
  2225. '===百度搜索.*?===',
  2226. '===\\*\\*小说巴士.*?===',
  2227. ]
  2228. },
  2229. {siteName: "思兔阅读",
  2230. url: "^https?://\\w+\\.sto\\.cc/book-\\d+-\\d+.html",
  2231. titleReg: "(.*?)_(.*?)_全文在線閱讀_思兔",
  2232. titlePos: 0,
  2233. //bookTitleSelector: "h1",
  2234. prevSelector: "a:contains('上壹頁'), a:contains('上壹页')",
  2235. nextSelector: "a:contains('下壹頁'), a:contains('下壹页')",
  2236. contentSelector: "div#BookContent",
  2237. contentRemove: 'span',
  2238. },
  2239. {siteName: "去读读",
  2240. url: "^https?://www\\.qududu\\.net/book/\\d+/\\d+/\\d+\\.html",
  2241. contentSelector: "#kui-page-read-txt",
  2242. },
  2243. {siteName: "33言情",
  2244. url: "^https?://www\\.33yq\\.com/read/\\d+/\\d+/\\d+\\.shtml",
  2245. contentRemove: 'a, .bottem, .red',
  2246. },
  2247. {siteName: "巫师图书馆.",
  2248. url: "^https?://www\\.54tushu\\.com/book_library/chaptershow/theId/\\d+\\.html",
  2249. bookTitleSelector: "#m-book-title",
  2250. titleSelector: "div.title",
  2251. prevSelector: "div.pageInfo a:first",
  2252. nextSelector: "div.pageInfo a:last",
  2253. indexSelector: "a[title='返回书页']",
  2254. useiframe: true,
  2255. timeout: 1000,
  2256. contentSelector: "div#ChapterContent",
  2257. contentPatch: function(fakeStub){
  2258. var bookTitle = fakeStub.find('meta[name="keywords"]').attr('content');
  2259. fakeStub.find('body').append('<div id="m-book-title">' + bookTitle + '</div>');
  2260. }
  2261. },
  2262.  
  2263. // ===== 特殊的获取下一页链接
  2264. {siteName: "看书啦",
  2265. url: "^https?://www.kanshu.la/book/\\w+/\\d+\\.shtml",
  2266. titleReg: "(.*)-(.*)-看书啦",
  2267. titlePos: 1,
  2268. nextUrl: function($doc){
  2269. var html = $doc.find('script:contains(next_page = ")').html();
  2270. var m = html.match(/next_page = "(.*?)";/);
  2271. if (m) return m[1];
  2272. },
  2273. prevUrl: function($doc){
  2274. var html = $doc.find('script:contains(preview_page = ")').html();
  2275. var m = html.match(/preview_page = "(.*?)";/);
  2276. if (m) return m[1];
  2277. }
  2278. },
  2279. {siteName: "书阁网",
  2280. url: "^https?://www\\.bookgew\\.com/Html/Book/\\d+/\\d+/\\d+\\.htm",
  2281. titleReg: "(.*)-(.*?)-书阁网",
  2282. titlePos: 1,
  2283. // titleSelector: ".newstitle",
  2284. nextUrl: function($doc){
  2285. var html = $doc.find('script:contains(nextpage=)').html();
  2286. var m = html.match(/nextpage="(.*?)";/);
  2287. if (m) return m[1];
  2288. },
  2289. prevUrl: function($doc) {
  2290. var html = $doc.find('script:contains(prevpage=)').html();
  2291. var m = html.match(/prevpage="(.*?)";/);
  2292. if (m) return m[1];
  2293. }
  2294. },
  2295.  
  2296. // {siteName: "雅文言情小说吧", // 一章分段
  2297. // url: "^https?://www\\.yawen8\\.com/\\w+/\\d+/\\d+\\.html",
  2298. // contentSelector: "#content .txtc"
  2299. // }
  2300.  
  2301. {siteName:'妙笔阁',
  2302. url: /^https?:\/\/www\.miaobige\.com\/.*\.html|^https?:\/\/www.(?:52dsm|banfusheng).com\/chapter\/\d+\/\d+.html/i,
  2303. siteExample:'http://www.miaobige.com/book/5_1586/1006320.html',
  2304. // 有的会提示防采集章节
  2305. fInit: function () {
  2306. $('<script>')
  2307. .text('$(document).unbind("contextmenu selectstart")')
  2308. .appendTo(document.body);
  2309. },
  2310.  
  2311. useiframe: true,
  2312. mutationSelector: '#content',
  2313. mutationChildCount: 1,
  2314. startLaunch: function($doc){
  2315. var $content = $doc.find('#content');
  2316.  
  2317. if ($content.text().match(/妙笔阁防盗模式:|小说阅读模式:/)) {
  2318. // 清空不完全的内容节点,通过 mutationSelector 等待内容 完全加载
  2319. $content.html('');
  2320. }
  2321. },
  2322. contentReplace: '妙笔阁,无弹窗,更新快,记住www.miaobige.com',
  2323. // contentPatch: function($doc){
  2324. // var $content = $doc.find('#content');
  2325. // var txt = $content.text();
  2326.  
  2327. // if (0 === txt.trim().indexOf('防采集章节,')) {
  2328. // var mNewLink = $content.html().match(/http:\/\/www\.miaobige\.com\/book\/(\d)_(\d+)\/(\d+)\.html/i);
  2329. // if (mNewLink) {
  2330. // $content .addClass(READER_AJAX)
  2331. // .attr({
  2332. // src: '/js/ajaxtxt.asp',
  2333. // charset: 'gbk'
  2334. // })
  2335. // .data('post', {
  2336. // sid: mNewLink[2],
  2337. // zid: mNewLink[3],
  2338. // cid: mNewLink[1]
  2339. // })
  2340. // .text('请等待加载…');
  2341. // }
  2342. // }
  2343. // },
  2344. // http://www.miaobige.com/read/11180/5216676.html 章节内容缺失(下面方式过于复杂,无效)
  2345. // contentPatchAsync: function($doc, callback) {
  2346. // var $content = $doc.find('#content');
  2347. // var txt = $content.text();
  2348.  
  2349. // if (txt.indexOf('妙笔阁防盗模式:') > -1) {
  2350. // // 很复杂。一串看不懂的 js 生成 $.post('/ajax/content/',{sid:11180,zid:15662893,cid:3},function(data){$('#content').html(data);});
  2351. // var $script = $doc.find('script:contains(H=~[])');
  2352. // if (!$script.length) {
  2353. // console.error('查找 script 失败');
  2354. // return
  2355. // }
  2356.  
  2357. // // 临时劫持
  2358. // var $ = {
  2359. // post: function(url, data, mCallback) {
  2360. // console.log('222222')
  2361. // $content.addClass(READER_AJAX)
  2362. // .attr({
  2363. // src: url,
  2364. // charset: 'UTF-8'
  2365. // })
  2366. // .data('post', data)
  2367. // .text('请等待加载…');
  2368.  
  2369. // callback()
  2370. // }
  2371. // };
  2372.  
  2373. // console.log('will eval script')
  2374. // debugger
  2375. // eval($script.text());
  2376.  
  2377. // // var funcStr = ''
  2378. // // var scriptFn = $script.text().trim().replace(/\(\);$/, '');
  2379. // // eval('funcStr = ' + scriptFn + '.toString()')
  2380. // } else {
  2381. // callback()
  2382. // }
  2383. // }
  2384. },
  2385.  
  2386. {siteName: '书海小说',
  2387. url: '^https?://www\\.shuhai\\.com/read/\\d+/\\d+\\.html',
  2388. bookTitleSelector: '.path2 a:nth-of-type(3)',
  2389. titleSelector: '.read_top h1',
  2390. prevSelector: '.read .read_dwn p a:nth-of-type(1)',
  2391. indexSelector: '.read .read_dwn p a:nth-of-type(2)',
  2392. nextSelector: '.read .read_dwn p a:nth-of-type(3)',
  2393. contentSelector: '.read .txt',
  2394. },
  2395. {siteName: "欢乐书客",
  2396. url: "^https?://www\\.hbooker\\.com/chapter/book_chapter_detail/\\d+",
  2397. bookTitleSelector: ".breakcrumb > a:last",
  2398. titleSelector: ".book-read-box .read-hd h3",
  2399. useiframe: true,
  2400. timeout: 500,
  2401. contentSelector: ".book-read-box .read-bd",
  2402. contentRemove: ".book-read-box .barrage, #J_BtnGuide, .book-read-box .read-bd i.num, .chapter i, .J_Num, .num, .book-read-box .read-hd p:nth-of-type(1) span",
  2403.  
  2404. indexSelector: ".book-read-page a.btn-list",
  2405. nextUrl: function ($doc){
  2406. return $doc.find('#J_BtnPageNext').attr('data-href');
  2407. },
  2408. prevUrl: function ($doc){
  2409. return $doc.find('#J_BtnPagePrev').attr('data-href');
  2410. },
  2411. },
  2412. {siteName: '棉花糖小说网',
  2413. url: '^https?://www\\.mht\\.la/\\d+/\\d+/\\d+\\.html',
  2414. bookTitleSelector: '.nav > a:nth-of-type(3)',
  2415. titleSelector: '.read_title h1',
  2416. prevSelector: '.pagego a:nth-of-type(1)',
  2417. indexSelector: '.pagego a:nth-of-type(2)',
  2418. nextSelector: '.pagego a:nth-of-type(3)',
  2419. contentSelector: '.content',
  2420. contentRemove: 'a, .contads',
  2421. contentReplace: [
  2422. '下载本书最新的txt电子书请点击:',
  2423. '本书手机阅读:',
  2424. '发表书评:',
  2425. '为了方便下次阅读,你可以在点击下方的.*谢谢您的支持!!',
  2426. '手机用户可访问wap.mianhuatang.la观看小说,跟官网同步更新.*',
  2427. ],
  2428. },
  2429. {siteName: '墨缘文学网',
  2430. url: '^https?://www\\.moyuanwenxue\\.com/xiaoshuo/\\d+/\\d+/\\d+\\.htm',
  2431. contentSelector: '#chapterContent',
  2432. contentReplace: [
  2433. {"ZHAN":"战"},
  2434. {"LU":"路"},
  2435. {"SHOU  QIANG":"手枪"},
  2436. {"si wang":"死亡"},
  2437. ],
  2438. },
  2439. // 必须先用键盘箭头翻页后变成 article\reader 的url后才不会有断章现象
  2440. {siteName: "格格党",
  2441. url: 'http://www\\.ggdown\\.com/modules/article/reader\\.php\\?aid=.*',
  2442. siteExample: 'http://www.ggdown.com/modules/article/reader.php?aid=41490&cid=13833393',
  2443. indexSelector: '.link.xb a:contains("返回列表")',
  2444. contentSelector: "#BookText",
  2445. contentReplace: [
  2446. '记住我们的网址噢。百度搜;格!!格!!党.或者直接输域名/g/g/d/o/w/n/./c/o/m',
  2447. ]
  2448. },
  2449. {siteName: "233言情",
  2450. url: 'http://233yq\\.com/xiaoshuo/.*/.*\\.html',
  2451. siteExample: 'http://233yq.com/xiaoshuo/UsRA_mfLLcU/cwsM8t2ibWE.html',
  2452. titleSelector: '.bname h1',
  2453. bookTitleSelector: '.b21 h3:first()',
  2454. contentSelector: ".cn",
  2455. contentRemove: '.bottem',
  2456. },
  2457. {siteName: "笔趣阁",
  2458. url: /^https?:\/\/www\.biquge\.com\.tw\/\d+_\d+\/\d+.html/,
  2459. siteExample: 'http://www.biquge.com.tw/17_17768/8280656.html',
  2460. contentSelector: "#content"
  2461. },
  2462. {siteName: '大主宰小说网',
  2463. url: 'www\\.daizhuzai\\.com/\\d+/\\d+\\.html',
  2464. bookTitleSelector: '.readbox article .info span:nth-of-type(1) a',
  2465. titleSelector: '.readbox article .title h1 a',
  2466. prevSelector: '.readbox .operate li:nth-of-type(1) a',
  2467. indexSelector: '.readbox .operate li:nth-of-type(2) a',
  2468. nextSelector: '.readbox .operate li:nth-of-type(3) a',
  2469. useiframe: true,
  2470. mutationSelector: "#chaptercontent",
  2471. mutationChildCount: 2,
  2472. timeout: 500,
  2473. contentSelector: '.readbox article .content',
  2474. contentRemove: '',
  2475. contentReplace: [
  2476. { '。&': '。' },
  2477. '△番茄小說○網☆',
  2478. '☆ 番茄○△小說網',
  2479. '番茄小說網☆',
  2480. ],
  2481. },
  2482. {siteName: "墨缘文学网",
  2483. url: "^http://www\\.mywenxue\\.com/xiaoshuo/\\d+/\\d+/\\d+\\.htm",
  2484. bookTitleSelector: '#htmltimu h1 a',
  2485. titleSelector: "#htmltimu h2 span",
  2486. prevSelector: ".papgbutton a:nth-of-type(1)",
  2487. indexSelector: ".papgbutton a:nth-of-type(2)",
  2488. nextSelector: ".papgbutton a:nth-of-type(3)",
  2489. useiframe: true,
  2490. contentSelector: '.contentbox > .contentbox',
  2491. contentRemove: "strong, a",
  2492. contentReplace: [
  2493. { 'ZHAN': '战' },
  2494. { 'SI议': '思议' },
  2495. { '意SI': '意思' },
  2496. { 'si wang': '死亡' },
  2497. { 'DING好': '定好' },
  2498. { '夺舍SHI': '夺舍式' },
  2499. { '招SHI': '招式' },
  2500. { '制SHI': '制式' },
  2501. { '正SHI': '正式' },
  2502. { '菜SHI': '菜式' },
  2503. { 'LU上': '路上' },
  2504. { '条LU': '条路' },
  2505. { '马LU': '马路' },
  2506. '更多请登录墨缘文学网.*欢迎您的来访 &gt;&gt;&gt;',
  2507. '更多请登录墨缘文学网.*欢迎您的来访\\[ .* \\]',
  2508. '\\( http.*墨缘文学网 \\)',
  2509. ],
  2510. },
  2511. {siteName: '大海中文',
  2512. url: 'http://www\\.dhzw\\.org/book/\\d+/\\d+/\\d+\\.html',
  2513. contentReplace: [
  2514. '恋上你看书网 630bookla.*',
  2515. '\\(\\)',
  2516. ]
  2517. },
  2518. {siteName: '爱上书屋',
  2519. url: 'https?://www.23sw.net/\\d+/\\d+/\\d+.html',
  2520. titleReg: /(.*?) (.*?),/,
  2521. contentReplace: [
  2522. '\\[www.23sw.net\\]',
  2523. ]
  2524. },
  2525. {siteName: '书轩网',
  2526. url: '^https?://www.bookxuan.com/\\d+_\\d+/\\d+.html',
  2527. bookTitleSelector: '.con_top a:last',
  2528. contentReplace: [
  2529. { '&amp;quot;': '"', },
  2530. 'getreadset;',
  2531. // '&lt;div class=&quot;divimage&quot;&gt;&lt;img src=&quot;',
  2532. '&lt;div class="divimage"&gt;&lt;img src="',
  2533. ],
  2534. contentPatch: function($doc) {
  2535. $doc.find('#content[title="书,轩,网"]').remove();
  2536. }
  2537. },
  2538. {siteName: '大家读书院',
  2539. url: '^https?://www.dajiadu.net/files/article/html/\\d+/\\d+/\\d+.html',
  2540. contentSelector: '#content, #content1',
  2541. contentRemove: '.copy',
  2542. },
  2543. {siteName: '2k小说阅读网',
  2544. url: 'https?://www.2kxs.com/xiaoshuo/\\d+/\\d+/\\d+.html',
  2545. exampleUrl: 'http://www.2kxs.com/xiaoshuo/106/106185/23622820.html',
  2546. contentSelector: '.Text',
  2547. contentRemove: 'a, font, strong',
  2548. contentReplace: [
  2549. '2k小说阅读网',
  2550. ]
  2551. },
  2552. {siteName: "新笔趣阁",
  2553. url: "^http:\/\/www.biqu6.com\/[0-9_]+\/[0-9]+.html$",
  2554.  
  2555. titleReg: /(.*?)章节目录 [-_\\\/](.*?)[-_\/].*/,
  2556. titlePos: 0,
  2557. titleSelector: "#title h1",
  2558.  
  2559. indexSelector: "a:contains('章节目录')",
  2560. prevSelector: "a:contains('上一章')",
  2561. nextSelector: "a:contains('下一章')",
  2562.  
  2563. contentSelector: "#content",
  2564. contentReplace: [
  2565. /\*/g
  2566. ],
  2567. },
  2568. {siteName: "涅破小说网",
  2569. url: "^http://www.niepo.net/html/\\d+/\\d+/\\d+.html",
  2570. contentReplace: [
  2571. '.*最新章节.*http://www.niepo.net/.*'
  2572. ],
  2573. },
  2574. {siteName: '全本小说网',
  2575. url: 'http://www.ybdu.com/xiaoshuo/\\d+/\\d+/\\d+.html',
  2576. contentRemove: '.infos, .chapter_Turnpage',
  2577. },
  2578. {siteName: '连载书',
  2579. exampleUrl: 'http://www.lianzaishu.com/4_4017/2172985.html',
  2580. url: '^https?://www.lianzaishu.com/\\d+_\\d+/\\d+.html',
  2581. bookTitleSelector: '.read-top h2 a',
  2582. contentRemove: 'h1, h2, .textinfo, .adbox, .read-page',
  2583. contentReplace: [
  2584. '&lt;html&gt;', '&lt;/html&gt;',
  2585. '&lt;head&gt;&lt;/head&gt;',
  2586. '&lt;body&gt;', '&lt;/body&gt;',
  2587. '&lt;div&gt;',
  2588. ]
  2589. },
  2590.  
  2591. // 这网站为了防抓取,内容顺序都是不对的,只好采用 iframe 方式
  2592. {siteName: '和图书',
  2593. exampleUrl: 'http://www.hetushu.com/book/1421/964983.html',
  2594. url: '^https?://www.hetushu.com/book/\\d+/\\d+.html',
  2595. bookTitleSelector: '#left h3',
  2596. nextSelector: 'a#next',
  2597. prevSelector: 'a#pre',
  2598. indexSelector: '#left h3 a',
  2599. useiframe: true,
  2600. // 后面的是 和图书 的干扰码
  2601. contentRemove: 'h2, acronym, bdo, big, cite, code, dfn, kbd, q, s, samp, strike, tt, u, var',
  2602. contentPatch: function($doc) {
  2603. // 转换 div 到 p
  2604. $doc.find('#content div').each(function() {
  2605. let html = $(this).html();
  2606. $(this).replaceWith(
  2607. $('<p>').html(html)
  2608. );
  2609. });
  2610. }
  2611. },
  2612.  
  2613. // 移动版
  2614. {siteName: "掌阅手机网",
  2615. url: "https?://wap\\.yc\\.ireader\\.com\\.cn/book/\\d+/\\d+/",
  2616. titleReg: "(.*?),.*?作品 - 掌阅小说网",
  2617. titlePos: 0,
  2618. titleSelector: "h4",
  2619. contentSelector: "div.text",
  2620. },
  2621.  
  2622. ];
  2623.  
  2624. // ===== 小说拼音字、屏蔽字修复 =====
  2625. // 运行在未替换 <br> 之前,.* 可能会造成全部替换
  2626. const replace = {
  2627. // ===格式整理===
  2628. // "\\(|\\[|\\{|(|【|{":"(",
  2629. // "\\)|\\]|\\}|)|】|}":")",
  2630.  
  2631. // 需要?
  2632. ",": ",",
  2633. // ":": ":", "\\?":"?", // 会造成起点的图片无法替换
  2634.  
  2635. "\\*|*": "*",
  2636. "[wWwW]{3}": "www",
  2637. "w{3}(\u3001|\u3002)": "www.",
  2638. "[cCcC][oOoO][mMmM]": "com",
  2639. "[nNnN][eeEE][ttTT]": "net",
  2640. "[cCcC][nNnN]": "cn",
  2641. "(\\.|\u3001|\u3002)com": ".com",
  2642. "(\\.|\u3001|\u3002)net": ".net",
  2643. "(\\.|\u3001|\u3002)cn": ".cn",
  2644. "[pPpP][sSsS][::]": "ps:",
  2645. "。{5,7}": "……", "~{2,50}": "——", "…{3,40}": "……", "-{3,20}": "——",
  2646. //"。(,|,|。)": "。",
  2647. // "?(,|,)": "?",
  2648. //"”(,|,|。)": "”",
  2649. "@{3,}": "",
  2650.  
  2651. // === 段末的多余的r ===
  2652. "\\\\r<br>": "<br>",
  2653.  
  2654. // === 一些特殊的替换 ===
  2655. "\\[+CP.*(http://file.*\\.jpg)\\]+": "<img src='$1'>",
  2656. "『(.)』": "$1", // "『色』": "色",
  2657.  
  2658. // === 去广告 ===
  2659. "\\[搜索最新更新尽在[a-z\\.]+\\]": "",
  2660. "<a>手机用户请到m.qidian.com阅读。</a>": "",
  2661. ".{2,4}中文网欢迎广大书友": "",
  2662. "访问下载txt小说|◎雲來閣免费万本m.yunlaige.com◎": "",
  2663. "〖∷更新快∷无弹窗∷纯文字∷.*?〗": "",
  2664. '超快稳定更新小说[,,]': '', "本文由 。。 首发": "",
  2665. '”小说“小说章节更新最快': '',
  2666. '如果觉得好看,请把本站网址推荐给您的朋友吧!': '',
  2667. '本站手机网址:&nbsp;&nbsp;请互相通知向您QQ群【微博/微信】论坛贴吧推荐宣传介绍!': '',
  2668. "fqXSw\\.com": "", "\\.5du|\\.5du5\\.": "",
  2669. "\\[\\]": "",
  2670. "如果您觉得网不错就多多分享本站谢谢各位读者的支持": "",
  2671. "全文字无广告|\\(看书窝&nbsp;看书窝&nbsp;无弹窗全文阅读\\)": "",
  2672. "。。+[\\s ]*看最新最全小说": "",
  2673. "水印广告测试": "",
  2674. "\\(平南文学网\\)": "", "讀蕶蕶尐說網": "",
  2675. "比奇提示:如何快速搜自己要找的书籍": "", "《百度书名\\+比奇》即可快速直达": "",
  2676. "~无~错~小~说": "",
  2677.  
  2678. "\\(一秒记住小说界\\)|\\*一秒记住\\*": "",
  2679. "uutxt\\.org|3vbook\\.cn|www\\.qbwx\\.com|WWw\\.YaNkuai\\.com|www\\.btzw\\.com|www\\.23uS\\.com": "",
  2680. "txt53712/": "",
  2681. "\xa0{4,12}": "\xa0\xa0\xa0\xa0\xa0\xa0\xa0",
  2682.  
  2683. // === 通用去广告
  2684. "[wwW]{1,3}[.\\.]23uS[.\\.](?:coM|com)": "",
  2685.  
  2686. // === 星号屏蔽字还原 ===
  2687. // === 八九 ===
  2688. "十有(\\*{2})": "十有八九",
  2689. "十有bā'九": "十有八九",
  2690. "(\\*{2})不离十": "八九不离十",
  2691. "(\\*{2})点": "八九点",
  2692. "(\\*{2})个": "八九个",
  2693. "(\\*{2})岁": "八九岁",
  2694. "(\\*{2})成": "八九成",
  2695. "(\\*{2})年": "八九年",
  2696. "一八(\\*{2})": "一八八九",
  2697.  
  2698. // === SM ===
  2699. "G(\\*{2})": "GSM",
  2700.  
  2701. // === 情色 ===
  2702. "感(\\*{2})彩": "感情色彩",
  2703.  
  2704. // === 大法 ===
  2705. "强(\\*{2})u5B9D": "强大法宝",
  2706. "强(\\*{2})宝": "强大法宝",
  2707. "种魔(\\*{2})": "种魔大法",
  2708. "巨(\\*{2})": "巨大法",
  2709. "强(\\*{2})术": "强大法术",
  2710. "(\\*{2})师": "大法师",
  2711.  
  2712. // === 肉体 ===
  2713. "(\\*{2})凡胎": "肉体凡胎",
  2714. "夺取她的(\\*{2})": "夺取她的肉体",
  2715. "夺取他的(\\*{2})": "夺取他的肉体",
  2716. "(\\*{2})与精神": "肉体与精神",
  2717. "(\\*{2})素材": "肉体素材",
  2718. "(\\*{2})材料": "肉体材料",
  2719. "在(\\*{2})上": "在肉体上",
  2720.  
  2721. // === 赤裸 ===
  2722. "(\\*{4})着": "赤裸着",
  2723. "(\\*{2})裸": "赤裸裸",
  2724. "浑身(\\*{2})": "浑身赤裸",
  2725.  
  2726. // === 射 ===
  2727. "枪(\\*{4})": "枪发射",
  2728. "(\\*{4})而出": "喷射而出",
  2729. "光(\\*{2})": "光四射",
  2730.  
  2731. // === 鱼水 ===
  2732. "(\\*{2})之欢": "鱼水之欢",
  2733.  
  2734. // === 国军 ===
  2735. "(\\*{2})队": "国军队",
  2736. "(\\*{2})舰": "国军舰",
  2737. "(\\*{2})方": "国军方",
  2738.  
  2739. // === 露阴 ===
  2740. "暴(\\*{2})谋": "暴露阴谋",
  2741.  
  2742. // === 欲望 ===
  2743. "的(\\*{2})是无止境的": "的欲望是无止境的",
  2744. "邪恶的(\\*{2})": "邪恶的欲望",
  2745. "被(\\*{2})支配": "被欲望支配",
  2746. "掀桌的(\\*{2})": "掀桌的欲望",
  2747. "控制不住(\\*{2})": "控制不住欲望",
  2748. "求生的(\\*{2})": "求生的欲望",
  2749. "求生(\\*{2})": "求生欲望",
  2750. "购买(\\*{2})": "购买欲望",
  2751. "永无止境的(\\*{2})": "永无止境的欲望",
  2752. "(\\*{2})的发泄": "欲望的发泄",
  2753. "发泄(\\*{2})": "发泄欲望",
  2754. "杀戮(\\*{2})": "杀戮欲望",
  2755. "(\\*{2})和本能": "欲望和本能",
  2756.  
  2757. // === 呻吟 ===
  2758. "不堪重负的(\\*{2})": "不堪重负的呻吟",
  2759. "(\\*{2})声": "呻吟声",
  2760. "颤抖(\\*{2})": "颤抖呻吟",
  2761. "(\\*{2})颤抖": "呻吟颤抖",
  2762.  
  2763. // === 独立 ===
  2764. "宣布(\\*{2})": "宣布独立",
  2765. "(\\*{2})空间": "独立空间",
  2766.  
  2767. // === 荡漾 ===
  2768. "波纹(\\*{2})": "波纹荡漾",
  2769.  
  2770. // === 喘息 ===
  2771. "(\\*{2})之机": "喘息之机",
  2772.  
  2773. // === 大波 ===
  2774. "一(\\*{2})": "一大波",
  2775.  
  2776. // === 上供 ===
  2777. "(\\*{2})奉": "上供奉",
  2778.  
  2779. // === 奸淫 ===
  2780. "(\\*{2})掳掠": "奸淫掳掠",
  2781.  
  2782. // === 失身 ===
  2783. "有(\\*{2})份": "有失身份",
  2784.  
  2785. // === 六合 ===
  2786. "(\\*{2})八荒": "六合八荒",
  2787.  
  2788. // === 人祸 ===
  2789. "天灾(\\*{2})": "天灾人祸",
  2790.  
  2791. // === 轮红 ===
  2792. "一(\\*{2})日": "一轮红日",
  2793.  
  2794. // === 西藏 ===
  2795. "东躲(\\*{2})": "东躲西藏",
  2796.  
  2797. // === 被操 ===
  2798. "(\\*{2})纵": "被操纵",
  2799.  
  2800. // === 穷屌 ===
  2801. "(\\*{2})丝": "穷屌丝",
  2802.  
  2803. // === 销魂 ===
  2804. "(\\*{2})滋味": "销魂滋味",
  2805.  
  2806. // === 色水 ===
  2807. "血(\\*{2})晶": "血色水晶",
  2808.  
  2809. // === 偷用 ===
  2810. "偷(\\*{2})": "偷偷用",
  2811.  
  2812. // === 乳交 ===
  2813. "水(\\*{2})融": "水乳交融",
  2814.  
  2815.  
  2816. // === 多字替换 ===
  2817. "cao之过急": "操之过急", "chunguang大泄": "春光大泄",
  2818. "大公无si": "大公无私",
  2819. "fu道人家": "妇道人家", "放sōng'xià来": "放松下来",
  2820. "奸yin掳掠": "奸淫掳掠",
  2821. "空dangdang": "空荡荡",
  2822. "突发qing况": "突发情况",
  2823. "yin奉阳违": "阴奉阳违", "一yin一阳": "一阴一阳",
  2824.  
  2825. // === 双字替换 ===
  2826. "暧m[eè][iì]":"暧昧",
  2827. "bàn\\s*fǎ":"办法", "bucuo":"不错", "不liáng":"不良", "b[ěe]i(\\s|&nbsp;)*j[īi]ng":"北京", "bǐ\\s*shǒu":"匕首", "半shen":"半身", "b[ìi]j[ìi]ng":"毕竟", "报(了?)jing":"报$1警", "bèi'pò":"被迫", "包yǎng":"包养", "(?:biǎo|婊\\\\?)子":"婊子", "biǎo\\s*xiàn\\s*":"表现",
  2828. "chifan":"吃饭", "ch[oō]ngd[oò]ng":"冲动", "chong物":"宠物", "cao(练|作)":"操$1", "出gui":"出轨", "chu\\s*xian":"出现", "缠mian":"缠绵", "成shu":"成熟", "(?:赤|chi)\\s*lu[oǒ]":"赤裸", "春guang":"春光", "chun风":"春风", "chuang伴":"床伴", "沉mi":"沉迷", "沉lun":"沉沦", "刺ji":"刺激", "chao红":"潮红", "初chun":"初春", ""chi\\s*luo"":"赤裸", "cí\\s*zhí":"辞职",
  2829. "dān\\s*xīn":"当心", "dang校":"党校", "da子":"鞑子", "大tui":"大腿", "dǎ\\s*suàn":"打算", "dài\\s*lǐ":"代理", "dengdai":"等待", "电huà":"电话", "diàn\\s*huà":"电话", "diàn\\s*yǐng":"电影", "diao丝":"屌丝", "d[úu](?:\\s|&nbsp;|<br/>)*l[ìi]":"独立", "d[uú]\\s{0,2}c[áa]i":"独裁", "d?[iì]f[āa]ng":"地方", "d[ìi]\\s*d[ūu]":"帝都", "di国|帝guo":"帝国", "du[oò]落":"堕落", "坠luò":"坠落",
  2830. "f[ǎa]ngf[óo]":"仿佛", "fei踢":"飞踢", "feng流":"风流", "风liu":"风流", "f[èe]nn[ùu]":"愤怒", "fǎn\\s*yīng":"反应", "fú\\s*wù":"服务", "fù\\s*chóu":"复仇",
  2831. "gao潮":"高潮", "高氵朝":"高潮", "gāo\\s*xìng\\s*":"高兴", "干chai":"干柴", "勾yin":"勾引", "gu[oò]ch[ée]ng":"过程", "gu[āa]n\\s*x[iì]":"关系", "官\\s*fāng":"官方", "g[ǎa]nji[àa]o":"感觉", "国wu院":"国务院", "gù\\s*yì\\s*":"故意", "guofen":"过分",
  2832. "hā\\s*hā\\s*":"哈哈", "h[aǎ]ode":"好的", "hù士":"护士", "火qiang":"火枪", "huó\\s*dòng":"活动", "há'guó":"韩国", "han住":"含住", "hai洛因":"海洛因", "红fen":"红粉", "火yao":"火药", "h[ǎa]oxi[àa]ng":"好像", "hu[áa]ngs[èe]":"黄色", "皇d[ìi]":"皇帝", "昏昏yu睡":"昏昏欲睡", "回dang":"回荡", "huí\\s*qù\\s*":"回去", "hé\\s*shì\\s*":"合适", "hàn\\s*jiān":"汉奸",
  2833. "jian(臣|细)":"奸$1", "奸yin":"奸淫", "jiànmiàn":"见面", "jian货":"贱货", "jing察":"警察", "jǐng\\s*chá":"警察", "j[ìi]nháng":"进行", "jīng\\s*guò":"经过", "ji烈":"激烈", "j[iì](nv|女)":"妓女", "jirou":"鸡肉", "ji者":"记者", "jì\\s*xù\\s*":"继续", "ju花":"菊花", "j[īi]动":"激动", "jili[èe]":"激烈", "肌r[òo]u":"肌肉", "ji射":"激射", "ji[ēe]ch[uù]":"接触", "jiù\\s*shì":"就是", "j[ùu]li[èe]":"剧烈", "jǐng惕":"警惕", "节cao":"节操", "浸yin":"浸淫", "jù\\s*jué\\s*":"拒绝", "jue色":"角色",
  2834. "k[ěe]n[ée]ng":"可能", "开bao":"开苞", "k[àa]o近":"靠近", "口wen":"口吻", "kankan":"看看",
  2835. "ling辱":"凌辱", "luan蛋":"卵蛋", "脸sè":"脸色", "lu出":"露出", "流máng":"流氓", "lun理":"伦理", "lì\\s*qì":"力气", "lán\\s*jié":"拦截", "lìng\\s*lèi":"另类", "lè\\s*suǒ":"勒索",
  2836. "m[ǎa]ny[ìi]":"满意", "m[ǎa]sh[àa]ng":"马上", "m[ée]iy[oǒ]u":"没有", "mei国":"美国", "měi\\s*nǚ":"美女", "m[íi]ngb[áa]i":"明白", "迷huan":"迷幻", "mi茫":"迷茫", "mó\\s*yàng":"模样", "m[íi]n\\s{0,2}zh[ǔu]":"民主", "迷jian":"迷奸", "mimi糊糊":"迷迷糊糊", "mì\\s*shū":"秘书", "末(?:\\s|<br/?>)*ì":"末日", "面se":"面色", "mengmeng":"蒙蒙", "màn\\s*huà":"漫画",
  2837. "nàme":"那么", "n[ǎa]o\\s*d[àa]i":"脑袋", "n[ée]ngg[oò]u":"能够", "nán\\s{0,2}hǎi":"那会", "内jian":"内奸", "[内內]y[iī]":"内衣", "内ku":"内裤",
  2838. "pi[áa]o客":"嫖客", "p[áa]ngbi[āa]n":"旁边",
  2839. "q[íi]gu[àa]i":"奇怪", "qì\\s*chē":"汽车", "qing\\s*(ren|人)":"情人", "qin兽":"禽兽", "q[iī]ngch[uǔ]":"清楚", "què\\s*dìng":"确定", "球mi":"球迷", "青chun":"青春", "青lou":"青楼", "qingkuang":"情况", "qiang[ \\s]*jian":"强奸",
  2840. "re\\s*nao":"热闹", "r[úu]gu[oǒ]":"如果", "r[oó]ngy[ìi]":"容易", "ru(房|白色)":"乳$1", "rén员":"人员", "rén形":"人形", "人chao":"人潮", "renmen":"人名", "ruǎn\\s*jiàn":"软件", "rì\\s*běn":"日本", "日\\s*běn":"日本",
  2841. "shàng\\s*mén":"上门", "上jiang":"上将", "she(门|术|手|程|击)":"射$1", "sudu":"速度", "shú\\s*nǚ":"熟女", "shuijue":"睡觉", "shide":"是的", "sh[iì]ji[eè]":"世界", "sh[ií]ji[aā]n":"时间", "sh[ií]h[oò]u":"时候", "sh[ií]me":"什么", "si人":"私人", "shi女":"侍女", "shi身":"失身", "sh[ūu]j[ìi]":"书记", "shu女":"熟女", "shu[ \\s]?xiong":"酥胸", "(?:上|shang)chuang":"上床", "shǒu\\s*jī":"手机", "呻y[íi]n":"呻吟", "sh[ēe]ngzh[íi]":"生殖", "深gu":"深谷", "双xiu":"双修", "生r[ìi]":"生日", "si盐":"私盐", "shi卫":"侍卫", "si下":"私下", "sao扰":"骚扰", "shuang\\s*feng":"双峰", "shǎo\\s*fù":"少妇", "shì\\s*pín":"视频", "shè\\s*xiàng":"摄像",
  2842. "t[uū]r[áa]n":"突然", "tiaojiao":"调教", "tí\\s*gòng":"提供", "偷qing":"偷情", "推dao":"推倒", "脱guang":"脱光", "t[èe]bi[ée]":"特别", "t[ōo]nggu[òo]":"通过", "同ju":"同居", "tian来tian去":"舔来舔去",
  2843. "w[ēe]ixi[ée]":"威胁", "wèizh[ìi]":"位置", "wei员":"委员", "w[èe]nti":"问题", "wèi\\s*dào\\s*":"味道", "wú\\s*nài":"无奈", "wǔ\\s*qì":"武器", "weilai":"未来",
  2844. "xiu长":"修长", "亵du":"亵渎", "xing福":"幸福", "xìng\\s*yùn":"幸运", "小bo":"小波", "小niū":"小妞", "xiong([^a-z])":"胸$1", "小tui":"小腿", "xiang港":"香港", "xiàohuà":"笑话", "xiāo\\s*shòu":"销售", "xiàn\\'zhì":"限制", "xiàn\\s*jīn":"现金", "xiāng\\s*zǐ":"箱子", "xiōng\\s*dì":"兄弟", "选zé":"选择", "xìn\\s*hào":"信号", "xìng\\s*gǎn":"性感", "xiǎo\\s*jiě":"小姐", "xìn\\s*hào":"信号",
  2845. "yì\\s*wài\\s*":"意外", "yin(冷|暗|谋|险|沉|沟|癸派|后)":"阴$1", "y[iī]y[àa]ng":"一样", "y[īi]di[ǎa]n":"一点", "yī\\s*zhèn":"一阵", "y[ǐi]j[īi]ng":"已经", "疑huo":"疑惑", "yí\\s*huò":"疑惑", "影mi":"影迷", "yin荡":"淫荡", "yin贼":"淫贼", "阳w[ěe]i":"阳痿", "yao头":"摇头", "yaotou":"摇头", "摇tou":"摇头", "yezhan":"野战", "you饵":"诱饵", "(?:you|诱)(?:惑|huo)":"诱惑", "you导":"诱导", "引you":"引诱", "you人":"诱人", "youshi":"有事", "you\\s*xiu":"优秀", "御yòng":"御用", "旖ni":"旖旎", "yu念":"欲念", "you敌深入":"诱敌深入", "影she":"影射", "牙qian":"牙签", "一yè情":"一夜情", "yīng\\s*yǔ":"英语",
  2846. "z[iì]j[iǐ]":"自己", "z[ìi](?:\\s|<br/?>|&nbsp;)*y[oó]u":"自由", "zh[iī]d?[àa]u?o":"知道", "zixin":"自信", "zhì'fú":"制服", "zha药":"炸药", "zhan有":"占有", "zhào\\s*piàn":"照片", "zhè\\s*gè":"这个", "政f[ǔu]|zheng府":"政府", "zh[èe]ng\\s{0,2}f[uǔ]":"政府", "zong理":"总理", "zh[ōo]ngy[āa]ng":"中央", "中yang":"中央", "zu[oǒ]\\s*y[oò]u":"左右", "zhǔ\\s*dòng":"主动", "zh[oō]uw[ée]i":"周围", "zhōu\\s*nián":"周年", "中nan海":"中南海", "中j委":"中纪委", "中zu部":"中组部", "政zhi局":"政治局", "(昨|一|时|余)(?:<br/?>|&nbsp;|\\s)*ì":"$1日", "照she":"照射", "zhǔn\\s*bèi\\s*":"准备", "zhu义":"主义",
  2847.  
  2848. "</p>\\n<p>\\s*ì":"日",
  2849.  
  2850. '曹艹': '曹操',
  2851. 'JI昂': '激昂',
  2852. '□□无暇': '自顾无暇',
  2853. '法律/界': '法律界',
  2854. '人/类': '人类',
  2855. '恐怖/主义': '恐怖主义',
  2856. '颠/覆': '颠覆',
  2857. '民.事.司.法.裁.判': '民事司法裁判',
  2858. '南海/问题': '南海问题',
  2859. '圈圈/功': '法轮功',
  2860. '镇/压': '镇压',
  2861. '赤.裸': '赤裸',
  2862. '欲·望': '欲望',
  2863. 'nv真': '女真',
  2864. '土gai': '土改',
  2865. '狗·屎': '狗屎',
  2866. 'du立': '独立',
  2867. '发sao': '发骚',
  2868. '奸/夫/淫/妇': '奸夫淫妇',
  2869. '爱qing': '爱情',
  2870. '抚mo': '抚摸',
  2871. '神qing': '神情',
  2872. '公~务~员': '公务员',
  2873. '原着': '原著',
  2874. '□□部分': '高潮部分',
  2875. '角□□面': '角色情面',
  2876. '艹': '操',
  2877. '淫/靡/香/艳': '淫靡香艳',
  2878. '毒丨药': '毒药',
  2879. '登6': '登陆',
  2880. '天□□美': '天性爱美',
  2881. '双丨飞': '双飞',
  2882. '高chao': '高潮',
  2883. 'pi股': '屁股',
  2884. '情/趣': '情趣',
  2885. '情/欲': '情欲',
  2886. '炸/弹': '炸弹',
  2887. '赤/身': '赤身',
  2888. '果/体': '裸体',
  2889. 'zhong国': '中国',
  2890. '帝国#主义': '帝国主义',
  2891. '形形□□': '形形色色',
  2892. 'yuwang': '欲望',
  2893. 'shuangtui': '双腿',
  2894. '城/管': '城管',
  2895. '调丨教': '调教',
  2896. '银/行/卡': '银行卡',
  2897. '裸/体': '裸体',
  2898. '光/裸': '光裸',
  2899. '嫩/女': '嫩女',
  2900. '维/谷': '维谷',
  2901. '开□□谈': '开始交谈',
  2902. '破碎的□□': '破碎的呻吟',
  2903. 'pi霜': '砒霜',
  2904. 'ma醉': '麻醉',
  2905. '麻zui': '麻醉',
  2906. 'nue杀': '虐杀',
  2907. '后gong': '后宫',
  2908. '林荫dao': '林荫道',
  2909. '分/身': '分身',
  2910. '克/隆': '克隆',
  2911. '性/需要': '性需要',
  2912. '黑/帮': '黑帮',
  2913. '政-府': '政府',
  2914. '八/九': '八九',
  2915. '不~着~寸~缕': '不着寸缕',
  2916. '肉~体': '肉体',
  2917. '蹲□子': '蹲下身子',
  2918. 'ji情': '激情',
  2919. 'xie恶': '邪恶',
  2920. 'Z国': '中国',
  2921. '创/世': '创世',
  2922. '紫jin城': '紫禁城',
  2923. '□□在外': '裸露在外',
  2924. '光怪6离': '光怪陆离',
  2925. '邪/教': '邪教',
  2926. '粗bao': '粗暴',
  2927. 'yin邪': '淫邪',
  2928. '小biao砸': '小婊砸',
  2929.  
  2930. '牛1b': '牛b', '微1博': '微博', '内1衣': '内衣',
  2931. };
  2932.  
  2933. const replaceAll = [
  2934. // 长文字替换
  2935. // 排序代码:newArr = arr.sort((a, b) => { var diff = a.charCodeAt(1) - b.charCodeAt(1); if (diff == 0) return b.length - a.length; return diff; })
  2936. '本站域名已经更换为,老域名已经停用,请大家重新收藏,并使用新域名访问。',
  2937. "\\(跪求订阅、打赏、催更票、月票、鲜花的支持!\\)",
  2938. "\\(?未完待续请搜索飄天文學,小说更好更新更快!",
  2939. "\\(跪求订阅、打赏、催更票、月票、鲜花的支持!",
  2940. "\\(看小说到网\\)",
  2941. "\\(未完待续。\\)",
  2942. "\\(本章完\\)",
  2943. "16977小游戏每天更新好玩的小游戏,等你来发现!",
  2944. "(800小说网 www.800Book.net 提供Txt免费下载)最新章节全文阅读-..-",
  2945. "(800小说网 www.800Book.net 提供Txt免费下载)",
  2946. "\\[800\\]\\[站页面清爽,广告少,",
  2947. "\\[看本书最新章节请到求书 .\\]",
  2948. "(\\s*君子聚义堂)",
  2949. "readx;",
  2950. "txt电子书下载/",
  2951. "txt全集下载",
  2952. "txt小说下载",
  2953. "\\|优\\|优\\|小\\|说\\|更\\|新\\|最\\|快\\|www.uuxs.cc\\|",
  2954. "\\|每两个看言情的人当中,就有一个注册过可°乐°小°说°网的账号。",
  2955. "思ˊ路ˋ客,更新最快的!",
  2956. "恋上你看书网 630bookla ,最快更新.*",
  2957. ",举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。",
  2958. "追书必备",
  2959. "-优-优-小-说-更-新-最-快-www.UUXS.CC-",
  2960. "-优-优-小-说-更-新-最-快x",
  2961. "来可乐网看小说",
  2962. "纯文字在线阅读本站域名手机同步阅读请访问",
  2963. "本文由  首发",
  2964. "樂文小说",
  2965. '最快更新无错小说阅读,请访问 请收藏本站阅读最新小说!',
  2966. "最新章节全文阅读看书神器\\.yankuai\\.",
  2967. "最新章节全文阅读(..首发)",
  2968. "最新章节全文阅读【首发】",
  2969. "最新章节全文阅读",
  2970. "看本书最新章节请到800小说网(www.800book.net)",
  2971. "(本章未完,请翻页)",
  2972. "手机用户请浏览m.biqugezw.com阅读,更优质的阅读体验。",
  2973. "手机用户请浏览阅读,更优质的阅读体验。",
  2974. "阅读,更优质的阅读体验。",
  2975. "手机最省流量无广告的站点。",
  2976. "手机看小说哪家强手机阅",
  2977. "如果你喜欢本站[〖]?一定要记住[】]?(?:网址|地址)哦",
  2978. "看清爽的小说就到",
  2979. "请用搜索引擎(?:搜索关键词)?.*?完美破防盗章节,各种小说任你观看",
  2980. "完美破防盗章节,请用搜索引擎各种小说任你观看",
  2981. "破防盗章节,请用搜索引擎各种小说任你观看",
  2982. "(?:搜索引擎)?各种小说任你观看,破防盗章节",
  2983. "章节错误,点此举报\\(免注册\\)",
  2984. "热门小说最新章节全文阅读.。 更新好快。",
  2985. "【阅读本书最新章节,请搜索800】",
  2986. "亲,百度搜索眼&amp;快,大量小说免费看。",
  2987. "亲,眼&快,大量小说免费看。",
  2988. '下载免费阅读器!!',
  2989. '笔趣阁&nbsp;.,最快更新.*最新章节!',
  2990. '请大家搜索(书迷楼)看最全!更新最快的小说',
  2991. '更新快无广告。',
  2992. '【鳳.{1,2}凰.{1,2}小说网 更新快 无弹窗 请搜索f.h.xiao.shuo.c.o.m】',
  2993. '【可换源APP看书软件:书掌柜APP或直接访问官方网站shuzh.net】',
  2994. '[●★▲]手机下载APP看书神器.*',
  2995. "m.?手机最省流量的站点。",
  2996. 'm.?手机最省流量.无广告的站点。',
  2997. '底部字链推广位',
  2998. 'us最快',
  2999.  
  3000. // 复杂规则的替换
  3001. '(看小说到|爱玩爱看就来|就爱上|喜欢)?(\\s|<|>|&| |[+@@=:;``%?》《〈︾-])?[乐樂](\\s|&lt;|&gt;|&amp;|&nbsp;|[+@@=:;``%?》《〈︾-])?[文].*?[说說][网]?[|]?(.*(3w|[wωWw]{1,3}|[Mm]).*[mMm])?[}。\\s]?(乐文小说)?',
  3002. '(本文由|小说)?(\\s| )?((3w|[wWw]{1,3}|[Mm]).)?\\s?[lしlL][wωWw][xχXx][sSs][55][22][00].*[mMm][|\\s]?(首发(哦亲)?)?',
  3003. '([『【↑△↓@︾]+[\u4E00-\u9FA5]){2,6}[】|]',
  3004.  
  3005. // 包含 \P 的替换
  3006. '\\P{1,2}[顶頂].{1,3}[点小].*?o?[mw,]',
  3007. '\\P.?长.{1,2}风.{1,2}文.{1,2}学.*?[tx]',
  3008. '\\P无.错.*?[cC][oO][mM]',
  3009. '[;\\(]顶.{0,2}点.小说',
  3010. '2长2风2文2学,w¢$',
  3011. '》长>风》',
  3012.  
  3013. // 包含 .* 的,可能有多余的替换
  3014. '看无防盗章节的小说,请用搜索引擎搜索关键词.*',
  3015. '(?:完美)?破防盗章节,请用搜索引擎搜索关键词.*',
  3016. '搜索引擎搜索关键词,各种任你观看,破防盗章节',
  3017. '破防盗完美章节,请用搜索引擎.*各种小说任你观看',
  3018. '如您已(?:閱讀|阅读)到此章节.*?敬请记住我们新的网址\\s*。',
  3019. '↗百度搜:.*?直达网址.*?↖',
  3020. "[:《〈|~∨∟∑]{1,2}长.{1,2}风.*?et",
  3021. '\\[限时抢购\\].*',
  3022. '支持网站发展.逛淘宝买东西就从这里进.*',
  3023. 'ps[::]想听到更多你们的声音,想收到更多你们的建议,现在就搜索微信公众号“qdread”并加关注,给.*?更多支持!',
  3024. '(?:ps[::])?看《.*?》背后的独家故事.*?告诉我吧!',
  3025. '(?天上掉馅饼的好活动.*?微信公众号!)?',
  3026. '(微信添加.*qdread微信公众号!)',
  3027. 'jiemei如您已阅读到此章节,请移步到.*?\\[ads:本站换新网址啦,速记方法:,.\\]',
  3028. '.*关注微信公众号.*',
  3029. '一秒记住.*',
  3030.  
  3031. // 短文字替换
  3032. '\\[txt全集下载\\]',
  3033. '\\[\\s*超多好看小说\\]',
  3034. '⊙四⊙五⊙中⊙文☆→',
  3035. '\\[ads:本站换新网址啦,速记方法:.*?\\]',
  3036. '[》《|~]无(?:.|&gt;)错(?:.|&gt;)小说',
  3037. '`无`错`小说`www.``com', '+无+错+小说+3w++',
  3038. '\\|优\\|优\\|小\\|说\\|更\\|新\\|最\\|快X',
  3039. '▲∴', '8,ww←',
  3040. /www.23+?[Ww][Xx].[Cc]om/ig,
  3041. /热门推荐:、+/g,
  3042. /h2&gt;/g,
  3043. '[《〈》>\\+|~[\\]]无\\1错\\1', '》无>错》',
  3044.  
  3045. '女凤免费小说抢先看', '女凤小说网全文字 无广告',
  3046. '乐文小说网?', '《乐〈文《小说', '乐文移动网', '頂点小说', '頂點小說',
  3047. '追小说哪里快去眼快',
  3048. '\\[书库\\].\\[774\\]\\[buy\\].kuai',
  3049. 'www.938xs.com',
  3050.  
  3051. /'ads_wz_txt;',|百度搜索|无弹窗小说网|更新快无弹窗纯文字|高品质更新|小说章节更新最快|\(百度搜.\)|全文字手打|“”&nbsp;看|无.弹.窗.小.说.网|追书网|〖∷∷无弹窗∷纯文字∷ 〗/g,
  3052. ];
  3053.  
  3054. // import _ from 'underscore'
  3055.  
  3056. // 单字替换,可能会误替换,所以需要特殊处理
  3057. var oneWordReplace = {
  3058. "b[āà]ng":"棒","bào":"爆","bà":"吧","bī":"逼","bō":"波", "biàn":"便",
  3059. "cāo":"操", "cǎo":"草", "cào":"操", "chāng":"娼", "chang":"娼", "cháo":"潮", "chā":"插", "chéng":"成", "chōu":"抽", "chuáng":"床", "chún":"唇", "chūn":"春", "cuō":"搓", "cū":"粗",
  3060. "dǎng":"党", "dàng":"荡", "dāo":"刀", "dòng":"洞", "diao":"屌", "diǎn":"点",
  3061. "fǎ":"法", "féi":"肥", "fù":"妇",
  3062. "guān":"官",
  3063. "hán":"含", "hóu":"喉", "hòu":"后", "h(u)?ā":"花", "huá":"华", "huì":"会", "huò":"惑", "hùn":"混", "hún":"魂",
  3064. "jiǔ":"九", "j[īi]ng":"精", "jìn":"禁", "jǐng":"警", "jiāng":"江", "jiān":"奸", "jiāo":"交", "jūn":"军", "jū":"拘", "jú":"局", "jī":"激", "激ān":"奸",
  3065. "kù":"裤", "kàn":"看",
  3066. "[1l]àng":"浪", "liáo":"撩", "liú":"流", "lì":"莉", "liè":"烈", "[1l]uàn":"乱", "lún":"伦", "luǒ":"裸", "lòu":"露", "[l1]ù":"露", "lǜ":"绿", "liàn":"练",
  3067. "mǎi":"买", "mài":"卖", "máo":"毛", "mā":"妈", "méng":"蒙", "mén":"门", "miè":"灭", "mí":"迷", "mì":"蜜", "mō":"摸", "miàn":"面",
  3068. "nǎi":"奶", "nèn":"嫩", "niào":"尿", "niē":"捏", "nòng":"弄", "nǚ":"女",
  3069. "pào":"炮", "piàn":"片", "pò":"破",
  3070. "qi[āa]ng":"枪", "qíng":"情", "qīn":"亲", "qiú":"求", "quán":"全", "qù":"去",
  3071. "rén":"人", "r[ìi]":"日", "rǔ":"乳",
  3072.  
  3073. // s
  3074. "sǎ":"洒", "sāo":"骚", "sǎo":"骚", "sè":"色", "se":"色", "shā":"杀",
  3075. "shēn":"身", "shēn":"呻", // 2个重复的,误替换且是单字怎么办
  3076. "shén":"神", "shè":"射", "shǐ":"屎", "shì":"侍", "sǐ":"死", "sī":"私", "shǔn":"吮", "sǔn":"吮", "sū":"酥", "shào":"绍",
  3077.  
  3078. "tān":"贪", "tiǎn":"舔", "t[ǐi]ng":"挺", "tǐ":"体", "tǒng":"捅", "tōu":"偷", "tou":"偷", "tuǐ":"腿", "tūn":"吞", "tún":"臀", "tiáo":"调", "tài":"态", "tào":"套",
  3079. "wēn":"温", "wěn":"吻",
  3080. "xiǎo":"小", "xiào":"笑", "xìng":"性", "xing":"性", "xiōng":"胸", "xī":"吸", "xí":"习", "xì":"系", "xìn":"信", "xué":"穴", "xuè":"穴", "xùe":"穴", "xuan":"宣", "xiàng":"象",
  3081. "yāng":"央", "yàn":"艳", "yīn":"阴", "yào":"药", "yé":"爷", "yòu":"诱", "zàng":"脏", "y[ùu]":"欲", "yín":"淫", "yì":"意", "yà":"讶",
  3082. "zhēn":"针", "zēn":"针", "zhà":"炸", "zhèng":"政", "zǒu":"走", "zuì":"罪", "zuò":"做", "zhōng":"中",
  3083. };
  3084.  
  3085. var replaceFix = {
  3086. // ===误替换还原===
  3087. "碧欲":"碧玉", "美欲":"美玉","欲石":"玉石","惜欲":"惜玉","宝欲":"宝玉",
  3088. "品性":"品行", "德性":"德行",
  3089. "波ok":"book", "波SS":"BOSS",
  3090.  
  3091. // ===其他修正===
  3092. "弥俩":"你俩",
  3093. "妳":"你",
  3094. "圞|垩|卝|龘":"",
  3095. "大6":"大陆",
  3096. };
  3097.  
  3098. function extendRule(replaceRule) {
  3099. _.each(oneWordReplace, function(value, key) {
  3100. // 这个替换会把 yùn 替换为 yù
  3101. // replace['\\b' + key + '(?:\\b|\\s*)'] = value;
  3102.  
  3103. // 这个不会替换 rén: shā rén偿命 => 杀 rén偿命
  3104. // replaceRule['([^a-z\\s])' + key + '(?![a-z])'] = '$1' + value;
  3105.  
  3106. replaceRule['\\b' + key + '(?![a-z])'] = value;
  3107. });
  3108.  
  3109. _.extend(replaceRule, replaceFix);
  3110. }
  3111.  
  3112.  
  3113.  
  3114. // test()
  3115.  
  3116. // Unicode/2000-2FFF:http://zh.wikibooks.org/wiki/Unicode/2000-2FFF
  3117. // Unicode/F000-FFFF:https://zh.wikibooks.org/wiki/Unicode/F000-FFFF
  3118.  
  3119. // replace 中的简写
  3120. var CHAR_ALIAS = {
  3121. '\\P': '[\\u2000-\\u2FFF\\u3004-\\u303F\\uFE00-\\uFF60\\uFFC0-\\uFFFF]', // 小说中添加的特殊符号
  3122. };
  3123.  
  3124. // ===== 自动尝试的规则 =====
  3125. var Rule = {
  3126. titleRegExp: /第?\s*[一二两三四五六七八九十○零百千万亿0-91234567890]{1,6}\s*[章回卷节折篇幕集话話]/i,
  3127. titleReplace: /^章节目录|^文章正文|^正文|全文免费阅读|最新章节|\(文\)/,
  3128.  
  3129. // nextRegExp: /[上前下后][一]?[页张个篇章节步]/,
  3130. nextSelector: "a[rel='next'], a:contains('下一页'), a:contains('下一章'), a:contains('下一节'), a:contains('下页')",
  3131. prevSelector: "a[rel='prev'], a:contains('上一页'), a:contains('上一章'), a:contains('上一节'), a:contains('上页')",
  3132. // 忽略的下一页链接,匹配 href
  3133. nextUrlIgnore: [
  3134. /(?:(?:index|list|last|LastPage|end)\.)|BuyChapterUnLogin|^javascript:/i,
  3135.  
  3136. // qidian
  3137. /BookReader\/LastPageNew\.aspx/i,
  3138. /read\.qidian\.com\/BookReader\/\d+,0\.aspx$/i,
  3139. /read\.qidian\.com\/$/i,
  3140. /free\.qidian\.com\/Free\/ShowBook\.aspx\?bookid=/i,
  3141.  
  3142. /book\.zongheng\.com\/readmore/i,
  3143. /www\.shumilou\.com\/to-n-[a-z]+-\d+\.html/i,
  3144. /\/0\.html$/i,
  3145. ],
  3146. nextUrlCompare: /\/\d+(_\d+)?\.html?$|\/wcxs-\d+-\d+\/$|chapter-\d+\.html$|\/\d+_\d+\/$/i, // 忽略的下一页链接(特殊),跟上一页比较
  3147.  
  3148. // 按顺序匹配,匹配到则停止。econtains 完全相等
  3149. indexSelectors: ["a[href='index.html']", "a:contains('返回书目')", "a:contains('章节目录')", "a:contains('章节列表')",
  3150. "a:econtains('最新章节')", "a:contains('回目录')","a:contains('回书目')", "a:contains('目 录')", "a:contains('目录')"],
  3151.  
  3152. contentSelectors: ["#pagecontent", "#contentbox", "#bmsy_content", "#bookpartinfo", "#htmlContent",
  3153. "#text_area", "#chapter_content", "#chapterContent", "#partbody", "#BookContent", "#read-content",
  3154. "#article_content", "#BookTextRead", "#booktext", "#BookText", "#readtext", "#readcon",
  3155. "#TextContent", "#text_c", "#txt_td", "#TXT", "#txt", "#zjneirong",
  3156. ".novel_content", ".readmain_inner", ".noveltext", ".booktext", ".yd_text2",
  3157. "#contentTxt", "#oldtext", "#a_content", "#contents", "#content2", "#contentts", "#content1", "#content", ".content"
  3158. ],
  3159.  
  3160. // 尝试查找书名。顶部章节导航的最后一个链接可能是书名。
  3161. bookTitleSelector: [
  3162. '.h1title > .shuming > a[title]',
  3163. '.chapter_nav > div:first > a:last',
  3164. '#header > .readNav > span > a:last',
  3165. 'div[align="center"] > .border_b > a:last',
  3166. '.ydselect > .weizhi > a:last',
  3167. '.bdsub > .bdsite > a:last',
  3168. '#sitebar > a:last',
  3169. '.con_top > a:last',
  3170. ],
  3171. bookTitleReplace: [
  3172. '全文阅读$',
  3173. ],
  3174.  
  3175. contentRemove: "script, iframe", // 内容移除选择器
  3176. removeLineRegExp: /<p>[ \s。;,!\.∷〖]*<\/p>/g, // 移除只有一个字符的行
  3177.  
  3178. // 以下不常改
  3179. replaceBrs: /(<br[^>]*>[ \n\r\t]*){1,}/gi, // 替换为<p>
  3180. };
  3181.  
  3182. Rule.specialSite = sites;
  3183.  
  3184. Rule.replace = replace;
  3185.  
  3186. extendRule(Rule.replace);
  3187.  
  3188. // ===== 全局移除,在替换 <br> 为 \n 之后 =====
  3189. Rule.replaceAll = replaceAll;
  3190.  
  3191.  
  3192. // 自定义的
  3193. Rule.customRules = [];
  3194. Rule.customReplace = {};
  3195.  
  3196. Rule.parseCustomReplaceRules = function(str) {
  3197. var arr = str.split(/\n/);
  3198. var rules = {};
  3199. _.each(arr, function(b) {
  3200. var pos = b.indexOf('=');
  3201. if (pos === -1) return;
  3202.  
  3203. var key = b.substring(0, pos),
  3204. value = b.substring(pos + 1, b.length);
  3205. rules[key] = value;
  3206. });
  3207. return rules;
  3208. };
  3209.  
  3210. // 内容需要 ajax 的 className
  3211. const READER_AJAX = "reader-ajax";
  3212.  
  3213. const autoBookTitleSelector = Rule.bookTitleSelector;
  3214.  
  3215. function autoGetBookTitle($doc) {
  3216. let bookTitle = '';
  3217. // 依次获取
  3218. for (let s of autoBookTitleSelector) {
  3219. let $node = $doc.find(s);
  3220. if ($node.length === 1) {
  3221. bookTitle = $node.text();
  3222. break
  3223. }
  3224. }
  3225.  
  3226. // 排除一些无效的?
  3227. C.log('autoGetBookTitle', bookTitle);
  3228.  
  3229. return bookTitle
  3230. }
  3231.  
  3232. function getElemFontSize(_heading) {
  3233. var fontSize = 0;
  3234. var _heading_style = window.getComputedStyle(_heading, null);
  3235. if (_heading_style) {
  3236. // firefox57 2017年9月10日 会错误
  3237. try {
  3238. var str = _heading_style.getPropertyValue("font-size") || 0;
  3239. fontSize = parseInt(str, 10);
  3240. } catch(e) { }
  3241. }
  3242.  
  3243. return fontSize
  3244. }
  3245.  
  3246. function Parser(){
  3247. this.init.apply(this, arguments);
  3248. }
  3249.  
  3250. Parser.prototype = {
  3251. constructor: Parser,
  3252. get contentTxt() { // callback 才有用
  3253. var text = $('<div>').html(this.content).text().trim();
  3254.  
  3255. // 解决第二个段落和第一个锻炼合在一起的问题
  3256. text = text.replace(/([^\n])  /, '$1\n  ');
  3257.  
  3258. return text;
  3259. },
  3260.  
  3261. init: function (info, doc, curPageUrl) {
  3262. this.info = info || {};
  3263. this.doc = doc;
  3264. this.$doc = $(doc);
  3265. this.curPageUrl = curPageUrl || doc.URL;
  3266. this._curPageHost = getUrlHost(this.curPageUrl); // 当前页的 host,后面用到
  3267.  
  3268. // 设置初始值
  3269. this.isTheEnd = false;
  3270. this.isSection = false;
  3271. },
  3272. applyPatch: function(){
  3273. var contentPatch = this.info.contentPatch;
  3274. if(contentPatch){
  3275. try {
  3276. contentPatch.call(this, this.$doc);
  3277. C.log("Apply Content Patch Success.");
  3278. } catch (e) {
  3279. C.log("Error: Content Patch Error!", e);
  3280. }
  3281. }
  3282. },
  3283. applyAsyncPatch: function(callback) {
  3284. var contentPatch = this.info.contentPatchAsync;
  3285. if(contentPatch){
  3286. try {
  3287. contentPatch.call(this, this.$doc, callback.bind(this));
  3288. C.log("Apply Content Patch[Async] Success.");
  3289. } catch (e) {
  3290. C.log("Error: Content Patch[Async] Error!", e);
  3291. }
  3292. } else {
  3293. callback();
  3294. }
  3295. },
  3296. getAll: function(callback){
  3297. var self = this;
  3298.  
  3299. C.debug('开始解析页面');
  3300.  
  3301. this.applyPatch();
  3302.  
  3303. this.applyAsyncPatch(function() {
  3304. self.preProcessDoc(callback);
  3305. });
  3306.  
  3307. return this;
  3308. },
  3309. preProcessDoc: function(callback) {
  3310. var self = this;
  3311. var endFn = function(data) {
  3312. if (data) {
  3313. var div;
  3314. if (data.content) {
  3315. div = $('<div id="content"></div>').html(data.content);
  3316. } else if (data.html) {
  3317. div = $('<div></div>').html(data.html);
  3318. }
  3319.  
  3320. self.$doc.find('body').prepend(div);
  3321. }
  3322.  
  3323. self.parse();
  3324. callback(self);
  3325. };
  3326.  
  3327. if (!this.hasContent() && this.info.getContent) {
  3328. C.log('开始 info.getContent');
  3329. this.info.getContent.call(this, this.$doc, endFn);
  3330. } else {
  3331. // 特殊处理,例如起点
  3332. var ajaxScript = this.$doc.find('.' + READER_AJAX);
  3333. if (ajaxScript.length > 0) {
  3334. var url = ajaxScript.attr('src');
  3335. if(!url) return;
  3336. var charset = ajaxScript.attr('charset') || 'utf-8';
  3337.  
  3338. C.log('Ajax 获取内容: ', url, ". charset=" + charset);
  3339.  
  3340. var reqObj = {
  3341. url: url,
  3342. method: "GET",
  3343. overrideMimeType: "text/html;charset=" + charset,
  3344. headers: {},
  3345. onload: function(res){
  3346. var text = res.responseText;
  3347. text = text.replace(/document.write(ln)?\('/, "")
  3348. .replace("');", "")
  3349. .replace(/[\n\r]+/g, '</p><p>');
  3350.  
  3351. endFn({
  3352. content: text
  3353. });
  3354. }
  3355. };
  3356.  
  3357. // Jixun: Allow post data
  3358. var postData = ajaxScript.data('post');
  3359.  
  3360. if (postData) {
  3361. reqObj.method = 'POST';
  3362. reqObj.data = $.param(postData);
  3363. reqObj.headers['Content-Type'] = 'application/x-www-form-urlencoded';
  3364. }
  3365.  
  3366. GM_xmlhttpRequest(reqObj);
  3367. } else {
  3368. endFn();
  3369. }
  3370. }
  3371. },
  3372. parse: function() {
  3373. C.group('开始获取链接');
  3374. this.getPrevUrl();
  3375. this.getIndexUrl();
  3376. this.getNextUrl();
  3377. C.groupEnd();
  3378.  
  3379. C.group('开始获取标题');
  3380. this.getTitles();
  3381. C.groupEnd();
  3382.  
  3383. this.getContent();
  3384. },
  3385.  
  3386. hasContent: function() {
  3387. var $content;
  3388.  
  3389. // var $ajaxScript = this.$doc.find('.' + READER_AJAX);
  3390. // if ($ajaxScript.length > 0) {
  3391. // return true;
  3392. // }
  3393.  
  3394. // 排除 qidian 需付费的页面
  3395. if (this.info.isVipChapter) {
  3396. if (this.info.isVipChapter(this.$doc)) {
  3397. this.isTheEnd = 'vip';
  3398. return false;
  3399. }
  3400. }
  3401.  
  3402. if(this.info.contentSelector){
  3403. $content = this.$doc.find(this.info.contentSelector);
  3404. }
  3405.  
  3406. if (!$content || !$content.length) {
  3407. // 按照顺序选取
  3408. var selectors = Rule.contentSelectors;
  3409. for(var i = 0, l = selectors.length; i < l; i++){
  3410. $content = this.$doc.find(selectors[i]);
  3411. if($content.length){
  3412. C.log("自动查找内容选择器: " + selectors[i]);
  3413. break;
  3414. }
  3415. }
  3416. }
  3417.  
  3418. this.$content = $content;
  3419. // C.debug($content);
  3420.  
  3421. return $content.size() > 0;
  3422. },
  3423. // 获取书名和章节标题
  3424. getTitles: function(){
  3425. var info = this.info,
  3426. chapterTitle,
  3427. bookTitle,
  3428. docTitle = this.$doc.find("title").text();
  3429.  
  3430. // 获取章节标题
  3431. if (info.titleReg){
  3432. var matches = docTitle.match(toRE(info.titleReg, 'i'));
  3433. if(matches && matches.length >= 2){
  3434. var titlePos = ( info.titlePos || 0 ) + 1;
  3435. var chapterPos = (titlePos == 1) ? 2 : 1;
  3436.  
  3437. bookTitle = matches[titlePos];
  3438. chapterTitle = matches[chapterPos];
  3439. }
  3440.  
  3441. C.log("TitleReg:", info.titleReg, matches);
  3442. }
  3443.  
  3444. // 如果有 titleSelector 则覆盖从 titleReg 中获取的
  3445. var tmpChapterTitle = this.getTitleFromRule(info.titleSelector);
  3446. if (tmpChapterTitle) {
  3447. chapterTitle = tmpChapterTitle;
  3448. }
  3449.  
  3450. if(!chapterTitle){
  3451. chapterTitle = this.autoGetChapterTitle(this.doc);
  3452. }
  3453. if (info.chapterTitleReplace) {
  3454. chapterTitle = chapterTitle.replace(toRE(info.chapterTitleReplace), '');
  3455. }
  3456.  
  3457. // get bookTitle
  3458. if (!bookTitle && info.bookTitleSelector) {
  3459. bookTitle = this.getTitleFromRule(info.bookTitleSelector);
  3460. }
  3461. if (!bookTitle) {
  3462. bookTitle = autoGetBookTitle(this.$doc);
  3463. bookTitle = this.replaceText(bookTitle, Rule.bookTitleReplace);
  3464. }
  3465. if (info.bookTitleReplace) {
  3466. bookTitle = bookTitle.replace(toRE(info.bookTitleReplace), '');
  3467. }
  3468.  
  3469. // 标题间增加一个空格,不准确,已注释
  3470. chapterTitle = chapterTitle
  3471. .replace(Rule.titleReplace, "")
  3472. .trim();
  3473. // .replace(/(第?\S+?[章节卷回])(.*)/, "$1 $2");
  3474.  
  3475. if (chapterTitle.startsWith(bookTitle)) {
  3476. chapterTitle = chapterTitle.replace(bookTitle, '').trim();
  3477. }
  3478.  
  3479. bookTitle = bookTitle.replace(/(?:最新章节|章节目录)$/, '');
  3480.  
  3481. docTitle = bookTitle ?
  3482. bookTitle + ' - ' + chapterTitle :
  3483. docTitle;
  3484.  
  3485. if (Setting.cn2tw) {
  3486. bookTitle = this.convert2tw(bookTitle);
  3487. chapterTitle = this.convert2tw(chapterTitle);
  3488. docTitle = this.convert2tw(docTitle);
  3489. }
  3490.  
  3491. this.bookTitle = (bookTitle || '目录').trim();
  3492. this.chapterTitle = chapterTitle;
  3493. this.docTitle = docTitle;
  3494.  
  3495. C.log("Book Title: " + this.bookTitle);
  3496. C.log("Chapter Title: " + this.chapterTitle);
  3497. C.log("Document Title: " + this.docTitle);
  3498. },
  3499. getTitleFromRule: function(selectorOrArray) {
  3500. var title = '';
  3501. if (!selectorOrArray) {
  3502. return '';
  3503. }
  3504.  
  3505. var selector,
  3506. replace;
  3507.  
  3508. if (_.isArray(selectorOrArray)) {
  3509. selector = selectorOrArray[0];
  3510. replace = selectorOrArray[1];
  3511. } else {
  3512. selector = selectorOrArray;
  3513. }
  3514.  
  3515. var $title = this.$doc.find(selector);
  3516. if (!$title.length) {
  3517. C.error('无法找到标题', selector, this.doc);
  3518. return '';
  3519. }
  3520.  
  3521. title = $title.remove().text().trim();
  3522.  
  3523. if (replace) {
  3524. title = title.replace(toRE(replace), '');
  3525. }
  3526.  
  3527. return title;
  3528. },
  3529. // 智能获取章节标题
  3530. autoGetChapterTitle: function (document) {
  3531. var
  3532. _main_selector = "h1, h2, h3",
  3533. _second_selector = "#TextTitle, #title, .ChapterName, #lbChapterName, div.h1",
  3534. _positive_regexp = Rule.titleRegExp,
  3535. // _positive_regexp = /第?\S+[章节卷回]|\d{2,4}/,
  3536. // _negative_regexp = /[上前下后][一]?[页张个篇章节步]/,
  3537. _title_remove_regexp = /最新章节|书书网/,
  3538. $doc = $(document),
  3539. _document_title = document.title || $doc.find("title").text(),
  3540. _search_document_title = ' ' + _document_title.replace(/\s+/gi, ' ') + ' ';
  3541.  
  3542. var _headings = $doc.find(_main_selector);
  3543. // 加上 second selector 并去除包含的
  3544. $doc.find(_second_selector).each(function(){
  3545. if($(this).find(_main_selector).length === 0){
  3546. _headings.push(this);
  3547. }
  3548. });
  3549.  
  3550. var possibleTitles = {},
  3551. _heading_text;
  3552.  
  3553. C.groupCollapsed('自动查找章节标题');
  3554.  
  3555. $(_headings).each(function(){
  3556. var _heading = this,
  3557. _heading_text = _heading.textContent.trim();
  3558.  
  3559. if (!_heading_text || _heading_text in possibleTitles) {
  3560. return;
  3561. }
  3562.  
  3563. C.group('开始计算 "' + _heading_text + '" 的得分');
  3564.  
  3565. // h1 为 1, h2 为 2
  3566. var
  3567. nodeNum = parseInt(_heading.nodeName.slice(1), 10) || 10,
  3568. score = 10 / nodeNum,
  3569. _heading_words = _heading_text.replace(/\s+/g, " ").split(" "),
  3570. _matched_words = "";
  3571.  
  3572. C.log("初始得分:" + score);
  3573.  
  3574. // 后面这种是特殊的判断
  3575. if (_positive_regexp.test(_heading_text) || /\d{2,4}/.test(_heading_text)) {
  3576. score += 50;
  3577. }
  3578. // if(_negative_regexp.test(_heading_text)){
  3579. // score -= 100;
  3580. // }
  3581.  
  3582. C.log("符合正则计算后得分:" + score);
  3583.  
  3584. // count words present in title
  3585. for (var j = 0, _j = _heading_words.length; j < _j; j++) {
  3586. if (_search_document_title.indexOf(_heading_words[j]) > -1) {
  3587. _matched_words += _heading_words[j] + ' ';
  3588. }
  3589. }
  3590. score += _matched_words.length * 1.5;
  3591.  
  3592. C.log("跟页面标题比较后得分:" + score);
  3593.  
  3594. var _font_size_add_score = getElemFontSize(_heading) * 1.5;
  3595. score += _font_size_add_score;
  3596.  
  3597. C.log("计算大小后得分:" + score);
  3598.  
  3599. possibleTitles[_heading_text] = score;
  3600.  
  3601. C.groupEnd();
  3602. });
  3603.  
  3604. // 找到分数最高的值
  3605. var topScoreTitle,
  3606. score_tmp = 0;
  3607. for (_heading_text in possibleTitles) {
  3608. if (possibleTitles[_heading_text] > score_tmp) {
  3609. topScoreTitle = _heading_text;
  3610. score_tmp = possibleTitles[_heading_text];
  3611. }
  3612. }
  3613.  
  3614. var curTitle = topScoreTitle;
  3615. if (!curTitle) {
  3616. curTitle = _document_title;
  3617.  
  3618. // 下面的正则从
  3619. // Firefox-Firefox浏览器论坛-卡饭论坛 - 互助分享 - 大气谦和!
  3620. // 变为
  3621. // Firefox-Firefox浏览器论坛-卡饭论坛
  3622. curTitle = curTitle.replace(/\s-\s.*/i, "")
  3623. .replace(/_[^\[\]【】]+$/, "");
  3624. curTitle = curTitle.trim();
  3625. curTitle = curTitle.replace(_title_remove_regexp, '');
  3626. }
  3627.  
  3628. curTitle = curTitle.replace(Rule.titleReplace, "");
  3629.  
  3630. C.groupEnd();
  3631.  
  3632. return curTitle;
  3633. },
  3634.  
  3635. // 获取和处理内容
  3636. getContent: function(){
  3637. var self = this;
  3638.  
  3639. this.hasContent();
  3640.  
  3641. if (!this.$content || this.$content.size() <= 0) {
  3642. // callback(this);
  3643. console.error('没有找到内容', this.$doc);
  3644. return;
  3645. }
  3646.  
  3647. this.content = this.handleContentText(this.$content.html(), this.info);
  3648. },
  3649. handleContentText: function(text, info){
  3650. if(!text) return null;
  3651.  
  3652. // 贴吧的内容处理比较耗时间
  3653. C.group('开始内容处理');
  3654. C.time('内容处理');
  3655.  
  3656. var contentHandle = (typeof(info.contentHandle) == 'undefined') ? true : info.contentHandle;
  3657.  
  3658. // 拼音字、屏蔽字修复
  3659. if(contentHandle){
  3660. text = this.replaceHtml(text, Rule.replace);
  3661. }
  3662.  
  3663. /* Turn all double br's into p's */
  3664. text = text.replace(Rule.replaceBrs, '</p>\n<p>');
  3665. text = text.replace(/<\/p><p>/g, "</p>\n<p>");
  3666.  
  3667. text = this.normalizeContent(text);
  3668.  
  3669. // GM_setClipboard(text);
  3670.  
  3671. text = this.removeDump(text);
  3672.  
  3673. // 规则替换
  3674. if (info.contentReplace) {
  3675. text = this.replaceText(text, info.contentReplace);
  3676. }
  3677.  
  3678. // 移除文字广告等
  3679. text = this.replaceText(text, Rule.replaceAll);
  3680.  
  3681. // 去除内容中的标题
  3682. if(this.chapterTitle && Rule.titleRegExp.test(this.chapterTitle)){
  3683. try {
  3684. var reg = toReStr(this.chapterTitle).replace(/\s+/g, '\\s*');
  3685. reg = new RegExp(reg, 'ig');
  3686. text = text.replace(reg, "");
  3687. C.log('去除内容中的标题', reg);
  3688. } catch(e) {
  3689. console.error(e);
  3690. }
  3691. }
  3692.  
  3693. if (this.bookTitle) {
  3694. var regStr = '(' + toReStr(this.bookTitle) + '\\d*章)';
  3695. text = text.replace(new RegExp(regStr, 'ig'), "");
  3696. }
  3697.  
  3698. if (Setting.cn2tw) {
  3699. text = this.convert2tw(text);
  3700. }
  3701.  
  3702. try {
  3703. text = this.contentCustomReplace(text);
  3704. } catch(ex) {
  3705. console.error('自定义替换错误', ex);
  3706. }
  3707.  
  3708. // 采用 DOM 方式进行处理
  3709. var $div = $("<div>").html(text);
  3710.  
  3711. // contentRemove
  3712. $div.find(Rule.contentRemove).remove();
  3713. if(info.contentRemove){
  3714. $div.find(info.contentRemove).remove();
  3715. }
  3716.  
  3717. // 给独立的文本加上 p
  3718. var $contents = $div.contents();
  3719. if ($contents.length === 1) { // 可能里面还包裹着一个 div
  3720. $contents = $contents.contents();
  3721. }
  3722. $contents.filter(function() {
  3723. return this.nodeType == 3 &&
  3724. this.textContent != '\n' &&
  3725. (!this.nextElementSibling || this.nextElementSibling.nodeName != 'A') &&
  3726. (!this.previousElementSibling || this.previousElementSibling.nodeName != 'A');
  3727. }).wrap('<p>');
  3728.  
  3729. // 删除无效的 p,排除对大块文本的判断
  3730. $div.find('p, h1').filter(function() {
  3731. var $this = $(this);
  3732. if ($this.find('img').size()) // 排除有图片的
  3733. return false;
  3734.  
  3735. // 有效文本(排除注释、换行符、空白)个数为 0
  3736. return $this.contents().filter(function() {
  3737. return this.nodeType != 8 &&
  3738. !this.textContent.match(/^\s*$/);
  3739. }).size() == 0;
  3740. }).remove();
  3741.  
  3742. // 把一大块的文本分段
  3743. if (Setting.split_content) {
  3744. var $p = $div.find('p'),
  3745. $newP;
  3746. if ($p.length == 0 ) {
  3747. $newP = $div;
  3748. } else if ($p.length == 1) {
  3749. $newP = $p;
  3750. }
  3751.  
  3752. if ($newP) {
  3753. $newP.replaceWith('<p>' + this.splitContent($newP.html()).join('</p>\n<p>') + '</p>');
  3754. }
  3755. }
  3756.  
  3757. if(contentHandle){
  3758. $div.filter('br').remove();
  3759.  
  3760. $div.find('*').removeAttr('style');
  3761. }
  3762.  
  3763. $div.find('p').removeAttr('class');
  3764.  
  3765. // 图片居中,所有图像?
  3766. // if(info.fixImage){
  3767. // $div.find("img").each(function(){
  3768. // this.className += " blockImage";
  3769. // });
  3770. // }
  3771.  
  3772. text = $div.html();
  3773.  
  3774. // 修复第一行可能是空的情况
  3775. text = text.replace(/(?:\s|&nbsp;)+<p>/, "<p>");
  3776.  
  3777. // 修复当行就一个字符的
  3778. text = text.replace(/<\/p><p>([。])/, "$1");
  3779.  
  3780. if(config.paragraphBlank){
  3781. text = text.replace(/<p>(?:\s|&nbsp;)+/g, "<p>")
  3782. .replace(/<p>/g, "<p>  ");
  3783. }
  3784.  
  3785. // 删除空白的、单个字符的 p
  3786. text = text.replace(Rule.removeLineRegExp, "");
  3787.  
  3788. C.timeEnd('内容处理');
  3789. C.groupEnd();
  3790.  
  3791. return text;
  3792. },
  3793. normalizeContent: function(text) {
  3794. text = text.trim();
  3795.  
  3796. if (text.startsWith('<')) return text;
  3797.  
  3798. // 修正 </p> 在另一行的情况
  3799. text = text.replace(/\n<\/p>/g, '</p>');
  3800.  
  3801. var lines = text.split('\n');
  3802. var firstLine = lines[0];
  3803. var lastLine = lines[lines.length - 1];
  3804.  
  3805. // 修正 p 不完整的情况
  3806. if (!firstLine.includes('<p>') && firstLine.includes('</p>')) {
  3807. text = '<p>' + text;
  3808. }
  3809. if (lastLine.includes('<p>') && !lastLine.includes('</p>')) {
  3810. text = text + '</p>';
  3811. }
  3812.  
  3813. return text;
  3814. },
  3815. /**
  3816. * 移除内容中大块的重复。
  3817. * 例如:http://www.wangshuge.com/books/109/109265/28265316.html
  3818. *
  3819. * @param {string} text 内容
  3820. * @return {string} 处理后的内容
  3821. */
  3822. removeDump: function(text) {
  3823. var newContent = text;
  3824.  
  3825. var lines = text.split('\n');
  3826. var firstLine = lines[0];
  3827. // 有重复
  3828. if (firstLine.length > 10) {
  3829. // 因为 indexOf 只查找第一个
  3830. var dumpIndex = lines.slice(1).indexOf(firstLine) + 1;
  3831. if (dumpIndex >= config.dumpContentMinLength) {
  3832. var firstPart = lines.slice(0, dumpIndex).join('\n');
  3833. var restPart = lines.slice(dumpIndex).join('\n')
  3834. .replace(/^<\/p>\n/, '');
  3835. if (restPart.startsWith(firstPart)) {
  3836. newContent = restPart;
  3837. }
  3838. }
  3839. }
  3840.  
  3841. return newContent;
  3842. },
  3843. replaceHtml: function(text, replaceRule) { // replaceRule 给“自定义替换规则直接生效”用
  3844. if (!replaceRule) {
  3845. replaceRule = Rule.replace;
  3846. }
  3847.  
  3848. // 先提取出 img
  3849. var imgs = {};
  3850. var i = 0;
  3851. text = text.replace(/<(img|a)[^>]*>/g, function(img){
  3852. imgs[i] = img;
  3853. return "{" + (i++) + "}";
  3854. });
  3855.  
  3856. // 修正拼音字等
  3857. text = this.contentReplacements(text, replaceRule);
  3858.  
  3859. // 还原图片
  3860. text = $.nano(text, imgs);
  3861.  
  3862. return text;
  3863. },
  3864. contentReplacements: function (text, rule) {
  3865. if (!text) return text;
  3866.  
  3867. for (var key in rule) {
  3868. text = text.replace(toRE(key, "ig"), rule[key]);
  3869. }
  3870. return text;
  3871. },
  3872. replaceText: function(text, rule){
  3873. var self = this;
  3874. switch(true) {
  3875. case _.isRegExp(rule):
  3876. text = text.replace(rule, '');
  3877. break;
  3878. case _.isString(rule):
  3879. // 还原简写
  3880. _.each(CHAR_ALIAS, function(value, key) {
  3881. rule = rule.replace(key, value);
  3882. });
  3883. var regexp = new RegExp(rule, 'ig');
  3884. text = text.replace(regexp, '');
  3885. break;
  3886. case _.isArray(rule):
  3887. rule.forEach(function(r){
  3888. text = self.replaceText(text, r);
  3889. });
  3890. break;
  3891. case _.isObject(rule):
  3892. var key;
  3893. for(key in rule){
  3894. text = text.replace(new RegExp(key, "ig"), rule[key]);
  3895. }
  3896. break;
  3897. }
  3898. return text;
  3899. },
  3900. convert2tw: function (text) {
  3901. if (!text) return text;
  3902.  
  3903. var ii, len, str;
  3904. str = text.split("");
  3905. len = str.length;
  3906. for (ii = 0; ii < len; ii++) {
  3907. str[ii] = cn2tw[str[ii]] || str[ii];
  3908. }
  3909.  
  3910. str = str.join("");
  3911.  
  3912. return str;
  3913. },
  3914. contentCustomReplace: function (text) {
  3915. if (!text) return text;
  3916.  
  3917. for (var key in Rule.customReplace) {
  3918. text = text.replace(new RegExp(key, 'ig'), Rule.customReplace[key]);
  3919. }
  3920. return text;
  3921. },
  3922. splitContent: function (text) { // 有些章节整个都集中在一起,没有分段,这个函数用于简易分段
  3923. if (text.indexOf('。') == -1) {
  3924. return [text];
  3925. }
  3926.  
  3927. var hasMark = false,
  3928. lines = [],
  3929. charCotainer = [];
  3930.  
  3931. text.split('').forEach(function(c) {
  3932. charCotainer.push(c);
  3933.  
  3934. if (c == '“') {
  3935. hasMark = true;
  3936. } else if (c == '”') {
  3937. hasMark = false;
  3938. } else if (c == '。' && !hasMark) {
  3939. lines.push(charCotainer.join(''));
  3940. charCotainer = [];
  3941. }
  3942. });
  3943.  
  3944. return lines;
  3945. },
  3946.  
  3947. getIndexUrl: function(){
  3948. var url = '',
  3949. selector = this.info.indexSelector || this.info.indexUrl;
  3950.  
  3951. if (selector === false) {
  3952. this.indexUrl = url;
  3953. return url;
  3954. }
  3955.  
  3956. // 先尝试站点规则
  3957. if (selector && _.isFunction(selector)) {
  3958. url = selector(this.$doc);
  3959. } else if(this.info.indexSelector){
  3960. url = this.$doc.find(this.info.indexSelector);
  3961. }
  3962.  
  3963. // 再尝试通用规则
  3964. if (!url || !url.length) {
  3965. var selectors = Rule.indexSelectors;
  3966. var _indexLink;
  3967. // 按照顺序选取目录链接
  3968. for(var i = 0, l = selectors.length; i < l; i++){
  3969. _indexLink = this.$doc.find(selectors[i]);
  3970. if(_indexLink.length > 0){
  3971. url = _indexLink;
  3972. break;
  3973. }
  3974. }
  3975. }
  3976.  
  3977. if(url){
  3978. url = this.checkLinks(url);
  3979. C.log("找到目录链接: " + url);
  3980. }
  3981.  
  3982. if (!url) {
  3983. C.log("无法找到目录链接.");
  3984. }
  3985.  
  3986. this.indexUrl = url;
  3987. return url;
  3988. },
  3989. getNextUrl: function(){
  3990. var url = '',
  3991. selector = this.info.nextSelector || this.info.nextUrl;
  3992.  
  3993. if (selector === false) {
  3994. this.nextUrl = url;
  3995. return url;
  3996. }
  3997.  
  3998. // 先尝试站点规则
  3999. if (selector) {
  4000. if (_.isFunction(selector)) {
  4001. url = selector(this.$doc);
  4002. } else {
  4003. url = this.$doc.find(selector);
  4004. }
  4005.  
  4006. url = this.checkLinks(url);
  4007. }
  4008.  
  4009. // 再尝试通用规则
  4010. if (!url) {
  4011. url = this.$doc.find(Rule.nextSelector);
  4012. url = this.checkLinks(url);
  4013. }
  4014.  
  4015. if (url) {
  4016. C.log("找到下一页链接: " + url);
  4017. } else {
  4018. C.log("无法找到下一页链接");
  4019. }
  4020.  
  4021. this.nextUrl = url || '';
  4022. this.isTheEnd = !this.checkNextUrl(url);
  4023. if(this.isTheEnd){
  4024. C.log('已到达最后一页');
  4025. this.theEndColor = config.end_color;
  4026. }
  4027.  
  4028. return url;
  4029. },
  4030. // 获取上下页及目录页链接
  4031. getPrevUrl: function(){
  4032. var url = '',
  4033. selector = this.info.prevSelector || this.info.prevUrl;
  4034.  
  4035. if (selector === false) {
  4036. this.prevUrl = url;
  4037. return url;
  4038. }
  4039.  
  4040. // 先尝试站点规则
  4041. if (selector) {
  4042. if (_.isFunction(selector)) {
  4043. url = selector(this.$doc);
  4044. } else {
  4045. url = this.$doc.find(selector);
  4046. }
  4047.  
  4048. url = this.checkLinks(url);
  4049. }
  4050.  
  4051. // 再尝试通用规则
  4052. if (!url) {
  4053. url = this.$doc.find(Rule.prevSelector);
  4054. url = this.checkLinks(url);
  4055. }
  4056.  
  4057. if (url) {
  4058. C.log("找到上一页链接: " + url);
  4059. } else {
  4060. C.log("无法找到上一页链接");
  4061. }
  4062.  
  4063. this.prevUrl = url || '';
  4064. return url;
  4065. },
  4066. checkNextUrl: function(url){
  4067. if (this.info.checkSection) {
  4068. if (/\/\d+_\d+\.html$/.test(this.curPageUrl)) {
  4069. this.isSection = true;
  4070. if(url == this.indexUrl){
  4071. return false;
  4072. }else{
  4073. return true;
  4074. }
  4075. }
  4076. }
  4077.  
  4078. // 跟 include 比较
  4079. var includeUrl = this.info.includeUrl || this.getIncludeUrl();
  4080. if (!toRE(includeUrl).test(url))
  4081. return false;
  4082.  
  4083. switch(true){
  4084. case url === '':
  4085. return false
  4086. case this.info.exclude && toRE(this.info.exclude).test(url):
  4087. return false
  4088. case Rule.nextUrlIgnore.some(function(re) { return toRE(re).test(url) }):
  4089. return false
  4090. case url === this.indexUrl:
  4091. return false
  4092. case url === this.prevUrl:
  4093. return false
  4094. case url === this.curPageUrl:
  4095. return false
  4096. case Rule.nextUrlCompare.test(this.prevUrl) && !Rule.nextUrlCompare.test(url):
  4097. return false
  4098. default:
  4099. return true
  4100. }
  4101. },
  4102. getIncludeUrl: function() {
  4103. var includeUrl = this.info.url;
  4104.  
  4105. if (!includeUrl && typeof GM_info !== 'undefined') {
  4106. var locationHref = location.href;
  4107. GM_info.script.includes.some(function(includeStr) {
  4108. var iUrl = wildcardToRegExpStr(includeStr);
  4109. if (toRE(iUrl).test(locationHref)) {
  4110. includeUrl = iUrl;
  4111. return true;
  4112. }
  4113. });
  4114. }
  4115.  
  4116. this.info.includeUrl = includeUrl;
  4117. return includeUrl;
  4118. },
  4119. checkLinks: function(links){
  4120. var self = this;
  4121. var url = '';
  4122.  
  4123. if (!links) return ''
  4124.  
  4125. if (_.isString(links)) {
  4126. return this.getFullHref(links);
  4127. }
  4128.  
  4129. links && links.each(function(){
  4130. url = $(this).attr("href");
  4131. if(!url || url.indexOf("#") === 0 || url.indexOf("javascript:") === 0)
  4132. return;
  4133.  
  4134. url = self.getFullHref(this);
  4135. return false;
  4136. });
  4137.  
  4138. return url;
  4139. },
  4140. getLinkUrl: function(linkOrUrl) {
  4141. // if (linkOrUrl && )
  4142. return linkOrUrl;
  4143. },
  4144. getFullHref: function(href) {
  4145. if(!href) return '';
  4146.  
  4147. if (!_.isString(href)) {
  4148. href = href.getAttribute('href');
  4149. }
  4150.  
  4151. if (href.indexOf('http://') === 0) {
  4152. return href;
  4153. }
  4154.  
  4155. var a = this.a;
  4156. if (!a) {
  4157. this.a = a = document.createElement('a');
  4158. }
  4159. a.href = href;
  4160.  
  4161. // // 检测 host 是否和 当前页的一致
  4162. // if (a.host != this._curPageHost) {
  4163. // a.host = this._curPageHost;
  4164. // }
  4165.  
  4166. return a.href;
  4167. },
  4168. };
  4169.  
  4170. var tpl_mainCss = "@font-face {\r\n font-family: 'FontAwesome';\r\n src: url('https://cdn.bootcss.com/font-awesome/4.7.0/fonts/fontawesome-webfont.eot?v=4.7.0');\r\n src: url('https://cdn.bootcss.com/font-awesome/4.7.0/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('https://cdn.bootcss.com/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('https://cdn.bootcss.com/font-awesome/4.7.0/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('https://cdn.bootcss.com/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('https://cdn.bootcss.com/font-awesome/4.7.0/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');\r\n font-weight: normal;\r\n font-style: normal;\r\n }\r\n\r\nbody > a { display:none !important; }\r\n.hidden {\r\n display: none;\r\n}\r\n.quiet-mode {\r\n display: none;\r\n}\r\nbody {\r\n background: #F3F2EE;\r\n color: #1F0909;\r\n padding: 0px;\r\n margin: 0px;\r\n font-family: \"Microsoft YaHei UI\", 微软雅黑, 新宋体, 宋体, arial;\r\n}\r\na { color: #065488; }\r\na:link { text-decoration: none; }\r\n\r\n#mynovelreader-content {\r\n width: {content_width};\r\n font-size: {font_size};\r\n font-family: {font_family};\r\n line-height: {text_line_height};\r\n margin-left:auto;\r\n margin-right:auto;\r\n padding-bottom: 15px;\r\n}\r\n#mynovelreader-content img{\r\n max-width: 100%;\r\n}\r\n\r\narticle {\r\n margin-top: 55px;\r\n word-wrap: break-word;\r\n}\r\n\r\narticle h1 {\r\n clear: both;\r\n line-height: 50px;\r\n font-size: {title_font_size};\r\n font-weight: normal;\r\n margin: 25px -20px;\r\n padding: 0 20px 10px;\r\n border-bottom: 1px solid rgba(0,0,0,.25);\r\n font-weight: normal;\r\n text-transform: none;\r\n}\r\n\r\narticle li {\r\n list-style: none;\r\n}\r\n\r\n.chapter-footer-nav {\r\n text-align:center;\r\n font-size:0.9em;\r\n margin:-10px 0px 30px 0px;\r\n}\r\n#loading {\r\n color: white;\r\n text-align: center;\r\n font: 12px \"微软雅黑\", \"宋体\", \"Times New Roman\", \"Verdana\";\r\n margin-top: 20px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n width: 376px;\r\n height: 32px;\r\n line-height: 32px;\r\n border-radius: 20px;\r\n border: 1px solid #666;\r\n background-color: #333;\r\n}\r\n#loading img {\r\n vertical-align: middle;\r\n}\r\n#loading a {\r\n color: white;\r\n}\r\n#preferencesBtn{\r\n position: fixed;\r\n top: 10px;\r\n right: 10px;\r\n z-index: 1597;\r\n}\r\n\r\n#alert {\r\n position: fixed;\r\n z-index: 100;\r\n float: auto;\r\n width: auto;\r\n height: auto;\r\n top: 10px;\r\n left: 500px;\r\n background: rgba(215, 240, 253, 0.65);\r\n color: #2d7091;\r\n border: 1px solid rgba(45,112,145,0.3);\r\n border-radius: 4px;\r\n}\r\n#alert p {\r\n font-size: 15px;\r\n margin: 6px;\r\n}\r\n\r\n#message {\r\n position: fixed;\r\n z-index: 1010;\r\n width: auto;\r\n height: auto;\r\n top: 10px;\r\n left: 500px;\r\n\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n box-shadow: 0 2px 8px rgba(0,0,0,.2);\r\n background: #fff;\r\n display: inline-block;\r\n pointer-events: all;\r\n\r\n font-size: 12px;\r\n}\r\n#message .fa-spinner {\r\n font-size: 13px;\r\n margin-right: 4px;\r\n}\r\n#message p {\r\n margin: 0;\r\n}\r\n\r\nimg.blockImage {clear: both;float: none;display: block;margin-left: auto;margin-right: auto;}\r\n\r\n#menu-bar {\r\n border: solid rgba(0, 100, 255, .9);\r\n border-width: 3px 2px 3px 0px;\r\n position: fixed;\r\n left: 0px;\r\n top: 40%;\r\n height: 100px;\r\n width: 2px;\r\n z-index: 199;\r\n {menu-bar-hidden}\r\n}\r\n#menu-bar {\r\n top: 0px;\r\n height: 100%;\r\n width: 1px;\r\n background: transparent;\r\n border: none;\r\n}\r\n#menu {\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 100;\r\n width: 270px;\r\n max-width: 100%;\r\n background: #333;\r\n overflow-y: auto;\r\n}\r\n#menu:after {\r\n content: \"\";\r\n display: block;\r\n position: absolute;\r\n top: 46px;\r\n bottom: 0;\r\n right: 0;\r\n width: 1px;\r\n background: rgba(0,0,0,0.6);\r\n box-shadow: 0 0 5px 2px rgba(0,0,0,0.6);\r\n}\r\n#header{\r\n color: #777;\r\n margin-top: 0;\r\n border-top: 1px solid rgba(0,0,0,0.3);\r\n background: #404040;\r\n box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);\r\n text-shadow: 0 1px 0 rgba(0,0,0,0.5);\r\n padding: 10px 12px;\r\n text-transform: uppercase;\r\n font-weight: bold;\r\n font-size: 20px;\r\n}\r\n#header a {\r\n color: #777777;\r\n}\r\n#divider {\r\n position: relative;\r\n z-index: 300;\r\n border-top: 1px solid rgba(255,255,255,0.01);\r\n border-bottom: 1px solid rgba(0,0,0,0.3);\r\n margin: 0;\r\n height: 4px;\r\n background: rgba(0,0,0,0.2);\r\n box-shadow: 0 1px 0 rgba(255,255,255,0.05), inset 0 1px 3px rgba(0,0,0,0.3);\r\n}\r\n#chapter-list {\r\n position: relative;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n z-index: 200;\r\n margin: 0;\r\n padding: 0;\r\n cursor: pointer;\r\n list-style: none;\r\n overflow-y: auto;\r\n}\r\n.chapter {\r\n list-style: none;\r\n}\r\n.chapter:last-child {\r\n border-bottom: 1px solid rgba(0,0,0,0.3);\r\n box-shadow: 0 1px 0 rgba(255,255,255,0.05);\r\n}\r\n.chapter div {\r\n color: #ccc;\r\n font-size: 15px;\r\n padding: 8px 20px;\r\n border-top: 1px solid rgba(0,0,0,0.3);\r\n box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);\r\n text-shadow: 0 1px 0 rgba(0,0,0,0.5);\r\n display: block;\r\n text-decoration: none;\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n cursor: pointer;\r\n}\r\n.chapter div:before {\r\n content: \"\\f105\";\r\n width: 20px;\r\n margin-left: -10px;\r\n float: left;\r\n font-family: \"FontAwesome\" !important;\r\n text-align: center;\r\n}\r\n.chapter div:hover {\r\n background: #404040;\r\n color: #fff;\r\n outline: 0;\r\n}\r\n.chapter.active div {\r\n background: #1a1a1a;\r\n color: #fff;\r\n font-size: 16px;\r\n box-shadow: inset 0 1px 3px rgba(0,0,0,0.3);\r\n}\r\n::-webkit-scrollbar {\r\n height: 9px !important;\r\n width: 9px !important;\r\n}\r\n::-webkit-scrollbar-thumb {\r\n background-color: #7D7D7D !important;\r\n border-radius: 3px !important;\r\n}\r\n::-webkit-scrollbar-track-piece {\r\n background-color: rgba(0,0,0,.25) !important;\r\n}\r\n";
  4171.  
  4172. var tpl_preferencesHTML = "<form id=\"preferences\" name=\"preferences\">\n <div id=\"setting_table1\">\n <span id=\"top-buttons\">\n <input title=\"部分选项需要刷新页面才能生效\" id=\"save_button\" value=\"√ 确认\" type=\"button\">\n <input title=\"取消本次设定,所有选项还原\" id=\"close_button\" value=\"X 取消\" type=\"button\">\n </span>\n <div class=\"form-row\">\n <label>\n 界面语言<select id=\"lang\">\n </select>\n </label>\n <label title=\"将小说网页文本转换为繁体。\\n\\n注意:内置的繁简转换表,只收录了简单的单字转换,启用本功能后,如有错误转换的情形,请利用脚本的自订字词取代规则来修正。\\n例如:「千里之外」,会错误转换成「千里之外」,你可以加入规则「千里之外=千里之外」来自行修正。\">\n <input type=\"checkbox\" id=\"enable-cn2tw\" name=\"enable-cn2tw\"/>网页:转繁体\n </label>\n <label id=\"quietMode\" class=\"right\" title=\"隐藏其他,只保留正文,适用于全屏状态下\">\n <input class=\"key\" type=\"button\" id=\"quietModeKey\"/>安静模式\n </label>\n </div>\n <div class=\"form-row\">\n <label title=\"不影响 booklink.me 的启用\">\n <input type=\"checkbox\" id=\"disable-auto-launch\" name=\"disable-auto-launch\"/>强制手动启用\n </label>\n <label title=\"booklink.me 点击的网站强制启用\">\n <input type=\"checkbox\" id=\"booklink-enable\" name=\"booklink-enable\"/>booklink 自动启用\n </label>\n <label>\n <input type=\"checkbox\" id=\"debug\" name=\"debug\"/>调试模式\n </label>\n <a href=\"https://greasyfork.org/scripts/292-my-novel-reader/feedback\" target=\"_blank\">反馈地址</a>\n </div>\n <div class=\"form-row\">\n <label title=\"图片章节用夜间模式没法看,这个选项在启动时会自动切换到缺省皮肤\">\n <input type=\"checkbox\" id=\"pic-nightmode-check\" name=\"pic-nightmode-check\"/>\n 夜间模式的图片章节检测\n </label>\n <label>\n <input type=\"checkbox\" id=\"copyCurTitle\"/>\n 打开目录复制当前标题\n </label>\n </div>\n <div class=\"form-row\">\n <label title=\"通过快捷键切换\">\n <input type=\"checkbox\" id=\"hide-menu-list\"/>隐藏左侧章节列表\n </label>\n <label>\n <input type=\"checkbox\" id=\"hide-footer-nav\"/>隐藏底部导航栏\n </label>\n <label class=\"right\" title=\"导出之后的所有章节\">\n <input type=\"button\" id=\"saveAsTxt\" value=\"存为 txt(测试)\" />\n </label>\n </div>\n <div class=\"form-row\">\n <label>\n 左侧导航栏切换快捷键:\n </label>\n <input class=\"key\" type=\"button\" id=\"setHideMenuListKey\" />\n <label title=\"通过快捷键切换或在 Greasemonkey 用户脚本命令处打开设置窗口\">\n <input type=\"checkbox\" id=\"hide-preferences-button\"/>隐藏设置按钮\n </label>\n <input class=\"key\" type=\"button\" id=\"openPreferencesKey\"/>\n </div>\n <div class=\"form-row\">\n <label>\n 距离底部\n <input type=\"textbox\" id=\"remain-height\" name=\"remain-height\" size=\"5\"/>\n px 加载下一页\n </label>\n <label>\n <input type=\"checkbox\" id=\"add-nextpage-to-history\"/>添加下一页到历史记录\n </label>\n <label>\n <input type=\"checkbox\" id=\"enable-dblclick-pause\"/>双击暂停翻页\n </label>\n </div>\n <div class=\"form-row\">\n <label>\n <select id=\"skin\">\n </select>\n </label>\n <label>\n 字体\n <input type=\"textbox\" id=\"font-family\" style=\"min-width:200px;\"/>\n </label>\n <br/><br/>\n <label>\n 字体大小\n <input type=\"textbox\" id=\"font-size\" name=\"font-size\" size=\"6\"/>\n </label>\n <label>\n 行高\n <input type=\"textbox\" id=\"text_line_height\" size=\"6\"/>\n </label>\n <label>\n 行宽\n <input type=\"textbox\" id=\"content_width\" size=\"6\"/>\n </label>\n </div>\n <div class=\"form-row\">\n <label title=\"把一大块未分段的内容文本按照句号分段\">\n <input type=\"checkbox\" id=\"split_content\"/>对一坨内容进行强制分段\n </label>\n <label>\n <input type=\"checkbox\" id=\"scroll_animate\"/>章节滚动效果\n </label>\n </div>\n <div class=\"form-row\">\n <div class=\"prefs_title\">自定义样式</div>\n <textarea id=\"extra_css\" class=\"prefs_textarea\" placeholder=\"自定义样式\"></textarea>\n </div>\n </div>\n <div id=\"setting_table2\">\n <div class=\"form-row\" title=\"详见脚本代码的 Rule.specialSite\">\n <div class=\"prefs_title\">自定义站点规则</div>\n <textarea id=\"custom_siteinfo\" class=\"prefs_textarea\" placeholder=\"自定义站点规则\" />\n </div>\n <div class=\"form-row\" title=\"一行一个,每行的第一个 = 为分隔符。\\n保存后生效\">\n <div class=\"prefs_title\">自定义替换规则</div>\n <textarea id=\"custom_replace_rules\" class=\"prefs_textarea\" placeholder=\"b[āà]ng=棒\" />\n </div>\n </div>\n</form>";
  4173.  
  4174. var tpl_preferencesCSS = ".body {\r\n color:#333;\r\n margin: 0 auto;\r\n background: white;\r\n padding: 10px;\r\n height: 420px;\r\n overflow-y: auto;\r\n }\r\n #top-buttons {\r\n background: none repeat scroll 0% 0% rgb(255, 255, 255);\r\n display: block;\r\n position: absolute;\r\n top: -35px;\r\n border-right: 12px solid rgb(224, 224, 224);\r\n border-top: 12px solid rgb(224, 224, 224);\r\n border-left: 12px solid rgb(224, 224, 224);\r\n text-align: center;\r\n }\r\n input {\r\n font-size: 12px;\r\n margin-right: 3px;\r\n vertical-align: middle;\r\n }\r\n .form-row {\r\n overflow: hidden;\r\n padding: 8px 12px;\r\n margin-top: 3px;\r\n font-size: 11px;\r\n }\r\n .form-row label {\r\n padding-right: 10px;\r\n }\r\n .form-row input {\r\n vertical-align: middle;\r\n margin-top: 0px;\r\n }\r\n textarea, .form-row input {\r\n padding: 2px 4px;\r\n border: 1px solid #e5e5e5;\r\n background: #fff;\r\n border-radius: 4px;\r\n color: #666;\r\n -webkit-transition: all linear .2s;\r\n transition: all linear .2s;\r\n }\r\n textarea {\r\n width: 100%;\r\n overflow: auto;\r\n vertical-align: top;\r\n }\r\n textarea:focus, input:focus {\r\n border-color: #99baca;\r\n outline: 0;\r\n background: #f5fbfe;\r\n color: #666;\r\n }\r\n .prefs_title {\r\n font-size: 12px;\r\n font-weight: bold;\r\n }\r\n .prefs_textarea {\r\n font-size: 12px;\r\n margin-top: 5px;\r\n height: 100px;\r\n }\r\n .right {\r\n float: right;\r\n }";
  4175.  
  4176. var Res = {
  4177. CSS_MAIN: tpl_mainCss,
  4178.  
  4179. preferencesHTML: tpl_preferencesHTML
  4180. .uiTrans().replace(/\\n/g, '\n'),
  4181.  
  4182. preferencesCSS: tpl_preferencesCSS,
  4183. };
  4184.  
  4185. var tpl_mainHtml = "<div id=\"container\">\r\n <div id=\"menu-bar\" title=\"点击显示隐藏章节列表\"></div>\r\n <div id=\"menu\">\r\n <div id=\"header\" title=\"打开目录\">\r\n <a href=\"{indexUrl}\" target=\"_blank\">{bookTitle}</a>\r\n </div>\r\n <div id=\"divider\"></div>\r\n <ul id=\"chapter-list\" title=\"左键滚动,中键打开链接(无阅读模式)\">\r\n </ul>\r\n </div>\r\n <div id=\"mynovelreader-content\"></div>\r\n <div id=\"loading\" style=\"display:none\"></div>\r\n <div id=\"preferencesBtn\">\r\n <img style=\"width:16px\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABwklEQVRIibVVzWrCQBAeQk/bdk+bm0aWDQEPHtwVahdavLU9aw6KAQ+SQ86Sa19Aqu0T9NafSw8ttOgr1CewUB9CBL3Yy26x1qRp0A8GhsnO9yUzmxmAhKjX68cAMAeAufK3C875FQAsAWCp/O3CsqyhFlB+Oti2/cAYewrD8FDHarXahWEYUy1gGMbUdd1z/TwMw0PG2JNt2/ex5IyxR02CEJpIKbuEkJGOrRshZCSl7CKEJjrGGHuIFMjlcs9RZElNcWxGEAQHGONxWnKM8TgIgoPYMkkpL9MKqNx4xNX8LyOEvMeSq5uxMZlz3vN9v+D7foFz3os6V61Wz36QNhqNUyHENaV0CACLTUnFYvF6/WVUbJPIglI6FELctFqtMiT59Ha7TdcFVCxJ6XYs0Gw2T1SJBlsq0ZxSOhBC3Hied/QjSTUoqsn9lSb3o879avI61FXbzTUFACiXy7v70Tqdzj7G+COtwJ+jIpPJvKYl12ZZ1kucwJs+iBD6lFJ2TdOMHB2mab7/a1xXKpW9fD5/6zjO3erCcV33PMnCcRwnfuHEYXVlZrPZQWqiKJRKpe8Bt5Ol73leCQBmADBTfiJ8AebTYCRbI3BUAAAAAElFTkSuQmCC\"/>\r\n </div>\r\n <div id=\"alert\" style=\"display: none;\">\r\n <p id=\"App-notice\"></p>\r\n </div>\r\n</div>";
  4186.  
  4187. let $messageDiv;
  4188. let _messageTimeId;
  4189.  
  4190. function notice(html, duration, noticeType, onClose) {
  4191. if (typeof duration === 'undefined')
  4192. duration = 2000;
  4193.  
  4194. var closeMessage = function() {
  4195. $messageDiv.remove();
  4196. $messageDiv = null;
  4197.  
  4198. if (typeof onClose === 'function') {
  4199. onClose();
  4200. }
  4201. };
  4202.  
  4203. if (!$messageDiv) {
  4204. var iconHtml = '';
  4205. if (noticeType === 'loading') {
  4206. iconHtml = '<i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i>';
  4207. }
  4208.  
  4209. $messageDiv = $('<div id="message" class="noRemove">' + iconHtml + '<span id="content"></span></div>')
  4210. .appendTo('body');
  4211.  
  4212. if (duration == 0) {
  4213. $messageDiv.on('click', closeMessage);
  4214. }
  4215. }
  4216.  
  4217. $messageDiv.find('#content').html(html);
  4218.  
  4219. if (duration > 0) {
  4220. clearTimeout(_messageTimeId);
  4221. _messageTimeId = setTimeout(closeMessage, duration);
  4222. }
  4223. }
  4224.  
  4225. function loading(html, duration, onClose) {
  4226. notice(html, duration, 'loading', onClose);
  4227. }
  4228.  
  4229. function saveAs(data, filename) {
  4230. if(!filename) filename = 'console.json';
  4231.  
  4232. if (typeof data == 'object') {
  4233. data = JSON.stringify(data, undefined, 4);
  4234. }
  4235.  
  4236. var blob = new Blob([data], { type: 'application/octet-stream' });
  4237. var blobUrl = window.URL.createObjectURL(blob);
  4238. var tmpLink = document.createElement('a');
  4239. tmpLink.href = blobUrl;
  4240. tmpLink.style.display = 'none';
  4241. tmpLink.setAttribute('download', filename);
  4242. tmpLink.setAttribute('target', '_blank');
  4243. document.body.appendChild(tmpLink);
  4244.  
  4245. tmpLink.click();
  4246. document.body.removeChild(tmpLink);
  4247. window.URL.revokeObjectURL(blobUrl);
  4248. }
  4249.  
  4250. function cnNum2ArabNum(cn){
  4251. var arab, parts, cnChars = '零一二三四五六七八九';
  4252.  
  4253. if (!cn) {
  4254. return 0
  4255. }
  4256.  
  4257. if (cn.indexOf('亿') !== -1){
  4258. parts = cn.split('亿');
  4259. return cnNum2ArabNum(parts[0]) * 1e8 + cnNum2ArabNum(parts[1])
  4260. }
  4261.  
  4262. if (cn.indexOf('万') !== -1){
  4263. parts = cn.split('万');
  4264. return cnNum2ArabNum(parts[0]) * 1e4 + cnNum2ArabNum(parts[1])
  4265. }
  4266.  
  4267. if (cn.indexOf('十') === 0){
  4268. cn = '一' + cn;
  4269. }
  4270.  
  4271. arab = cn
  4272. .replace(/[零一二三四五六七八九]/g, function (a) {
  4273. return '+' + cnChars.indexOf(a)
  4274. })
  4275. .replace(/(十|百|千)/g, function(a, b){
  4276. return '*' + (
  4277. b == '十' ? 1e1 :
  4278. b == '百' ? 1e2 : 1e3
  4279. )
  4280. });
  4281.  
  4282. return (new Function('return ' + arab))()
  4283. }
  4284.  
  4285. function getNumFromChapterTitle(title) {
  4286. if (!title) return;
  4287.  
  4288. var m = title.match(/第(\d+)章/);
  4289. if (m) {
  4290. return parseInt(m[1], 10)
  4291. }
  4292.  
  4293. // 第二十二章
  4294. m = title.match(/(?:第|^)([一二两三四五六七八九十○零百千万亿\d]+){1,6}章/);
  4295. if (m) {
  4296. return cnNum2ArabNum(m[1])
  4297. }
  4298. }
  4299.  
  4300. const chapters = [];
  4301.  
  4302. const fileName = {
  4303. bookTitle: '',
  4304. ext: '.txt',
  4305. start: 0,
  4306. end: 0,
  4307.  
  4308. setBookTitle(bookTitle) {
  4309. this.bookTitle = bookTitle;
  4310. },
  4311. setStart(chapterTitle) {
  4312. let num = getNumFromChapterTitle(chapterTitle);
  4313. if (num) {
  4314. this.start = num;
  4315. }
  4316. },
  4317. setEnd(chapterTitle) {
  4318. let num = getNumFromChapterTitle(chapterTitle);
  4319. if (num) {
  4320. this.end = num;
  4321. }
  4322. },
  4323.  
  4324. toString() {
  4325. let start = this.start || '';
  4326. let end = this.end || '';
  4327. let count = chapters.length;
  4328.  
  4329. return `${this.bookTitle || '未知名称'}(${start} - ${end},共${count}章)${this.ext}`
  4330. }
  4331. };
  4332.  
  4333. function toTxt(parser) {
  4334. var html = $.nano('{chapterTitle}\n\n{contentTxt}', parser);
  4335. chapters.push(html);
  4336.  
  4337. var msg = '已下载 ' + chapters.length + ' 章,' +
  4338. (parser.chapterTitle || '');
  4339.  
  4340. loading(msg, 0);
  4341. }
  4342.  
  4343. function finish(parser) {
  4344. var allTxt = chapters.join('\n\n');
  4345. if (isWindows) {
  4346. allTxt = allTxt.replace(/\n/g, '\r\n');
  4347. }
  4348.  
  4349. fileName.setEnd(parser.chapterTitle);
  4350.  
  4351. saveAs(allTxt, fileName.toString());
  4352. }
  4353.  
  4354. function getOnePage(parser, nextUrl, endFn) {
  4355. var isEnd = false;
  4356. if (parser) {
  4357. toTxt(parser);
  4358. nextUrl = parser.nextUrl;
  4359. isEnd = parser.isTheEnd;
  4360. }
  4361.  
  4362. if (!nextUrl || isEnd) {
  4363. console.log('全部获取完毕');
  4364. finish(parser);
  4365. endFn();
  4366. return;
  4367. }
  4368.  
  4369. if (App.site.useiframe) {
  4370. // App.iframeRequest(nextUrl);
  4371. return;
  4372. }
  4373.  
  4374. setTimeout(function() {
  4375. console.log('[存为txt]正在获取:', nextUrl);
  4376. App.httpRequest(nextUrl, function(doc) {
  4377. if (doc) {
  4378. var par = new Parser(App.site, doc, nextUrl);
  4379. par.getAll(getOnePage);
  4380. } else {
  4381. console.error('超时或连接出错');
  4382. finish();
  4383. endFn();
  4384. }
  4385. });
  4386. }, config.download_delay);
  4387. }
  4388.  
  4389. function run(cachedParsers=[], endFn) {
  4390. console.log(`[存为txt]每章下载延时 ${config.download_delay} 毫秒`);
  4391.  
  4392. cachedParsers.forEach(toTxt);
  4393.  
  4394. var lastParser = cachedParsers[cachedParsers.length - 1];
  4395. fileName.setBookTitle(lastParser.bookTitle);
  4396. fileName.setStart(lastParser.chapterTitle);
  4397.  
  4398. getOnePage(null, lastParser.nextUrl, endFn);
  4399. }
  4400.  
  4401. var App = {
  4402. isEnabled: false,
  4403. parsedPages: {},
  4404. pageNum: 1,
  4405. paused: false,
  4406. curPageUrl: location.href,
  4407. requestUrl: null,
  4408. iframe: null,
  4409. remove: [],
  4410.  
  4411. init: function() {
  4412. if (["mynovelreader-iframe", "superpreloader-iframe"].indexOf(window.name) != -1) { // 用于加载下一页的 iframe
  4413. return;
  4414. }
  4415.  
  4416. // 手动调用
  4417. var readx = function() {
  4418. // 防止 unsafeWindow cannot call: GM_getValue
  4419. setTimeout(function() {
  4420. App.launch();
  4421. }, 0);
  4422. };
  4423. try {
  4424. exportFunction(readx, unsafeWindow, {defineAs: "readx"});
  4425. } catch(ex) {
  4426. console.error('无法定义 readx 函数');
  4427. }
  4428.  
  4429.  
  4430. App.loadCustomSetting();
  4431. App.site = App.getCurSiteInfo();
  4432.  
  4433. if (App.site.startLaunch) {
  4434. App.site.startLaunch($(document));
  4435. }
  4436.  
  4437. var autoLaunch = App.isAutoLaunch();
  4438.  
  4439. if (autoLaunch === -1) {
  4440. return;
  4441. } else if (autoLaunch) {
  4442. if (App.site.mutationSelector) { // 特殊的启动:等待js把内容生成完毕
  4443. App.addMutationObserve(document, App.launch);
  4444. } else if (App.site.timeout) { // 延迟启动
  4445. setTimeout(App.launch, App.site.timeout);
  4446. } else { // NoScript 下 setTimeout 没用?
  4447. App.launch();
  4448. }
  4449. } else {
  4450. UI.addButton();
  4451. }
  4452. },
  4453. loadCustomSetting: function() {
  4454. var customRules;
  4455. try {
  4456. customRules = eval(Setting.customSiteinfo);
  4457. } catch (e) {
  4458. console.error('载入自定义站点配置错误', e);
  4459. }
  4460.  
  4461. if (_.isArray(customRules)) {
  4462. Rule.customRules = customRules;
  4463. C.log('载入自定义站点规则成功', customRules);
  4464. }
  4465.  
  4466. // load custom replace rules
  4467. Rule.customReplace = Rule.parseCustomReplaceRules(Setting.customReplaceRules);
  4468.  
  4469. C.log('载入自定义替换规则成功', Rule.customReplace);
  4470. },
  4471. getCurSiteInfo: function() {
  4472. var rules = Rule.customRules.concat(Rule.specialSite);
  4473. var locationHref = location.href;
  4474.  
  4475. var info = _.find(rules, function(x) {
  4476. return toRE(x.url).test(locationHref);
  4477. });
  4478.  
  4479. if (!info) {
  4480. info = {};
  4481. C.log("没有找到规则,尝试自动模式。");
  4482. } else {
  4483. C.log("找到规则:", info);
  4484. }
  4485. return info;
  4486. },
  4487. isAutoLaunch: function() {
  4488. var locationHref = window.location.href,
  4489. locationHost = location.host,
  4490. referrer = document.referrer;
  4491.  
  4492. switch (true) {
  4493. case L_getValue("mynoverlreader_disable_once") == 'true':
  4494. L_removeValue("mynoverlreader_disable_once");
  4495. return false;
  4496. // case location.hostname == 'www.fkzww.net' && !document.title.match(/网文快讯/): // 啃书只自动启用一个地方
  4497. // return false;
  4498. case Setting.booklink_enable && /booklink\.me/.test(referrer):
  4499. return true;
  4500. case locationHost == 'tieba.baidu.com':
  4501. var title = $('.core_title_txt').text();
  4502. if (title.match(Rule.titleRegExp)) {
  4503. return false;
  4504. } else {
  4505. return -1;
  4506. }
  4507. case Setting.getDisableAutoLaunch():
  4508. return false;
  4509. case GM_getValue("auto_enable"):
  4510. case config.soduso && /www\.sodu\.so/.test(referrer):
  4511. return true;
  4512. default:
  4513. return false;
  4514. }
  4515. },
  4516. addMutationObserve: function(doc, callback) {
  4517. var shouldAdd = false;
  4518. var $doc = $(doc);
  4519.  
  4520. if ($doc.find(App.site.contentSelector).size()) {
  4521. shouldAdd = false;
  4522. } else {
  4523. var mutationSelector = App.site.mutationSelector;
  4524. var target = $doc.find(mutationSelector)[0];
  4525. if (target) {
  4526. var childCount = App.site.mutationChildCount;
  4527. if (childCount === undefined || target.children.length <= childCount) {
  4528. shouldAdd = true;
  4529. }
  4530. }
  4531. }
  4532.  
  4533. if (shouldAdd) {
  4534. var observer = new MutationObserver(function(mutations) {
  4535. var nodeAdded = mutations.some(function(x) {
  4536. return x.addedNodes.length > 0;
  4537. });
  4538.  
  4539. if (nodeAdded) {
  4540. observer.disconnect();
  4541. callback();
  4542. }
  4543. });
  4544.  
  4545. observer.observe(target, {
  4546. childList: true
  4547. });
  4548.  
  4549. C.log("添加 MutationObserve 成功:", mutationSelector);
  4550. } else {
  4551. callback();
  4552. }
  4553. },
  4554. launch: function() {
  4555. // 只解析一次,防止多次重复解析一个页面
  4556. if (document.body && document.body.getAttribute("name") == "MyNovelReader") {
  4557. return App.toggle();
  4558. }
  4559.  
  4560. if (!App.site) {
  4561. App.site = App.getCurSiteInfo();
  4562. }
  4563.  
  4564. if (App.site.startFilter) {
  4565. try {
  4566. App.site.startFilter();
  4567. C.log('run startFilter function success');
  4568. } catch (ex) {
  4569. console.error('运行 startFilter function 错误', ex);
  4570. }
  4571. }
  4572.  
  4573. var parser = new Parser(App.site, document);
  4574. var hasContent = !!parser.hasContent();
  4575. if (hasContent) {
  4576. document.body.setAttribute("name", "MyNovelReader");
  4577. App.parsedPages[window.location.href] = true;
  4578. parser.getAll(function(parser) {
  4579. App.processPage(parser);
  4580. });
  4581. } else {
  4582. console.error("当前页面没有找到内容");
  4583. }
  4584.  
  4585. // 初始化, 取消页面限制等
  4586. if (App.site.fInit)
  4587. App.site.fInit();
  4588. },
  4589. processPage: function(parser) {
  4590. // 对 Document 进行处理
  4591. document.body.innerHTML = '';
  4592. App.prepDocument();
  4593. App.initDocument(parser);
  4594.  
  4595. // cache vars
  4596. App.$doc = $(document);
  4597. App.$menuBar = App.$doc.find("#menu-bar");
  4598. App.$menu = App.$doc.find("#menu");
  4599. App.$content = App.$doc.find("#mynovelreader-content");
  4600. App.$loading = App.$doc.find("#loading");
  4601. App.$preferencesBtn = App.$doc.find("#preferencesBtn");
  4602.  
  4603. App.$menuHeader = App.$menu.find("#chapter-list");
  4604. App.$chapterList = App.$menu.find("#chapter-list");
  4605.  
  4606. App.indexUrl = parser.indexUrl;
  4607. App.prevUrl = parser.prevUrl; // 第一个上一页
  4608.  
  4609. App.oArticles = []; // 原始的内容,用于替换的无需刷新
  4610. App.parsers = [];
  4611.  
  4612. // 加入上一章的链接
  4613. if (parser.prevUrl) {
  4614. $("<li>")
  4615. .addClass('chapter')
  4616. .append(
  4617. $("<div>")
  4618. .attr({
  4619. "realHref": parser.prevUrl,
  4620. "onclick": "return false;"
  4621. })
  4622. .text("上一章".uiTrans())
  4623. )
  4624. .prependTo(App.$chapterList);
  4625. }
  4626.  
  4627. // 插入站点样式
  4628. if (App.site.style) {
  4629. GM_addStyle(App.site.style);
  4630. }
  4631.  
  4632. App.appendPage(parser, true);
  4633.  
  4634. App.registerControls();
  4635.  
  4636. // UI 的初始化
  4637. UI.init();
  4638.  
  4639. App.curFocusElement = $("article:first").get(0); // 初始化当前关注的 element
  4640. App.requestUrl = parser.nextUrl;
  4641. App.isTheEnd = parser.isTheEnd;
  4642.  
  4643. App.isEnabled = true;
  4644. UI.addButton();
  4645.  
  4646. // // 如果已经把当前焦点链接添加到历史记录,则滚动到顶部
  4647. // if (Setting.addToHistory) {
  4648. // window.scrollTo(0, 0);
  4649. // }
  4650.  
  4651. // 有些图片网站高度随着图片加载而变长
  4652. setTimeout(App.scroll, 1000);
  4653.  
  4654. App.cleanAgain();
  4655.  
  4656. if (config.PRELOADER) {
  4657. App.doRequest();
  4658. }
  4659. },
  4660. prepDocument: function() {
  4661. window.onload = window.onunload = function() {};
  4662.  
  4663. // 破解右键限制
  4664. var doc = document;
  4665. var bd = doc.body;
  4666. bd.onclick = bd.ondblclick = bd.onselectstart = bd.oncopy = bd.onpaste = bd.onkeydown = bd.oncontextmenu = bd.onmousemove = bd.onselectstart = bd.ondragstart = doc.onselectstart = doc.oncopy = doc.onpaste = doc.onkeydown = doc.oncontextmenu = null;
  4667. doc.onclick = doc.ondblclick = doc.onselectstart = doc.oncontextmenu = doc.onmousedown = doc.onkeydown = function() {
  4668. return true;
  4669. };
  4670.  
  4671. doc = document.wrappedJSObject || document;
  4672. doc.onmouseup = null;
  4673. doc.onmousedown = null;
  4674. doc.oncontextmenu = null;
  4675.  
  4676. var arAllElements = document.getElementsByTagName('*');
  4677. for (var i = arAllElements.length - 1; i >= 0; i--) {
  4678. var elmOne = arAllElements[i];
  4679. elmOne = elmOne.wrappedJSObject || elmOne;
  4680. elmOne.onmouseup = null;
  4681. elmOne.onmousedown = null;
  4682. }
  4683.  
  4684. $(document).unbind("keypress");
  4685. $(document).unbind("keydown");
  4686.  
  4687. // remove body style
  4688. $('link[rel="stylesheet"], script').remove();
  4689. $('body')
  4690. .removeAttr('style')
  4691. .removeAttr('bgcolor');
  4692.  
  4693. $('style').filter(function() {
  4694. var $style = $(this);
  4695. if($style.text().indexOf('#cVim-link-container') != -1) { // chrome 的 cVim 扩展
  4696. return false;
  4697. }
  4698. return true;
  4699. }).remove();
  4700. },
  4701. initDocument: function(parser) {
  4702. document.title = parser.docTitle;
  4703.  
  4704. document.body.innerHTML = $.nano(tpl_mainHtml.uiTrans(), parser);
  4705. },
  4706. clean: function() {
  4707. $('body > *:not("#container, .readerbtn, .noRemove, #reader_preferences, #uil_blocker,iframe[name=\'mynovelreader-iframe\']")').remove();
  4708. $('link[rel="stylesheet"]:not(.noRemove)').remove();
  4709. $('body, #container').removeAttr('style').removeAttr('class');
  4710.  
  4711. if (unsafeWindow.jQuery && location.host.indexOf('qidian') > 0) {
  4712. unsafeWindow.jQuery(document).off("selectstart").off("contextmenu");
  4713. }
  4714. },
  4715. cleanAgain: function() {
  4716. // var host = location.host;
  4717. // if (!host.match(/qidian\.com|zongheng\.com/)) { // 只在起点、纵横等网站运行
  4718. // return;
  4719. // }
  4720.  
  4721. // 再次移除其它不相关的,起点,纵横中文有时候有问题
  4722. setTimeout(App.clean, 2000);
  4723. setTimeout(App.clean, 5000);
  4724. setTimeout(App.clean, 8000);
  4725. // TM 用 addEventListener('load') 有问题
  4726. window.onload = function() {
  4727. App.clean();
  4728. setTimeout(App.clean, 500);
  4729. };
  4730. },
  4731. toggle: function() {
  4732. if (App.isEnabled) { // 退出
  4733. GM_setValue("auto_enable", false);
  4734. L_setValue("mynoverlreader_disable_once", true);
  4735.  
  4736. location.href = App.activeUrl;
  4737. } else {
  4738. GM_setValue("auto_enable", true);
  4739. L_removeValue("mynoverlreader_disable_once");
  4740. App.isEnabled = true;
  4741. App.launch();
  4742. }
  4743. },
  4744. removeListener: function() {
  4745. C.log("移除各种事件监听");
  4746. App.remove.forEach(function(_remove) {
  4747. _remove();
  4748. });
  4749. },
  4750. appendPage: function(parser, isFirst) {
  4751. var chapter = $("article:last");
  4752. if (chapter.length && parser.isSection) { // 每次获取的不是一章,而是一节
  4753. var lastText = chapter.find("p:last").remove().text().trim();
  4754. var newPage = parser.content.replace(/<p>\s+/, "<p>" + lastText);
  4755.  
  4756. chapter
  4757. .find(".chapter-footer-nav").remove()
  4758. .end()
  4759. .append(newPage);
  4760.  
  4761. if (!Setting.hide_footer_nav) {
  4762. chapter.append($.nano(UI.tpl_footer_nav, parser));
  4763. }
  4764.  
  4765. } else {
  4766. chapter = $("<article>")
  4767. .attr("id", "page-" + App.pageNum)
  4768. .append(
  4769. $("<h1>").addClass("title").text(parser.chapterTitle)
  4770. )
  4771. .append(parser.content)
  4772. .appendTo(App.$content);
  4773.  
  4774. if (!Setting.hide_footer_nav) {
  4775. chapter.append($.nano(UI.tpl_footer_nav, parser));
  4776. }
  4777.  
  4778. // App.fixImageFloats(chapter.get(0));
  4779.  
  4780. // 添加到章节列表
  4781. var chapterItem = $("<li>")
  4782. .addClass('chapter')
  4783. .append(
  4784. $("<div>")
  4785. .attr({
  4786. href: "#page-" + App.pageNum,
  4787. "realHref": parser.curPageUrl,
  4788. onclick: "return false;",
  4789. title: parser.chapterTitle
  4790. })
  4791. .text(parser.chapterTitle)
  4792. )
  4793. .prependTo(App.$chapterList);
  4794.  
  4795. if (isFirst) {
  4796. chapterItem.addClass('active');
  4797. }
  4798.  
  4799. App.pageNum += 1;
  4800. App.resetCache();
  4801. }
  4802.  
  4803. App.oArticles.push(chapter[0].outerHTML);
  4804. App.parsers.push(parser);
  4805. },
  4806. resetCache: function() { // 更新缓存变量
  4807. App.menuItems = App.$chapterList.find("div");
  4808. App.scrollItems = $("article");
  4809. },
  4810. registerControls: function() {
  4811. // 内容滚动
  4812. var throttled = _.throttle(App.scroll, 200);
  4813. $(window).scroll(throttled);
  4814.  
  4815. App.registerKeys();
  4816.  
  4817. if (Setting.dblclickPause) {
  4818. App.$content.on("dblclick", function() {
  4819. App.pauseHandler();
  4820. });
  4821. }
  4822.  
  4823. // 左侧章节列表
  4824. App.$menuHeader.click(function() {
  4825. App.copyCurTitle();
  4826. });
  4827.  
  4828. App.$menuBar.click(function() {
  4829. UI.hideMenuList();
  4830. });
  4831.  
  4832. App.$doc.on("mousedown", "#chapter-list div", function(event) {
  4833. switch (event.which) {
  4834. case 1:
  4835. var href = $(this).attr("href");
  4836. if (href) {
  4837. App.scrollToArticle($(href));
  4838. } else {
  4839. location.href = $(this).attr("realHref");
  4840. }
  4841. break;
  4842. case 2: // middle click
  4843. L_setValue("mynoverlreader_disable_once", true);
  4844. App.openUrl($(this).attr("realHref"));
  4845. break;
  4846. }
  4847. });
  4848.  
  4849. $("#preferencesBtn").click(function(event) {
  4850. event.preventDefault();
  4851. UI.preferencesShow();
  4852. });
  4853.  
  4854. GM_registerMenuCommand("小说阅读脚本设置".uiTrans(), UI.preferencesShow.bind(UI));
  4855. },
  4856. registerKeys: function() {
  4857. key('enter', function(event) {
  4858. if (UI.$prefs) {
  4859. return;
  4860. }
  4861.  
  4862. App.openUrl(App.indexUrl, "主页链接没有找到".uiTrans());
  4863. App.copyCurTitle();
  4864.  
  4865. event.stopPropagation();
  4866. event.preventDefault();
  4867. });
  4868.  
  4869. key('left', function(event) {
  4870. var scrollTop = $(window).scrollTop();
  4871. if (scrollTop === 0) {
  4872. location.href = App.prevUrl;
  4873. } else {
  4874. var offsetTop = $(App.curFocusElement).offset().top;
  4875. // 在视野窗口内
  4876. if (offsetTop > scrollTop && offsetTop < (scrollTop + $(window).height())) {
  4877. App.scrollToArticle(App.curFocusElement.previousSibling || 0);
  4878. } else {
  4879. App.scrollToArticle(App.curFocusElement);
  4880. }
  4881. }
  4882. return false;
  4883. });
  4884.  
  4885. key('right', function(event) {
  4886. if (App.getRemain() === 0) {
  4887. location.href = App.lastRequestUrl || App.requestUrl;
  4888. } else {
  4889. App.scrollToArticle(App.curFocusElement.nextSibling || App.$doc.height());
  4890. }
  4891.  
  4892. event.preventDefault();
  4893. event.stopPropagation();
  4894. return false;
  4895. });
  4896.  
  4897. key('esc', function(){
  4898. if (UI.$prefs) {
  4899. UI.hide();
  4900. return false;
  4901. }
  4902. });
  4903.  
  4904. key('shift+/', function() {
  4905. UI.openHelp();
  4906. return false;
  4907. });
  4908.  
  4909. key(Setting.quietModeKey, function(){
  4910. UI.toggleQuietMode();
  4911. return false;
  4912. });
  4913.  
  4914. key(Setting.hideMenuListKey, function(){
  4915. UI.hideMenuList();
  4916. return false;
  4917. });
  4918.  
  4919. key(Setting.openPreferencesKey, function(){
  4920. UI.preferencesShow();
  4921. return false;
  4922. });
  4923. },
  4924. copyCurTitle: function() {
  4925. if (Setting.copyCurTitle) {
  4926. var title = $(App.curFocusElement).find(".title").text()
  4927. .replace(/第?\S+章/, "").trim();
  4928.  
  4929. GM_setClipboard(title, "text");
  4930. }
  4931. },
  4932. scrollToArticle: function(elem) {
  4933. var offsetTop;
  4934. if (typeof elem == "number") {
  4935. offsetTop = elem;
  4936. } else {
  4937. offsetTop = $(elem).offset().top - parseInt($(elem).css("margin-top"), 10);
  4938. }
  4939.  
  4940. if (Setting.scrollAnimate) {
  4941. $("html, body").stop().animate({
  4942. scrollTop: offsetTop
  4943. }, 750, "easeOutExpo");
  4944. } else {
  4945. $("html, body").stop().scrollTop(offsetTop);
  4946. }
  4947. },
  4948. openUrl: function(url, errorMsg) {
  4949. if (url) {
  4950. // ff30 Greasemonkey 会报错:Greasemonkey 访问违规:unsafeWindow 无法调用 GM_openInTab。新建脚本采用按键调用也这样。
  4951. setTimeout(function() {
  4952. GM_openInTab(url, false);
  4953. }, 0);
  4954. } else if (errorMsg) {
  4955. UI.notice(errorMsg);
  4956. }
  4957. },
  4958. pauseHandler: function() {
  4959. App.paused = !App.paused;
  4960. if (App.paused) {
  4961. UI.notice('<b>状态</b>:自动翻页<span style="color:red!important;"><b>暂停</b></span>'.uiTrans());
  4962. App.$loading.html('自动翻页已经<span style="color:red!important;"><b>暂停</b></span>'.uiTrans()).show();
  4963. } else {
  4964. UI.notice('<b>状态</b>:自动翻页<span style="color:red!important;"><b>启用</b></span>'.uiTrans());
  4965. App.scroll();
  4966. }
  4967. },
  4968. scroll: function() {
  4969. if (!App.paused && !App.working && App.getRemain() < Setting.remain_height) {
  4970. if (App.tmpDoc) {
  4971. App.loaded(App.tmpDoc);
  4972. } else {
  4973. App.doRequest();
  4974. }
  4975. }
  4976.  
  4977. if (App.isTheEnd) {
  4978. App.$loading.html("已到达最后一页...".uiTrans()).show();
  4979. }
  4980.  
  4981. App.updateCurFocusElement();
  4982. },
  4983. updateCurFocusElement: function() { // 滚动激活章节列表
  4984. // Get container scroll position
  4985. var fromTop = $(window).scrollTop() + $(window).height() / 2;
  4986.  
  4987. // Get id of current scroll item
  4988. var cur = App.scrollItems.map(function() {
  4989. if ($(this).offset().top < fromTop)
  4990. return this;
  4991. });
  4992. // Get the id of the current element
  4993. cur = cur[cur.length - 1];
  4994. var id = cur ? cur.id : "";
  4995.  
  4996. if (App.lastId !== id) {
  4997. App.lastId = id;
  4998.  
  4999. var activeItem = App.menuItems.filter("[href=#" + id + "]"),
  5000. activeTitle = activeItem.text(),
  5001. activeUrl = activeItem.attr("realHref");
  5002.  
  5003. // Set/remove active class
  5004. App.menuItems.parent().removeClass("active");
  5005. activeItem.parent().addClass("active");
  5006.  
  5007. App.curFocusElement = cur;
  5008. App.activeUrl = activeUrl;
  5009.  
  5010. if (Setting.addToHistory) {
  5011. var curNum = id.match(/\d+/)[0] - 1; // 当前是第几个
  5012. var curTitle = App.parsers[curNum].docTitle;
  5013. document.title = curTitle;
  5014.  
  5015. // 有域名的限制,起点过渡到 vip 章节无法生效
  5016. var url = activeUrl.replace('http://read.qidian.com', '');
  5017. try {
  5018. unsafeWindow.history.pushState(null, curTitle, url);
  5019. } catch (e) {
  5020. console.error('添加下一页到历史记录失败', e);
  5021. }
  5022. }
  5023. }
  5024. },
  5025. getRemain: function() {
  5026. var scrollHeight = Math.max(document.documentElement.scrollHeight,
  5027. document.body.scrollHeight);
  5028. var remain = scrollHeight - window.innerHeight - window.scrollY;
  5029. return remain;
  5030. },
  5031. doRequest: function() {
  5032. App.working = true;
  5033. var nextUrl = App.requestUrl;
  5034. App.lastRequestUrl = App.requestUrl;
  5035.  
  5036. if (nextUrl && !App.isTheEnd && !(nextUrl in App.parsedPages)) {
  5037. App.parsedPages[nextUrl] = 0;
  5038. App.curPageUrl = App.requestUrl;
  5039. App.requestUrl = null;
  5040.  
  5041. var useiframe = App.site.useiframe;
  5042.  
  5043. App.$loading
  5044. .show()
  5045. .html("")
  5046. .append($("<img>").attr("src", "data:image/gif;base64,R0lGODlhEAAQAMQAAPf39+/v7+bm5t7e3tbW1s7OzsXFxb29vbW1ta2traWlpZycnJSUlIyMjISEhHt7e3Nzc2tra2NjY1paWlJSUkpKSkJCQjo6OjExMSkpKSEhIRkZGRAQEAgICAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBQAeACwAAAEADwAOAAAFdaAnet20GAUCceN4LQlyFMRATC3GLEqM1gIc6dFgPDCii6I2YF0eDkinxUkMBBAPBfLItESW2sEjiWS/ItqALJGgRZrNRtvWoDlxFqZdmbY0cVMdbRMWcx54eSMZExQVFhcYGBmBfxWPkZQbfi0dGpIYGiwjIQAh+QQJBQAeACwAAAEADwAOAAAFeKAnep0FLQojceOYQU6DIsdhtVoEywptEBRRZyKBQDKii+JHYGEkxE6LkyAMIB6KRKJpJQuDg2cr8Y7AgjHULCoQ0pUJZWO+uBGeDIVikbYyDgRYHRUVFhcsHhwaGhsYfhuHFxgZGYwbHH4iHBiUlhuYmlMbjZktIQAh+QQFBQAeACwAAAEADwAOAAAFe6Aneh1GQU9UdeOoTVIEOQ2zWG0mSVP0ODYF4iLq7HgaEaaRQCA4HsyOwhp1FgdDxFOZTDYt0cVQSHgo6PCIPOBWKmpRgdDGWCzQ8KUwOHg2FxcYYRwJdBAiGRgZGXkcC3MEjhkalZYTfBMtHRudnhsKcGodHKUcHVUeIQAh+QQJBQAeACwAAAEADwAOAAAFbKAnjp4kURiplmYEQemoTZMpuY/TkBVFVRtRJtJgMDoejaViWT0WiokHc2muMIoEY0pdiRCIgyeDia0OhoJnk8l4PemEh6OprxQFQkS02WiCIhd4HmoiHRx9ImkEA14ciISMBFJeSAQIEBwjIQAh+QQJBQAeACwAAAEADwAOAAAFd6Anel1WTRKFdeO4WRWFStKktdwFU3JNZ6MM5nLZiDQTCCTC4ghXrU7k4bB4NpoMpyXKNBqQa5Y7YiwWHg6WLFK4SWoW95JAMOAbI05xOEhEHWoaFyJ0BgYHWyIcHA4Fj48EBFYtGJKSAwMFFGQdEAgCAgcQih4hACH5BAkFAB4ALAAAAQAPAA4AAAV0oCeKG2ZVFtaNY6dh10lNU8Z2WwbLkyRpI85Gk+GQKr7JqiME3mYSjIe5WbE8GkhkMhVeR48HpLv5ihoOB9l4xTAYYw9nomCLOgzFoiJSEAoIFiIXCwkJC1YVAwMEfwUGBgeBLBMEAouOBxdfHA8HlwgRdiEAIfkECQUAHgAsAAABAA8ADgAABXOgJ4rdpmWZ1o0sZ2YYdlka63XuKVsVVZOuzcrDufQoQxzH1rFMJJiba8jaPCnSjW30lHgGhMJWBIl4D2DLNvOATDwPwSCxHHUgjseFOJAn1B4YDgwND0MTAWAFBgcICgsMUVwDigYICQt7NhwQCGELE1QhACH5BAkFAB4ALAAAAQAPAA4AAAV4oCeOHWdyY+p1JbdpWoam7fZmGYZtYoeZm46Ik7kYhZBBQ6PyWSoZj0FAuKg8mwrF4glQryIKZdL9gicTiVQw4Ko2aYrnwUbMehGJBOPhDAYECVYeGA8PEBNCHhOABgcJCgwNh0wjFQaOCAoLk1EqHBILmg8Vih4hACH5BAkFAB4ALAAAAQAPAA4AAAV6oCd6Hdmd5ThWCee+XCpOwTBteL6lnCAMLVFHQ9SIHgHBgaPyZDKYjcfwszQ9HMwl40kOriKLuDsggD2VtOcwKFibGwrFCiEUEjJSZTLhcgwGBwsYIhkUEhITKRYGCAkKDA0PiBJcKwoKCwwODxETRk0dFA8NDhIYMiEAIfkECQUAHgAsAAABAA8ADgAABXmgJ3rcYwhcN66eJATCsHEpOwXwQGw8rZKDGMIi6vBmokcswWFtNBvVQUdkcTJQj67AGmEyGU+hYOiKMGiP4oC4dDmXS1iCSDR+xYvFovF0FAoLDxgiGxYUFRY/FwsMDQ4PEhOTFH0jFw6QEBKcE5YrHRcTERIUGHghACH5BAkFAB4ALAAAAQAPAA4AAAV4oCd63GMAgfF04zgNQixjrVcJQz4QRLNxI06Bh7CILpkf0CMpGBLL0ebHWhwOl5qno/l5EGCtqAtUmMWeTNfzWCxoNU4maWs0Vq0OBpMBdh4ODxEaIhsXhxkjGRAQEhITExQVFhdRHhoTjo8UFBYbWnoUjhUZLCIhACH5BAkFAB4ALAAAAQAPAA4AAAV5oCd6HIQIgfFw42gZBDEMgjBMbXUYRlHINEFF1FEgEIqLyHKQJToeikLBgI44iskG+mAsMC0RR7NhNRqM8IjMejgcahHbM4E8Mupx2YOJSCZWIxlkUB0TEhIUG2IYg4tyiH8UFRaNGoEeGYgTkxYXGZhEGBWTGI8iIQA7"))
  5047. .append("<a href='" + nextUrl + "' title='点击打开下一页链接'>正在载入下一页".uiTrans() + (useiframe ? "(iframe)" : "") + "...</a>");
  5048.  
  5049. setTimeout(function() {
  5050. if (useiframe) {
  5051. App.iframeRequest(nextUrl);
  5052. } else {
  5053. App.httpRequest(nextUrl, App.httpRequestDone);
  5054. }
  5055. }, App.site.nDelay || 0);
  5056. } else {
  5057. // App.$loading.html("<a href='" + App.curPageUrl + "'>无法使用阅读模式,请手动点击下一页</a>").show();
  5058. }
  5059. },
  5060. httpRequest: function(nextUrl, callback) {
  5061. if (!_.isFunction(callback)) {
  5062. callback = function() {};
  5063. }
  5064.  
  5065. C.log("获取下一页: " + nextUrl);
  5066. App.parsedPages[nextUrl] += 1;
  5067.  
  5068. GM_xmlhttpRequest({
  5069. url: nextUrl,
  5070. method: "GET",
  5071. overrideMimeType: "text/html;charset=" + document.characterSet,
  5072. timeout: config.xhr_time,
  5073. onload: function(res) {
  5074. var doc = parseHTML$1(res.responseText);
  5075. callback(doc, nextUrl);
  5076. },
  5077. ontimeout: function() {
  5078. callback(null, nextUrl);
  5079. }
  5080. });
  5081. },
  5082. httpRequestDone: function(doc, nextUrl) {
  5083. if (doc) {
  5084. App.beforeLoad(doc);
  5085. return;
  5086. }
  5087.  
  5088. if (App.parsedPages[nextUrl] >= 3) {
  5089. console.error('同一个链接已获取3次', nextUrl);
  5090. App.$loading.html("<a href='" + nextUrl + "'>无法获取下一页,请手动点击</a>").show();
  5091. return;
  5092. }
  5093.  
  5094. // 无内容再次尝试获取
  5095. console.error('连接超时, 再次获取');
  5096. App.httpRequest(nextUrl, App.httpRequestDone);
  5097. },
  5098. iframeRequest: function(nextUrl) {
  5099. C.log("iframeRequest: " + nextUrl);
  5100. if (!App.iframe) {
  5101. var i = document.createElement('iframe');
  5102. App.iframe = i;
  5103. i.name = 'mynovelreader-iframe';
  5104. i.width = '100%';
  5105. i.height = '0';
  5106. i.frameBorder = "0";
  5107. i.style.cssText = '\
  5108. margin:0!important;\
  5109. padding:0!important;\
  5110. visibility:hidden!important;\
  5111. ';
  5112. i.src = nextUrl;
  5113. i.addEventListener('load', App.iframeLoaded, false);
  5114. App.remove.push(function() {
  5115. i.removeEventListener('load', App.iframeLoaded, false);
  5116. });
  5117. document.body.appendChild(i);
  5118. } else {
  5119. App.iframe.contentDocument.location.replace(nextUrl);
  5120. }
  5121. },
  5122. iframeLoaded: function() {
  5123. var iframe = this;
  5124. var body = iframe.contentDocument.body;
  5125.  
  5126. if (body && body.firstChild) {
  5127. var doc = iframe.contentDocument;
  5128.  
  5129. if (App.site.startLaunch) {
  5130. App.site.startLaunch($(doc));
  5131. }
  5132.  
  5133. var mutationSelector = App.site.mutationSelector;
  5134. if (mutationSelector) {
  5135. App.addMutationObserve(doc, function() {
  5136. App.beforeLoad(doc);
  5137. });
  5138. } else {
  5139. var timeout = App.site.timeout || 0;
  5140.  
  5141. setTimeout(function() {
  5142. App.beforeLoad(doc);
  5143. }, timeout);
  5144. }
  5145. }
  5146. },
  5147. beforeLoad: function(htmlDoc) {
  5148. if (config.PRELOADER) {
  5149. App.tmpDoc = htmlDoc;
  5150. App.working = false;
  5151. App.scroll();
  5152.  
  5153. // 预读图片
  5154. var existSRC = {};
  5155. $(App.tmpDoc).find('img').each(function() {
  5156. var isrc = $(this).attr('src');
  5157. if (!isrc || existSRC[isrc]) {
  5158. return;
  5159. } else {
  5160. existSRC[isrc] = true;
  5161. }
  5162. var img = document.createElement('img');
  5163. img.src = isrc;
  5164. });
  5165. } else {
  5166. App.loaded(htmlDoc);
  5167. }
  5168. },
  5169. loaded: function(doc) {
  5170. var parser = new Parser(App.site, doc, App.curPageUrl);
  5171. parser.getAll(function() {
  5172. App.addNextPage(parser);
  5173. });
  5174. App.tmpDoc = null;
  5175. },
  5176. addNextPage: function(parser) {
  5177. if (parser.content) {
  5178. App.appendPage(parser);
  5179.  
  5180. App.$loading.hide();
  5181. App.requestUrl = parser.nextUrl;
  5182. App.isTheEnd = parser.isTheEnd;
  5183.  
  5184. App.afterLoad();
  5185. } else {
  5186. App.removeListener();
  5187.  
  5188. var msg = (parser.isTheEnd == 'vip') ?
  5189. 'vip 章节,需付费。' :
  5190. '错误:没有找到下一页的内容。';
  5191. App.$loading.html(
  5192. '<a href="' + App.curPageUrl + '">' + msg + '点此打开下一页。</a>'.uiTrans())
  5193. .show();
  5194. }
  5195.  
  5196. App.working = false;
  5197. },
  5198. afterLoad: function() {
  5199. App.tmpDoc = null;
  5200.  
  5201. if (config.PRELOADER) {
  5202. setTimeout(function(){
  5203. App.doRequest();
  5204. }, 200);
  5205. }
  5206. },
  5207. fixImageFloats: function(articleContent) {
  5208. if (!config.fixImageFloats) return;
  5209.  
  5210. articleContent = articleContent || document;
  5211.  
  5212. var imageWidthThreshold = Math.min(articleContent.offsetWidth, 800) * 0.55,
  5213. images = articleContent.querySelectorAll('img:not(.blockImage)');
  5214.  
  5215. for (var i = 0, il = images.length; i < il; i += 1) {
  5216. var image = images[i];
  5217.  
  5218. if (image.offsetWidth > imageWidthThreshold) {
  5219. image.className += " blockImage";
  5220. }
  5221. }
  5222. },
  5223.  
  5224. isSaveing: false,
  5225. saveAsTxt: function() {
  5226. if (App.site.useiframe) {
  5227. UI.notice('暂不支持', 3000);
  5228. return;
  5229. }
  5230.  
  5231. if (App.isSaveing) {
  5232. alert('正在保存中,请稍后');
  5233. return;
  5234. }
  5235.  
  5236. App.isSaveing = true;
  5237.  
  5238. run(App.parsers, function() {
  5239. App.isSaveing = false;
  5240. });
  5241. }
  5242. };
  5243.  
  5244. var UI = {
  5245. tpl_footer_nav: '\
  5246. <div class="chapter-footer-nav">\
  5247. <a class="prev-page" href="{prevUrl}">上一页</a> | \
  5248. <a class="index-page" href="{indexUrl}" title="Enter 键打开目录">目录</a> | \
  5249. <a class="next-page" style="color:{theEndColor}" href="{nextUrl}">下一页</a>\
  5250. </div>\
  5251. '.uiTrans(),
  5252. skins: {},
  5253.  
  5254. init: function(){
  5255. UI.refreshMainStyle();
  5256.  
  5257. UI.refreshSkinStyle(Setting.skin_name, true);
  5258.  
  5259. UI.refreshExtraStyle(Setting.extra_css);
  5260.  
  5261. UI.fixMobile();
  5262.  
  5263. // 初始变量
  5264. UI.$menu = $('#menu');
  5265. UI.$menuBar = $('#menu-bar');
  5266. UI.$content = $('#mynovelreader-content');
  5267. UI.$preferencesBtn = $('#preferencesBtn');
  5268.  
  5269. // 初始化是否隐藏
  5270. if(Setting.hide_footer_nav){
  5271. UI.hideFooterNavStyle(true);
  5272. }
  5273.  
  5274. // UI.toggleQuietMode(); // 初始化安静模式
  5275. UI.hideMenuList(Setting.menu_list_hiddden); // 初始化章节列表是否隐藏
  5276. UI.hidePreferencesButton(Setting.hide_preferences_button); // 初始化设置按钮是否隐藏
  5277. },
  5278. refreshMainStyle: function(){
  5279. var mainCss = Res.CSS_MAIN
  5280. .replace("{font_family}", Setting.font_family)
  5281. .replace("{font_size}", UI.calcContentFontSize(Setting.font_size))
  5282. .replace("{title_font_size}", UI.calcTitleFontSize(Setting.font_size))
  5283. .replace("{content_width}", Setting.content_width)
  5284. .replace("{text_line_height}", Setting.text_line_height)
  5285. .replace("{menu-bar-hidden}", Setting.menu_bar_hidden ? "display:none;" : "");
  5286.  
  5287. if(UI.$mainStyle){
  5288. UI.$mainStyle.text(mainCss);
  5289. return;
  5290. }
  5291.  
  5292. UI.$mainStyle = $('<style id="main">')
  5293. .text(mainCss)
  5294. .appendTo('head');
  5295. },
  5296. hideFooterNavStyle: function(hidden){
  5297. var navStyle = $("#footer_nav_css");
  5298. if(hidden) {
  5299. if(navStyle.length === 0) {
  5300. $('<style>')
  5301. .attr("id", "footer_nav_css")
  5302. .text(".chapter-footer-nav { display: none; }")
  5303. .appendTo('head');
  5304. }
  5305. } else {
  5306. navStyle.remove();
  5307. }
  5308. },
  5309. hideMenuList: function(hidden){
  5310. if(typeof(hidden) === "undefined"){
  5311. hidden = !UI.menu_list_hiddden;
  5312. }
  5313.  
  5314. if(hidden){
  5315. UI.$menu.addClass('hidden');
  5316. UI.$content.css("margin-left", "");
  5317. }else{
  5318. UI.$menu.removeClass('hidden');
  5319. UI.$content.css("margin-left", "320px");
  5320. }
  5321. UI.menu_list_hiddden = hidden;
  5322. },
  5323. hidePreferencesButton: function(hidden) {
  5324. hidden = _.isUndefined(hidden) ? Setting.hide_preferences_button : hidden;
  5325.  
  5326. UI.$preferencesBtn.toggle(!hidden);
  5327. },
  5328. hideMenuBar: function(hidden) {
  5329. hidden = _.isUndefined(hidden) ? Setting.menu_bar_hidden : hidden;
  5330.  
  5331. UI.$menuBar.toggle(!hidden);
  5332. },
  5333. refreshSkinStyle: function(skin_name, isFirst){
  5334. var $style = $("#skin_style");
  5335. if($style.length === 0){
  5336. $style = $('<style id="skin_style">').appendTo('head');
  5337. }
  5338.  
  5339. // 图片章节夜间模式会变的无法看
  5340. if (isFirst && skin_name.indexOf('夜间'.uiTrans()) != -1 && Setting.picNightModeCheck) {
  5341. setTimeout(function(){
  5342. var img = $('#mynovelreader-content img')[0];
  5343. // console.log(img.width, img.height)
  5344. if (img && img.width > 500 && img.height > 1000) {
  5345. $style.text(UI.skins['缺省皮肤'.uiTrans()]);
  5346. return;
  5347. }
  5348. }, 200);
  5349. }
  5350.  
  5351. $style.text(UI.skins[skin_name]);
  5352. },
  5353. refreshExtraStyle: function(css){
  5354. var style = $("#extra_style");
  5355. if(style.length === 0){
  5356. style = $('<style id="extra_style">').appendTo('head');
  5357. }
  5358.  
  5359. style.text(css);
  5360. },
  5361. toggleQuietMode: function() {
  5362. this._isQuietMode = !this._isQuietMode;
  5363. var selector = '#menu-bar, #menu, #preferencesBtn, .readerbtn';
  5364.  
  5365. if (this.$_quietStyle) {
  5366. this.$_quietStyle.remove();
  5367. this.$_quietStyle = null;
  5368. }
  5369.  
  5370. if (this._isQuietMode) {
  5371. $(selector).addClass("quiet-mode");
  5372.  
  5373. if (!isChrome) { // firefox 下隐藏滚动条
  5374. this.$_quietStyle = $('<style>')
  5375. .text('scrollbar {visibility:collapse !important; } body {overflow: hidden !important; overflow-x: hidden !important;}')
  5376. .appendTo('head');
  5377. }
  5378. } else {
  5379. $(selector).removeClass("quiet-mode");
  5380. }
  5381. },
  5382. addButton: function(){
  5383. GM_addStyle('\
  5384. .readerbtn {\
  5385. position: fixed;\
  5386. right: 10px;\
  5387. bottom: 10px;\
  5388. z-index: 2247483648;\
  5389. padding: 20px 5px;\
  5390. width: 50px;\
  5391. height: 20px;\
  5392. line-height: 20px;\
  5393. text-align: center;\
  5394. border: 1px solid;\
  5395. border-color: #888;\
  5396. border-radius: 50%;\
  5397. background: rgba(0,0,0,.5);\
  5398. color: #FFF;\
  5399. font: 12px/1.5 "微软雅黑","宋体",Arial;\
  5400. cursor: pointer;\
  5401. }\
  5402. ');
  5403.  
  5404. $("<div>")
  5405. .addClass("readerbtn")
  5406. .html(App.isEnabled ? "退出".uiTrans() : "阅读模式".uiTrans())
  5407. .mousedown(function(event){
  5408. if(event.which == 1){
  5409. App.toggle();
  5410. }else if(event.which == 2){
  5411. event.preventDefault();
  5412. L_setValue("mynoverlreader_disable_once", true);
  5413.  
  5414. var url = App.activeUrl || App.curPageUrl;
  5415. App.openUrl(url);
  5416. }
  5417. })
  5418. .appendTo('body');
  5419. },
  5420. calcContentFontSize: function(fontSizeStr) {
  5421. var m = fontSizeStr.match(/([\d\.]+)(px|r?em|pt)/);
  5422. if(m) {
  5423. var size = m[1],
  5424. type = m[2];
  5425. return parseFloat(size, 10) + type;
  5426. }
  5427.  
  5428. m = fontSizeStr.match(/([\d\.]+)/);
  5429. if (m) {
  5430. return parseFloat(m[1], 10) + 'px';
  5431. }
  5432.  
  5433. return "";
  5434. },
  5435. calcTitleFontSize: function(fontSizeStr){
  5436. var m = fontSizeStr.match(/([\d\.]+)(px|r?em|pt)/);
  5437. if(m) {
  5438. var size = m[1],
  5439. type = m[2];
  5440. return parseFloat(size, 10) * 1.8 + type;
  5441. }
  5442.  
  5443. m = fontSizeStr.match(/([\d\.]+)/);
  5444. if (m) {
  5445. return parseFloat(m[1], 10) * 1.8 + 'px';
  5446. }
  5447.  
  5448. return "";
  5449. },
  5450. fixMobile: function(){ // 自适应网页设计
  5451. var meta = document.createElement("meta");
  5452. meta.setAttribute("name", "viewport");
  5453. meta.setAttribute("content", "width=device-width, initial-scale=1");
  5454. document.head.appendChild(meta);
  5455. },
  5456. preferencesShow: function(event){
  5457. if($("#reader_preferences").length){
  5458. return;
  5459. }
  5460.  
  5461. UI._loadBlocker();
  5462.  
  5463. UI.$prefs = $('<div id="reader_preferences">')
  5464. .css('cssText', 'position:fixed; top:12%; left:30%; width:500px; z-index:300000;')
  5465. .append(
  5466. $('<style>').text(Res.preferencesCSS))
  5467. .append(
  5468. $('<div class="body">').html(Res.preferencesHTML))
  5469. .appendTo('body');
  5470.  
  5471. UI.preferencesLoadHandler();
  5472. },
  5473. _loadBlocker: function() {
  5474. UI.$blocker = $('<div>').attr({
  5475. id: 'uil_blocker',
  5476. style: 'position:fixed;top:0px;left:0px;right:0px;bottom:0px;background-color:#000;opacity:0.5;z-index:100000;'
  5477. }).appendTo('body');
  5478. },
  5479. hide: function(){
  5480. if(UI.$prefs) UI.$prefs.remove();
  5481. if(UI.$blocker) UI.$blocker.remove();
  5482. UI.$prefs = null;
  5483. UI.$blocker = null;
  5484. },
  5485. preferencesLoadHandler: function(){
  5486. var $form = $("#preferences");
  5487.  
  5488. // checkbox
  5489. $form.find("#enable-cn2tw").get(0).checked = Setting.cn2tw;
  5490. $form.find("#disable-auto-launch").get(0).checked = Setting.getDisableAutoLaunch();
  5491. $form.find("#booklink-enable").get(0).checked = Setting.booklink_enable;
  5492. $form.find("#debug").get(0).checked = Setting.debug;
  5493. $form.find("#quietMode").get(0).checked = Setting.isQuietMode;
  5494. $form.find("#pic-nightmode-check").get(0).checked = Setting.picNightModeCheck;
  5495. $form.find("#copyCurTitle").get(0).checked = Setting.copyCurTitle;
  5496.  
  5497. $form.find("#hide-menu-list").get(0).checked = Setting.menu_list_hiddden;
  5498. $form.find("#hide-footer-nav").get(0).checked = Setting.hide_footer_nav;
  5499. $form.find("#hide-preferences-button").get(0).checked = Setting.hide_preferences_button;
  5500. $form.find("#add-nextpage-to-history").get(0).checked = Setting.addToHistory;
  5501. $form.find("#enable-dblclick-pause").get(0).checked = Setting.dblclickPause;
  5502.  
  5503. $form.find("#font-family").get(0).value = Setting.font_family;
  5504. $form.find("#font-size").get(0).value = Setting.font_size;
  5505. $form.find("#content_width").get(0).value = Setting.content_width;
  5506. $form.find("#text_line_height").get(0).value = Setting.text_line_height;
  5507. $form.find("#split_content").get(0).checked = Setting.split_content;
  5508. $form.find("#scroll_animate").get(0).checked = Setting.scrollAnimate;
  5509.  
  5510. $form.find("#remain-height").get(0).value = Setting.remain_height;
  5511. $form.find("#extra_css").get(0).value = Setting.extra_css;
  5512. $form.find("#custom_siteinfo").get(0).value = Setting.customSiteinfo;
  5513. UI._rules = $form.find("#custom_replace_rules").get(0).value = Setting.customReplaceRules;
  5514.  
  5515. // 界面语言
  5516. var $lang = $form.find("#lang");
  5517. $("<option>").text("zh-CN").appendTo($lang);
  5518. $("<option>").text("zh-TW").appendTo($lang);
  5519. $lang.val(Setting.lang).change(function(){
  5520. var key = $(this).find("option:selected").text();
  5521. Setting.lang = key;
  5522. });
  5523.  
  5524. // 皮肤
  5525. var $skin = $form.find("#skin");
  5526. for(var key in UI.skins){
  5527. $("<option>").text(key).appendTo($skin);
  5528. }
  5529. $skin.val(Setting.skin_name).change(function(){
  5530. var key = $(this).find("option:selected").text();
  5531. UI.refreshSkinStyle(key);
  5532. Setting.skin_name = key;
  5533. });
  5534.  
  5535. // 字体大小等预览
  5536. var preview = _.debounce(function(){
  5537. switch(this.id){
  5538. case "font-size":
  5539. var contentFontSize = UI.calcContentFontSize(this.value);
  5540. var titleFontSize = UI.calcTitleFontSize(this.value);
  5541. if(titleFontSize) {
  5542. UI.$content.css("font-size", contentFontSize);
  5543. UI.$content.find("h1").css("font-size", titleFontSize);
  5544. }
  5545. break;
  5546. case "font-family":
  5547. UI.$content.css("font-family", this.value);
  5548. break;
  5549. case "content_width":
  5550. UI.$content.css("width", this.value);
  5551. break;
  5552. case "text_line_height":
  5553. UI.$content.css("line-height", this.value);
  5554. break;
  5555. default:
  5556. break;
  5557. }
  5558. }, 300);
  5559. $form.on("input", "input", preview);
  5560.  
  5561. // 初始化设置按键
  5562. $form.find("#quietModeKey").get(0).value = Setting.quietModeKey;
  5563. $form.find("#openPreferencesKey").get(0).value = Setting.openPreferencesKey;
  5564. $form.find("#setHideMenuListKey").get(0).value = Setting.hideMenuListKey;
  5565.  
  5566. // 点击事件
  5567. $form.on('click', 'input:checkbox, input:button', function(event){
  5568. UI.preferencesClickHandler(event.target);
  5569. });
  5570. },
  5571. cleanPreview: function() {
  5572. UI.$content.find("h1").css("font-size", "");
  5573.  
  5574. // 恢复初始设置(有误操作)
  5575. // UI.$content.removeAttr('style');
  5576. },
  5577. preferencesClickHandler: function(target){
  5578. var key;
  5579. switch (target.id) {
  5580. case 'close_button':
  5581. UI.preferencesCloseHandler();
  5582. break;
  5583. case 'save_button':
  5584. UI.preferencesSaveHandler();
  5585. break;
  5586. case 'debug':
  5587. Setting.debug = !Setting.debug;
  5588. toggleConsole(Setting.debug);
  5589. break;
  5590. case 'quietMode':
  5591. UI.toggleQuietMode(target.checked);
  5592. break;
  5593. case 'hide-menu-list':
  5594. UI.hideMenuList(target.checked);
  5595. break;
  5596. case 'hide-preferences-button':
  5597. UI.hidePreferencesButton(target.checked);
  5598. if (target.checked) {
  5599. alert('隐藏后通过快捷键或 Greasemonkey 用户脚本命令处调用'.uiTrans());
  5600. }
  5601. break;
  5602. case 'hide-footer-nav':
  5603. break;
  5604. case 'quietModeKey':
  5605. key = prompt('请输入打开设置的快捷键:'.uiTrans(), Setting.quietModeKey);
  5606. if (key) {
  5607. Setting.quietModeKey = key;
  5608. $(target).val(key);
  5609. }
  5610. break;
  5611. case 'openPreferencesKey':
  5612. key = prompt('请输入打开设置的快捷键:'.uiTrans(), Setting.openPreferencesKey);
  5613. if (key) {
  5614. Setting.openPreferencesKey = key;
  5615. $(target).val(key);
  5616. }
  5617. break;
  5618. case 'setHideMenuListKey':
  5619. key = prompt('请输入切换左侧章节列表的快捷键:'.uiTrans(), Setting.hideMenuListKey);
  5620. if (key) {
  5621. Setting.hideMenuListKey = key;
  5622. $(target).val(key);
  5623. }
  5624. break;
  5625. case 'saveAsTxt':
  5626. UI.preferencesCloseHandler();
  5627. App.saveAsTxt();
  5628. break;
  5629. default:
  5630. break;
  5631. }
  5632. },
  5633. preferencesCloseHandler: function(){
  5634. UI.cleanPreview();
  5635.  
  5636. UI.hide();
  5637. },
  5638. preferencesSaveHandler: function(){
  5639. var $form = $("#preferences");
  5640.  
  5641. Setting.setDisableAutoLaunch($form.find("#disable-auto-launch").get(0).checked);
  5642.  
  5643. Setting.cn2tw = $form.find("#enable-cn2tw").get(0).checked;
  5644. Setting.booklink_enable = $form.find("#booklink-enable").get(0).checked;
  5645. Setting.isQuietMode = $form.find("#quietMode").get(0).checked;
  5646. Setting.debug = $form.find("#debug").get(0).checked;
  5647. Setting.picNightModeCheck = $form.find("#pic-nightmode-check").get(0).checked;
  5648. Setting.setCopyCurTitle($form.find("#copyCurTitle").get(0).checked);
  5649.  
  5650. Setting.addToHistory = $form.find("#add-nextpage-to-history").get(0).checked;
  5651. Setting.dblclickPause = $form.find("#enable-dblclick-pause").get(0).checked;
  5652.  
  5653. var skinName = $form.find("#skin").find("option:selected").text();
  5654. Setting.skin_name = skinName;
  5655. UI.refreshSkinStyle(skinName);
  5656.  
  5657. Setting.font_family = $form.find("#font-family").get(0).value;
  5658. UI.$content.css("font-family", Setting.font_family);
  5659.  
  5660. Setting.font_size = $form.find("#font-size").get(0).value;
  5661. Setting.text_line_height = $form.find("#text_line_height").get(0).value;
  5662. Setting.content_width = $form.find("#content_width").get(0).value;
  5663. Setting.remain_height = $form.find("#remain-height").get(0).value;
  5664. Setting.split_content = $form.find("#split_content").get(0).checked;
  5665. Setting.scrollAnimate = $form.find("#scroll_animate").get(0).checked;
  5666.  
  5667. Setting.menu_list_hiddden = $form.find("#hide-menu-list").get(0).checked;
  5668. UI.hideMenuList(Setting.menu_list_hiddden);
  5669.  
  5670. Setting.hide_footer_nav = $form.find("#hide-footer-nav").get(0).checked;
  5671. Setting.hide_preferences_button = $form.find("#hide-preferences-button").get(0).checked;
  5672.  
  5673. var css = $form.find("#extra_css").get(0).value;
  5674. UI.refreshExtraStyle(css);
  5675. Setting.extra_css = css;
  5676.  
  5677. Setting.customSiteinfo = $form.find("#custom_siteinfo").get(0).value;
  5678.  
  5679. // 自定义替换规则直接生效
  5680. var rules = $form.find("#custom_replace_rules").get(0).value;
  5681. Setting.customReplaceRules = rules;
  5682. if (rules != UI._rules) {
  5683. var contentHtml = App.oArticles.join('\n');
  5684. if (rules) {
  5685. // 转换规则
  5686. rules = Rule.parseCustomReplaceRules(rules);
  5687. // 替换
  5688. contentHtml = Parser.prototype.replaceHtml(contentHtml, rules);
  5689. }
  5690.  
  5691. UI.$content.html(contentHtml);
  5692.  
  5693. App.resetCache();
  5694.  
  5695. UI._rules = rules;
  5696. }
  5697.  
  5698. // 重新载入样式
  5699. UI.cleanPreview();
  5700. UI.refreshMainStyle();
  5701.  
  5702. UI.hide();
  5703. },
  5704. openHelp: function() {
  5705.  
  5706. },
  5707. notice: function (htmlText, ms){
  5708. var $noticeDiv = $("#alert");
  5709. if (!ms) {
  5710. ms = 1666;
  5711. }
  5712.  
  5713. clearTimeout(UI.noticeDivto);
  5714. $noticeDiv.find("p").html(htmlText);
  5715. $noticeDiv.fadeIn("fast");
  5716.  
  5717. UI.noticeDivto = setTimeout(function(){
  5718. $noticeDiv.fadeOut(500);
  5719. }, ms);
  5720.  
  5721. return $noticeDiv;
  5722. }
  5723. };
  5724.  
  5725. UI.skins["缺省皮肤".uiTrans()] = "";
  5726. UI.skins["暗色皮肤".uiTrans()] = "body { color: #666; background-color: rgba(0;0;0;.1); }\
  5727. .title { color: #222; }";
  5728. UI.skins["白底黑字".uiTrans()] = "body { color: black; background-color: white;}\
  5729. .title { font-weight: bold; border-bottom: 0.1em solid; margin-bottom: 1.857em; padding-bottom: 0.857em;}";
  5730. UI.skins["夜间模式".uiTrans()] = "body { color: #939392; background: #2d2d2d; } #preferencesBtn { background: white; } #mynovelreader-content img { background-color: #c0c0c0; } .chapter.active div{color: #939392;}";
  5731. UI.skins["夜间模式1".uiTrans()] = "body { color: #679; background-color: black; } #preferencesBtn img { background-color: white !important; } .title { color: #3399FF; background-color: #121212; }";
  5732. UI.skins["夜间模式2".uiTrans()] = "body { color: #AAAAAA; background-color: #121212; } #preferencesBtn img { background-color: white; } #mynovelreader-content img { background-color: #c0c0c0; } .title { color: #3399FF; background-color: #121212; } body a { color: #E0BC2D; } body a:link { color: #E0BC2D; } body a:visited { color:#AAAAAA; } body a:hover { color: #3399FF; } body a:active { color: #423F3F; }";
  5733. UI.skins["夜间模式(多看)".uiTrans()] = "body { color: #4A4A4A; background: #101819; } #preferencesBtn { background: white; } #mynovelreader-content img { background-color: #c0c0c0; }";
  5734.  
  5735. UI.skins["橙色背景".uiTrans()] = "body { color: #24272c; background-color: #FEF0E1; }";
  5736. UI.skins["绿色背景".uiTrans()] = "body { color: black; background-color: #d8e2c8; }";
  5737. UI.skins["绿色背景2".uiTrans()] = "body { color: black; background-color: #CCE8CF; }";
  5738. UI.skins["蓝色背景".uiTrans()] = "body { color: black; background-color: #E7F4FE; }";
  5739. UI.skins["棕黄背景".uiTrans()] = "body { color: black; background-color: #C2A886; }";
  5740. UI.skins["经典皮肤".uiTrans()] = "body { color: black; background-color: #EAEAEE; } .title { background-color: #f0f0f0; }";
  5741.  
  5742. UI.skins["起点牛皮纸(深色)".uiTrans()] = "body { color: black; background: url(\"http://qidian.gtimg.com/qd/images/read.qidian.com/theme/body_theme1_bg_2x.0.3.png\"); }";
  5743. UI.skins["起点牛皮纸(浅色)".uiTrans()] = "body { color: black; background: url(\"http://qidian.gtimg.com/qd/images/read.qidian.com/theme/theme_1_bg_2x.0.3.png\"); }";
  5744.  
  5745. var getBooleanConfig = function(configName, defaultValue) {
  5746. var config$$1 = GM_getValue(configName);
  5747. if(config$$1 === undefined) {
  5748. GM_setValue(configName, defaultValue);
  5749. config$$1 = defaultValue;
  5750. }
  5751. return config$$1;
  5752. };
  5753.  
  5754. var Setting = {
  5755. getDisableAutoLaunch: function() { // 强制手动启用模式
  5756. return getBooleanConfig("disable_auto_launch", false);
  5757. },
  5758. setDisableAutoLaunch: function(bool) {
  5759. GM_setValue("disable_auto_launch", bool);
  5760. },
  5761.  
  5762. // 按键调用会遇到问题: Greasemonkey 访问违规:unsafeWindow 无法调用 GM_getValue
  5763. // 故改成这种形式
  5764. copyCurTitle: getBooleanConfig("copyCurTitle", true),
  5765. setCopyCurTitle: function (bool) {
  5766. this.copyCurTitle = !!bool;
  5767. GM_setValue("copyCurTitle", !!bool);
  5768. },
  5769.  
  5770. get cn2tw() {
  5771. if (_.isUndefined(this._cn2tw)) {
  5772. this._cn2tw = getBooleanConfig('cn2tw', this.lang === 'zh-TW' ? true : false);
  5773. }
  5774. return this._cn2tw;
  5775. },
  5776. set cn2tw(bool) {
  5777. GM_setValue('cn2tw', bool);
  5778. this._cn2tw = bool;
  5779. },
  5780.  
  5781. get booklink_enable() { // booklink.me 跳转的自动启动
  5782. return getBooleanConfig("booklink_enable", true);
  5783. },
  5784. set booklink_enable(bool) {
  5785. GM_setValue("booklink_enable", bool);
  5786. },
  5787.  
  5788. get debug() { // 调试
  5789. if (_.isUndefined(this._debug)) {
  5790. this._debug = getBooleanConfig("debug", false);
  5791. }
  5792. return this._debug;
  5793. },
  5794. set debug(bool) {
  5795. this._debug = bool;
  5796. GM_setValue("debug", bool);
  5797. toggleConsole(bool);
  5798. },
  5799.  
  5800. get addToHistory() {
  5801. if (_.isUndefined(this._addToHistory)) {
  5802. this._addToHistory = getBooleanConfig("add_nextpage_to_history", true);
  5803. }
  5804. return this._addToHistory;
  5805. },
  5806. set addToHistory(bool) {
  5807. this._addToHistory = bool;
  5808. GM_setValue("add_nextpage_to_history", bool);
  5809. },
  5810.  
  5811. get dblclickPause() {
  5812. return getBooleanConfig('dblclick_pause', true);
  5813. },
  5814. set dblclickPause(bool) {
  5815. GM_setValue('dblclick_pause', bool);
  5816. },
  5817.  
  5818. get remain_height() { // 距离底部多少高度(px)开始加载下一页
  5819. if(_.isUndefined(this._remain_height)){
  5820. this._remain_height = parseInt(GM_getValue("remain_height"), 10) || 400;
  5821. }
  5822. return this._remain_height;
  5823. },
  5824. set remain_height(val) {
  5825. this._remain_height = val;
  5826. GM_setValue("remain_height", val);
  5827. },
  5828.  
  5829. get lang() {
  5830. if (_.isUndefined(this._lang)) {
  5831. this._lang = GM_getValue("lang") || ((navigator.language === "zh-TW" || navigator.language === "zh-HK") ? "zh-TW" : "zh-CN");
  5832. }
  5833. return this._lang;
  5834. },
  5835. set lang(val) {
  5836. this._lang = val;
  5837. config.lang = val;
  5838. GM_setValue("lang", val);
  5839. },
  5840.  
  5841. get font_family() {
  5842. return GM_getValue("font_family") || "微软雅黑,宋体,黑体,楷体".uiTrans();
  5843. },
  5844. set font_family(val) {
  5845. GM_setValue("font_family", val);
  5846. },
  5847.  
  5848. get font_size() { // 字体大小
  5849. return GM_getValue("font_size") || "18px";
  5850. },
  5851. set font_size(val) {
  5852. GM_setValue("font_size", val);
  5853. },
  5854.  
  5855. get text_line_height(){
  5856. return GM_getValue("text_line_height") || "2em";
  5857. },
  5858. set text_line_height(val){
  5859. GM_setValue("text_line_height", val);
  5860. },
  5861.  
  5862. get content_width() { // 内容宽度
  5863. return GM_getValue("content_width") || "800px";
  5864. },
  5865. set content_width(val) {
  5866. GM_setValue("content_width", val);
  5867. },
  5868.  
  5869. get extra_css() {
  5870. return GM_getValue("extra_css", "");
  5871. },
  5872. set extra_css(val) {
  5873. GM_setValue("extra_css", val);
  5874. },
  5875.  
  5876. get customSiteinfo() {
  5877. return GM_getValue('custom_siteinfo', '[]');
  5878. },
  5879. set customSiteinfo(val) {
  5880. GM_setValue('custom_siteinfo', val);
  5881. },
  5882.  
  5883. get customReplaceRules() {
  5884. var rules = GM_getValue('custom_replace_rules', 'b[āà]ng=棒\n『(.)』=$1');
  5885.  
  5886. return rules;
  5887. },
  5888. set customReplaceRules(val) {
  5889. GM_setValue('custom_replace_rules', val);
  5890. },
  5891.  
  5892. get skin_name() {
  5893. return GM_getValue("skin_name") || "缺省皮肤".uiTrans();
  5894. },
  5895. set skin_name(val) {
  5896. GM_setValue("skin_name", val);
  5897. },
  5898.  
  5899. get menu_list_hiddden() {
  5900. return getBooleanConfig("menu_list_hiddden", false);
  5901. },
  5902. set menu_list_hiddden(bool) {
  5903. GM_setValue("menu_list_hiddden", bool);
  5904. },
  5905.  
  5906. get hide_footer_nav() {
  5907. return getBooleanConfig("hide_footer_nav", true);
  5908. },
  5909. set hide_footer_nav(bool) {
  5910. GM_setValue("hide_footer_nav", bool);
  5911. UI.hideFooterNavStyle(bool);
  5912. },
  5913.  
  5914. get hide_preferences_button() {
  5915. return getBooleanConfig("hide_preferences_button", false);
  5916. },
  5917. set hide_preferences_button(bool) {
  5918. GM_setValue('hide_preferences_button', bool);
  5919. },
  5920.  
  5921. // === 快捷键
  5922.  
  5923. // 安静模式切换快捷键
  5924. get quietModeKey() {
  5925. if (this._quietModeKey) {
  5926. return this._quietModeKey;
  5927. }
  5928. this._quietModeKey = GM_getValue('quietModeKey') || 'q';
  5929.  
  5930. return this._quietModeKey;
  5931. },
  5932. set quietModeKey(keyCode) {
  5933. this._quietModeKey = keyCode;
  5934. GM_setValue('quietModeKey', keyCode);
  5935. },
  5936.  
  5937. // 打开设置窗口的快捷键
  5938. get openPreferencesKey() {
  5939. if (this._openPreferencesKey) {
  5940. return this._openPreferencesKey;
  5941. }
  5942. this._openPreferencesKey = GM_getValue('open_preferences_key') || 's';
  5943.  
  5944. return this._openPreferencesKey;
  5945. },
  5946. set openPreferencesKey(keyCode) {
  5947. this._openPreferencesKey = keyCode;
  5948. GM_setValue('open_preferences_key', keyCode);
  5949. },
  5950.  
  5951. // 隐藏左侧章节列表的快捷键
  5952. get hideMenuListKey() { // 默认为 c
  5953. // 'C'.charCodeAt(0) = 67
  5954. if (this._hideMenuListKey) {
  5955. return this._hideMenuListKey;
  5956. }
  5957. this._hideMenuListKey = GM_getValue('hide_menulist_key') || 'c';
  5958.  
  5959. return this._hideMenuListKey;
  5960. },
  5961. set hideMenuListKey(key) {
  5962. this._hideMenuListKey = key;
  5963. GM_setValue("hide_menulist_key", key);
  5964. },
  5965.  
  5966. get picNightModeCheck() {
  5967. return getBooleanConfig('picNightModeCheck', true);
  5968. },
  5969. set picNightModeCheck(bool) {
  5970. GM_setValue('picNightModeCheck', bool);
  5971. },
  5972.  
  5973. get split_content() {
  5974. if (_.isUndefined(this._split_content)) {
  5975. this._split_content = GM_getValue('split_content', true);
  5976. }
  5977. return this._split_content;
  5978. },
  5979. set split_content(bool) {
  5980. this._split_content = bool;
  5981. GM_setValue('split_content', bool);
  5982. },
  5983.  
  5984. get scrollAnimate() {
  5985. return GM_getValue('scrollAnimate', false);
  5986. },
  5987. set scrollAnimate(bool) {
  5988. GM_setValue('scrollAnimate', bool);
  5989. },
  5990. };
  5991.  
  5992. var BookLinkMe = {
  5993. clickedColor: "666666",
  5994.  
  5995. init: function() {
  5996.  
  5997. this.addUnreadButton();
  5998.  
  5999. // if (location.pathname.indexOf("/book-") === 0) {
  6000. // this.chapterPageAddTiebaLink();
  6001. // }
  6002. },
  6003. addUnreadButton: function(){ // 添加一键打开所有未读链接
  6004. var $parent = $('td[colspan="2"]:contains("未读"):first, td[colspan="2"]:contains("未讀"):first');
  6005. if(!$parent.length) return;
  6006.  
  6007. var openAllUnreadLinks = function(event){
  6008. event.preventDefault();
  6009.  
  6010. var links = $x('./ancestor::table[@width="100%"]/descendant::a[img[@alt="未读"]]', event.target);
  6011. links.forEach(function(link){
  6012. // 忽略没有盗版的
  6013. var chapterLink = link.parentNode.nextSibling.nextSibling.querySelector('a');
  6014. if (chapterLink.querySelector('font[color*="800000"]')) {
  6015. return;
  6016. }
  6017.  
  6018. if(isFirefox)
  6019. link.click();
  6020. else
  6021. GM_openInTab(link.href);
  6022.  
  6023. // 设置点击后的样式
  6024. // 未读左边的 1x 链接
  6025. link.parentNode.previousSibling.querySelector('font')
  6026. .setAttribute('color', BookLinkMe.clickedColor);
  6027. chapterLink.classList.add('mclicked');
  6028. });
  6029. };
  6030.  
  6031.  
  6032. $('<a>')
  6033. .attr({ href: 'javascript:;', title: '一键打开所有未读链接', style: 'width:auto;' })
  6034. .click(openAllUnreadLinks)
  6035. .append($('<img src="me.png" style="max-width: 20px;">'))
  6036. .appendTo($parent);
  6037. },
  6038. chapterPageAddTiebaLink: function() {
  6039. var link = $('font:contains("贴吧")').parent().get(0);
  6040. if (!link) return;
  6041.  
  6042. var tiebaUrl = 'http://tieba.baidu.com/f?kw=' + $('h1').text();
  6043. console.log('GM_xmlhttpRequest', tiebaUrl);
  6044. GM_xmlhttpRequest({
  6045. method: "GET",
  6046. url: tiebaUrl,
  6047. onload: function(response) {
  6048. var doc = parseHTML(response.responseText);
  6049. BookLinkMe.load(doc);
  6050. }
  6051. });
  6052. },
  6053. load: function(doc) {
  6054. var $data = $(doc).find('.threadlist_text > a').map(function() {
  6055. return {
  6056. title: $(this).text(),
  6057. url: 'http://tieba.baidu.com' + $(this).attr('href')
  6058. }
  6059. });
  6060.  
  6061. var trimTitle = function(title, strict) {
  6062. title = title.trim()
  6063. .replace(/\.\.\.$/, '');
  6064.  
  6065. if (strict) {
  6066. title = title.replace(/第.*?章\s*/, '');
  6067. }
  6068.  
  6069. // if (toNum) {
  6070. // title = title.replace(/[零一二三四五六七八九十百千万亿]+/, cnNum2ArabNum);
  6071. // }
  6072.  
  6073. return title;
  6074. };
  6075.  
  6076. var findUrl = function(sTitle) {
  6077. if (!sTitle) return;
  6078.  
  6079. var url;
  6080. $data.each(function(i, item) {
  6081. var tiebaTitle = item.title;
  6082. if (tiebaTitle.indexOf(trimTitle(sTitle)) > 0 ||
  6083. sTitle.indexOf(trimTitle(tiebaTitle, true)) > 0 // 包含贴吧标题的部分
  6084. ) {
  6085. url = item.url;
  6086. return true;
  6087. }
  6088. });
  6089.  
  6090. return url;
  6091. };
  6092.  
  6093. $('a:contains("搜索本章节")').each(function(){
  6094. var $this = $(this),
  6095. $thisLine = $this.parent().parent(),
  6096. chapterTitle = $thisLine.prev().find('a[href^="/jump.php"]:first').text();
  6097.  
  6098. var url = findUrl(chapterTitle);
  6099. if (url) {
  6100. $('<a>')
  6101. .attr({ target: '_blank', href: url })
  6102. .text('贴吧')
  6103. .appendTo($this.parent());
  6104. }
  6105. });
  6106. }
  6107. };
  6108.  
  6109. toggleConsole(Setting.debug);
  6110.  
  6111. if (location.host.indexOf('booklink.me') > -1) {
  6112. BookLinkMe.init();
  6113. } else {
  6114. App.init();
  6115. }
  6116.  
  6117. }());