网站整合
guaner写源工具整合
分享者: guaner001125 (317)发布时间: 4天前
◎我的常用◎ 【0、3、】《📝 | 一键导入》『洛娅橙一键导入【本地html】』 【0、2、】《📝 | 预览调试》『html网页预览调试【本地html】』 【0、1、】《📝 | 发现规则》『发现一键生成 | 正则替换【本地html】』 【https://legado.miaogongzi.net/legado/dy.html】《📝 | 喵公子》『阅读相关』 【https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIzMTc0NzE1MQ==&action=getalbum&album_id=1429936613618188289&scene=126#wechat_redirect】《📖 | 阅读教程》『阅读公众号』 【https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIzMTc0NzE1MQ==&action=getalbum&album_id=1337256947799916544&scene=126#wechat_redirect】《📖 | 阅读资源》 【http://www.yckceo.vip】《常用 | 源仓库》『源仓库发布页』 【https://www.jianguoyun.com】《必备 | 坚果云》『用来云备份』 【http://mail.qq.com】《登录 | QQ邮箱》 【http://gitee.com】《登录 | Gitee》 ◎在线工具◎ 【http://www.jsons.cn/reg/】《🛠️ | 正则替换》 【https://netcut.cn】《🛠️ | 网络剪切板》 【https://www.dejs.vip/2obfuscator】《🛠️ | DesJs》『Js反混淆 | Js格式化』 【https://www.51shizhi.com/tool/js-anti-obfuscate-io】《🛠️ | obfuscator.io反混淆》『Js反混淆 | Js格式化』 【https://tool.lu/】《🛠️ | 工具箱》 【https://ol.woobx.cn】《🛠️ | 一个木函》 【https://uutool.cn】《🛠️ | UU在线》 【http://24mail.chacuo.net】《📱 | 临时邮箱》 【https://rootsh.com/】《📱 | 十分钟邮箱》 【https://ykjtb.com/c】《🛠️ | 一块剪切板》 【https://note.ms】《🛠️ | note剪切板》 ◎教程资料◎ 【https://celetor.github.io/teachme】《📖 | 阅读3.0书源规则》『官方书源规则』 【https://www.w3school.com.cn】《📕 | W3school》『web相关学习 | html、css、js』 【https://jsoup.org/apidocs/org/jsoup/select/Selector.html】《📕 | Jsoup Selector》『类似CSS选择器 | 阅读可以用的语法@css:开头』 【https://www.cnblogs.com/wynjauu/articles/9556396.html】《📕 | JsonPath教程》『阅读可以用的语法 @json:或 $.开头』 【https://www.runoob.com/xpath/xpath-syntax.html】《📕 | XPath相关》『阅读可以用的语法 @XPath:或 //开头』 【https://www.bilibili.com/video/BV1z56iY6EB8?p=4】《📕 | Js基础语法参考视频》『P4-P27为Js语法,也就是2-01至6-04』 【https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types】《📕 | JavaScript指南》『Js语法』
{ "articleStyle": 1, "customOrder": 0, "enableJs": true, "enabled": true, "enabledCookieJar": true, "header": "{\n \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"\n}", "jsLib": "function bDe(data){\n\tconst {java} = this;\n\treturn java.base64Decode(data.match(\/base64,(.*?),\/)[1])\n\t}", "lastUpdateTime": 0, "loadWithBaseUrl": true, "loginUi": "◎分类1◎\n【序号或链接】《列表名称》@图片链接@『简介』\n------------------\n◎分类2◎\n【序号或链接】《列表名称》@图片链接@『简介』\n❗️0、2、开始❗️\n\n❗️0、2、结束❗️", "ruleArticles": "<js>\njson=[];\nlistStr = bDe(baseUrl);\nlist=listStr.split('\\n');\nfor(i = 0;i<list.length;i++){\n\tlet index =\/【(.*?)】\/.test(list[i])?list[i].match(\/【(.*?)】\/)[1]:\"\";\n\tlet src = \/@(.*?)@\/.test(list[i])?list[i].match(\/@(.*?)@\/)[1]:\"\";\n\tlet text = \/《(.*?)》\/.test(list[i])?list[i].match(\/《(.*?)》\/)[1]:\"\";\n\tlet intro = \/『(.*?)』\/.test(list[i])?list[i].match(\/『(.*?)』\/)[1]:\"\";\tjson.push({index:index,src:src,text:text,intro:intro})\n\t}\nJSON.stringify(json)<\/js>\n$.[*]", "ruleDescription": "❗️0、2、开始❗️\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>代码预览工具<\/title>\n <style>\n body {\n font-family: Arial, sans-serif;\n margin: 0;\n padding: 10px;\n background-color: #f9f9f9;\n }\n h1 {\n font-size: 20px;\n margin: 0 0 10px 0;\n color: #333;\n }\n h2 {\n font-size: 16px;\n margin: 0 0 8px 0;\n color: #555;\n }\n .container {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .code-input, .preview {\n width: 100%;\n }\n .code-wrapper {\n display: flex;\n gap: 10px;\n }\n .line-numbers {\n width: 30px;\n padding: 8px 0;\n font-family: monospace;\n font-size: 14px;\n text-align: right;\n color: #888;\n background-color: #f0f0f0;\n border: 1px solid #ccc;\n border-radius: 4px;\n box-sizing: border-box;\n user-select: none;\n overflow-y: hidden;\n height: 150px;\n }\n textarea {\n width: 100%;\n height: 150px;\n padding: 8px;\n font-family: monospace;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 4px;\n box-sizing: border-box;\n line-height: 1.5;\n resize: none;\n overflow-y: auto;\n }\n .preview {\n border: 1px solid #ccc;\n padding: 10px;\n border-radius: 4px;\n background-color: #fff;\n }\n .console {\n margin-top: 10px;\n padding: 8px;\n background-color: #000;\n color: #fff;\n font-family: monospace;\n font-size: 12px;\n border-radius: 4px;\n height: 80px;\n overflow-y: auto;\n box-sizing: border-box;\n }\n button {\n margin-top: 8px;\n padding: 8px 16px;\n font-size: 14px;\n background-color: #007bff;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n }\n button:hover {\n background-color: #0056b3;\n }\n .preview-output {\n height: 400px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background-color: #fff;\n overflow: auto;\n box-sizing: border-box;\n padding: 10px;\n }\n .button-group {\n display: flex;\n gap: 10px;\n align-items: center;\n }\n .tab-group {\n display: flex;\n gap: 10px;\n margin-bottom: 10px;\n }\n .tab-button {\n padding: 8px 16px;\n font-size: 14px;\n background-color: #f0f0f0;\n color: #333;\n border: 1px solid #ccc;\n border-radius: 4px;\n cursor: pointer;\n }\n .tab-button.active {\n background-color: #007bff;\n color: white;\n border-color: #007bff;\n }\n .code-input {\n display: none;\n }\n .code-input.active {\n display: block;\n }\n .preview-content {\n display: none;\n }\n .preview-content.active {\n display: block;\n }\n .mode-switch {\n margin-top: 10px;\n }\n <\/style>\n<\/head>\n<body>\n <div class=\"container\">\n <div class=\"preview\">\n <h2>控制台输出<\/h2>\n <div id=\"consoleOutput\" class=\"console\"><\/div>\n <\/div>\n <div class=\"code-input active\">\n \n <div class=\"tab-group\">\n <button class=\"tab-button active\" onclick=\"switchTab('previewTab')\">预览代码<\/button>\n <button class=\"tab-button\" onclick=\"switchTab('debugTab')\">调试 JS<\/button>\n <button class=\"tab-button\" onclick=\"switchTab('injectTab')\">注入 JS<\/button>\n <button onclick=\"clearConsole()\">清除控制台<\/button>\n <\/div>\n \n <div class=\"code-wrapper\">\n <div id=\"lineNumbers\" class=\"line-numbers\">1<\/div>\n <textarea id=\"codeInput\" placeholder=\"请输入 HTML、CSS 或 JavaScript 代码...\" oninput=\"updateLineNumbers()\" onscroll=\"syncLineNumbers()\"><\/textarea>\n <\/div>\n \n <div class=\"button-group\">\n <button id=\"previewButton\" onclick=\"previewCode()\">确认<\/button>\n <button id=\"debugButton\" onclick=\"debugJS()\" style=\"display: none;\">调试<\/button>\n <button id=\"injectButton\" onclick=\"injectJS()\" style=\"display: none;\">注入<\/button>\n <button onclick=\"switchMode('code')\">代码<\/button>\n <button onclick=\"switchMode('url')\">网址<\/button>\n <button onclick=\"switchPreview('preview')\">预览<\/button>\n <button onclick=\"switchPreview('source')\">源码<\/button>\n <button onclick=\"clearCode()\">清除<\/button>\n <\/div>\n \n <\/div>\n\n\n <div class=\"preview\">\n <div id=\"previewOutput\" class=\"preview-content active preview-output\"><\/div>\n <div id=\"sourceCodeOutput\" class=\"preview-content preview-output\"><\/div>\n <\/div>\n <\/div>\n\n <script>\n \/\/ 数据存储\n var codeData = {\n preview: '',\n debug: '',\n inject: ''\n };\n\n \/\/ 当前选中的标签\n var currentTab = 'previewTab';\n\n \/\/ 当前模式(代码模式或网址模式)\n var currentMode = 'code';\n\n \/\/ 切换标签\n function switchTab(tab) {\n currentTab = tab;\n\n \/\/ 更新按钮状态\n document.querySelectorAll('.tab-button').forEach(button => button.classList.remove('active'));\n document.querySelector(`.tab-button[onclick=\"switchTab('${tab}')\"]`).classList.add('active');\n\n \/\/ 显示对应的输入框和按钮\n var codeInput = document.getElementById('codeInput');\n var previewButton = document.getElementById('previewButton');\n var debugButton = document.getElementById('debugButton');\n var injectButton = document.getElementById('injectButton');\n\n if (tab === 'previewTab') {\n codeInput.value = codeData.preview;\n previewButton.style.display = 'inline-block';\n debugButton.style.display = 'none';\n injectButton.style.display = 'none';\n } else if (tab === 'debugTab') {\n codeInput.value = codeData.debug;\n previewButton.style.display = 'none';\n debugButton.style.display = 'inline-block';\n injectButton.style.display = 'none';\n } else if (tab === 'injectTab') {\n codeInput.value = codeData.inject;\n previewButton.style.display = 'none';\n debugButton.style.display = 'none';\n injectButton.style.display = 'inline-block';\n }\n\n \/\/ 更新行号\n updateLineNumbers();\n }\nfunction clearCode(){\nif (currentTab === 'previewTab') {\n codeData.preview = \"\"\n codeInput.value = \"\";\n } else if (currentTab === 'debugTab') {\n codeData.debug = \"\";\n codeInput.value = \"\"\n \n } else if (currentTab === 'injectTab') {\n codeData.inject =\"\";\n codeInput.value = \"\";\n }\n\n}\n \/\/ 更新行号\n function updateLineNumbers() {\n var codeInput = document.getElementById('codeInput');\n var lineNumbers = document.getElementById('lineNumbers');\n var lines = codeInput.value.split('\\n').length;\n lineNumbers.innerHTML = Array.from({ length: lines }, (_, i) => i + 1).join('<br>');\n\n \/\/ 保存当前输入框的数据\n if (currentTab === 'previewTab') {\n codeData.preview = codeInput.value;\n } else if (currentTab === 'debugTab') {\n codeData.debug = codeInput.value;\n } else if (currentTab === 'injectTab') {\n codeData.inject = codeInput.value;\n }\n }\n\n \/\/ 同步行号滚动\n function syncLineNumbers() {\n var codeInput = document.getElementById('codeInput');\n var lineNumbers = document.getElementById('lineNumbers');\n lineNumbers.scrollTop = codeInput.scrollTop;\n }\n\n \/\/ 捕获本页面的 console 输出\n var consoleOutput = document.getElementById('consoleOutput');\n var originalConsole = {\n log: console.log,\n error: console.error,\n warn: console.warn,\n info: console.info,\n };\n\n function captureConsole(type) {\n return function () {\n \/\/ 将输出保存到控制台输出区域\n var message = Array.from(arguments).join(' ');\n var logElement = document.createElement('div');\n logElement.textContent = `[${type}] ${message}`;\n consoleOutput.appendChild(logElement);\n\n \/\/ 调用原始的 console 方法\n originalConsole[type].apply(console, arguments);\n };\n }\n\n \/\/ 重写本页面的 console 方法\n console.log = captureConsole('log');\n console.error = captureConsole('error');\n console.warn = captureConsole('warn');\n console.info = captureConsole('info');\n\n \/\/ 预览代码\n function previewCode() {\n if (currentMode === 'code') {\n \/\/ 获取用户输入的代码\n var code = codeData.preview;\n\n \/\/ 清空预览区域\n var previewOutput = document.getElementById('previewOutput');\n previewOutput.innerHTML = '';\n\n \/\/ 移除所有 <a> 标签的 target=\"_blank\" 属性\n code = code.replace(\/<a\\s+([^>]*)\\s*target=\"_blank\"\\s*([^>]*)>\/gi, '<a $1 $2>');\n\n \/\/ 创建一个 iframe 来隔离代码环境\n var iframe = document.createElement('iframe');\n iframe.style.width = '100%';\n iframe.style.height = '100%';\n iframe.style.border = 'none';\n previewOutput.appendChild(iframe);\n\n \/\/ 捕获 iframe 的 console 输出\n var iframeWindow = iframe.contentWindow;\n iframeWindow.console.log = captureConsole('log');\n iframeWindow.console.error = captureConsole('error');\n iframeWindow.console.warn = captureConsole('warn');\n iframeWindow.console.info = captureConsole('info');\n\n \/\/ 将处理后的代码写入 iframe\n var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;\n iframeDoc.open();\n iframeDoc.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n ${code.includes('<style>') ? '' : 'body { margin: 0; padding: 0; }'}\n <\/style>\n <\/head>\n <body>\n ${code}\n <script>\n ${code.includes('<script>') ? '' : ''}\n <\\\/script>\n <\/body>\n <\/html>\n `);\n iframeDoc.close();\n\n \/\/ 显示源码\n updateSourceCode(iframeDoc.documentElement.outerHTML);\n } else if (currentMode === 'url') {\n \/\/ 加载网址\n var url = codeData.preview.trim();\n if (!url) {\n console.error('请输入网址。');\n return;\n }\n\n \/\/ 清空预览区域\n var previewOutput = document.getElementById('previewOutput');\n previewOutput.innerHTML = '';\n\n \/\/ 创建一个 iframe 来加载网址\n var iframe = document.createElement('iframe');\n iframe.style.width = '100%';\n iframe.style.height = '100%';\n iframe.style.border = 'none';\n previewOutput.appendChild(iframe);\n\n \/\/ 捕获 iframe 的 console 输出\n var iframeWindow = iframe.contentWindow;\n iframeWindow.console.log = captureConsole('log');\n iframeWindow.console.error = captureConsole('error');\n iframeWindow.console.warn = captureConsole('warn');\n iframeWindow.console.info = captureConsole('info');\n\n \/\/ 加载网址\n iframe.src = url;\n\n \/\/ 显示源码\n iframe.onload = function () {\n var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;\n updateSourceCode(iframeDoc.documentElement.outerHTML);\n };\n }\n }\n\n \/\/ 更新源码预览\n function updateSourceCode(source) {\n var sourceCodeOutput = document.getElementById('sourceCodeOutput');\n sourceCodeOutput.textContent = source;\n }\n\n \/\/ 调试 JS 函数\n function debugJS() {\n var code = codeData.debug;\n\n try {\n \/\/ 使用 eval 执行 JavaScript 代码\n eval(code);\n } catch (error) {\n \/\/ 捕获错误并解析行号\n var errorLine = error.stack.match(\/<anonymous>:(\\d+):\\d+\/);\n if (errorLine) {\n console.error(`调试失败,第 ${errorLine[1]} 行:${error.message}`);\n } else {\n console.error('调试失败:', error);\n }\n }\n }\n\n \/\/ 注入 JS 到 iframe\n function injectJS() {\n var code = codeData.inject;\n var iframe = document.querySelector('#previewOutput iframe');\n\n if (!iframe) {\n console.error('请先点击“确认预览”创建 iframe。');\n return;\n }\n\n try {\n \/\/ 获取 iframe 的 window 对象\n var iframeWindow = iframe.contentWindow;\n\n \/\/ 在 iframe 中执行 JavaScript 代码\n iframeWindow.eval(code);\n\n \/\/ 更新源码预览\n var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;\n updateSourceCode(iframeDoc.documentElement.outerHTML);\n } catch (error) {\n console.error('注入 JS 失败:', error);\n }\n }\n\n \/\/ 切换预览效果和源码预览\n function switchPreview(type) {\n var previewOutput = document.getElementById('previewOutput');\n var sourceCodeOutput = document.getElementById('sourceCodeOutput');\n\n if (type === 'preview') {\n previewOutput.classList.add('active');\n sourceCodeOutput.classList.remove('active');\n } else if (type === 'source') {\n previewOutput.classList.remove('active');\n sourceCodeOutput.classList.add('active');\n }\n }\n\n \/\/ 切换模式(代码模式或网址模式)\n function switchMode(mode) {\n currentMode = mode;\n var codeInput = document.getElementById('codeInput');\n\n if (mode === 'code') {\n codeInput.placeholder = '请输入 HTML、CSS 或 JavaScript 代码...';\n } else if (mode === 'url') {\n codeInput.placeholder = '输入网址,例如:https:\/\/example.com';\n }\n }\n\n \/\/ 清除控制台\n function clearConsole() {\n var consoleOutput = document.getElementById('consoleOutput');\n consoleOutput.innerHTML = '';\n }\n\n \/\/ 默认显示预览标签\n switchTab('previewTab');\n <\/script>\n<\/body>\n<\/html>\n\n❗️0、2、结束❗️\n\n\n❗️0、3、开始❗️\n<html lang=\"zh-CN\">\n\n<head>\n <meta charset=\"utf-8\">\n <title>阅读导入<\/title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n <meta name=\"description\" content=\"洛娅橙,开源阅读软件,书源、订阅源、字典、净化等json、txt文件导入,小说书籍地址导入,base64,链接净化,精华规则。\">\n <style>\n :root {\n --back-color: #fffbf0;\n --font-color: black;\n }\n\n @media (prefers-color-scheme: dark) {\n :root {\n --back-color: #1a1a1a;\n --font-color: white;\n }\n }\n\n html {\n background-color: var(--back-color);\n color: var(--font-color);\n }\n\n .hidden {\n display: none;\n }\n\n body {\n display: flex;\n flex-direction: column;\n align-items: center;\n min-height: 80vh;\n }\n\n textarea {\n font-size: 12px;\n color: var(--font-color);\n width: 96%;\n margin: 16px 2%;\n padding: 8px;\n background-color: rgba(80, 155, 84, 0.1);\n border-radius: 10px;\n border: 2px solid rgba(76, 175, 80, 0.3);\n }\n\n textarea:focus {\n border-color: rgb(76, 175, 80);\n outline: none;\n box-shadow: 0 0 8px rgba(255, 107, 107, 0.3);\n }\n\n button {\n user-select: none;\n color: white;\n border: none;\n border-radius: 4px;\n height: 40px;\n width: 80px;\n overflow: hidden;\n transition: 0.3s;\n font-size: 16px;\n }\n\n .an-s {\n transform: scale(0.8);\n }\n\n #btn1 {\n background-color: rgba(76, 175, 80, 0.9);\n }\n\n #btn2 {\n background-color: rgba(175, 76, 80, 0.9);\n }\n\n #btn3 {\n background-color: rgba(76, 80, 175, 0.9);\n }\n <\/style>\n<\/head>\n\n<body>\n <h1 class=\"hidden\">在线导入-洛娅橙<\/h1>\n <textarea id=\"copyt\" rows=\"9\" placeholder=\"在这里填写链接\n支持书源、订阅源、净化、字典等json或txt文件\n支持书籍网址(需要有对应的书源)\n支持data或base64加密链接\"><\/textarea>\n <br>\n <button id=\"btn1\" onclick=\"copy(1)\">导入<\/button>\n <br>\n <button id=\"btn2\" onclick=\"cleart()\">清空<\/button>\n <br>\n <button id=\"btn3\" onclick=\"copy(3)\">净化<\/button>\n <script>\n function copy(x) {\n const btn = document.getElementById('btn' + x);\n btn.classList.add('an-s');\n const cpt = document.getElementById(\"copyt\");\n let url = cpt.value;\n if (\/[删除去消].*(?:[删除去掉].*[中汉我]|汉.*字|中.*文|文.*字)\/.test(url)) url = url.replace(\/[abphm]站|[一-ꀀ]\/g, '');\n url = url.replace(\/[\\s一-ꀀ,。?!;…“‘、’”]+$\/, '').replace(\/\\s+|(?:\\p{Emoji_Presentation}|\\p{Emoji}[\\uFE0F\\u200d]+)+|\\[(?:酷币|受虐滑稽|微笑|哈哈哈|呵呵|呲牙|可爱|可怜|皱眉|惊讶|微笑|坏笑|流泪|抱拳|色|强|doge笑哭|doge原谅ta|旺财|OK)\\]\/giu, '').replace(\/(\\\/.+\\.(?:json|txt|zip))(?:[^\\\/\\?\\-\\_\\.][\\S\\s]*)$\/, '$1').replace(\/^[\\S\\s]+?(?=https?:)\/i, '').replace(\/\\u0026\/g, '%26');\n if (url.startsWith('data:')) url = atob(url.match(\/^[^,]+,([^\\s,]+)\/)[1]);\n else if (\/^[\\da-z\\+\\\/]{2,}=*$\/i.test(url)) url = atob(url);\n setTimeout(() => {\n btn.classList.remove('an-s');\n }, 500);\n if (url == '') { alert('请输入内容'); return }\n if (\/^https?\\:\/i.test(url) && x == 1) {\n if (\/\\\/.+\\.(?:json|txt)\/i.test(url)) {\n window.location.href = 'legado:\/\/import\/Source?src=' + url;\n }\n else if (\/\\\/.+\\.(?:zip)\/i.test(url)) {\n window.location.href = 'legado:\/\/import\/bookSource?src=' + url;\n }\n else {\n window.location.href = 'legado:\/\/import\/addToBookshelf?src=' + url;\n }\n }\n else if (x == 3) { cpt.value = url; }\n else alert('链接格式错误');\n }\n function cleart() {\n const btn = document.getElementById('btn2');\n btn.classList.add('an-s');\n const cpt = document.getElementById(\"copyt\");\n setTimeout(() => {\n btn.classList.remove('an-s');\n }, 300);\n cpt.value = '';\n }\n <\/script>\n<\/body>\n\n<\/html>\n❗️0、3、结束❗️\n\n\/\/发现规则\n❗️0、1、开始❗️\n <script>\n function $(selector) {\n return document.querySelector(selector);\n }\n\n function $$(selector) {\n return document.querySelectorAll(selector);\n }\n<\/script>\n<style>\n button,\n input {\n margin: 5px\n }\n\n #basic-addon1,\n #replaceSpan1 {\n background-color: Azure;\n padding: 3px\n }\n\n button,\n input[type=\"button\"] {\n outline: none;\n height: 30px;\n box-shadow: 2px 1px #CFD8DC;\n background: #fff;\n border: 1px solid #607D8B;\n border-radius: 6px;\n }\n\n textarea {\n background-color: GhostWhite;\n border: 0px solid black;\n width: 100%\n }\n\n .bt1,\n .bt4 {\n background: #fff;\n width: 29%;\n border: 1px solid green;\n border-radius: 10px;\n }\n\n #bt4:active,\n #bt2:active,\n #bt3:active {\n background: #CFD8DC\n }\n\n #bt4,\n #bt2,\n #bt3 {\n background: #fff;\n width: 100%;\n border: 1px solid #607D8B;\n border-radius: 6px;\n }\n\n button:active,\n input[type=\"button\"]:active {\n background: #C8E6C9\n }\n\n #success {\n text-align: center;\n border: 1px solid green;\n position: fixed;\n left: 40%;\n width: 20%;\n background: #fff;\n border-radius: 5px;\n display: none;\n top: 2px;\n box-shadow: 2px 1px 3px #CFD8DC;\n }\n\n #pageclass,\n #pageclass2 {\n width: 100%\n }\n\n .pageclass {\n font-size: 10px\n }\n<\/style>\n<a href=\"https:\/\/www.sojson.com\/rehtml\">html转义<\/a> <a href=\"http:\/\/www.jsons.cn\/urlencode\/\">URL解码<\/a>\n<textarea rows=\"23\" id=\"input\" onfocus=\"di()\" placeholder=\"输入带html标签的发现内容\"><\/textarea>\n<button onclick=\"getInput();dis()\" class=\"bt1\">格式化发现[旧]<\/button>\n<button onclick=\"getInput2();dis()\" class=\"bt1\">格式化发现[新]<\/button>\n<button onclick=\"getInput3();\" class=\"bt1\">发现格式互转<\/button>\n<button onclick=\"getInput4(1);\" id=\"bt4\">(新发现)改样式先点这个<\/button>\n<button onclick=\"getInput4(2,1);\" class=\"bt4\">一排一个<\/button>\n<button onclick=\"getInput4(2,2);\" class=\"bt4\">一排两个<\/button>\n<button onclick=\"getInput4(2,3);\" class=\"bt4\">一排三个<\/button>\n<button onclick=\"getInput4(2,4);\" class=\"bt4\">一排四个<\/button>\n<button onclick=\"copyText()\" id=\"bt2\">一键复制<\/button>\n<button onclick=\"formatJson()\" id=\"bt3\">格式化Json<\/button>\n<div class=\"pageclass\">输入分类里的链接,如: \/sort\/xuanhuan\/ 写成 \/sort\/分类\/ <\/div>\n<input id=\"pageclass\">\n<div class=\"pageclass\">输入带有翻页的链接,如: \/sort\/xuanhuan\/2.html 写成 \/sort\/分类\/页码.html <\/div>\n<input id=\"pageclass2\">\n<div class=\"pageclass\"> 第一页跟第二页不一样? 输入不一样的部分(第二页比第一页多出来的部分) 如 index_页码.html <\/div>\n<input id=\"pageclass3\">\n<button onclick=\"okpage()\">确认加入翻页(仅旧发现)<\/button>\n<p id=\"success\">复制成功!<\/p><br><br><br>\n<p>正则表达式匹配替换<\/p>\n<div class=\"form-group\">\n <div class=\"col-sm-12\">\n <textarea class=\"form-control\" onmouseover=\"this.focus();\" id=\"textSour\" name=\"textSour\" rows=\"10\" style=\"max-height: 2222px;\" placeholder=\"请输入要验证的文本\"><\/textarea>\n <\/div>\n<\/div>\n<div class=\"form-group\">\n <div class=\"col-sm-12\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\" id=\"basic-addon1\">正则表达式<\/span>\n <input type=\"text\" class=\"form-control\" id=\"textPattern\" name=\"textPattern\" placeholder=\"请输入自定义正则表达式 例如:\\d{6}\" aria-describedby=\"basic-addon1\" style=\"width: 65%;\">\n <\/div>\n <\/div>\n<\/div>\n<div class=\"form-group\">\n <div class=\"col-sm-2\">\n <div class=\"input-group\" style=\"margin-left: 20px;\">\n <label class=\"checkbox\" style=\"cursor: pointer;\">\n <input type=\"checkbox\" value=\"global\" checked=\"checked\" id=\"optionGlobal\" name=\"optionGlobl\">全局搜索<\/label>\n <\/div>\n <\/div>\n <div class=\"col-sm-2\">\n <div class=\"input-group\" style=\"margin-left: 20px;\">\n <label class=\"checkbox\" style=\"cursor: pointer;\">\n <input type=\"checkbox\" value=\"ignoreCase\" id=\"optionIgnoreCase\" name=\"optionIgnoreCase\">忽略大小写<\/label>\n <\/div>\n <\/div>\n <div class=\"col-sm-8\">\n <input type=\"button\" onclick=\"return onMatch();\" value=\"验证匹配内容\" class=\"btn btn-success\">\n <input type=\"button\" onclick=\"Empty();\" value=\"清空输入框\" class=\"btn btn-danger\">\n <button onclick=\"copyText3()\">一键复制<\/button>\n <\/div>\n<\/div>\n<div class=\"form-group\">\n <div class=\"col-sm-12\">\n <div id=\"textResult\"><\/div>\n <textarea onmouseover=\"this.focus();\" id=\"textMatchResult\" class=\"form-control\" rows=\"10\" style=\"max-height: 2222px;\" placeholder=\"得到验证后内容,内容为空为验证失败\" readonly=\"readonly\"><\/textarea>\n <\/div>\n<\/div>\n<div class=\"form-group\">\n <div class=\"col-sm-4\">\n <div class=\"input-group\" style=\"width: 98%;\">\n <span class=\"input-group-addon\" id=\"replaceSpan1\">替换文本<\/span>\n <input type=\"text\" class=\"form-control\" id=\"textReplace\" name=\"textReplace\" placeholder=\"请输入替换内容\" aria-describedby=\"replaceSpan1\" style=\"width: 70%;\">\n <button value=\"{\\{page}}\" onclick=\"pp(this.value)\">page<\/button>\n <button value=\"$\" onclick=\"pp(this.value)\">$<\/button>\n <button value=\"'\" onclick=\"pp(this.value)\">'<\/button>\n <button value=\"\/\" onclick=\"pp(this.value)\">\/<\/button>\n <button value=\"_\" onclick=\"pp(this.value)\">_<\/button>\n <button value=\"-\" onclick=\"pp(this.value)\">-<\/button>\n <\/div>\n <\/div>\n <div class=\"col-sm-2\">\n <div class=\"input-group\">\n <button onclick=\"return onReplace()\" class=\"btn btn-success\">替换匹配内容<\/button>\n <button onclick=\"copyText2()\">一键复制<\/button>\n <\/div>\n <\/div>\n <div class=\"col-sm-6\">\n <\/div>\n<\/div>\n<div class=\"form-group\">\n <div class=\"col-sm-12\">\n <textarea readonly=\"readonly\" id=\"textReplaceResult\" class=\"form-control\" rows=\"10\" placeholder=\"此处为替换后内容\"><\/textarea>\n <\/div>\n<\/div>\n<\/form>\n<\/div>\n<\/div>\n<script>\n var copyText = function() {\n var text = document.getElementById('input');\n \/\/ 选中文本\n text.select()\n \/\/ 复制\n document.execCommand('copy')\n text.blur()\n $(\"#success\").style.display = \"block\";\n setTimeout(function() {\n $(\"#success\").style.display = \"none\";\n }, 500)\n }\n var copyText2 = function() {\n var text = document.getElementById('textReplaceResult');\n \/\/ 选中文本\n text.select()\n \/\/ 复制\n document.execCommand('copy')\n text.blur()\n $(\"#success\").style.display = \"block\";\n setTimeout(function() {\n $(\"#success\").style.display = \"none\";\n }, 500)\n }\n var copyText3 = function() {\n var text = document.getElementById('textMatchResult');\n \/\/ 选中文本\n text.select()\n \/\/ 复制\n document.execCommand('copy')\n text.blur()\n $(\"#success\").style.display = \"block\";\n setTimeout(function() {\n $(\"#success\").style.display = \"none\";\n }, 500)\n }\n<\/script>\n<script>\n function pp(a) {\n b = a.replace(\/\\\\\/, '');\n $(\"#textReplace\").value += b;\n $(\"#textReplace\").focus()\n }\n\n function dis() {\n document.getElementById(\"bt1\").disabled = true;\n document.getElementById(\"bt2\").disabled = true\n }\n\n function di() {\n document.getElementById(\"bt1\").disabled = false;\n document.getElementById(\"bt2\").disabled = false\n }\n\n function parseToDOM(str) {\n var div = document.createElement(\"div\");\n if (typeof str == \"string\") div.innerHTML = str;\n return div.querySelectorAll(\"a\");;\n }\n\n function okpage() {\n pageclass = $(\"#pageclass\").value.replace(\/(\\+|\\?)\/g, '\\\\$1');\n pageclass = pageclass.replace(\/分类$\/g, '(.*)').replace(\/分类(?!$)\/g, '(.*?)');\n reg = new RegExp(pageclass)\n pageclass2 = $(\"#pageclass2\").value;\n html = $(\"#input\").value;\n pageclass2 = pageclass2.replace(\/页码\/g, '{\\{page}}');\n pageclass3 = $(\"#pageclass3\").value.replace(\/(\\+|\\?)\/g, '\\\\$1').replace(\/页码\/, '{\\{page}}')\n h = \"\";\n if (html.match(\/::\/) && pageclass != \"\" && pageclass2 != \"\" && !\/{\\{page}}\/.test(html)) {\n list = html.split(\/\\n|&&\/);\n for (i in list) {\n if (list[i].match(\/::\/)) {\n text = list[i].match(\/(.*?)::\/)[1];\n href = list[i].match(\/::(.*)\/)[1]\n if (href.match(reg)) {\n href = pageclass2.replace(\/分类\/g, href.match(reg)[1])\n } else {\n href = href\n }\n h += text + \"::\" + href + \"\\n\"\n }\n }\n $(\"#input\").value = h\n }\n html = $(\"#input\").value\n if (pageclass3 != \"\" && !\/<,.*?>\/.test(html)) {\n reg = new RegExp(\"(\" + pageclass3 + \")\", 'g');\n $(\"#input\").value = html.replace(reg, '<,$1>')\n }\n }\n\n function getInput() {\n var str = $(\"#input\").value;\n var list = parseToDOM(str);\n if (list.length == 0) {\n $(\"#input\").placeholder = \"格式化失败!!!请检查是否为带html标签的文本\"\n } else {\n var html = \"\";\n for (let i = 0; i < list.length; i++) {\n let text = list[i].innerText;\n let href = list[i].getAttribute(\"href\");\n html += text + \"::\" + href + \"\\n\"\n }\n $(\"#pageclass\").value = html.match(\/.*?::(.*?)\\n\/)[1];\n $(\"#input\").value = html\n }\n }\n\n function getInput2() {\n var str = $(\"#input\").value;\n var list = parseToDOM(str);\n if (list.length == 0) {\n $(\"#input\").placeholder = \"格式化失败!!!请检查是否为带html标签的文本\"\n } else {\n var html = [];\n for (let i = 0; i < list.length; i++) {\n let text = list[i].innerText;\n let href = list[i].getAttribute(\"href\");\n html.push({\n title: text,\n url: href\n })\n }\n $(\"#input\").value = JSON.stringify(html)\n }\n }\n\n function getInput3() {\n text = $(\"#input\").value;\n if (text.match(\/\\&\\&|::\/g)) {\n text = text.replace(\/\\&\\&\/g, '\\n');\n list = text.match(\/.*::.*\/g);\n html = [];\n for (i = 0; i < list.length; i++) {\n l = list[i].match(\/(.*)::(.*)\/);\n title = l[1];\n url = l[2]\n html.push({\n title: title,\n url: url\n })\n }\n $(\"#input\").value = JSON.stringify(html)\n } else {\n html = \"\";\n json = eval(text);\n for (i in json) {\n html += json[i].title + \"::\" + json[i].url + \"\\n\"\n }\n $(\"#input\").value = html\n }\n }\n\n function getInput4(flag, x) {\n text = $(\"#input\").value;\n if (flag == 1) {\n json = JSON.parse(text);\n for (i in json) {\n json[i].style = {}\n json[i].style.layout_flexGrow = 1\n }\n } else if (flag == 2) {\n data = {\n 1: 1,\n 2: 0.4,\n 3: 0.25,\n 4: 0.2\n }\n json = JSON.parse(text);\n for (i in json) {\n json[i].style.layout_flexBasisPercent = data[x]\n }\n }\n $(\"#input\").value = JSON.stringify(json)\n }\n\n function setVisible(idElement, visible) {\n var obj = document.getElementById(idElement);\n obj.style.visibility = visible ? \"visible\" : \"hidden\";\n }\n\n function isValidFields() {\n var textSour = document.getElementById(\"textSour\");\n if (null == textSour.value || textSour.value.length < 1) {\n textSour.focus();\n JsonsMessageBox($(\"#textSour\"), \"请输入待匹配文本\");\n return false;\n }\n var textPattern = document.getElementById(\"textPattern\");\n if (null == textPattern.value || textPattern.value.length < 1) {\n textPattern.focus();\n JsonsMessageBox($(\"#textPattern\"), \"请输入正则表达式\");\n return false;\n }\n return true;\n }\n\n function buildRegex() {\n var op = \"\";\n if (document.getElementById(\"optionGlobal\").checked) op = \"g\";\n if (document.getElementById(\"optionIgnoreCase\").checked) op = op + \"i\";\n return new RegExp(document.getElementById(\"textPattern\").value, op);\n }\n\n function onMatch() {\n if (!isValidFields()) return false;\n document.getElementById(\"textMatchResult\").value = \"\";\n var regex = buildRegex();\n var result = document.getElementById(\"textSour\").value.match(regex);\n if (null == result || 0 == result.length) {\n document.getElementById(\"textMatchResult\").value = \"(没有匹配)\";\n return false;\n }\n if (document.getElementById(\"optionGlobal\").checked) {\n var re = \"\";\n var strResult = \"共找到 \" + result.length + \" 处匹配:\\r\\n\";\n document.getElementById(\"textResult\").innerText = strResult;\n for (var i = 0; i < result.length; ++i) {\n re += result[i] + \"\\r\\n\";\n }\n document.getElementById(\"textMatchResult\").value = re;\n } else {\n document.getElementById(\"textMatchResult\").value = \"匹配位置:\" + regex.lastIndex + \"\\r\\n匹配结果:\" + result[0];\n }\n return true;\n }\n\n function onReplace() {\n var str = document.getElementById(\"textSour\").value;\n var regex = buildRegex();\n document.getElementById(\"textReplaceResult\").value = str.replace(regex, document.getElementById(\"textReplace\").value);\n }\n\n function reset() {\n $(\"#textSour\").value = \"\";\n $(\"#textPattern\").value = \"\";\n $(\"#textMatchResult\").value = \"\";\n $(\"#textReplace\").value = \"\";\n $(\"#textReplaceResult\").value = \"\";\n }\n $(\"#regCommon a\").click(function() {\n $(\"#textPattern\").val($(this).attr(\"t\"));\n onMatch();\n });\n\n function Empty() {\n $(\"#textSour\").value = \"\";\n $(\"#textMatchResult\").value = \"\";\n $(\"#textReplace\").value = \"\";\n $(\"#textReplaceResult\").value = \"\";\n $(\"#textSour\").select();\n }\n \n\n\/\/ 格式方法\n\/\/ 公共方法\nfunction transitionJsonToString (jsonObj, callback) {\n\t\/\/ 转换后的jsonObj受体对象\n\tvar _jsonObj = null;\n\t\/\/ 判断传入的jsonObj对象是不是字符串,如果是字符串需要先转换为对象,再转换为字符串,这样做是为了保证转换后的字符串为双引号\n\tif (Object.prototype.toString.call(jsonObj) !== \"[object String]\") {\n\t\ttry {\n\t\t\t_jsonObj = JSON.stringify(jsonObj);\n\t\t} catch (error) {\n\t\t\t\/\/ 转换失败错误信息\n\t\t\talert('您传递的json数据格式有误,请核对...');\n\t\t\talert(error);\n\t\t\tcallback(error);\n\t\t}\n\t} else {\n\t\ttry {\n\t\t\tjsonObj = jsonObj.replace(\/(\\')\/g, '\\\"');\n\t\t\t_jsonObj = JSON.stringify(JSON.parse(jsonObj));\n\t\t} catch (error) {\n\t\t\t\/\/ 转换失败错误信息\n\t\t\talert('您传递的json数据格式有误,请核对...');\n\t\t\talert(error);\n\t\t\tcallback(error);\n\t\t}\n\t}\n\treturn _jsonObj;\n}\n\/\/ callback为数据格式化错误的时候处理函数\nfunction formatJson (callback) {\n var jsonObj = $(\"#input\").value;\n\t\/\/ 正则表达式匹配规则变量\n\tvar reg = null;\n\t\/\/ 转换后的字符串变量\n\tvar formatted = '';\n\t\/\/ 换行缩进位数\n\tvar pad = 0;\n\t\/\/ 一个tab对应空格位数\n\tvar PADDING = ' ';\n\t\/\/ json对象转换为字符串变量\n\tvar jsonString = transitionJsonToString(jsonObj, callback);\n\tif (!jsonString) {\n\t\treturn jsonString;\n\t}\n\t\/\/ 存储需要特殊处理的字符串段\n\tvar _index = [];\n\t\/\/ 存储需要特殊处理的“再数组中的开始位置变量索引\n\tvar _indexStart = null;\n\t\/\/ 存储需要特殊处理的“再数组中的结束位置变量索引\n\tvar _indexEnd = null;\n\t\/\/ 将jsonString字符串内容通过\\r\\n符分割成数组\n\tvar jsonArray = [];\n \/\/ 正则匹配到{,}符号则在两边添加回车换行\n\tjsonString = jsonString.replace(\/([\\{\\}])\/g, '\\r\\n$1\\r\\n');\n\t\/\/ 正则匹配到[,]符号则在两边添加回车换行\n\tjsonString = jsonString.replace(\/([\\[\\]])\/g, '\\r\\n$1\\r\\n');\n\t\/\/ 正则匹配到,符号则在两边添加回车换行\n\tjsonString = jsonString.replace(\/(\\,)\/g, '$1\\r\\n');\n\t\/\/ 正则匹配到要超过一行的换行需要改为一行\n\tjsonString = jsonString.replace(\/(\\r\\n\\r\\n)\/g, '\\r\\n');\n\t\/\/ 正则匹配到单独处于一行的,符号时需要去掉换行,将,置于同行\n\tjsonString = jsonString.replace(\/\\r\\n\\,\/g, ',');\n\t\/\/ 特殊处理双引号中的内容\n\tjsonArray = jsonString.split('\\r\\n');\n\tjsonArray.forEach(function (node, index) {\n\t\t\/\/ 获取当前字符串段中\"的数量\n\t\tvar num = node.match(\/\\\"\/g) ? node.match(\/\\\"\/g).length : 0;\n\t\t\/\/ 判断num是否为奇数来确定是否需要特殊处理\n\t\tif (num % 2 && !_indexStart) {\n\t\t\t_indexStart = index\n\t\t}\n\t\tif (num % 2 && _indexStart && _indexStart != index) {\n\t\t\t_indexEnd = index\n\t\t}\n\t\t\/\/ 将需要特殊处理的字符串段的其实位置和结束位置信息存入,并对应重置开始时和结束变量\n\t\tif (_indexStart && _indexEnd) {\n\t\t\t_index.push({\n\t\t\t\tstart: _indexStart,\n\t\t\t\tend: _indexEnd\n\t\t\t})\n\t\t\t_indexStart = null\n\t\t\t_indexEnd = null\n\t\t}\n\t})\n\t\/\/ 开始处理双引号中的内容,将多余的\"去除\n\t_index.reverse().forEach(function (item, index) {\n\t\tvar newArray = jsonArray.slice(item.start, item.end + 1)\n\t\tjsonArray.splice(item.start, item.end + 1 - item.start, newArray.join(''))\n\t})\n\t\/\/ 奖处理后的数组通过\\r\\n连接符重组为字符串\n\tjsonString = jsonArray.join('\\r\\n');\n\t\/\/ 将匹配到:后为回车换行加大括号替换为冒号加大括号\n\tjsonString = jsonString.replace(\/\\:\\r\\n\\{\/g, ':{');\n\t\/\/ 将匹配到:后为回车换行加中括号替换为冒号加中括号\n\tjsonString = jsonString.replace(\/\\:\\r\\n\\[\/g, ':[');\n\t\/\/ 将上述转换后的字符串再次以\\r\\n分割成数组\n\tjsonArray = jsonString.split('\\r\\n');\n \/\/ 将转换完成的字符串根据PADDING值来组合成最终的形态\n jsonArray.forEach(function (item, index) {\n\t\tconsole.log(item)\n \tvar i = 0;\n \t\/\/ 表示缩进的位数,以tab作为计数单位\n\t\tvar indent = 0;\n\t\t\/\/ 表示缩进的位数,以空格作为计数单位\n\t\tvar padding = '';\n\t\tif (item.match(\/\\{$\/) || item.match(\/\\[$\/)) {\n\t\t\t\/\/ 匹配到以{和[结尾的时候indent加1\n\t\t\tindent += 1\n\t\t} else if (item.match(\/\\}$\/) || item.match(\/\\]$\/) || item.match(\/\\},$\/) || item.match(\/\\],$\/)) {\n\t\t\t\/\/ 匹配到以}和]结尾的时候indent减1\n\t\t\tif (pad !== 0) {\n\t\t\t\tpad -= 1\n\t\t\t}\n } else {\n indent = 0\n }\n for (i = 0; i < pad; i++) {\n padding += PADDING\n }\n formatted += padding + item + '\\r\\n'\n\t\tpad += indent\n \t})\n\t\/\/ 返回的数据需要去除两边的空格\n\t$(\"#input\").value = formatted.trim();\n\t\n}\n \n\n<\/script>\n❗️0、1、结束❗️\n\n{{}}\n——————分割线————————\n<js>\nindex='{{$.index}}';\nif(index.match(\/\\d+、\\d+、\/)){\nreg=eval('\/❗️'+index+'开始❗️[\\\\s\\\\S]+?❗️'+index+'结束❗️\/g');\nreg2=eval('\/❗️'+index+'..❗️\/g');\nresult=result.match(reg)?result.match(reg)[0]:'<br\/>'\nresult.replace(reg2,'')}else{result=''}\n<\/js>", "ruleImage": "$.src", "ruleLink": "$.index", "rulePubDate": "$.intro", "ruleTitle": "$.text", "singleUrl": false, "sortUrl": "@js:\nvar input = String(source.sourceComment);\nvar lines = input.split('\\n');\nvar result = [];\nvar groupName = '';\nvar content = '';\n\nfor (var i = 0; i < lines.length; i++) {\n var line = lines[i].trim();\n if (line === '') continue;\n\n \/\/ 如果以 ◎ 开头,则是分组名\n if (line.startsWith('◎')) {\n \/\/ 如果当前分组名和内容已存在,保存上一个分组\n if (groupName && content) {\n var encodedContent = java.base64Encode(content); \/\/ 使用 java.base64Encode\n result.push(`${groupName}::data:;base64,${encodedContent},{\"type\":\"\"}`);\n }\n groupName = line.slice(1, -1).trim(); \/\/ 去掉 ◎,设置新的分组名\n content = ''; \/\/ 重置内容\n } else if (line.startsWith('【')) {\n \/\/ 如果以 【 开头,则是内容的一部分\n content += line + '\\n';\n }\n}\n\n\/\/ 保存最后一个分组\nif (groupName && content) {\n var encodedContent = java.base64Encode(content); \/\/ 使用 java.base64Encode\n result.push(`${groupName}::data:;base64,${encodedContent},{\"type\":\"\"}`);\n}\n\nresult.join(\"\\n\")", "sourceComment": "◎我的常用◎\n【0、3、】《📝 | 一键导入》『洛娅橙一键导入【本地html】』\n【0、2、】《📝 | 预览调试》『html网页预览调试【本地html】』\n\n【0、1、】《📝 | 发现规则》『发现一键生成 | 正则替换【本地html】』\n【https:\/\/legado.miaogongzi.net\/legado\/dy.html】《📝 | 喵公子》『阅读相关』\n【https:\/\/mp.weixin.qq.com\/mp\/appmsgalbum?__biz=MzIzMTc0NzE1MQ==&action=getalbum&album_id=1429936613618188289&scene=126#wechat_redirect】《📖 | 阅读教程》『阅读公众号』\n【https:\/\/mp.weixin.qq.com\/mp\/appmsgalbum?__biz=MzIzMTc0NzE1MQ==&action=getalbum&album_id=1337256947799916544&scene=126#wechat_redirect】《📖 | 阅读资源》\n【http:\/\/www.yckceo.vip】《常用 | 源仓库》『源仓库发布页』\n【https:\/\/www.jianguoyun.com】《必备 | 坚果云》『用来云备份』\n【http:\/\/mail.qq.com】《登录 | QQ邮箱》\n【http:\/\/gitee.com】《登录 | Gitee》\n◎在线工具◎\n【http:\/\/www.jsons.cn\/reg\/】《🛠️ | 正则替换》\n【https:\/\/netcut.cn】《🛠️ | 网络剪切板》\n【https:\/\/www.dejs.vip\/2obfuscator】《🛠️ | DesJs》『Js反混淆 | Js格式化』\n【https:\/\/www.51shizhi.com\/tool\/js-anti-obfuscate-io】《🛠️ | obfuscator.io反混淆》『Js反混淆 | Js格式化』\n【https:\/\/tool.lu\/】《🛠️ | 工具箱》\n【https:\/\/ol.woobx.cn】《🛠️ | 一个木函》\n【https:\/\/uutool.cn】《🛠️ | UU在线》\n【http:\/\/24mail.chacuo.net】《📱 | 临时邮箱》\n【https:\/\/rootsh.com\/】《📱 | 十分钟邮箱》\n【https:\/\/ykjtb.com\/c】《🛠️ | 一块剪切板》\n【https:\/\/note.ms】《🛠️ | note剪切板》\n◎教程资料◎\n【https:\/\/celetor.github.io\/teachme】《📖 | 阅读3.0书源规则》『官方书源规则』\n【https:\/\/www.w3school.com.cn】《📕 | W3school》『web相关学习 | html、css、js』\n【https:\/\/jsoup.org\/apidocs\/org\/jsoup\/select\/Selector.html】《📕 | Jsoup Selector》『类似CSS选择器 | 阅读可以用的语法@css:开头』\n【https:\/\/www.cnblogs.com\/wynjauu\/articles\/9556396.html】《📕 | JsonPath教程》『阅读可以用的语法 @json:或 $.开头』\n【https:\/\/www.runoob.com\/xpath\/xpath-syntax.html】《📕 | XPath相关》『阅读可以用的语法 @XPath:或 \/\/开头』\n【https:\/\/www.bilibili.com\/video\/BV1z56iY6EB8?p=4】《📕 | Js基础语法参考视频》『P4-P27为Js语法,也就是2-01至6-04』\n【https:\/\/developer.mozilla.org\/zh-CN\/docs\/Web\/JavaScript\/Guide\/Grammar_and_types】《📕 | JavaScript指南》『Js语法』", "sourceGroup": "工具", "sourceIcon": "\/storage\/emulated\/0\/YueDu3.0\/Hr.png", "sourceName": "网站整合", "sourceUrl": "guaner写源工具整合", "variableComment": "◎分类1◎\n【序号或链接】《列表名称》@图片链接@『简介』\n------------------\n◎分类2◎\n【序号或链接】《列表名称》@图片链接@『简介』\n❗️0、2、开始❗️\n\n❗️0、2、结束❗️" }