精确搜索【1230】
https://m.jjwxc.net/assort#@js: try{ java.longToast("加载中...请稍候..."); let wo= String(source.getVariable()??""); let script=`<script> let wo= \`${wo}\`; let iswo = /^🔼.*?@.*?#/.test(wo); let temp = localStorage.getItem('setTag'); let istemp = /.*?@.*?#/.test(temp); let saveTag = temp; if(iswo)saveTag=wo.replace(/^🔼/,''); localStorage.setItem('setTag',saveTag); saveTag = localStorage.getItem('setTag'); </script>`; let saveTag =java.webView(script,"https://m.jjwxc.net/assort#","saveTag"); source.setVariable(saveTag); }catch(e){ java.log("我是错误:"+e) }; result
分享者: guaner001125 (317)发布时间: 2天前
{
"articleStyle": 0,
"cacheFirst": false,
"customOrder": 21,
"enableJs": true,
"enabled": true,
"enabledCookieJar": true,
"header": "@js:\nresult = JSON.stringify({\n\t\"referer\":\"http:\/\/android.jjwxc.net\/?v=357\",\n\t\"versionCode\":\"357\",\n\t\"versiontype\":\"reading\",\n \"User-Agent\": \"Dalvik\/2.1.0\"\n})",
"injectJs": "if(\/book2\\\/\\d+\/.test(window.location.href)){\ndocument.getElementById(\"app\").remove();\ndocument.querySelector(\".grid-c\").remove();\n\/\/ 获取书籍链接\n\t\tbookid = String(window.location.href).replace(\/^.*\\\/\/,'');\n\t\tbooksrc = \"http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=\"+bookid;\n\t\t\nbooksrc = `legado:\/\/import\/addToBookshelf?src=${encodeURIComponent(booksrc)}`;\n\tconsole.log(booksrc)\n\t\t\/\/获取书籍名称\ntitle = document.querySelector(\".big.o\").innerText.replace(\/首页>\/,'');\nconsole.log(\"x\"+title)\n\n\/\/获取作者名称\nauthor = document.querySelector(\".authorname-content a\").innerText;\n\n\/\/跳转作者url[可省略]\nhref = document.querySelector(\".authorname-content a\").href;\n\n\/\/create(搜索的内容,\"bookName or bookAuthor\",距离顶部距离,[跳转其他url])\n\ncreate(title,\"addBookshelf\",14,booksrc);\ncreate(title,\"bookName\",18)\ncreate(author,\"bookAuthor\",22)\n}\n\n function create(name,type,top,url){\n \t type = type+\"=\"+name;\n \t url = url!=undefined?url+\"#\"+type:\"\";\n \t \n let \ttypebutton;\n if(\/bookName\/.test(type)){\n \t typebutton=\"搜索书名\"\n \t}else if(\/bookAuthor\/.test(type)){\n \t\t typebutton=\"搜索作者\"\n \t}else{\n \t\t\t typebutton=\"加入书架\"\n \t}\n \n \tlet Url = location.search!=\"\"?location.search.replace(\/&*book[AN].*?=.*\/,'')+\"&\"+type:window.location.pathname+\"?\"+type;\n \turl = url!=\"\"?url:Url;\n \t\n \tA = document.createElement(\"a\");\n\t\t A.href =url.replace(\/#addBookshelf.*\/,'')\n\t\t \n\t\tA.innerHTML = `<button style=\"outline:none; position:fixed; top:${top}%; right:7%; z-index:999; border-radius:5px; color:#166188;background:#fff;padding:4px;border:1px solid #000\"><b>${typebutton}<\/b><\/button>`;\n\t\tconsole.log(A.href)\n \tdocument.body.appendChild(A);\n \t}\t \n\n\n\nlet previousUrl = \"\";\nlet currentUrl = '';\nlet currentOffset = 0;\nlet totalPages = 1;\nlet isLoading = false;\nlet hasMore = true;\nlet hasPrevious = false;\nlet scrollDebounceTimer = null;\nlet exploreM = localStorage.getItem('explore') || \"0\";\n\nif(document.querySelector(\"#dis\")){\n \ndocument.querySelector(\"#dis\").remove();\ndocument.querySelector(\"#logininfo\").remove();\ndocument.querySelector(\".ft\").innerHTML =`<div style=\"width:100%;height:200px;display:block\"><\/div>\n`;\n\nvar li1 = document.createElement('li');\nli1.innerHTML = `\n <span class=\"biaoqian\">排序方式:<\/span>\n <div class=\"optionsArea\">\n \n <label><input type=\"radio\" name=\"sorttype\" value=\"2\" checked=\"checked\">\n 积分<\/label>\n \n <label><input type=\"radio\" name=\"sorttype\" value=\"1\">\n <span>最近更新<\/span><\/label>\n \n <label><input type=\"radio\" name=\"sorttype\" value=\"3\">\n <span>最新发表<\/span><\/label>\n\n <label><input type=\"radio\" name=\"sorttype\" value=\"5\">\n <span>字数<\/span><\/label>\n \n <label><input type=\"radio\" name=\"sorttype\" value=\"4\">\n <span>收藏数<\/span><\/label>\n\n <label><input type=\"radio\" name=\"sorttype\" value=\"10\">\n <span>完结高分<\/span><\/label>\n \n <\/div>\n`;\n\n\nvar li2 = document.createElement('li');\nli2.innerHTML = `\n <span class=\"biaoqian\">完成状态:<\/span>\n <div class=\"optionsArea\">\n\n <label><input type=\"radio\" name=\"isfinish\" value=\"0\" checked=\"checked\">\n <span>无限制<\/span><\/label>\n \n <label><input type=\"radio\" name=\"isfinish\" value=\"1\">\n <span>连载<\/span><\/label>\n \n <label><input type=\"radio\" name=\"isfinish\" value=\"2\">\n <span>完结<\/span><\/label>\n \n <\/div>\n`;\n\n\/\/ 添加到ul中\nvar formsList = document.getElementById('formsList');\nif(formsList){\n \/*\nformsList.prepend(li1);\nformsList.prepend(li2);\n*\/\nvar liElements = formsList.getElementsByTagName(\"li\");\n var liCount = liElements.length;\n \n var lastLi = liElements[liCount - 1];\n var secondLastLi = liElements[liCount - 3];\n formsList.insertBefore(lastLi,secondLastLi)\n formsList.insertBefore(li1,liElements[9]);\n formsList.insertBefore(li2,liElements[9])\n \n}\n}\n\nfunction encode(str) {\n str = str.replace(\/https:.*?bq=\/g,'');\n return btoa(encodeURI(str));\n}\n\nfunction decode(str) {\n str = \"https:\/\/android.jjwxc.net\/search\/getSearchForKeyWords?offset=0&limit=20&bq=\" + atob(str);\n return str;\n}\n\n\/\/ 书籍定位\nfunction recordBookPosition(novelid,offset) {\n let previousUrl = sessionStorage.getItem('previousUrl');\n sessionStorage.setItem('bookPosition', JSON.stringify({\n url:previousUrl,\n novelid: novelid,\n offset: offset \n }));\n}\n\nfunction restoreBookPosition() {\n const bookPosition = sessionStorage.getItem('bookPosition');\n if (!bookPosition) return;\n \n let { url, novelid, offset, timestamp } = JSON.parse(bookPosition);\n const pUrl = new URL(url);\n pUrl.searchParams.set('offset', offset);\n currentOffset = offset;\n fetchAndRender(pUrl.toString(), function(error) {\n if (error) {\n return;\n }\n \n const bookElement = document.querySelector(`.book[data-id=\"${novelid}\"]`);\n if (bookElement) {\n updateCurrentPage()\n window.scrollTo({\n top: bookElement.offsetTop - 100,\n behavior: 'auto'\n });\n }\n});\n \n}\n \nfunction fetchAndRender(url, callback) {\n showLoadingMessage();\n isLoading = true;\n sessionStorage.setItem('previousUrl',url);\n fetch(url)\n .then(response => response.json())\n .then(jsonData => {\n currentUrl = url;\n totalPages = jsonData.total_page;\n \n currentOffset = parseInt(new URL(url).searchParams.get('offset')) || 0;\n hasMore = (Math.floor(currentOffset \/ 20) + 1) < jsonData.total_page;\n hasPrevious = currentOffset > 0; \n sessionStorage.setItem('previousUrl',url);\n generatePageContent(jsonData,currentOffset);\n addStyles();\n \n if (typeof callback === 'function') {\n callback(null, jsonData);\n }\n })\n .catch(error => {\n console.error('加载失败:', error);\n if (typeof callback === 'function') {\n callback(error);\n }\n })\n .finally(() => {\n isLoading = false;\n hideLoadingMessage();\n bookPosition = sessionStorage.getItem('bookPosition'); \n sessionStorage.removeItem('bookPosition'); \n if (!bookPosition) {\n window.scrollTo(0,0); \t\n return;\n }\n });\n}\n\n\/\/ 下拉加载\nfunction initScrollListener() { \n window.addEventListener('scroll', handleScroll, { passive: true });\n}\n\nfunction handleScroll() { \n clearTimeout(scrollDebounceTimer);\n scrollDebounceTimer = setTimeout(() => {\n if (!isLoading) {\n updateCurrentPage();\n } \n checkScrollBoundaries();\n }, 50);\n}\n\nfunction checkScrollBoundaries() {\n if (isLoading) return;\n \n const scrollPosition = window.scrollY;\n const documentHeight = document.body.offsetHeight;\n const windowHeight = window.innerHeight;\n \n if (scrollPosition + windowHeight >= documentHeight - 100 && hasMore) {\n loadNextPage();\n }\n \n if (scrollPosition <= 100 && hasPrevious) {\n loadPreviousPage();\n }\n}\n\nfunction loadPreviousPage() {\n if (isLoading) return;\n \n isLoading = true;\n document.getElementById('loading').style.display = 'block';\n \n const newOffset = Math.max(0, currentOffset - 20);\n const url = new URL(currentUrl);\n url.searchParams.set('offset', newOffset);\n const scrollPositionBefore = window.scrollY;\n \n fetch(url.toString())\n .then(response => response.json())\n .then(jsonData => {\n requestAnimationFrame(() => {\n prependBookElements(jsonData, newOffset); \n currentOffset = newOffset;\n updateCurrentPage();\n hasMore = (Math.floor(newOffset \/ 20) + 1) < jsonData.total_page;\n hasPrevious = newOffset > 0; \n const newBooks = document.querySelectorAll('.book');\n if (newBooks.length > 0) { \n const targetBook = newBooks[jsonData.items.length - 1];\n if (targetBook) {\n const targetPosition = targetBook.offsetTop +100; \n window.scrollTo({\n top: targetPosition,\n behavior: 'auto'\n });\n }\n }\n });\n })\n .catch(error => {\n console.error('加载上一页失败:', error);\n })\n .finally(() => {\n isLoading = false;\n document.getElementById('loading').style.display = 'none';\n });\n}\n\n\/\/ 加载下一页函数\nfunction loadNextPage() {\n \n if (isLoading) return;\n \n isLoading = true;\n document.getElementById('loading').style.display = 'block';\n \n const newOffset = currentOffset + 20;\n \n \n const url = new URL(currentUrl);\n url.searchParams.set('offset', newOffset);\n \n fetch(url.toString())\n .then(response => response.json())\n .then(jsonData => {\n requestAnimationFrame(() => {\n currentOffset = newOffset;\n appendBookElements(jsonData, newOffset);\n updateCurrentPage();\n hasMore = (Math.floor(newOffset \/ 20) + 1) < jsonData.total_page;\n });\n })\n .catch(error => {\n console.error('加载下一页失败:', error);\n })\n .finally(() => {\n isLoading = false;\n document.getElementById('loading').style.display = 'none';\n });\n}\n\nfunction createBookElement(item,offset){\nlet bookDiv = document.createElement('div');\n bookDiv.className = 'book';\n bookDiv.setAttribute('data-id', item.novelid);\n bookDiv.setAttribute('data-offset', offset);\n booksrc = `http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=${item.novelid}`;\n bookDiv.innerHTML = `\n <div class=\"bookdes\">\n <div class=\"pic\" onclick=\"window.open('${booksrc}')\"><img src=\"${item.cover.replace(\/https?\/,'https')}\" referrerpolicy=\"no-referrer\"><\/div>\n <div class=\"details\">\n <p class=\"bookname\">\n <span class=\"name\"><a href=\"https:\/\/m.jjwxc.net\/book2\/${item.novelid}\">${item.novelname}<\/a><\/span>\n <br>\n <span class=\"author\" onclick=\"window.open('https:\/\/m.jjwxc.net\/channel\/#bookAuthor=${item.authorname}')\">——${item.authorname}<\/span>\n <\/p>\n <p class=\"tag\" onclick=\"window.open('https:\/\/m.jjwxc.net\/channel\/#bookName=${item.novelname}')\">⭐️ ${item.novelSizeformat}字•${item.novelstep === '2' ? '<span style=\"color:red\">已完结<\/span>' : '<span style=\"color:blue\">连载中<\/span>'} 🔎<br><br>📖 ${item.novelintroshort}<br><br>🔖 ${item.novelClass}<br><br>🏷 <span style=\"color:green\">${item.tags}<\/span><\/p>\n <\/div>\n <\/div>\n `;\n \n const link = bookDiv.querySelector('a');\n link.addEventListener('click', (e) => {\n e.preventDefault();\n recordBookPosition(item.novelid, offset);\n window.location.href = link.href;\n });\nreturn bookDiv\n}\n\nfunction prependBookElements(data, offset) {\n const bookContainer = document.getElementById('bookContainer');\n const fragment = document.createDocumentFragment(); \n data.items.forEach((item, index) => { \n let bookDiv = createBookElement(item,offset)\n fragment.appendChild(bookDiv);\n }); \n bookContainer.insertBefore(fragment, bookContainer.firstChild);\n}\n\n\n\/\/ 书籍列表生成\nfunction createBookElements(data,offset) {\n const bookContainer = document.getElementById('bookContainer');\n bookContainer.innerHTML = '';\n data.items.forEach((item, index) => {\n let bookDiv = createBookElement(item,offset)\n bookContainer.appendChild(bookDiv); \n });\n}\n\nfunction appendBookElements(data,offset) {\n const bookContainer = document.getElementById('bookContainer');\n data.items.forEach((item, index) => {\n let bookDiv = createBookElement(item,offset)\n bookContainer.appendChild(bookDiv);\n });\n}\n\n\/\/ 页面操作\nfunction updateUrlParam(key, value) {\n const url = new URL(currentUrl);\n url.searchParams.set(key, value);\n url.searchParams.set('offset', 0);\n currentOffset = 0;\n updateCurrentPage()\n fetchAndRender(url.toString());\n}\n\nfunction updateOffset(delta) {\n const url = new URL(currentUrl);\n const newOffset = Math.max(0, currentOffset + delta);\n currentOffset = newOffset;\n url.searchParams.set('offset', newOffset);\n fetchAndRender(url.toString());\n}\n\nfunction jumpToPage() {\n const pageInput = document.querySelector('.page-input');\n const page = parseInt(pageInput.value);\n if (isNaN(page) || page < 1 || page > totalPages) {\n alert(`请输入有效的页码(1-${totalPages})`);\n return;\n }\n \n currentOffset = (page - 1) * 20;\n const url = new URL(currentUrl);\n url.searchParams.set('offset', currentOffset);\n fetchAndRender(url.toString());\n}\n\nfunction updateCurrentPage() {\n const books = document.querySelectorAll('.book');\n if (books.length === 0) return;\n \n \n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const bookOffsetAttr = entry.target.getAttribute('data-offset');\n \nconst bookOffset = bookOffsetAttr !== null ? parseInt(bookOffsetAttr) : currentOffset;\n\n const currentPage = Math.floor(bookOffset \/ 20) + 1;\n \n \n const currentDisplay = document.querySelector('.current-page').textContent;\n if (currentDisplay !== currentPage.toString()) {\n document.querySelector('.current-page').textContent = currentPage;\n document.querySelector('.current').textContent = currentPage;\n currentOffset = bookOffset;\n }\n }\n });\n }, {\n threshold: 0.5 \n }); \n books.forEach(book => {\n observer.observe(book);\n });\n \n return () => {\n observer.disconnect();\n };\n}\n\n\n\/\/ 辅助函数\nfunction showLoadingMessage() {\n const loadingDiv = document.createElement('div');\n loadingDiv.id = 'loading-message';\n loadingDiv.style.position = 'fixed';\n loadingDiv.style.top = '20px';\n loadingDiv.style.left = '50%';\n loadingDiv.style.transform = 'translateX(-50%)';\n loadingDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';\n loadingDiv.style.color = 'white';\n loadingDiv.style.padding = '10px 20px';\n loadingDiv.style.borderRadius = '5px';\n loadingDiv.style.zIndex = '1000';\n loadingDiv.textContent = '正在加载,请稍候...';\n document.body.appendChild(loadingDiv);\n}\n\nfunction hideLoadingMessage() {\n const loadingDiv = document.getElementById('loading-message');\n if (loadingDiv) loadingDiv.remove();\n}\n\nfunction generateFinalUrl(formData) {\n const variables = {};\n for (let [key, value] of formData.entries()) {\n const variableName = key.replace(\/\\d+\/g, '');\n if (!variables[variableName]) {\n variables[variableName] = [];\n }\n variables[variableName].push(value);\n }\n\n for (const key in variables) {\n variables[key] = variables[key].join(',');\n }\n\n let bookurl = `https:\/\/android.jjwxc.net\/search\/getSearchForKeyWords?offset=0&limit=20&bq=${variables.bq || ''}&removetags=${variables.removebq || ''}¬likecollectionTypes=${variables.notlikecollectiontypes || ''}&fw=${variables.fw || ''}&yc=${variables.yc || ''}&xx=${variables.xx || ''}&sd=${variables.sd || ''}&lx=${variables.lx || ''}&mainview=${variables.mainview || ''}&fbsj=${variables.fbsj || ''}&novelbefavoritedcount=${variables.novelbefavoritedcount || ''}&isfinish=${variables.isfinish || ''}&collectionTypes=${variables.collectiontypes || ''}&searchkeyWords=${variables.searchkeywords || ''}&sortType=${variables.sorttype}`;\n return bookurl\n}\n\n\/\/ 页面生成\nfunction generatePageContent(jsonData,offset) {\n document.documentElement.innerHTML = `\n <!-- 悬浮按钮组 -->\n <div class=\"float-buttons\">\n <div class=\"button-group\">\n <!-- 页码控制面板 -->\n <div class=\"page-control\">\n <div class=\"page-info\">\n <span class=\"current-page\">1<\/span>\n <div class=\"divider\"><\/div>\n <span class=\"total-pages\">${jsonData.total_page}<\/span>\n <\/div>\n <div class=\"page-jump\">\n <input type=\"number\" min=\"1\" max=\"${jsonData.total_page}\" value=\"1\" class=\"page-input\">\n <button class=\"go-btn\">GO<\/button>\n <\/div>\n <\/div>\n <!-- 功能按钮(从下到上顺序) -->\n <button class=\"func-btn home\" title=\"返回首页\">⌂<\/button>\n <button class=\"func-btn bottom\" title=\"页面底部\">↓<\/button>\n <button class=\"func-btn top\" title=\"页面顶部\">↑<\/button>\n \n\n <\/div>\n \n <!-- 主按钮 - 深绿色圆形 -->\n <button class=\"main-btn\" title=\"展开功能\">\n <span class=\"current\">1<\/span>\n <div class=\"divider\"><\/div>\n <span class=\"total\">${jsonData.total_page}<\/span>\n <\/button>\n <\/div>\n \n <div class=\"center\" style=\"text-align: center;\">\n <select name=\"sortType\" id=\"orderstr\" style=\"width:25%\">\n <option value=\"2\">积分<\/option>\n <option value=\"1\">最近更新<\/option>\n <option value=\"3\">最新发表<\/option>\n <option value=\"5\">字数<\/option>\n <option value=\"4\">收藏数<\/option>\n <option value=\"10\">完结高分<\/option>\n <\/select>\n <span style=\"margin: 0 2px;\">|<\/span>\n <select name=\"isfinish\" id=\"isfinish\" style=\"width:25%\">\n <option value=\"0\">无限制<\/option>\n <option value=\"1\">连载<\/option>\n <option value=\"2\">完结<\/option>\n <\/select>\n <span style=\"margin: 0 2px;\">|<\/span>\n <button id=\"biaoqian\" style=\"width:25%\">\n 标签管理 \n <\/button>\n <\/div>\n <div style=\"height: 60px;\"><\/div>\n <br>\n <div id=\"bookContainer\" class=\"book-container\"><\/div>\n <div id=\"loading\" style=\"text-align: center; padding: 10px; display: none;\">\n 正在加载更多...\n <\/div>\n `;\n\n const sortTypeSelect = document.getElementById(\"orderstr\");\n const isFinishSelect = document.getElementById(\"isfinish\");\n const urlParams = new URLSearchParams(currentUrl.split('?')[1]);\n \n const mainBtn = document.querySelector('.main-btn');\n const floatButtons = document.querySelector('.float-buttons');\n const totalPagesEl = document.querySelector('.total-pages');\n const pageInput = document.querySelector('.page-input');\n const pageSections = document.querySelectorAll('.page-section');\n const homeBtn = document.querySelector('.func-btn.home');\n const topBtn = document.querySelector('.func-btn.top');\n const bottomBtn = document.querySelector('.func-btn.bottom');\n totalPages = jsonData.total_page; \n totalPagesEl.textContent = totalPages;\n pageInput.max = totalPages;\n \n if (totalPages >= 10000) {\n floatButtons.classList.add('long-page');\n }\n \n \n mainBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n floatButtons.classList.toggle('expanded');\n mainBtn.style.display = 'none';\n \n });\n \n document.addEventListener('click', function() {\n floatButtons.classList.remove('expanded');\n mainBtn.style.display = 'flex';\n });\n \n \n document.querySelector('.button-group').addEventListener('click', function(e) {\n e.stopPropagation();\n });\n \n \n document.querySelector('.go-btn').addEventListener('click', jumpToPage);\n document.querySelector('#biaoqian').addEventListener('click',function() { \n toggleTag(sessionStorage.getItem('previousUrl'))\n });\n\n \n homeBtn.addEventListener('click', function() {\n sessionStorage.setItem('previousUrl', \"\");\n window.location.reload();\n });\n \n topBtn.addEventListener('click', function() {\n window.scrollTo({top: 0, behavior: 'smooth'});\n floatButtons.classList.remove('expanded');\n mainBtn.style.display = 'flex';\n });\n \n bottomBtn.addEventListener('click', function() {\n window.scrollTo({top: document.body.scrollHeight-100, behavior: 'smooth'});\n floatButtons.classList.remove('expanded');\n mainBtn.style.display = 'flex';\n });\n \n sortTypeSelect.value = urlParams.get('sortType') || '2';\n isFinishSelect.value = urlParams.get('isfinish') || '0';\n sortTypeSelect.onchange = () => {\n updateUrlParam('sortType', sortTypeSelect.value);\n window.scrollTo(0,0);\n }\n isFinishSelect.onchange = () => {\n updateUrlParam('isfinish', isFinishSelect.value);\n window.scrollTo(0,0);\n }\n \n \n initScrollListener();\n createBookElements(jsonData,offset);\n updateCurrentPage();\n \n const checkScrollable = () => {\n if (document.body.scrollHeight <= window.innerHeight) {\n \n if (hasMore) {\n loadNextPage();\n } else if (hasPrevious) {\n loadPreviousPage();\n }\n }\n };\n \n\n checkScrollable();\n}\n\n\n\nfunction createTag(url){ \n const form = document.getElementsByTagName('form')[1];\n const formData = new FormData(form);\n \n const finalUrl = url==undefined?generateFinalUrl(formData):url; \n const dialog = createModalDialog(); \n const urlTextarea = document.createElement('textarea');\n urlTextarea.value = `标签名@${encode(finalUrl)}#`;\n urlTextarea.style.width = '90%';\n urlTextarea.style.height = '100px';\n urlTextarea.style.padding = '10px';\n urlTextarea.style.margin = '10px';\n urlTextarea.style.outline ='none';\n urlTextarea.style.border ='1px solid #ddd';\n urlTextarea.style.resize = 'none';\n \n dialog.dialog.prepend(urlTextarea);\n\n const promptText = document.createElement('p');\n promptText.textContent = '修改标签名,点击保存';\n promptText.style.margin = '10px 0';\n promptText.style.fontSize = '14px';\n promptText.style.color = '#333';\n dialog.dialog.prepend(promptText);\n\n const copyButton = document.createElement('button');\n copyButton.textContent = '保存';\n copyButton.style.margin = '10px';\n copyButton.style.padding = '5px 5px';\n copyButton.style.backgroundColor = '#28a745';\n copyButton.style.color = 'white';\n copyButton.style.border = 'none';\n copyButton.style.borderRadius = '5px';\n copyButton.style.cursor = 'pointer';\n copyButton.addEventListener('click', () => {\n let tag = urlTextarea.value;\n let tags = localStorage.getItem(\"setTag\");\n localStorage.setItem(\"setTag\",tags+tag);\n let saveTag = localStorage.getItem(\"setTag\"); \n alert('已保存标签:'+tag);\n document.body.removeChild(dialog.overlay);\n });\n dialog.dialog.appendChild(copyButton); \n \n const addshelfButton = document.createElement('button');\n addshelfButton.textContent = '加入书架';\n addshelfButton.style.margin = '10px';\n addshelfButton.style.padding = '5px 5px';\n addshelfButton.style.backgroundColor = '#F3A23D';\n addshelfButton.style.color = 'white';\n addshelfButton.style.border = 'none';\n addshelfButton.style.borderRadius = '5px';\n addshelfButton.style.cursor = 'pointer';\n addshelfButton.addEventListener('click', () => {\n let tag = urlTextarea.value;\n let u = tag.split(\"@\");\n let name = u[0];\n let booku = decode(u[1].replace(\/#$\/,''))+\"#❌bookname=\"+u[0]; \n \n let url = `legado:\/\/import\/addToBookshelf?src=${encodeURIComponent(booku)}`;\n window.open(url)\n document.body.removeChild(dialog.overlay);\n });\n dialog.dialog.appendChild(addshelfButton); \n}\n\n\n\/\/标签管理弹窗\nfunction createModalDialog(options = {}) {\n \/\/遮罩层\n const overlay = document.createElement('div');\n overlay.style.position = 'fixed';\n overlay.style.top = '0';\n overlay.style.left = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';\n overlay.style.zIndex = '1001';\n overlay.style.display = 'flex';\n overlay.style.justifyContent = 'center';\n overlay.style.alignItems = 'center';\n \n \/\/弹窗\n const dialog = document.createElement('div');\ndialog.style.cssText = `\n background-color: white;\n padding: 10px;\n border-radius: 10px;\n width: 80%;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);\n text-align: center;\n max-height: 60vh;\n`;\n\n\n if (options.title) {\n const title = document.createElement('h2');\n title.textContent = options.title;\n title.style.marginTop = '0';\n dialog.appendChild(title);\n }\n\n if (options.content && Array.isArray(options.content)) {\n options.content.forEach(element => {\n dialog.appendChild(element);\n });\n }\n\n \/\/ 创建关闭按钮\n const closeButton = document.createElement('button');\n closeButton.textContent = '关闭';\n closeButton.style.margin = '10px';\n closeButton.style.padding = '5px 5px';\n closeButton.style.backgroundColor = '#dc3545';\n closeButton.style.color = 'white';\n closeButton.style.border = 'none';\n closeButton.style.borderRadius = '5px';\n closeButton.style.cursor = 'pointer';\n closeButton.addEventListener('click', () => {\n document.body.removeChild(overlay);\n if (typeof options.onClose === 'function') {\n options.onClose(); \n }\n });\n dialog.appendChild(closeButton);\n\n overlay.appendChild(dialog);\n document.body.appendChild(overlay);\n\n return {\n dialog: dialog, \n overlay: overlay\n };\n}\n\nfunction createTagButton(type){ \n const tagsWrapper = document.createElement('div');\n tagsWrapper.style.cssText = `\n margin: 5px;\n padding:5px;\n max-height:50vh;\n overflow-y: auto;\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n `;\n let url = localStorage.getItem('setTag');\n const urls = url.split('#');\n const buttonData = urls.filter(part => part.trim() !== ''); \n buttonData.forEach((data, index) => {\n const [label, url] = data.split('@');\n const button = document.createElement('button');\n button.textContent = decodeURIComponent(label) || `标签${index + 1}`;\n button.style.cssText = `\n padding: 5px 5px;\n border-radius: 5px;\n white-space: wrap;\n flex-shrink: 0;\n background-color: #2196F3;\n color: white;\n border: none;\n cursor: pointer;\n transition: all 0.3s;\n margin-right: 10px;\n margin-bottom: 10px;\n min-width: 60px;\n max-width: 100%;\n `;\n if(type!==0){ \n if(exploreM==\"0\"){\n button.addEventListener('click', () =>{\n fetchAndRender(decode(url));\n window.scrollTo(0,0);\n });\n \n }else{\n button.addEventListener('click', () =>{\n window.open(decode(url)+\"bookname\"+encodeURIComponent(label))\n });\n }\n }else if(type===0){\n button.addEventListener('click', () => {\n try{\n document.querySelectorAll(\"input\").forEach(input => {\n\n input.checked = false;\n \n const span = input.nextElementSibling; \n if (span && span.tagName === 'SPAN') {\n span.style.color = 'black';\n }\n});\n\n document.querySelectorAll('.del_choosed_tag').forEach(button => {\n button.click();\n}); \n let eurl = decodeURIComponent(decodeURIComponent(decode(url)));\n \n eurl = eurl.toLowerCase().replace(\/http.*?\\?|offset=\\d+&|limit=\\d+&\/g,'').split('&'); \n if(!\/sortsype\/.test(eurl))document.querySelector(`input[name=\"sorttype\"][value=\"2\"]`).checked = true;\n if(!\/isfinish\/.test(eurl))document.querySelector(`input[name=\"isfinish\"][value=\"0\"]`).checked = true;\n for(let i=0;i<eurl.length;i++){\n let params = eurl[i].split(\"=\");\n let names = params[0]; \n \n let values = params[1].split(\",\"); \n \n for(let j=0;j<values.length;j++){\n let name,input;\n if(names===\"searchkeywords\"){\n \tdocument.querySelector(`input[name=\"${names}\"]`).value = params[1];\n \t}else if(names===\"bq\"||names===\"removetags\"){\n if(values[j]){\n addBq(params[1],values[j],names)\n }\n }else if(\/\\d+\/.test(values[j]) && !\/sorttype|isfinish\/.test(names)){\n name = names+values[j]; \n input = document.querySelector(`input[name=\"${name}\"]`);\n if(input){\n if (input.nextElementSibling && input.nextElementSibling.tagName === 'SPAN') {\n input.nextElementSibling.style.color = 'red';\n }\n input.checked=true\n } \n }else{\n input = document.querySelector(`input[name=\"${names}\"][value=\"${values[j]}\"]`);\n \n input?input.checked=true:null\n } \t \n } \n }\n \n }catch(e){alert(e)} \n }); \n }\n tagsWrapper.appendChild(button); \n });\n return tagsWrapper\n}\n\nfunction addBq(all,v,type){\ntry{\n \n type === \"removetags\"? \n document.querySelector('.tag_label_'+v+\"~.remove_tags\").click() \n :document.querySelector('.tag_label_'+v+\"~.add_tags\").click(); \n \n }catch(e){\n alert(e)\n }\n}\n\nfunction toggleTagEdit(){ \n const dialog = createModalDialog();\n const tagContainer = document.createElement('div');\n const tagsWrapper = createTagButton(0);\n\n tagContainer.style.cssText = `\n max-height:50vh;\n padding: 10px;\n margin: 5px;\n border-radius: 10px;\n width: 90%;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n `;\n \n tagContainer.appendChild(tagsWrapper); \n dialog.dialog.prepend(tagContainer);\n\n dialog.overlay.addEventListener('click', () => {\n document.body.removeChild(dialog.overlay);\n });\n \n}\n\n\/\/\/标签选择\nfunction toggleTag(curl){ \n \/\/ 创建弹窗 \n const dialog = createModalDialog();\n const tagContainer = document.createElement('div');\n const tagsWrapper = createTagButton();\n\n tagContainer.style.cssText = `\n max-height:50vh;\n padding: 10px;\n margin: 5px;\n border-radius: 10px;\n width: 90%;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n `;\n\n \/\/ 创建【生成标签】按钮\n const generateBtn = document.createElement('button');\n generateBtn.textContent = '生成';\n generateBtn.style.cssText = `\n padding: 5px 5px;\n margin: 6px;\n background: #4CAF50;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n margin-bottom: 10px;\n `;\n dialog.dialog.appendChild(generateBtn);\n const editBtn = document.createElement('button');\n \n \n editBtn.textContent = '编辑';\n editBtn.style.cssText = `\n padding: 5px 5px;\n margin: 6px;\n background: #719EA5;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n margin-bottom: 10px;\n `;\n dialog.dialog.appendChild(editBtn);\n \n const copyBtn = document.createElement('button');\n copyBtn.textContent = '复制';\n copyBtn.style.cssText = `\n padding: 5px 5px;\n margin: 6px;\n background: #DE8E32;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n margin-bottom: 10px;\n `;\n dialog.dialog.appendChild(copyBtn);\n \n tagContainer.appendChild(tagsWrapper); \n dialog.dialog.prepend(tagContainer);\n\n dialog.overlay.addEventListener('click', () => {\n document.body.removeChild(dialog.overlay);\n });\n \n \/\/ 【生成标签】点击事件\n generateBtn.addEventListener('click', () => { \n createTag(curl) \n }); \n editBtn.addEventListener('click', () => { \n editTag() \n }); \n copyBtn.addEventListener('click', () => { \n copyTag() \n }); \n}\nfunction copyTag(){\n let setTagValue = localStorage.getItem('setTag');\n if (setTagValue){\n let tempTextArea = document.createElement('textarea');\n tempTextArea.value = setTagValue;\n document.body.appendChild(tempTextArea);\n tempTextArea.select();\n document.execCommand('copy');\n document.body.removeChild(tempTextArea);\n alert('内容已复制到剪贴板: ' + setTagValue);\n } else {\n alert('localStorage中没有找到setTag的值');\n }\n \n \n}\n\nfunction editTag(){\n let dialog = createModalDialog();\n let text = localStorage.getItem('setTag');\n const tagsWrapper = document.createElement('div');\n tagsWrapper.style.cssText = `\n margin: 5px;\n padding:5px;\n max-height:50vh;\n overflow-y: auto;\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n `; \n const urls = text.split('#');\n \n const buttonData = urls.filter(part => part.trim() !== ''); \n buttonData.forEach((data, index) => {\n const [label, url] = data.split('@');\n const button = document.createElement('input');\n button.type = \"text\";\n button.value = label || `标签${index + 1}`;\n button.style.cssText = `\n padding: 5px 5px;\n border-radius: 5px;\n white-space: wrap;\n flex-shrink: 0;\n background-color: #2196F3;\n color: white;\n border: none;\n cursor: pointer;\n transition: all 0.3s; \n min-width: 60px;\n max-width: 100%;\n width:40%;\n margin-right: 10px;\n margin-bottom: 10px;\n `;\n \n button.dataset.id = url; \n tagsWrapper.appendChild(button); \n }); \n dialog.dialog.prepend(tagsWrapper);\n \n const promptText = document.createElement('p');\n promptText.textContent = '修改标签名或者删除相应文字,点击保存';\n promptText.style.margin = '10px 0';\n promptText.style.fontSize = '14px';\n promptText.style.color = '#333';\n dialog.dialog.prepend(promptText);\n\n const copyButton = document.createElement('button');\n copyButton.textContent = '保存';\n copyButton.style.margin = '10px';\n copyButton.style.padding = '5px 5px';\n copyButton.style.backgroundColor = '#28a745';\n copyButton.style.color = 'white';\n copyButton.style.border = 'none';\n copyButton.style.borderRadius = '5px';\n copyButton.style.cursor = 'pointer';\n copyButton.addEventListener('click', () => {\n const allButtons = tagsWrapper.querySelectorAll('input');\n \n let saveTag = \"\"; \n allButtons.forEach(data=>{\n if(data.value){\n saveTag+=data.value+\"@\"+data.dataset.id+\"#\";}\n });\n \n localStorage.setItem(\"setTag\",saveTag);\n alert(\"已更新标签\");\n document.body.removeChild(dialog.overlay);\n \n }); \n \n dialog.dialog.appendChild(copyButton); \n}\n\n\n\nif(\/#$\/.test(window.location.href)){\n let homeTagButton = document.createElement('button');\n homeTagButton.textContent = '标签管理';\n homeTagButton.style.cssText = `\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 1000;\n padding: 5px 10px;\n background-color: #007BFF;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n `;\n document.body.appendChild(homeTagButton);\n \n let cTagButton = document.createElement('button');\n cTagButton.textContent = '生成标签';\n cTagButton.style.cssText = `\n position: fixed;\n bottom: 50px;\n right: 20px;\n z-index: 1000;\n padding: 5px 10px;\n background-color: #007BFF;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n `;\n document.body.appendChild(cTagButton);\n \n \n let eTagButton = document.createElement('button');\n eTagButton.textContent = '复现标签';\n eTagButton.style.cssText = `\n position: fixed;\n bottom: 80px;\n right: 20px;\n z-index: 1000;\n padding: 5px 10px;\n background-color: #007BFF;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n `;\n document.body.appendChild(eTagButton);\n \n let exploreButton = document.createElement('button');\n exploreButton.textContent = exploreM==\"0\"?\"网页模式\":\"发现模式\";\n exploreButton.style.cssText = `\n position: fixed;\n bottom: 110px;\n right: 20px;\n z-index: 1000;\n padding: 5px 10px;\n background-color: #007BFF;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n `;\n document.body.appendChild(exploreButton);\n \n \n let searchb = document.createElement('button');\n searchb.textContent = \"搜索\";\n searchb.style.cssText = `\n position: fixed;\n bottom: 140px;\n right: 20px;\n z-index: 1000;\n padding: 5px 10px;\n background-color: #007BFF;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n `;\n document.body.appendChild(searchb);\n \n exploreButton.addEventListener('click', () => {\n if(exploreM==\"0\"){\n localStorage.setItem('explore',\"1\");\n exploreButton.textContent = \"发现模式\"\n exploreM = 1;\n }else{\n localStorage.setItem('explore',\"0\");\n exploreM = 0;\n exploreButton.textContent = \"网页模式\"\n }\n });\n \n homeTagButton.addEventListener('click', () => { \n toggleTag()\n });\n \n eTagButton.addEventListener('click', () => { \n toggleTagEdit()\n });\n \n cTagButton.addEventListener('click', () => { \n createTag() \n });\n \n const forms = document.getElementsByTagName('form')[1];\n restoreBookPosition();\n searchb.addEventListener('click', () => { \n let formData = new FormData(forms);\n currentUrl = generateFinalUrl(formData);\n previousUrl = currentUrl;\n currentOffset = 0;\n if(exploreM == \"0\")fetchAndRender(currentUrl);\n if(exploreM == \"1\")window.open(currentUrl)\n });\n forms.addEventListener('submit', function(event) {\n event.preventDefault();\n let formData = new FormData(forms);\n currentUrl = generateFinalUrl(formData);\n previousUrl = currentUrl;\n currentOffset = 0;\n if(exploreM == \"0\")fetchAndRender(currentUrl);\n if(exploreM == \"1\")window.open(currentUrl)\n });\n}\n\nfunction addStyles() {\n const style = document.createElement('style');\n style.innerHTML = `\n .center {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n background: white;\n z-index: 999;\n padding: 10px 0;\n box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n}\n\n a:link { color: #415E44; }\n a:visited { color: #8EB28B; }\n button, select, input {\n background: #E9F5F3;\n color: green;\n font-weight: bold;\n border-radius: 15px;\n border: 0px solid #000;\n padding: 5px 10px;\n box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n }\n \n .float-buttons {\n position: fixed;\n right: 10px;\n bottom: 10px;\n display: flex;\n flex-direction: column-reverse;\n align-items: center;\n z-index: 999;\n }\n \n \/* 主按钮 - 深绿色圆形 *\/\n .main-btn {\n width: 50px;\n height: 50px;\n border-radius: 50%;\n background: #E9F5F3;\n color: green;\n border: none;\n cursor: pointer;\n box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n transition: all 0.3s ease;\n padding: 5px 2px;\n position: relative;\n }\n \n \/* 当前页和总页数颜色区分 *\/\n .main-btn .current {\n color: green;\n font-weight: bold;\n margin-bottom: 2px;\n }\n \n .main-btn .total {\n color: rgba(0, 0, 0, 0.8);\n font-size: 0.9em;\n margin-top: 2px;\n }\n \n .main-btn .divider {\n width: 60%;\n height: 1px;\n background: green;\n margin: 3px 0;\n }\n \n \/* 功能按钮容器 - 默认隐藏 *\/\n .button-group {\n display: none;\n flex-direction: column-reverse;\n align-items: center;\n }\n \n \n .expanded .button-group {\n display: flex;\n }\n \n \/* 功能按钮样式 *\/\n .func-btn {\n width: 50px;\n height: 50px;\n border-radius: 50%;\n background: #495057;\n color: white;\n border: none;\n cursor: pointer;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n outline: none;\n margin-bottom: 8px;\n }\n \n \/* 不同功能按钮颜色 *\/\n .func-btn.home { background: #9B5F64; }\n .func-btn.bottom { background: #8DA371; }\n .func-btn.top { background: #67749A; }\n \n \/* 页码控制面板 *\/\n .page-control {\n background: #E9F5F3;\n color: white;\n padding: 10px;\n border-radius: 25px;\n font-size: 14px;\n box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 30px;\n margin-bottom: 8px;\n }\n \n .page-info {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-bottom: 8px;\n font-size: 12px;\n line-height: 1.3;\n position: relative;\n width: 100%;\n }\n \n \n .page-info .divider {\n width: 90%;\n height: 1px;\n background: green;\n margin: 4px 0;\n }\n \n .page-info .current-page {\n color: green;\n font-weight: bold;\n font-size: 14px;\n }\n \n .page-info .total-pages {\n color: rgba(0, 0, 0, 0.6);\n font-size: 11px;\n }\n \n .page-jump {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n }\n \n .page-jump input {\n width: 30px;\n padding: 6px;\n border: none;\n border-radius: 15px;\n text-align: center;\n outline: none;\n font-size: 12px;\n margin-bottom: 6px;\n background: #f8f9fa;\n }\n \n .page-jump button {\n width: 30px;\n height: 25px;\n background: #2b8a3e;\n color: white;\n border: none;\n border-radius: 15px;\n cursor: pointer;\n font-size: 12px;\n transition: background 0.2s;\n }\n \n .page-jump button:hover {\n background: #2f9e44;\n }\n \n .main-btn:hover, .func-btn:hover {\n transform: translateY(-3px);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.25);\n }\n \n .main-btn:active, .func-btn:active {\n transform: translateY(0);\n }\n \n .long-page .main-btn {\n font-size: 11px;\n padding: 3px 1px;\n }\n \n .book {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n margin-bottom: 8px;\n }\n .bookdes {\n display: flex;\n flex-direction: row;\n margin: 5px;\n width: 100%;\n position: relative;\n align-items: center;\n }\n .pic {\n width: 25vw;\n margin-right: 20px;\n align-self: center;\n }\n .details {\n width: 72vw;\n margin-left: 20px;\n align-self: center;\n margin-left: auto;\n }\n .pic img {\n border: 1px solid #C4C4C4;\n border-radius: 5px;\n box-shadow: 1px 2px 2px black;\n width: 97%;\n height: auto;\n }\n .name { font-size: 20px; color: #000; }\n .author {\n font-size: 15px;\n display: inline-block;\n position: absolute;\n right: 8px;\n }\n .tag { font-size: 12px; margin-top: -10px; }\n #loading {\n background: rgba(0,0,0,0.1);\n margin: 10px 0;\n }\n `;\n document.head.appendChild(style);\n}",
"jsLib": "function gbkToutf(title){\n\tconst {java} = this;\n let URLDecoder = Packages.java.net.URLDecoder;\n let \tgb2312Str = URLDecoder.decode(title,\"gbk\");\n let utf8Str = URLDecoder.decode(title,\"utf-8\");\n let result = gb2312Str.length() >= utf8Str.length();\n\ttitle = result?decodeURI(title):gb2312Str;\n\treturn title\n\t\n\t}",
"lastUpdateTime": 1767029767207,
"loadWithBaseUrl": true,
"loginUi": "[\n {\n \"name\": \"🖨打印标签\",\n \"type\": \"button\",\n \"action\": \"getTag()\",\n \"style\": {\n \"layout_flexGrow\": 1, \n \"layout_flexBasisPercent\": 0.4 \n }\n },\n {\n \"name\": \"❌删除所有标签\",\n \"type\": \"button\",\n \"action\": \"clearTag()\",\n \"style\": {\n \"layout_flexGrow\": 1, \n \"layout_flexBasisPercent\": 0.4\n }\n },\n {\n \"name\": \"☕️支持源作者\",\n \"type\": \"button\",\n \"action\": \"toThank()\",\n \"style\": {\n \"layout_flexGrow\": 1, \n \"layout_flexBasisPercent\": 1\n }\n }\n]",
"loginUrl": "function getTag(){\n\t java.longToast(\"打印中...请稍候...\");\n let \tlocal = java.webView(null,\"https:\/\/m.jjwxc.net\/assort#\",\"localStorage.getItem('setTag')?localStorage.getItem('setTag'):''\"); \n let msg = `\\n------这是源变量里的标签----\\n${source.getVariable()}\\n------这是网页里的标签------\\n${local}`\n \tjava.log(msg);\n \tjava.longToast(\"请查看日志查看标签,可复制用来备份\");\n\t}\n\t\nfunction clearTag(){\n\t java.longToast(\"删除中...请稍候...\");\n let \tlocal = java.webView(\"<script>localStorage.setItem('setTag','')<\/script>\",\"https:\/\/m.jjwxc.net\/assort#\",null); \t\n \tjava.longToast(\"已删除网页保存标签\");\n\t}\nfunction toThank(){\n\tjava.startBrowser(\"data:text\/html;base64,PGltZyBzdHlsZT0id2lkdGg6MTAwJSIgc3JjPSJhYm91dDpibGFuayIgb25lcnJvcj0idGhpcy5zcmM9YXRvYignYUhSMGNITTZMeTluYVhSbFpTNWpiMjB2WjNWaGJtVnlNREF4TVRJMUwySnZiMnR6YjNWeVkyVXZjbUYzTDIxaGMzUmxjaThsUlRVbE9VSWxRa1VsUlRjbE9Ea2xPRGN2WjNWaGJtVnlMbmRsWW5BPScpIj4KCg==\",\"感谢你的支持\");\t\n\t}",
"preload": false,
"shouldOverrideUrlLoading": "if(\/[\\?#&]book[AN]\/.test(url)){\n\ttitle = url.match(\/[\\?#&]book[AN].+?=(.*)\/)[1];\n\t title = gbkToutf(title)\n\t java.searchBook(title);\n\t true\n\t}\n\t\n\tif(\/novelbasicinfo\/.test(url) && !\/legado\/.test(url)){\n\t\tjava.addBook(url);\n\t\ttrue\n\t\t}\n\t\t\n\t\t\nif(\/^http.*?search\\\/getSearchForKeyWords\/.test(url)){\n\tlet urls = url.replace(\/offset=\\d+\/,'offset={\\{(page-1)*20}}').split('bookname');\n\t\ttitle = urls[0].match(\/searchkeyWords=(.*?)&\/)?.[1]??\"\";\t\n\t title = gbkToutf(title)\n\t url = urls[0].replace(\/searchkeyWords=.*?&\/,'searchkeyWords='+title+'&');\n\t \n\tjava.open(\"explore\", url,urls[1]?decodeURIComponent(urls[1]):\"搜索结果\",\"https:\/\/m.jjwxc.net\/channel\/\")\n\t\n\ttrue\n\t}",
"showWebLog": true,
"singleUrl": true,
"sourceComment": "❗️保存标签,在网页里生成标签后保存标签。\n❗️删除标签,在网页里编辑标签,把文字删了,点保存。\n◎网页保存的标签信息消失情况:清除webView或清除应用缓存。\n◎源变量消失情况:对源URL进行了更改。\n◎当网页保存的标签信息和源变量两者都消失时,你的标签信息就会消失。\n◎每次点进网页会同步二者。\n\n❗️【编辑订阅源->右上角三点->设置源变量】里有保存的标签,可以复制下来,给其他设备使用。\n\n❗️利用源变量更新标签:\n\n前面加上🔼符号将复制的所有标签保存到源变量,\n如:🔼标签1@xxxxx#标签2@xxxxx#标签2@xxxxx#",
"sourceIcon": "https:\/\/m-static.jjwxc.net\/images\/wap\/logo.png",
"sourceName": "精确搜索【1230】",
"sourceUrl": "https:\/\/m.jjwxc.net\/assort#@js:\ntry{\n\t java.longToast(\"加载中...请稍候...\");\n let wo= String(source.getVariable()??\"\"); \n let script=`<script>\n let wo= \\`${wo}\\`;\n let iswo = \/^🔼.*?@.*?#\/.test(wo);\n let temp = localStorage.getItem('setTag'); \n let istemp = \/.*?@.*?#\/.test(temp);\n let saveTag = temp;\n if(iswo)saveTag=wo.replace(\/^🔼\/,'');\n \t localStorage.setItem('setTag',saveTag);\n \t saveTag = localStorage.getItem('setTag'); \n \t <\/script>`;\n \t let saveTag =java.webView(script,\"https:\/\/m.jjwxc.net\/assort#\",\"saveTag\");\t \n source.setVariable(saveTag);\n}catch(e){\n \tjava.log(\"我是错误:\"+e)\n};\nresult",
"type": 0,
"variableComment": "\n想利用源变量更新标签请在最前面加上符号🔼\n如\n🔼新名字@xxxxx#我的标签@xxxxx#我的标签@xxxxx#"
}