百合会论坛
https://bbs.yamibo.com
sf-gitee (12782)03/23 21:17
百合会论坛,需要登陆。支持文学区、中文百合漫画区、轻小说/译文区。
{
"bookSourceComment": "需先登录百合会账号后使用;覆盖轻小说\/译文区、文学区、中文百合漫画区",
"bookSourceGroup": "论坛",
"bookSourceName": "百合会论坛",
"bookSourceType": 0,
"bookSourceUrl": "https:\/\/bbs.yamibo.com",
"bookUrlPattern": "https?:\/\/bbs\\.yamibo\\.com\/forum\\.php\\?mod=viewthread.*tid=\\d+.*",
"customOrder": 1,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"header": "{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 10; Mobile) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0 Mobile Safari\/537.36\"}",
"exploreUrl": "轻小说\/译文区::https:\/\/bbs.yamibo.com\/forum.php?mod=forumdisplay&fid=55&page={{page}}&mobile=2\n文学区::https:\/\/bbs.yamibo.com\/forum.php?mod=forumdisplay&fid=49&page={{page}}&mobile=2\n中文百合漫画区::https:\/\/bbs.yamibo.com\/forum.php?mod=forumdisplay&fid=30&page={{page}}&mobile=2\n轻小说最新::https:\/\/bbs.yamibo.com\/forum.php?mod=forumdisplay&fid=55&filter=lastpost&orderby=lastpost&page={{page}}&mobile=2\n文学最新::https:\/\/bbs.yamibo.com\/forum.php?mod=forumdisplay&fid=49&filter=lastpost&orderby=lastpost&page={{page}}&mobile=2\n漫画最新::https:\/\/bbs.yamibo.com\/forum.php?mod=forumdisplay&fid=30&filter=lastpost&orderby=lastpost&page={{page}}&mobile=2",
"lastUpdateTime": "1774271829642",
"loginUrl": "https:\/\/bbs.yamibo.com\/member.php?mod=logging&action=login&mobile=2",
"respondTime": 180000,
"ruleBookInfo": {
"bookInfoInit": "(function(){\n var doc = org.jsoup.Jsoup.parse(result, baseUrl);\n\n function trim(s){ return s ? String(s).replace(\/^\\s+|\\s+$\/g, \"\") : \"\"; }\n function norm(s){ return trim(String(s || \"\").replace(\/\\u00A0\/g, \" \").replace(\/[ \\t\\r\\f\\v]+\/g, \" \")); }\n function text(el){ return el ? trim(el.text()) : \"\"; }\n function own(el){ return el ? trim(el.ownText()) : \"\"; }\n function abs(el, attr){ return el ? trim(el.attr(\"abs:\" + attr)) : \"\"; }\n function forumName(){\n var h = text(doc.select('.header h2 a').first());\n return h ? h.replace(\/文學區\/g, '文学区') : '';\n }\n function cleanTitle(t){\n t = trim(t || '');\n t = t.replace(\/^\\s*(?:[\\[【][^\\]】]{1,24}[\\]】]\\s*)+\/g, '');\n t = t.replace(\/\\s*[\\[【](?:更新|更至|更新至|更新到|完结|完結|番外.*?完).*?[\\]】]\\s*$\/g, '');\n t = t.replace(\/\\s+\\d+\\s*\\\/\\s*\\d+\\s*(?:\\(\\d+\\s*\\\/\\s*\\d+\\))?\\s*$\/g, '');\n return trim(t);\n }\n function decodeTextLines(s){\n s = String(s || '').replace(\/\\r\/g, '');\n var arr = s.split('\\n');\n for (var i = 0; i < arr.length; i++) arr[i] = org.jsoup.Jsoup.parse(arr[i]).text();\n return arr.join('\\n');\n }\n function messageToText(msgEl){\n if (!msgEl) return '';\n var c = msgEl.clone();\n c.select('i.pstatus, script, style, rt, .quote, .pstatus, .aimg_tip, .jammer').remove();\n var rubies = c.select('ruby');\n for (var i = rubies.size() - 1; i >= 0; i--) rubies.get(i).unwrap();\n var as = c.select('a');\n for (var j = as.size() - 1; j >= 0; j--) as.get(j).unwrap();\n var h = String(c.html() || '');\n h = h.replace(\/<br[^>]*>\/ig, '\\n');\n h = h.replace(\/<hr[^>]*>\/ig, '\\n\\n');\n h = h.replace(\/<li[^>]*>\/ig, '\\n');\n h = h.replace(\/<\\\/(?:li|div|p|section|blockquote|article|header|footer|aside|tr|td|th|ul|ol|table|tbody|thead|tfoot)>\/ig, '\\n');\n h = h.replace(\/<h[1-6][^>]*>\/ig, '\\n\\n');\n h = h.replace(\/<\\\/h[1-6]>\/ig, '\\n\\n');\n h = h.replace(\/<[^>]+>\/g, '');\n h = decodeTextLines(h);\n h = h.replace(\/\\u00A0\/g, ' ');\n h = h.replace(\/[ \\t\\f\\v]+\/g, ' ');\n h = h.replace(\/ *\\n *\/g, '\\n');\n h = h.replace(\/\\n{3,}\/g, '\\n\\n');\n return trim(h);\n }\n function linesFromMessage(msgEl){\n var txt = messageToText(msgEl);\n var raw = txt.split(\/\\n+\/);\n var arr = [];\n for (var i = 0; i < raw.length; i++) {\n var line = norm(raw[i]);\n if (!line) continue;\n if (\/^(本帖最后由|評分|评分|點評|点评|參與人數|参与人数|積分|积分|理由|查看全部评分)\/.test(line)) continue;\n arr.push(line);\n }\n return arr;\n }\n var firstPost = doc.select('.plc.cl').first();\n var firstMsg = firstPost ? firstPost.select('.message').first() : null;\n var poster = firstPost ? text(firstPost.select('.authi .z a').first()) : '';\n var postTime = firstPost ? own(firstPost.select('.authi .mtime').first()) : '';\n var rawTitle = text(doc.select('.view_tit').first());\n\n var lines = linesFromMessage(firstMsg);\n var labelReg = \/^(作品名稱|作品名称|作品名|書名|书名|標題|标题|題名|题名|原名|作者|原作|原著|作者名|翻譯|翻译|譯者|译者|校對|校对|圖源|图源|嵌字|漢化|汉化|簡介|简介|內容簡介|内容简介|原文简介|介紹|介绍|文案|作品連結|作品链接|連結|链接|原地址|生肉|作品標籤|作品标签|主题|主題)\\s*[::]?\\s*$\/;\n function isLabelLine(line){ return labelReg.test(trim(line || '')); }\n function cleanValue(v){ return trim(v || '').replace(\/^[\\[\\【\\(\\(「『]+|[\\]\\】\\)\\)」』]+$\/g, ''); }\n function extractSingle(keys, maxLen){\n var keyReg = '(?:' + keys.join('|') + ')';\n for (var i = 0; i < lines.length; i++) {\n var line = trim(lines[i]);\n var m = line.match(new RegExp('^' + keyReg + '\\\\s*[::]\\\\s*(.+)$', 'i'));\n if (m) return cleanValue(m[1]).substring(0, maxLen || 120);\n if (line.match(new RegExp('^' + keyReg + '\\\\s*[::]?\\\\s*$', 'i'))) {\n for (var j = i + 1; j < lines.length && j <= i + 3; j++) {\n var n = trim(lines[j]);\n if (!n) continue;\n if (isLabelLine(n)) break;\n return cleanValue(n).substring(0, maxLen || 120);\n }\n }\n }\n return '';\n }\n function extractIntro(){\n var keys = ['簡介','简介','內容簡介','内容简介','原文简介','介紹','介绍','文案'];\n var keyReg = '(?:' + keys.join('|') + ')';\n var start = -1, first = '';\n for (var i = 0; i < lines.length; i++) {\n var line = trim(lines[i]);\n var m = line.match(new RegExp('^' + keyReg + '\\\\s*[::]\\\\s*(.*)$', 'i'));\n if (m) { start = i + 1; first = trim(m[1]); break; }\n if (line.match(new RegExp('^' + keyReg + '\\\\s*[::]?\\\\s*$', 'i'))) { start = i + 1; break; }\n }\n if (start < 0) return '';\n var arr = [];\n if (first) arr.push(first);\n for (var j = start; j < lines.length; j++) {\n var x = trim(lines[j]);\n if (!x) continue;\n if (isLabelLine(x)) break;\n if (\/^(目錄|目录|索引|主題|主题|作品標籤|作品标签|邊看邊翻|边看边翻|嚴禁劇透|严禁剧透|轉載請註明|转载请注明|生肉推薦串|生肉推荐串)\/.test(x) && arr.length > 0) break;\n arr.push(x);\n if (arr.join('\\n').length >= 260 && arr.length >= 2) break;\n }\n return trim(arr.join('\\n')).substring(0, 320);\n }\n function normalizeTocUrl(u){\n u = String(u || '').replace(\/([?&])__pid=\\d+\/g, '$1').replace(\/&&+\/g, '&').replace(\/#pid\\d+$\/g, '');\n if (!u || u.indexOf('mod=viewthread') < 0) {\n var tm = String(baseUrl || '').match(\/tid=(\\d+)\/);\n if (tm) u = 'https:\/\/bbs.yamibo.com\/forum.php?mod=viewthread&tid=' + tm[1] + '&mobile=2';\n }\n if (u.indexOf('mobile=2') < 0) u += (u.indexOf('?') >= 0 ? '&' : '?') + 'mobile=2';\n return u.replace(\/\\?&\/, '?');\n }\n\n var name = extractSingle(['作品名稱','作品名称','作品名','書名','书名','標題','标题','題名','题名','原名'], 180);\n if (!name) name = cleanTitle(rawTitle);\n\n var author = extractSingle(['作者','原作','原著','作者名'], 120);\n if (!author) author = trim(poster);\n\n var intro = extractIntro();\n if (!intro) {\n var metaDesc = trim(doc.select('meta[name=description]').attr('content'));\n if (metaDesc) intro = metaDesc.replace(\/\\s*,\\s*百合会\\s*$\/i, '').substring(0, 260);\n }\n\n var forum = forumName();\n var kind = '百合会' + (forum ? ',' + forum : '');\n var onlyAuthor = doc.select('#nav-more-menu a[href*=authorid], a[rel=nofollow][href*=authorid]').first();\n var toc = normalizeTocUrl(abs(onlyAuthor, 'href') || String(baseUrl || ''));\n\n return {\n name: name,\n author: author,\n kind: kind,\n word: '',\n last: postTime,\n intro: intro,\n cover: '',\n toc: toc\n };\n})()",
"name": "name",
"author": "author",
"kind": "kind",
"wordCount": "word",
"lastChapter": "last",
"intro": "intro",
"coverUrl": "cover",
"tocUrl": "toc",
"canReName": true
},
"ruleContent": {
"content": "<js>\n(function(){\n var html = '';\n try { html = result ? String(result) : ''; } catch(e) {}\n if (!html) {\n try { html = src ? String(src) : ''; } catch(e2) {}\n }\n var doc = org.jsoup.Jsoup.parse(html, baseUrl);\n\n function trim(s){ return s ? String(s).replace(\/^\\s+|\\s+$\/g, '') : ''; }\n function decodeTextLines(s){\n s = String(s || '').replace(\/\\r\/g, '');\n var arr = s.split('\\n');\n for (var i = 0; i < arr.length; i++) arr[i] = org.jsoup.Jsoup.parse(arr[i]).text();\n return arr.join('\\n');\n }\n\n var pid = '';\n var m = String(baseUrl || '').match(\/[?&]__pid=(\\d+)\/);\n if (!m) m = String(baseUrl || '').match(\/#pid(\\d+)\/);\n if (!m) m = String(baseUrl || '').match(\/[?&]pid=(\\d+)\/);\n if (m) pid = m[1];\n\n var post = pid ? doc.select('#pid' + pid).first() : doc.select('.plc.cl').first();\n var msg = post ? post.select('.message').first() : null;\n if (!msg) return '';\n\n msg = msg.clone();\n msg.select('i.pstatus, script, style, rt, .quote, .pstatus, .aimg_tip, .jammer').remove();\n\n var rubies = msg.select('ruby');\n for (var r = rubies.size() - 1; r >= 0; r--) rubies.get(r).unwrap();\n\n var imgMap = {};\n var imgs = msg.select('img');\n for (var i = imgs.size() - 1; i >= 0; i--) {\n var img = imgs.get(i);\n var src = trim(img.attr('abs:src')) || trim(img.attr('abs:zsrc')) || trim(img.attr('src')) || trim(img.attr('zsrc'));\n if (!src) { img.remove(); continue; }\n var token = '§§IMG' + i + '§§';\n img.after('\\n' + token + '\\n');\n img.remove();\n imgMap[token] = '<img src=\"' + src + '\">';\n }\n\n var as = msg.select('a');\n for (var j = as.size() - 1; j >= 0; j--) as.get(j).unwrap();\n\n var h = String(msg.html() || '');\n h = h.replace(\/<br[^>]*>\/ig, '\\n');\n h = h.replace(\/<hr[^>]*>\/ig, '\\n\\n');\n h = h.replace(\/<li[^>]*>\/ig, '\\n');\n h = h.replace(\/<\\\/(?:li|div|p|section|blockquote|article|header|footer|aside|tr|td|th|ul|ol|table|tbody|thead|tfoot)>\/ig, '\\n');\n h = h.replace(\/<h[1-6][^>]*>\/ig, '\\n\\n');\n h = h.replace(\/<\\\/h[1-6]>\/ig, '\\n\\n');\n h = h.replace(\/<[^>]+>\/g, '');\n h = decodeTextLines(h);\n\n for (var key in imgMap) {\n h = h.split(key).join('\\n\\n' + imgMap[key] + '\\n\\n');\n }\n\n h = h.replace(\/\\u00A0\/g, ' ');\n h = h.replace(\/[ \\t\\f\\v]+\/g, ' ');\n h = h.replace(\/ *\\n *\/g, '\\n');\n h = h.replace(\/\\n{3,}\/g, '\\n\\n');\n h = trim(h);\n if (!h) return '';\n\n var blocks = h.split(\/\\n\\n+\/);\n var out = [];\n for (var p = 0; p < blocks.length; p++) {\n var part = trim(blocks[p]);\n if (!part) continue;\n if (part.indexOf('<img ') >= 0) out.push(part);\n else out.push(part.replace(\/\\n+\/g, '\\n'));\n }\n return out.join('\\n\\n');\n})();\n<\/js>",
"imageStyle": "max-width:100%;height:auto;display:block;margin:0.6em auto;",
"replaceRegex": "",
"sourceRegex": ""
},
"ruleExplore": {
"bookList": "<js>\n(function(){\n var doc = org.jsoup.Jsoup.parse(result, baseUrl);\n function trim(s){ return s ? String(s).replace(\/^\\s+|\\s+$\/g, \"\") : \"\"; }\n function text(el){ return el ? trim(el.text()) : \"\"; }\n function absHref(el){ return el ? trim(el.attr(\"abs:href\")) : \"\"; }\n function norm(s){ return trim(String(s || \"\").replace(\/\\s+\/g, \" \")); }\n function forumIdFromUrl(u){ var m = String(u || \"\").match(\/[?&]fid=(\\d+)\/); return m ? m[1] : \"\"; }\n function forumNameFromId(fid){ if (fid == \"30\") return \"中文百合漫画区\"; if (fid == \"49\") return \"文学区\"; if (fid == \"55\") return \"轻小说\/译文区\"; return \"\"; }\n function cleanForumName(s){ return norm(s).replace(\/^#\/, \"\").replace(\/文學區\/g, \"文学区\"); }\n function makeBookUrl(threadUrl, uid){ var m = String(threadUrl || \"\").match(\/[?&]tid=(\\d+)\/); if (m && uid) return \"https:\/\/bbs.yamibo.com\/forum.php?mod=viewthread&tid=\" + m[1] + \"&page=1&authorid=\" + uid + \"&mobile=2\"; return trim(threadUrl || \"\"); }\n function shouldKeep(title, desc, forumId, label, icon){\n if (!title) return false;\n if (icon && icon.indexOf(\"投票\") >= 0) return false;\n if (!\/^(30|49|55)$\/.test(String(forumId || \"\"))) return false;\n if (\/版规|版規|目录编辑教程|目錄編輯教程|新人须知|新人須知|如何找回账号|如何修改密码|禁止转载|禁止轉載|求助|報到|签到|簽到|公告\/.test(title)) return false;\n var hay = [title, desc, label].join(\" \");\n var kw = \/(翻译|翻譯|渣翻|自翻|渣译|渣譯|转载|轉載|生肉|更新|话|話|章|长篇|長篇|短篇|中篇|译介|譯介|文库|文庫|完结|完結|汉化组|漢化組|汉化|漢化|第.{0,10}[话話章]|[0-9一二三四五六七八九十百零〇]+[话話章])\/i;\n return kw.test(hay);\n }\n var list = [];\n var items = doc.select('.threadlist li.list');\n for (var i = 0; i < items.size(); i++) {\n var li = items.get(i);\n var title = norm(text(li.select('.threadlist_tit').first()));\n var poster = text(li.select('.muser a.mmc').first());\n var uidHref = absHref(li.select('.muser a.mmc').first());\n var uidM = uidHref.match(\/[?&]uid=(\\d+)\/);\n var uid = uidM ? uidM[1] : '';\n var desc = norm(text(li.select('.threadlist_mes').first()));\n var labelEl = li.select('.threadlist_foot li.mr a').first();\n var label = cleanForumName(text(labelEl));\n var forumHref = absHref(labelEl);\n var forumId = forumIdFromUrl(forumHref) || forumIdFromUrl(baseUrl);\n var forumName = forumNameFromId(forumId) || label;\n var icon = norm(text(li.select('.threadlist_tit .micon, .threadlist_tit em').first())).replace(\/[\\[\\]]\/g, '');\n if (!shouldKeep(title, desc, forumId, label, icon)) continue;\n var threadUrl = absHref(li.select(\"a[href*='viewthread']\").first());\n var bookUrl = makeBookUrl(threadUrl, uid);\n var kind = '百合会' + (forumName ? ',' + forumName : '') + (icon ? ',' + icon : '');\n var intro = (forumName ? ('[' + forumName + '] ') : '') + desc;\n list.push({name:title, author: trim(poster || ''), kind:kind, word:'', last:text(li.select('.mtime').first()), intro:intro, cover:'', url:bookUrl});\n }\n return list;\n})();\n<\/js>",
"name": "name",
"author": "author",
"kind": "kind",
"wordCount": "word",
"lastChapter": "last",
"intro": "intro",
"coverUrl": "cover",
"bookUrl": "url"
},
"ruleSearch": {
"bookList": "<js>\n(function(){\n var doc = org.jsoup.Jsoup.parse(result, baseUrl);\n function trim(s){ return s ? String(s).replace(\/^\\s+|\\s+$\/g, \"\") : \"\"; }\n function text(el){ return el ? trim(el.text()) : \"\"; }\n function absHref(el){ return el ? trim(el.attr(\"abs:href\")) : \"\"; }\n function norm(s){ return trim(String(s || \"\").replace(\/\\s+\/g, \" \")); }\n function forumIdFromUrl(u){ var m = String(u || \"\").match(\/[?&]fid=(\\d+)\/); return m ? m[1] : \"\"; }\n function forumNameFromId(fid){ if (fid == \"30\") return \"中文百合漫画区\"; if (fid == \"49\") return \"文学区\"; if (fid == \"55\") return \"轻小说\/译文区\"; return \"\"; }\n function cleanForumName(s){ return norm(s).replace(\/^#\/, \"\").replace(\/文學區\/g, \"文学区\"); }\n function makeBookUrl(threadUrl, uid){ var m = String(threadUrl || \"\").match(\/[?&]tid=(\\d+)\/); if (m && uid) return \"https:\/\/bbs.yamibo.com\/forum.php?mod=viewthread&tid=\" + m[1] + \"&page=1&authorid=\" + uid + \"&mobile=2\"; return trim(threadUrl || \"\"); }\n function shouldKeep(title, desc, forumId, label, icon){\n if (!title) return false;\n if (icon && icon.indexOf(\"投票\") >= 0) return false;\n if (!\/^(30|49|55)$\/.test(String(forumId || \"\"))) return false;\n if (\/版规|版規|目录编辑教程|目錄編輯教程|新人须知|新人須知|如何找回账号|如何修改密码|禁止转载|禁止轉載|求助|報到|签到|簽到|公告\/.test(title)) return false;\n var hay = [title, desc, label].join(\" \");\n var kw = \/(翻译|翻譯|渣翻|自翻|渣译|渣譯|转载|轉載|生肉|更新|话|話|章|长篇|長篇|短篇|中篇|译介|譯介|文库|文庫|完结|完結|汉化组|漢化組|汉化|漢化|第.{0,10}[话話章]|[0-9一二三四五六七八九十百零〇]+[话話章])\/i;\n return kw.test(hay);\n }\n var list = [];\n var items = doc.select('.threadlist li.list');\n for (var i = 0; i < items.size(); i++) {\n var li = items.get(i);\n var title = norm(text(li.select('.threadlist_tit').first()));\n var poster = text(li.select('.muser a.mmc').first());\n var uidHref = absHref(li.select('.muser a.mmc').first());\n var uidM = uidHref.match(\/[?&]uid=(\\d+)\/);\n var uid = uidM ? uidM[1] : '';\n var desc = norm(text(li.select('.threadlist_mes').first()));\n var labelEl = li.select('.threadlist_foot li.mr a').first();\n var label = cleanForumName(text(labelEl));\n var forumHref = absHref(labelEl);\n var forumId = forumIdFromUrl(forumHref) || forumIdFromUrl(baseUrl);\n var forumName = forumNameFromId(forumId) || label;\n var icon = norm(text(li.select('.threadlist_tit .micon, .threadlist_tit em').first())).replace(\/[\\[\\]]\/g, '');\n if (!shouldKeep(title, desc, forumId, label, icon)) continue;\n var threadUrl = absHref(li.select(\"a[href*='viewthread']\").first());\n var bookUrl = makeBookUrl(threadUrl, uid);\n var kind = '百合会' + (forumName ? ',' + forumName : '') + (icon ? ',' + icon : '');\n var intro = (forumName ? ('[' + forumName + '] ') : '') + desc;\n list.push({name:title, author: trim(poster || ''), kind:kind, word:'', last:text(li.select('.mtime').first()), intro:intro, cover:'', url:bookUrl});\n }\n return list;\n})();\n<\/js>",
"name": "name",
"author": "author",
"kind": "kind",
"wordCount": "word",
"lastChapter": "last",
"intro": "intro",
"coverUrl": "cover",
"bookUrl": "url"
},
"ruleToc": {
"chapterList": "<js>\n(function(){\n var doc = org.jsoup.Jsoup.parse(result, baseUrl);\n function trim(s){ return s ? String(s).replace(\/^\\s+|\\s+$\/g, '') : ''; }\n function norm(s){ return trim(String(s || '').replace(\/\\u00A0\/g, ' ').replace(\/[ \\t\\r\\f\\v]+\/g, ' ')); }\n function decodeTextLines(s){\n s = String(s || '').replace(\/\\r\/g, '');\n var arr = s.split('\\n');\n for (var i = 0; i < arr.length; i++) arr[i] = org.jsoup.Jsoup.parse(arr[i]).text();\n return arr.join('\\n');\n }\n function messageToText(msgEl){\n if (!msgEl) return '';\n var c = msgEl.clone();\n c.select('i.pstatus, script, style, rt, .quote, .pstatus, .aimg_tip, .jammer').remove();\n var rubies = c.select('ruby');\n for (var i = rubies.size() - 1; i >= 0; i--) rubies.get(i).unwrap();\n var as = c.select('a');\n for (var j = as.size() - 1; j >= 0; j--) as.get(j).unwrap();\n var h = String(c.html() || '');\n h = h.replace(\/<br[^>]*>\/ig, '\\n');\n h = h.replace(\/<hr[^>]*>\/ig, '\\n\\n');\n h = h.replace(\/<li[^>]*>\/ig, '\\n');\n h = h.replace(\/<\\\/(?:li|div|p|section|blockquote|article|header|footer|aside|tr|td|th|ul|ol|table|tbody|thead|tfoot)>\/ig, '\\n');\n h = h.replace(\/<h[1-6][^>]*>\/ig, '\\n\\n');\n h = h.replace(\/<\\\/h[1-6]>\/ig, '\\n\\n');\n h = h.replace(\/<[^>]+>\/g, '');\n h = decodeTextLines(h);\n h = h.replace(\/\\u00A0\/g, ' ');\n h = h.replace(\/[ \\t\\f\\v]+\/g, ' ');\n h = h.replace(\/ *\\n *\/g, '\\n');\n h = h.replace(\/\\n{3,}\/g, '\\n\\n');\n return trim(h);\n }\n function linesFromMessage(msgEl){\n var txt = messageToText(msgEl);\n var raw = txt.split(\/\\n+\/);\n var arr = [];\n for (var i = 0; i < raw.length; i++) {\n var line = norm(raw[i]);\n if (!line) continue;\n if (\/^(本帖最后由|評分|评分|點評|点评|參與人數|参与人数|積分|积分|理由|查看全部评分)\/.test(line)) continue;\n arr.push(line);\n }\n return arr;\n }\n function cleanThreadTitle(){\n var t = trim(doc.select('.view_tit').first().text());\n t = t.replace(\/^\\s*(?:[\\[【][^\\]】]{1,20}[\\]】]\\s*)+\/g, '');\n t = t.replace(\/[\\[【](?:\\d+[.\\-\/]\\d+更新.*?|更新.*?|完结.*?|完結.*?)[\\]】]\\s*$\/g, '');\n t = t.replace(\/\\s+\\d+\\s*\\\/\\s*\\d+\\s*(?:\\(\\d+\\s*\\\/\\s*\\d+\\))?\\s*$\/g, '');\n return trim(t);\n }\n function firstMeaningful(lines, rawTitle, imgCount){\n if (imgCount >= 2) return rawTitle;\n for (var i = 0; i < lines.length && i < 16; i++) {\n var line = lines[i];\n if (\/^(作品名稱|作品名称|作品名|書名|书名|標題|标题|題名|题名|原名|作者\\s*[::]?|原作\\s*[::]?|原著\\s*[::]?|翻譯\\s*[::]?|翻译\\s*[::]?|譯者\\s*[::]?|译者\\s*[::]?|校對\\s*[::]?|校对\\s*[::]?|圖源\\s*[::]?|图源\\s*[::]?|嵌字\\s*[::]?|漢化\\s*[::]?|汉化\\s*[::]?|簡介\\s*[::]?|简介\\s*[::]?|內容簡介\\s*[::]?|内容简介\\s*[::]?|原文简介\\s*[::]?|作品連結\\s*[::]?|作品链接\\s*[::]?|連結\\s*[::]?|链接\\s*[::]?|原地址\\s*[::]?|生肉\\s*[::]?|作品標籤\\s*[::]?|作品标签\\s*[::]?|主題\\s*[::]?|主题\\s*[::]?|目錄|目录|邊看邊翻|边看边翻|嚴禁劇透|严禁剧透)\/.test(line)) continue;\n if (\/^[0-9]{1,3}(后)?$\/.test(line)) continue;\n if (line.length <= 1) continue;\n return line;\n }\n return rawTitle;\n }\n function isIntroCatalogPost(index, lines, msg){\n if (index != 0) return false;\n var tocLinks = msg.select(\"a[href*='goto=findpost'], a[href*='pid=']\").size();\n if (tocLinks >= 2) return true;\n var joined = lines.join('\\n');\n if (\/(作品名稱|作品名称|作品名|書名|书名|作者|原作|原著|簡介|简介)\/.test(joined) && \/(目錄|目录|索引)\/.test(joined)) return true;\n return false;\n }\n function isChapter(name, text, imgCount){\n if (imgCount >= 2) return true;\n if (\/^(前言|序章|后记|後記|番外|楔子|序|终章|終章|尾声|尾聲|最終話|最终话|第.{0,16}[话話章节章卷篇回]|[一二三四五六七八九十百零〇0-9]+[话話章节章卷篇回])\/.test(name)) return true;\n if (text.length >= 180) return true;\n return false;\n }\n\n var list = [];\n var posts = doc.select('.plc.cl');\n var pageUrl = String(baseUrl || '').replace(\/([?&])__pid=\\d+\/g, '$1').replace(\/&&+\/g, '&').replace(\/#pid\\d+$\/g, '');\n var rawTitle = cleanThreadTitle();\n for (var i = 0; i < posts.size(); i++) {\n var post = posts.get(i);\n var pid = String(post.id() || '').replace(\/^pid\/, '');\n var msg = post.select('.message').first();\n if (!pid || !msg) continue;\n var lines = linesFromMessage(msg);\n if (isIntroCatalogPost(i, lines, msg)) continue;\n var text = lines.join('\\n');\n var imgCount = msg.select('img').size();\n var name = firstMeaningful(lines, rawTitle, imgCount);\n if (!isChapter(name, text, imgCount)) continue;\n var url = pageUrl + (pageUrl.indexOf('?') >= 0 ? '&' : '?') + '__pid=' + pid + '#pid' + pid;\n list.push({name: name || rawTitle, url: url});\n }\n return list;\n})();\n<\/js>",
"chapterName": "name",
"chapterUrl": "url",
"nextTocUrl": "<js>\n(function(){\n var doc = org.jsoup.Jsoup.parse(result, baseUrl);\n var a = doc.select(\"a:matchesOwn(^下一页$), a:matchesOwn(^下一頁$), .pg a.nxt, .pgs a.nxt\").first();\n return a ? String(a.attr(\"abs:href\")) : \"\";\n})();\n<\/js>"
},
"searchUrl": "{{\n(function(){\n if (page == 1) {\n var body = \"srchtxt=\" + java.encodeURI(String(key)) + \"&searchsubmit=yes\";\n var option = {\n \"method\": \"POST\",\n \"body\": String(body),\n \"headers\": {\n \"Content-Type\": \"application\/x-www-form-urlencoded\"\n }\n };\n return \"https:\/\/bbs.yamibo.com\/search.php?mod=forum&mobile=2,\" + JSON.stringify(option);\n } else {\n var sid = java.get(\"yamibo_searchid\");\n return \"https:\/\/bbs.yamibo.com\/search.php?mod=forum&searchid=\" + sid + \"&orderby=dateline&ascdesc=desc&searchsubmit=yes&page=\" + page + \"&mobile=2\";\n }\n})()\n}}",
"weight": 0
}