小說閱讀腳本

小說閱讀腳本,統一閱讀樣式,內容去廣告、修正拼音字、段落整理,自動下一頁

目前為 2017-08-22 提交的版本,檢視 最新版本

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

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址