立方
https://qq.com#立方
分享者: NRHSYD (2776)发布时间: 6天前
该用户很懒,什么介绍也没有写!
{ "articleStyle": 0, "contentBlacklist": "", "customOrder": -10098533, "enableJs": true, "enabled": true, "enabledCookieJar": true, "header": "{\"User-Agent\":\"\"}", "lastUpdateTime": 0, "loadWithBaseUrl": true, "loginUi": "", "loginUrl": "", "ruleArticles": "<js>\nconst ori = baseUrl.slice(baseUrl.indexOf('#') + 1);\nconst sort = ori.split('★').map((item) => {\n const parts = item.split('☆');\n return {\n title: parts[1],\n date: parts[2],\n img: parts[3],\n link: parts[0]\n };\n});\nJSON.stringify(sort);\n<\/js>\n$.[*]", "ruleContent": "", "ruleDescription": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=0\">\n <style>\n @keyframes tip {\n 0% {\n opacity: 0;\n transform: translateY(-24px);\n }\n 30%,\n 70% {\n opacity: 1;\n transform: translateY(0);\n }\n 100% { opacity: 0; }\n }\n \n * {\n line-height: 1em;\n margin: 0;\n padding: 0;\n word-break: break-all;\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n \n *:focus { outline: none; }\n \n input,\n textarea { -webkit-user-select: auto; }\n \n body {\n background: #f4f5f7;\n display: flex;\n flex-wrap: wrap;\n place-content: center;\n place-items: start;\n padding: 15px;\n color: #001944;\n }\n \n label:has(#y)+div {\n opacity: 0;\n max-height: 0;\n overflow: hidden;\n transition: .3s;\n }\n \n label:has(#y:checked)+div {\n opacity: 1;\n max-height: 50px;\n }\n \n .card {\n border-top: .5px solid rgba(255, 255, 255, .9);\n border-radius: 24px;\n background: rgba(255, 255, 255, .8);\n box-shadow: 0 10px 20px rgba(0, 0, 0, .05);\n padding: 30px;\n margin: 12.5px;\n width: 250px;\n height: auto;\n }\n \n .card details+div {\n overflow: hidden;\n max-height: 0;\n opacity: 0;\n transition: .6s;\n }\n \n .card details[open]+div {\n max-height: 666px;\n opacity: 1;\n }\n \n .card details summary {\n font-size: 24px;\n font-weight: 700;\n user-select: none;\n outline: 0;\n opacity: .4;\n transition: .6s;\n display: block;\n list-style: none;\n }\n \n .card details[open] summary {\n opacity: 1;\n margin-bottom: 6px;\n font-size: 20.5px;\n }\n \n .flex {\n display: flex;\n flex-wrap: wrap;\n }\n \n .tip {\n position: fixed;\n z-index: 9;\n top: 45px;\n border-radius: .75em;\n padding: .9em;\n background-color: rgba(99, 99, 99, .9);\n box-shadow: 0 5px 20px rgba(0, 0, 0, .2);\n color: #fff;\n opacity: 0;\n animation: tip 1s;\n backdrop-filter: blur(15px);\n }\n \n .txt-box { position: relative; }\n \n .txt-box button {\n position: absolute;\n top: 19px;\n margin: 0;\n padding: .3em;\n border-radius: .3em;\n background: rgba(0, 0, 0, .15);\n color: #fff;\n font-size: 12px;\n z-index: 9;\n display: none;\n }\n \n .clear-btn { right: 9px; }\n \n .copy-btn { right: 44px; }\n \n .txt-box:hover .clear-btn,\n .txt-box:hover .copy-btn { display: block; }\n \n span {\n background: rgba(0, 0, 0, .04);\n padding: .15em .3em;\n border-radius: .5em;\n margin-left: .5em;\n font-family: serif;\n font-size: 12px;\n opacity: .75;\n }\n \n button {\n font-size: 13.5px;\n font-weight: 700;\n color: #4360b7;\n background: #e7eeff;\n padding: .65em .9em;\n margin-top: 9px;\n margin-right: 9px;\n opacity: .81;\n border-radius: 2em;\n border: none;\n transition: .3s;\n cursor: pointer;\n }\n \n button:active {\n background: #d6ddee;\n transform: scale(.95);\n }\n \n textarea {\n margin-top: 9px;\n padding: 9px;\n width: 100%;\n box-sizing: border-box;\n line-height: 1.2em;\n font-size: 14px;\n font-family: serif;\n resize: none;\n border-radius: 9px;\n color: #333;\n border: 2px solid rgba(0, 0, 0, .1);\n background: rgba(0, 0, 0, .006);\n }\n \n input[type=\"checkbox\"],\n input[type=\"radio\"] {\n vertical-align: bottom;\n appearance: none;\n margin: 0 .5em;\n width: 1em;\n height: 1em;\n box-sizing: border-box;\n background: rgba(0, 0, 0, .006);\n border: 2px solid rgba(0, 0, 0, .1);\n border-radius: 9px;\n cursor: pointer;\n transition: .15s;\n }\n \n input:checked {\n border-color: #4360b7;\n background: #e7eeff;\n opacity: .81;\n }\n \n label {\n display: inline-block;\n margin-top: 9px;\n margin-bottom: 0;\n font-size: 14px;\n font-family: serif;\n cursor: pointer;\n }\n <\/style>\n <title>写源助手<\/title>\n<\/head>\n\n<body>\n <div class=\"card\">\n <details>\n <summary>格式化发现<\/summary>\n <\/details>\n <div>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"text\" rows=\"4\" placeholder=\"请输入要处理的内容\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <div class=\"flex\">\n <button onclick=\"htmlToDisc()\">html转旧发现<\/button>\n <button onclick=\"switchFormat()\">新旧发现互转<\/button>\n <\/div>\n <label> 每行列数<span>仅新发现<\/span><\/label>\n <div class=\"flex\">\n <button onclick=\"setColumn(null)\">自动<\/button>\n <button onclick=\"setColumn(1)\">1<\/button>\n <button onclick=\"setColumn(.4)\">2<\/button>\n <button onclick=\"setColumn(.25)\">3<\/button>\n <button onclick=\"setColumn(.2)\">4<\/button>\n <\/div>\n <\/div>\n <\/div>\n\n <div class=\"card\">\n <details>\n <summary>匹配 \/ 替换<\/summary>\n <\/details>\n <div>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"text1\" rows=\"4\" placeholder=\"请输入要处理的内容\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"matchText\" rows=\"1\" placeholder=\"请输入正则表达式\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <label><input id=\"g\" type=\"checkbox\" checked>全局匹配<span>g<\/span><\/label>\n <label><input id=\"i\" type=\"checkbox\">忽略大小写<span>i<\/span><\/label>\n <label><input id=\"m\" type=\"checkbox\">多行模式<span>m<\/span><\/label>\n <label><input id=\"s\" type=\"checkbox\">点号通配<span>s<\/span><\/label>\n <label><input id=\"u\" type=\"checkbox\">Unicode<span>u<\/span><\/label>\n <label><input id=\"y\" type=\"checkbox\">粘连匹配<span>y<\/span><\/label>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"lastIndex\" rows=\"1\" placeholder=\"lastIndex,用于粘连匹配\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"replaceText\" rows=\"1\" placeholder=\"想要替换成什么\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <div class=\"flex\">\n <button onclick=\"insertReplaceText('{\\{page}}')\">{{page}}<\/button>\n <button onclick=\"insertReplaceText('\\\\')\">\\<\/button>\n <button onclick=\"insertReplaceText('<')\"><<\/button>\n <button onclick=\"insertReplaceText('>')\">><\/button>\n <\/div>\n <div class=\"flex\">\n <button onclick=\"regexMatch()\">匹配<\/button>\n <button onclick=\"regexReplace()\">替换<\/button>\n <button onclick=\"resetAll()\">重置匹配替换<\/button>\n <\/div>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"matchResult\" rows=\"4\" placeholder=\"匹配结果\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"replaceResult\" rows=\"4\" placeholder=\"替换结果\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <\/div>\n <\/div>\n\n <div class=\"card\">\n <details>\n <summary>编码 \/ 转义<\/summary>\n <\/details>\n <div>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"text2\" rows=\"4\" placeholder=\"请输入要处理的内容\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <label><input id=\"more\" type=\"checkbox\">处理更多字符<\/label>\n <div class=\"flex\">\n <button onclick=\"encodeURL()\">url 编码<\/button>\n <button onclick=\"decodeURL()\">url 解码<\/button>\n <button onclick=\"encodeHTML()\">html 转义<\/button>\n <button onclick=\"decodeHTML()\">html 反转义<\/button>\n <\/div>\n <div id=\"temp\" hidden><\/div>\n <\/div>\n <\/div>\n\n <div class=\"card\">\n <details>\n <summary>工具 \/ 教程<\/summary>\n <\/details>\n <div>\n <div class=\"flex\">\n <button onclick=\"window.open('https:\/\/base64.guru\/converter')\">base64<\/button>\n <button onclick=\"window.open('https:\/\/tool.lu\/zhconvert')\">简繁转换<\/button>\n <button onclick=\"window.open('https:\/\/www.wetools.com\/js-compress')\">js压缩<\/button>\n <button onclick=\"window.open('https:\/\/www.yuque.com\/legado\/yuan')\">写源教程①<\/button>\n <button onclick=\"window.open('https:\/\/www.yuque.com\/120031xufengnian\/yuedu')\">写源教程②<\/button>\n <\/div>\n <\/div>\n <\/div>\n\n <script>\n const $ = (id) => document.getElementById(id);\n \n const textEl = $('text');\n const text1El = $('text1');\n const text2El = $('text2');\n const matchTextEl = $('matchText');\n const lastIndexEl = $('lastIndex');\n const matchResultEl = $('matchResult');\n const replaceTextEl = $('replaceText');\n const replaceResultEl = $('replaceResult');\n const more = $('more');\n const temp = $('temp');\n const flags = ['g', 'i', 'm', 's', 'u', 'y']\n .reduce((acc, flag) => {\n acc[flag] = $(flag);\n return acc;\n }, {});\n\n const showTip = (text) => {\n const tip = document.createElement('p');\n tip.className = \"tip\";\n tip.textContent = text;\n document.body.appendChild(tip);\n setTimeout(() => tip.remove(), 2000);\n };\n\n const htmlToDisc = () => {\n const text = textEl.value;\n if (!text) return textEl.focus();\n try {\n const links = Array.from(new DOMParser()\n .parseFromString(text, 'text\/html')\n .querySelectorAll('a[href]'))\n .filter(a => {\n const url = a.getAttribute('href').trim().toLowerCase();\n return !url.startsWith('javascript:') && !url.startsWith('#');\n })\n .map(a => a.textContent.trim() + \"::\" + a.getAttribute('href').trim());\n const num = links.length;\n if (num > 0) {\n textEl.value = links.join('\\n');\n showTip(`提取到 ${num} 条发现`);\n } else showTip('未提取到发现');\n } catch (error) {\n showTip('html 解析失败');\n }\n };\n \n const switchFormat = () => {\n const text = textEl.value\n if (!text) return textEl.focus();\n let result = \"\";\n try {\n result = JSON.parse(text)\n .map(({ title = \"\", url = \"\" }) => title + \"::\" + url)\n .join('\\n');\n } catch (error) {\n result = JSON.stringify(text\n .replace(\/&&\/g, '\\n')\n .split(\/\\s*\\n+\\s*\/)\n .map(line => {\n const [title, ...url] = line.split('::').map(s => s.trim());\n return { title: title, url: url.join('::') };\n }));\n }\n result ? textEl.value = result: showTip('格式转换失败');\n };\n \n const setColumn = (n) => {\n const text = textEl.value;\n if (!text) return textEl.focus();\n try {\n const json = JSON.parse(text);\n json.forEach(item => {\n item.style = {\n layout_flexGrow: 1,\n layout_flexBasisPercent: n\n };\n });\n textEl.value = JSON.stringify(json);\n } catch (error) {\n showTip('列数设置失败');\n }\n };\n \n const buildRegex = () => {\n const text = text1El.value;\n if (!text) return text1El.focus();\n const matchText = matchTextEl.value;\n if (!matchText) return matchTextEl.focus();\n const options = Object.keys(flags).filter(flag => flags[flag].checked).join('');\n try {\n const regex = new RegExp(matchText, options);\n regex.lastIndex = parseInt(lastIndexEl.value) || 0;;\n return { text, regex };\n } catch (error) {\n showTip('构建正则表达式失败');\n }\n };\n \n const regexMatch = () => {\n const result = buildRegex();\n if (!result) return;\n const { text, regex } = result;\n const match = text.match(regex);\n if (match) {\n if (regex.flags.includes('g')) {\n showTip(`找到 ${match.length} 个匹配项`);\n matchResultEl.value = match.join('\\n');\n } else {\n showTip(`匹配位置:` + match.index);\n matchResultEl.value = match[0];\n }\n } else {\n matchResultEl.value = \"\";\n showTip('未找到匹配项');\n }\n };\n \n const insertReplaceText = (text) => {\n const start = replaceTextEl.selectionStart;\n const lastValue = replaceTextEl.value;\n replaceTextEl.value = lastValue.slice(0, start) + text + lastValue.slice(start + replaceTextEl.selectionEnd - start);\n replaceTextEl.focus();\n replaceTextEl.setSelectionRange(start + text.length, start + text.length);\n };\n \n const regexReplace = () => {\n const result = buildRegex();\n if (!result) return;\n const { text, regex } = result;\n regexMatch();\n replaceResultEl.value = text.replace(regex, replaceTextEl.value);\n };\n \n const resetAll = () => {\n const fields = ['matchText', 'matchResult', 'lastIndex', 'replaceText', 'replaceResult'];\n fields.forEach(field => $(`${field}`).value = \"\");\n showTip('重置匹配替换成功');\n };\n \n const encodeURL = () => {\n const text = text2El.value;\n if (!text) return text2El.focus();\n text2El.value = more.checked? encodeURIComponent(text) : encodeURI(text);\n showTip('URLEncode 编码成功');\n };\n \n const decodeURL = () => {\n const text = text2El.value;\n if (!text) return text2El.focus();\n try {\n text2El.value = decodeURIComponent(text);\n showTip('URLDecode 解码成功');\n } catch (error) {\n showTip('URLDecode 解码失败');\n }\n };\n\n const encodeHTML = () => {\n const text = text2El.value;\n if (!text) return text2El.focus();\n if (more.checked) text2El.value = text.split('').map(c => `&#${c.charCodeAt(0)};`).join('');\n else {\n temp.textContent = text;\n text2El.value = temp.innerHTML;\n }\n showTip('html 转义成功');\n };\n \n const decodeHTML = () => {\n const text = text2El.value;\n if (!text) return text2El.focus();\n try {\n temp.innerHTML = text.replace(\/<br\\s*\\\/?>\/gi, '\\n').replace(\/<\/g, '<').replace(\/>\/g, '>');\n text2El.value = temp.textContent;\n showTip('html 反转义成功');\n } catch (error) {\n showTip('html 反转义失败');\n }\n };\n\n const clearText = (button) => {\n button.nextElementSibling.value = \"\";\n showTip('清空成功');\n };\n\n const copyText = (button) => {\n const text = button.previousElementSibling.value;\n if (!text) return showTip('内容为空');\n navigator.clipboard.writeText(text)\n .then(() => showTip('复制成功'))\n .catch(() => showTip('复制失败'));\n };\n <\/script>\n<\/body>\n\n<\/html>\n🔵<!DOCTYPE html>\n<html lang=\"zh-CN\">\n\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=0\">\n <title>随心导入<\/title>\n <style>\n @keyframes tip {\n 0% {\n opacity: 0;\n transform: translateY(-24px);\n }\n 30%,\n 70% {\n opacity: 1;\n transform: translateY(0);\n }\n 100% { opacity: 0; }\n }\n \n * {\n line-height: 1em;\n margin: 0;\n padding: 0;\n word-break: break-all;\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n \n *:focus { outline: none; }\n \n textarea { -webkit-user-select: auto; }\n \n body {\n background: #f4f5f7;\n display: flex;\n flex-wrap: wrap;\n place-content: center;\n place-items: start;\n padding: 15px;\n color: #001944;\n }\n \n .card {\n border-top: .5px solid rgba(255, 255, 255, .9);\n border-radius: 24px;\n background: rgba(255, 255, 255, .8);\n box-shadow: 0 10px 20px rgba(0, 0, 0, .05);\n padding: 30px;\n margin: 12.5px;\n width: 250px;\n height: auto;\n }\n \n .card details+div {\n overflow: hidden;\n max-height: 0;\n opacity: 0;\n transition: .6s;\n }\n \n .card details[open]+div {\n max-height: 666px;\n opacity: 1;\n }\n \n .card details summary {\n font-size: 24px;\n font-weight: 700;\n user-select: none;\n outline: 0;\n opacity: .4;\n transition: .6s;\n display: block;\n list-style: none;\n }\n \n .card details[open] summary {\n opacity: 1;\n margin-bottom: 6px;\n font-size: 20.5px;\n }\n \n .flex {\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n gap: 1.3px;\n }\n \n .tip {\n position: fixed;\n z-index: 9;\n top: 45px;\n border-radius: .75em;\n padding: .9em;\n background-color: rgba(99, 99, 99, .9);\n box-shadow: 0 5px 20px rgba(0, 0, 0, .2);\n color: #fff;\n opacity: 0;\n animation: tip 1s;\n backdrop-filter: blur(15px);\n }\n \n .txt-box { position: relative; }\n \n .txt-box button {\n position: absolute;\n top: 19px;\n margin: 0;\n padding: .3em;\n border-radius: .3em;\n background: rgba(0, 0, 0, .15);\n color: #fff;\n font-size: 12px;\n z-index: 9;\n display: none;\n }\n \n .clear-btn { right: 9px; }\n \n .copy-btn { right: 44px; }\n \n .txt-box:hover .clear-btn,\n .txt-box:hover .copy-btn { display: block; }\n \n .span {\n background: rgba(0, 0, 0, .04);\n place-content: center;\n place-items: stretch;\n padding: auto .3em;\n font-family: serif;\n font-size: 13.5px;\n opacity: .75;\n }\n \n button {\n font-size: 13.5px;\n font-weight: 700;\n color: #4360b7;\n flex-grow: 1;\n background: #e7eeff;\n padding: .75em .9em;\n opacity: .81;\n border: none;\n transition: .3s;\n cursor: pointer;\n }\n \n button:active {\n background: #d6ddee;\n transform: scale(.95);\n }\n \n textarea {\n margin-top: 9px;\n padding: 9px;\n width: 100%;\n box-sizing: border-box;\n line-height: 1.2em;\n font-size: 14px;\n font-family: serif;\n resize: none;\n border-radius: 9px;\n color: #333;\n border: 2px solid rgba(0, 0, 0, .1);\n background: rgba(0, 0, 0, .006);\n }\n\n .select-wrapper {\n display: flex;\n align-items: center;\n margin-top: 9px;\n border: 2px solid rgba(0, 0, 0, 0.1);\n border-radius: 9px;\n overflow: hidden;\n font-size: 14px;\n color: #333;\n }\n\n .import-select {\n flex: 1;\n padding: 9px;\n border: none;\n appearance: none;\n font-family: serif;\n font-size: 14px;\n background: rgba(0, 0, 0, 0.006);\n -webkit-appearance: none;\n -moz-appearance: none;\n }\n\n .import-select::-ms-expand {\n display: none;\n }\n\n #import {\n margin: 0;\n padding: 10px 12px;\n flex-grow: 0;\n border-radius: 0;\n border-left: 1px solid rgba(0, 0, 0, 0.1);\n }\n \n #import:active {\n transform: none;\n }\n \n .grid {\n display: grid;\n margin-top: 9px;\n width: 100%;\n grid-template-columns: 2fr 5fr;\n grid-gap: 1.3px;\n place-items: stretch;\n place-content: center;\n border-radius: 9px;\n overflow: hidden;\n }\n <\/style>\n <\/head>\n\n <body>\n <div class=\"card\">\n <details id=\"main\" open>\n <summary>随心导入<\/summary>\n <\/details>\n <div>\n <div class=\"txt-box\">\n <button class=\"clear-btn\" onclick=\"clearText(this)\">清空<\/button>\n <textarea id=\"url\" rows=\"4\" placeholder=\"请输入资源链接\"><\/textarea>\n <button class=\"copy-btn\" onclick=\"copyText(this)\">复制<\/button>\n <\/div>\n <div class=\"select-wrapper\">\n <select id=\"path\" class=\"import-select\" name=\"path\">\n <option value=\"auto\" selected>自动识别<\/option>\n <option value=\"bookSource\">书源<\/option>\n <option value=\"rssSource\">订阅源<\/option>\n <option value=\"replaceRule\">替换规则<\/option>\n <option value=\"textTocRule\">TXT目录规则<\/option>\n <option value=\"httpTTS\">TTS<\/option>\n <option value=\"theme\">主题<\/option>\n <option value=\"readConfig\">排版<\/option>\n <option value=\"dictRule\">字典规则<\/option>\n <\/select>\n <button id=\"import\" onclick=\"importUrl()\">导入<\/button>\n <\/div>\n <\/div>\n <\/div>\n <div class=\"card\">\n <details open>\n <summary>长期链接<\/summary>\n <\/details>\n <div>\n <div class=\"grid\">\n <div class=\"flex span\">书源<\/div>\n <div class=\"flex\">\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/shidahuilang\/shuyuan\/shuyuan\/good.json★1')\">大灰狼<\/button>\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/zmn001125\/booksources\/master\/sources\/guaner.txt★1')\">关耳<\/button>\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/XIU2\/Yuedu\/master\/shuyuan★1')\">XIU2<\/button>\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/cyao2q\/yuedu\/master\/shuyuan★1')\">漠星曜<\/button>\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/PB-pobing\/pobing\/pb\/sy.json★1')\">破冰<\/button>\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/yc-sy\/yd\/refs\/heads\/master\/sy.json★1')\">一程<\/button>\n <\/div>\n <div class=\"flex span\">订阅源<\/div>\n <div class=\"flex\">\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/yc-sy\/yd\/refs\/heads\/master\/dy.json★2')\">一程<\/button>\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/nrhsyd\/yd\/refs\/heads\/main\/rss.json★2')\">NRHSYD<\/button>\n <\/div>\n <div class=\"flex span\">替换规则<\/div>\n <div class=\"flex\">\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/shidahuilang\/shuyuan\/shuyuan\/jinghua.json★3')\">大灰狼<\/button>\n <\/div>\n <div class=\"flex span\">TTS<\/div>\n <div class=\"flex\">\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/shidahuilang\/shuyuan\/shuyuan\/tts.json★5')\">大灰狼<\/button>\n <\/div>\n <div class=\"flex span\">主题<\/div>\n <div class=\"flex\">\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/nrhsyd\/yd\/refs\/heads\/main\/theme.json★6')\">NRHSYD<\/button>\n <\/div>\n <div class=\"flex span\">字典规则<\/div>\n <div class=\"flex\">\n <button onclick=\"setUrl('https:\/\/raw.githubusercontent.com\/nrhsyd\/yd\/refs\/heads\/main\/dict.json★8')\">NRHSYD<\/button>\n <\/div>\n <\/div>\n <\/div>\n <\/div>\n <script>\n const $ = (id) => document.getElementById(id);\n\n const urlEl = $('url');\n const path = $('path');\n const main = $('main');\n\n const showTip = (text) => {\n const tip = document.createElement(\"p\");\n tip.className = \"tip\";\n tip.textContent = text;\n document.body.appendChild(tip);\n setTimeout(() => tip.remove(), 2000);\n };\n\n const importUrl = () => {\n const url = urlEl.value;\n if (!url) return urlEl.focus();\n window.open(`yuedu:\/\/import\/${path.value}?src=` + encodeURIComponent(url));\n };\n\n const setUrl = (starSplit) => {\n const splitEl = starSplit.split('★');\n let newUrl = splitEl[0];\n if (\/^https:\\\/\\\/raw.githubusercontent.com\\\/\/i.test(newUrl)) newUrl = \"https:\/\/gitproxy.click\/\" + newUrl;\n urlEl.value = newUrl;\n path.selectedIndex = parseInt(splitEl[1]) || 0;\n main.open = true;\n urlEl.focus();\n showTip('请点击导入按钮');\n };\n\n const clearText = (button) => {\n button.nextElementSibling.value = \"\";\n path.selectedIndex = 0;\n showTip('清空成功');\n };\n\n const copyText = (button) => {\n const text = button.previousElementSibling.value;\n if (!text) return showTip('内容为空');\n navigator.clipboard.writeText(text)\n .then(() => showTip('复制成功'))\n .catch(() => showTip('复制失败'));\n };\n <\/script>\n <\/body>\n\n<\/html>\n{{}}\n@js:\nconst u = \"{{$.link}}\";\n\/^\\d+$\/.test(u) ? result.split('🔵')[u]: \"\";", "ruleImage": "$.img", "ruleLink": "$.link", "rulePubDate": "$.date", "ruleTitle": "$.title", "shouldOverrideUrlLoading": "if (\/s?q=\/.test(url)) {\n java.searchBook(java.toURL(url).searchParams.get('q').split(' ')[0]);\n 1;\n}", "singleUrl": false, "sortUrl": "工具::https:\/\/qq.com#1☆随心导入☆支持多种导入格式~★0☆写源助手☆会有用喔(大概)\n\n寻书::https:\/\/qq.com#https:\/\/quark.sm.cn\/api\/rest?method=Novelnew.home&format=html&schema=v2&cate=全部&rank=rank_hot&gender=male☆夸克热搜-小说☆什么野榜★https:\/\/www.qidiantu.com☆起点图☆养书要从幼苗抓起\n\n找源::https:\/\/qq.com#https:\/\/yckceo.vip☆源仓库☆好源很多的仓库★https:\/\/taoba.cf☆源社区☆好人很多的论坛★https:\/\/shuyuan.yiove.com☆Yiove 书源仓库☆书源收集★http:\/\/fabu.yihulove.top☆YX源仓库☆书源收集★https:\/\/legado.aoaostar.com☆@AOAOSTAR☆收集整理★http:\/\/yuedu.miaogongzi.net\/gx.html☆@喵公子☆收集整理★https:\/\/source.jwyihao.top☆@吉王义昊☆书源发布★https:\/\/skybook.pages.dev☆@明月照大江☆书源发布★https:\/\/qyyuapi.com☆@xiaohan231☆书源发布★https:\/\/yolo52.github.io\/Yuedu☆@Yolo☆书源发布★https:\/\/dashabi.tk☆@大灰狼☆书源发布★https:\/\/www.jingluo.love☆@鲸落☆书源发布★https:\/\/www.luoyacheng.ip-ddns.com☆@洛娅橙☆书源发布★http:\/\/www.qingtian618.com☆@晴天☆书源发布★http:\/\/www.yesui.me☆@情无羁☆书源发布★http:\/\/fb.shushan.vip:9999☆@书山☆书源发布★https:\/\/yuzhi.ip-ddns.com☆@遇知☆书源发布", "sourceComment": "", "sourceIcon": "data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0NDQiIGQ9Ik04LjQyMiAyMC42MThDMTAuMTc4IDIxLjU0IDExLjA1NiAyMiAxMiAyMlYxMkwyLjYzOCA3LjA3M2EzLjE5NiAzLjE5NiAwIDAgMC0uMDQuMDY3QzIgOC4xNTQgMiA5LjQxNyAyIDExLjk0MnYuMTE3YzAgMi41MjQgMCAzLjc4Ny41OTcgNC44MDFjLjU5OCAxLjAxNSAxLjY3NCAxLjU4IDMuODI1IDIuNzA5eiIvPjxwYXRoIGZpbGw9IiM0NDQiIGQ9Im0xNy41NzcgNC40MzJsLTItMS4wNUMxMy44MjIgMi40NjEgMTIuOTQ0IDIgMTIgMmMtLjk0NSAwLTEuODIyLjQ2LTMuNTc4IDEuMzgybC0yIDEuMDVDNC4zMTggNS41MzYgMy4yNDIgNi4xIDIuNjM4IDcuMDcyTDEyIDEybDkuMzYyLTQuOTI3Yy0uNjA2LS45NzMtMS42OC0xLjUzNy0zLjc4NS0yLjY0MSIgb3BhY2l0eT0iLjciLz48cGF0aCBmaWxsPSIjNDQ0IiBkPSJNMjEuNDAzIDcuMTRhMy4xNTMgMy4xNTMgMCAwIDAtLjA0MS0uMDY3TDEyIDEydjEwYy45NDQgMCAxLjgyMi0uNDYgMy41NzgtMS4zODJsMi0xLjA1YzIuMTUxLTEuMTI5IDMuMjI3LTEuNjkzIDMuODI1LTIuNzA4Yy41OTctMS4wMTQuNTk3LTIuMjc3LjU5Ny00Ljh2LS4xMTdjMC0yLjUyNSAwLTMuNzg4LS41OTctNC44MDIiIG9wYWNpdHk9Ii41Ii8+PC9zdmc+", "sourceName": "立方", "sourceUrl": "https:\/\/qq.com#立方", "style": "" }