网站整合

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>&nbsp;&nbsp;<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、结束❗️"
}
广告