Jelajahi Sumber

web source editor: v3.22.091908

github-actions[bot] 4 tahun lalu
induk
melakukan
3f65c647a1

File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/bookSource/css/app.1bd41080.css


File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/bookSource/css/app.37e72839.css


TEMPAT SAMPAH
app/src/main/assets/web/bookSource/fonts/Cascadia-Code-Regular-2.97c09831.ttf


+ 0 - 1
app/src/main/assets/web/bookSource/index.html

@@ -1 +0,0 @@
-<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="./favicon.ico"><title>legado_web_editor</title><script defer="defer" src="./js/chunk-vendors.86212f98.js"></script><script defer="defer" src="./js/app.836bd8bb.js"></script><link href="./css/app.37e72839.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but legado_web_editor doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/bookSource/js/app.2c3e42a8.js


File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/bookSource/js/app.2c3e42a8.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/bookSource/js/app.836bd8bb.js


File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/bookSource/js/app.836bd8bb.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/bookSource/js/chunk-vendors.86212f98.js


File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/bookSource/js/chunk-vendors.86212f98.js.map


+ 0 - 150
app/src/main/assets/web/rssSource/index.css

@@ -1,150 +0,0 @@
-body {
-  margin: 0;
-}
-.editor {
-  display: flex;
-  align-items: stretch;
-}
-.setbox,
-.menu,
-.outbox {
-  flex: 1;
-  display: flex;
-  flex-flow: column;
-  max-height: 100vh;
-  overflow-y: auto;
-}
-.menu {
-  justify-content: center;
-  max-width: 90px;
-  margin: 0 5px;
-}
-.menu .button {
-  width: 90px;
-  height: 30px;
-  min-height: 30px;
-  margin: 5px 0px;
-  cursor: pointer;
-}
-@keyframes stroker {
-  0% {
-    stroke-dashoffset: 0;
-  }
-  100% {
-    stroke-dashoffset: -240;
-  }
-}
-.button rect {
-  width: 100%;
-  height: 100%;
-  fill: transparent;
-  stroke: #666;
-  stroke-width: 2px;
-}
-.button rect.busy {
-  stroke: #fd1850;
-  stroke-dasharray: 30 90;
-  animation: stroker 1s linear infinite;
-}
-.button text {
-  text-anchor: middle;
-  dominant-baseline: middle;
-}
-.setbox {
-  min-width: 40em;
-}
-.rules {
-  overflow: auto;
-}
-.tabbox {
-  flex: 1;
-  display: flex;
-  flex-flow: column;
-}
-.rules > * {
-  display: flex;
-  margin: 2px 0;
-}
-.rules textarea {
-  flex: 1;
-  margin-left: 5px;
-}
-.rules > *,
-.rules > * > div,
-.rules textarea {
-  min-height: 1em;
-}
-textarea {
-  word-break: break-all;
-}
-.tabtitle {
-  display: flex;
-  z-index: 1;
-  justify-content: flex-end;
-}
-.tabtitle > div {
-  cursor: pointer;
-  padding: 1px 10px 0 10px;
-  border-bottom: 3px solid transparent;
-  font-weight: bold;
-}
-.tabtitle > .this {
-  color: #4f9da6;
-  border-bottom-color: #4ebbe4;
-}
-.tabbody {
-  flex: 1;
-  display: flex;
-  margin-top: -1px;
-  border: 1px solid #a9a9a9;
-  height: 0;
-}
-.tabbody > * {
-  flex: 1;
-  flex-flow: column;
-  display: none;
-}
-.tabbody > .this {
-  display: flex;
-}
-.tabbody > * > .titlebar {
-  display: flex;
-}
-.tabbody > * > .titlebar > * {
-  flex: 1;
-  margin: 1px 1px 1px 1px;
-}
-.tabbody > * > .context {
-  flex: 1;
-  flex-flow: column;
-  border: 0;
-  padding: 5px;
-  overflow-y: auto;
-}
-.tabbody > * > .inputbox {
-  border: 0;
-  border-bottom: #a9a9a9 solid 1px;
-  height: 15px;
-  text-align: center;
-}
-.link > * {
-  display: flex;
-  margin: 5px;
-  border-bottom: 1px solid;
-  text-decoration: none;
-}
-#RuleList > label > * {
-  background: #eee;
-  padding-left: 3px;
-  margin: 2px 0;
-  cursor: pointer;
-}
-#RuleList input[type="radio"] {
-  display: none;
-}
-#RuleList input[type="radio"]:checked + * {
-  background: #15cda8;
-}
-.isError {
-  color: #ff0000;
-}

+ 0 - 248
app/src/main/assets/web/rssSource/index.html

@@ -1,248 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
-    <meta charset="UTF-8">
-    <title>阅读3.0订阅源编辑器_V4.0</title>
-    <link rel="icon" href="../favicon.ico">
-    <link rel="stylesheet" type="text/css" href="index.css"/>
-</head>
-
-<body>
-<div class="editor">
-    <div class="setbox">
-        <div>
-            <a href="../index.html">←主页</a>
-            <b>订阅源</b>
-        </div>
-        <div class="rules">
-            <div><b>基本</b></div>
-            <div>
-                <div>源域名 :</div>
-                <textarea rows="1" id="sourceUrl" class="base" title="sourceUrl"
-                          placeholder="<必填>通常填写网站主页,例: https://www.qidian.com"></textarea>
-            </div>
-            <div>
-                <div>源名称 :</div>
-                <textarea rows="1" id="sourceName" class="base" title="sourceName"
-                          placeholder="&lt;必填&gt;源名称"></textarea>
-            </div>
-            <div>
-                <div>图标  :</div>
-                <textarea rows="1" id="sourceIcon" class="base" title="sourceIcon"
-                          placeholder="&lt;选填&gt;图标"></textarea>
-            </div>
-            <div>
-                <div>源分组 :</div>
-                <textarea rows="1" id="sourceGroup" class="base" title="sourceGroup"
-                          placeholder="&lt;选填&gt;描述源的特征信息"></textarea>
-            </div>
-            <div>
-                <div>源注释 :</div>
-                <textarea rows="1" id="sourceComment" class="base" title="sourceComment"
-                          placeholder="&lt;选填&gt;描述源作者和状态"></textarea>
-            </div>
-            <div>
-                <div>登录地址:</div>
-                <textarea rows="1" id="loginUrl" class="base" title="loginUrl"
-                          placeholder="&lt;选填&gt;填写网站登录网址,仅在需要登录的源有用"></textarea>
-            </div>
-            <div>
-                <div>登录界面:</div>
-                <textarea rows="3" id="loginUi" class="base" title="loginUi"
-                          placeholder="&lt;选填&gt;自定义登录界面"></textarea>
-            </div>
-            <div>
-                <div>登录检测:</div>
-                <textarea rows="3" id="loginCheckJs" class="base" title="loginCheckJs"
-                          placeholder="&lt;选填&gt;登录检测js"></textarea>
-            </div>
-            <div>
-                <div>并发率 :</div>
-                <textarea rows="1" id="concurrentRate" class="base" title="concurrentRate"
-                          placeholder="&lt;选填&gt;并发率"></textarea>
-            </div>
-            <div>
-                <div>请求头 :</div>
-                <textarea rows="3" id="header" class="base" title="header"
-                          placeholder="&lt;选填&gt;客户端标识"></textarea>
-            </div>
-            <div>
-                <div>分类地址:</div>
-                <textarea rows="3" id="sortUrl" class="base" title="sortUrl"
-                          placeholder="&lt;选填&gt;例:&#10;名称1::网址(Url)1&#10;名称2::网址(Url)2&#10;..."></textarea>
-            </div>
-            <p></p>
-            <div><b>列表规则</b></div>
-            <div>
-                <div>列表样式:</div>
-                <textarea rows="1" id="articleStyle" class="base" title="articleStyle"
-                          placeholder="列表样式:0,1,2"></textarea>
-            </div>
-            <div>
-                <div>列表规则:</div>
-                <textarea rows="1" id="ruleArticles" class="base" title="ruleArticles"
-                          placeholder="列表规则 (规则结果为List&lt;Element&gt;)"></textarea>
-            </div>
-            <div>
-                <div>标题规则:</div>
-                <textarea rows="1" id="ruleTitle" class="base" title="ruleTitle"
-                          placeholder="选择节点书名 (规则结果为String)"></textarea>
-            </div>
-            <div>
-                <div>时间规则:</div>
-                <textarea rows="1" id="rulePubDate" class="base" title="rulePubDate"
-                          placeholder="发表时间 (规则结果为String)"></textarea>
-            </div>
-            <div>
-                <div>翻页规则:</div>
-                <textarea rows="1" id="ruleNextPage" class="base" title="ruleNextPage"
-                          placeholder="下一页链接 (规则结果为List&lt;String&gt;或String)"></textarea>
-            </div>
-            <p></p>
-            <div><b>WebView规则</b></div>
-            <div>
-                <div>加载地址:</div>
-                <textarea rows="1" id="loadWithBaseUrl" class="base" title="loadWithBaseUrl"
-                          placeholder="是否加载url (启用: true  关闭: false (可选,默认true))"></textarea>
-            </div>
-            <div>
-                <div>启用JS :</div>
-                <textarea rows="1" id="enableJs" class="base" title="enableJs"
-                          placeholder="是否启用Js (启用: true  关闭: false (可选,默认true))"></textarea>
-            </div>
-            <div>
-                <div>描述规则:</div>
-                <textarea rows="1" id="ruleDescription" class="base" title="ruleDescription"
-                          placeholder="rss内容 (规则结果为String)"></textarea>
-            </div>
-            <div>
-                <div>图片地址:</div>
-                <textarea rows="1" id="ruleImage" class="base" title="ruleImage"
-                          placeholder="图片rul规则 (规则结果为url)"></textarea>
-            </div>
-            <div>
-                <div>原文链接:</div>
-                <textarea rows="1" id="ruleLink" class="base" title="ruleLink"
-                          placeholder="原文链接规则 (规则结果为url)"></textarea>
-            </div>
-            <div>
-                <div>内容规则:</div>
-                <textarea rows="1" id="ruleContent" class="base" title="ruleContent"
-                          placeholder="内容规则 (规则结果为String)"></textarea>
-            </div>
-            <div>
-                <div>内容样式:</div>
-                <textarea rows="1" id="style" class="base" title="style"
-                          placeholder="内容样式 (css样式)"></textarea>
-            </div>
-            <p></p>
-            <div><b>其它规则</b></div>
-            <div>
-                <div>启用  :</div>
-                <textarea rows="1" id="enabled" class="base" title="enabled"
-                          placeholder="启用: true  关闭: false (可选,默认true)"></textarea>
-            </div>
-            <div>
-                <div>排序编号:</div>
-                <textarea rows="1" id="customOrder" class="base" title="customOrder"
-                          placeholder="整数: 0~N (可选,默认0) | 数字越小越靠前"></textarea>
-            </div>
-            <div>
-                <div>单URL :</div>
-                <textarea rows="1" id="singleUrl" class="base" title="singleUrl"
-                          placeholder="启用: true  关闭: false (可选,false)"></textarea>
-            </div>
-        </div>
-    </div>
-    <div class="menu">
-        <svg class="button">
-            <text x="50%" y="55%">⇈推送源</text>
-            <rect id="push"></rect>
-        </svg>
-        <svg class="button">
-            <text x="50%" y="55%">⇊拉取源</text>
-            <rect id="pull"></rect>
-        </svg>
-        <svg class="button">
-            <text x="50%" y="55%">⋘编辑源</text>
-            <rect id="editor"></rect>
-        </svg>
-        <svg class="button">
-            <text x="50%" y="55%">⋙生成源</text>
-            <rect id="conver"></rect>
-        </svg>
-        <svg class="button">
-            <text x="50%" y="55%">✗清空表单</text>
-            <rect id="initial"></rect>
-        </svg>
-        <svg class="button">
-            <text x="50%" y="55%">↶撤销操作</text>
-            <rect id="undo"></rect>
-        </svg>
-        <svg class="button">
-            <text x="50%" y="55%">↷重做操作</text>
-            <rect id="redo"></rect>
-        </svg>
-        <svg class="button">
-            <text x="50%" y="55%">⇏调试源</text>
-            <rect id="debug"></rect>
-        </svg>
-        <svg class="button">
-            <text x="50%" y="55%">✓保存源</text>
-            <rect id="accept"></rect>
-        </svg>
-    </div>
-    <div class="outbox">
-        <div class="tabbox">
-            <div class="tabtitle">
-                <div name="编辑源" class="tab1 this">编辑源</div>
-                <div name="调试源" class="tab2">调试源</div>
-                <div name="源列表" class="tab3">源列表</div>
-                <div name="帮助信息" class="tab4">帮助信息</div>
-            </div>
-            <div class="tabbody">
-                <div class="tab1 this">
-                        <textarea class="context" id="RuleJsonString"
-                                  placeholder="这里输出序列化的JSON数据,可直接导入'阅读'APP"></textarea>
-                </div>
-                <div class="tab2">
-                    <textarea class="context" id="DebugConsole" placeholder="这里用于输出调试信息"></textarea>
-                </div>
-                <div class="tab3">
-                    <input type="text" class="inputbox" id="Filter"
-                           placeholder="输入筛选关键词(源名称、源URL或源分组)后按回车筛选源">
-                    <div class="titlebar">
-                        <button id="Import">导入源文件</button>
-                        <button id="Export">导出源文件</button>
-                        <button id="Delete">删除选中源</button>
-                        <button id="ClrAll">清空列表</button>
-                    </div>
-                    <div class="context" id="RuleList"></div>
-                </div>
-                <div class="tab4">
-                    <div class="context link">
-                        <a target="_blank" href="https://alanskycn.gitee.io/teachme">源制作教程</a>
-                        <a target="_blank"
-                           href="https://zhuanlan.zhihu.com/p/29436838">Xpath基础教程</a>
-                        <a target="_blank"
-                           href="https://zhuanlan.zhihu.com/p/32187820">Xpath高级教程</a>
-                        <a target="_blank" href="https://www.w3cschool.cn/regex_rmjc">正则表达式教程</a>
-                        <a target="_blank" href="https://regexr.com">正则表达式在线验证工具</a>
-                        <div>^$()[]{}.?+*| 这些是Java正则特殊符号,匹配需转义
-                            <br>(?s) 前缀表示跨行解析
-                            <br>(?m) 前缀表示逐行匹配
-                            <br>(?i) 前缀表示忽略大小写
-                        </div>
-                        <a target="_blank" href="https://www.beta.browxy.com">代码在线运行工具</a>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<script src="/assets/js/md5.js"></script>
-<script type="text/javascript" src="index.js"></script>
-</body>
-
-</html>

+ 0 - 396
app/src/main/assets/web/rssSource/index.js

@@ -1,396 +0,0 @@
-// 简化js原生选择器
-function $(selector) { return document.querySelector(selector); }
-function $$(selector) { return document.querySelectorAll(selector); }
-// 读写Hash值(val未赋值时为读取)
-function hashParam(key, val) {
-	let hashstr = decodeURIComponent(window.location.hash);
-	let regKey = new RegExp(`${key}=([^&]*)`);
-	let getVal = regKey.test(hashstr) ? hashstr.match(regKey)[1] : null;
-	if (val == undefined) return getVal;
-	if (hashstr == '' || hashstr == '#') {
-		window.location.hash = `#${key}=${val}`;
-	}
-	else {
-		if (getVal) window.location.hash = hashstr.replace(getVal, val);
-		else {
-			window.location.hash = hashstr.indexOf(key) > -1 ? hashstr.replace(regKey, `${key}=${val}`) : `${hashstr}&${key}=${val}`;
-		}
-	}
-}
-// 创建源规则容器对象
-function Container() {
-	let ruleJson = {};
-
-	// 基本以及其他
-	$$('.rules .base').forEach(item => ruleJson[item.title] = '');
-	ruleJson.customOrder = 0;
-	ruleJson.enabled = true;
-
-	return ruleJson;
-}
-// 选项卡Tab切换事件处理
-function showTab(tabName) {
-	$$('.tabtitle>*').forEach(node => { node.className = node.className.replace(' this', ''); });
-	$$('.tabbody>*').forEach(node => { node.className = node.className.replace(' this', ''); });
-	$(`.tabbody>.${$(`.tabtitle>*[name=${tabName}]`).className}`).className += ' this';
-	$(`.tabtitle>*[name=${tabName}]`).className += ' this';
-	hashParam('tab', tabName);
-}
-// 源列表列表标签构造函数
-function newRule(rule) {
-	return `<label for="${hex_md5(rule.sourceUrl)}"><input type="radio" name="rule" id="${hex_md5(rule.sourceUrl)}"><div>${rule.sourceName}<br>${rule.sourceUrl}</div></label>`;
-}
-// 缓存规则列表
-var RuleSources = [];
-if (localStorage.getItem('RssSources')) {
-	RuleSources = JSON.parse(localStorage.getItem('RssSources'));
-	RuleSources.forEach(item => $('#RuleList').innerHTML += newRule(item));
-}
-// 页面加载完成事件
-window.onload = () => {
-	$$('.tabtitle>*').forEach(item => {
-		item.addEventListener('click', () => {
-			showTab(item.innerHTML);
-		});
-	});
-	if (hashParam('tab')) showTab(hashParam('tab'));
-}
-// 获取数据
-function HttpGet(url) {
-	return fetch(hashParam('domain') ? hashParam('domain') + url : url)
-		.then(res => res.json()).catch(err => console.error('Error:', err));
-}
-// 提交数据
-function HttpPost(url, data) {
-	return fetch(hashParam('domain') ? hashParam('domain') + url : url, {
-		body: JSON.stringify(data),
-		method: 'POST',
-		mode: "cors",
-		headers: new Headers({
-			'Content-Type': 'application/json;charset=utf-8'
-		})
-	}).then(res => res.json()).catch(err => console.error('Error:', err));
-}
-// 将源表单转化为源对象
-function rule2json() {
-	let RuleJSON = Container();
-	// 转换base
-	Object.keys(RuleJSON).forEach(key => {
-		RuleJSON[key] = $('#' + key).value;
-	});
-	RuleJSON.lastUpdateTime = new Date().getTime();
-	RuleJSON.customOrder = RuleJSON.customOrder == '' ? 0 : parseInt(RuleJSON.customOrder);
-	RuleJSON.articleStyle = RuleJSON.articleStyle == '' ? 0 : parseInt(RuleJSON.articleStyle);
-	RuleJSON.enabled = RuleJSON.enabled == '' || String(RuleJSON.enabled).toLocaleLowerCase().replace(/^\s*|\s*$/g, '') == 'true';
-	RuleJSON.enableJs = RuleJSON.enableJs == '' || String(RuleJSON.enableJs).toLocaleLowerCase().replace(/^\s*|\s*$/g, '') == 'true';
-	RuleJSON.loadWithBaseUrl = RuleJSON.loadWithBaseUrl == '' || String(RuleJSON.loadWithBaseUrl).toLocaleLowerCase().replace(/^\s*|\s*$/g, '') == 'true';
-	RuleJSON.singleUrl = String(RuleJSON.singleUrl).toLocaleLowerCase().replace(/^\s*|\s*$/g, '') == 'true';
-	return RuleJSON;
-}
-// 将源对象填充到源表单
-function json2rule(RuleEditor) {
-	let RuleJSON = Container();
-	// 转换base
-	Object.keys(RuleJSON).forEach(key => {
-		let val = RuleEditor[key];
-        if (typeof val == "number") {
-            $("#" + key).value = val ? String(val) : '0';
-        }
-        else if (typeof val == "boolean") {
-            $("#" + key).value = val ? String(val) : 'false';
-        }
-        else {
-            $("#" + key).value = val ? String(val) : '';
-        }
-	});
-}
-// 记录操作过程
-var course = { "old": [], "now": {}, "new": [] };
-if (localStorage.getItem('rssSourceCourse')) {
-	course = JSON.parse(localStorage.getItem('rssSourceCourse'));
-	json2rule(course.now);
-}
-else {
-	course.now = rule2json();
-	window.localStorage.setItem('rssSourceCourse', JSON.stringify(course));
-}
-function todo() {
-	course.old.push(Object.assign({}, course.now));
-	course.now = rule2json();
-	course.new = [];
-	if (course.old.length > 50) course.old.shift(); // 限制历史记录堆栈大小
-	localStorage.setItem('rssSourceCourse', JSON.stringify(course));
-}
-function undo() {
-	course = JSON.parse(localStorage.getItem('rssSourceCourse'));
-	if (course.old.length > 0) {
-		course.new.push(course.now);
-		course.now = course.old.pop();
-		localStorage.setItem('rssSourceCourse', JSON.stringify(course));
-		json2rule(course.now);
-	}
-}
-function redo() {
-	course = JSON.parse(localStorage.getItem('rssSourceCourse'));
-	if (course.new.length > 0) {
-		course.old.push(course.now);
-		course.now = course.new.pop();
-		localStorage.setItem('rssSourceCourse', JSON.stringify(course));
-		json2rule(course.now);
-	}
-}
-function setRule(editRule) {
-	let checkRule = RuleSources.find(x => x.sourceUrl == editRule.sourceUrl);
-	if ($(`input[id="${hex_md5(editRule.sourceUrl)}"]`)) {
-		Object.keys(checkRule).forEach(key => { checkRule[key] = editRule[key]; });
-		$(`input[id="${hex_md5(editRule.sourceUrl)}"]+*`).innerHTML = `${editRule.sourceName}<br>${editRule.sourceUrl}`;
-	} else {
-		RuleSources.push(editRule);
-		$('#RuleList').innerHTML += newRule(editRule);
-	}
-}
-$$('input').forEach((item) => { item.addEventListener('change', () => { todo() }) });
-$$('textarea').forEach((item) => { item.addEventListener('change', () => { todo() }) });
-// 处理按钮点击事件
-$('.menu').addEventListener('click', e => {
-	let thisNode = e.target;
-	thisNode = thisNode.parentNode.nodeName == 'svg' ? thisNode.parentNode.querySelector('rect') :
-		thisNode.nodeName == 'svg' ? thisNode.querySelector('rect') : null;
-	if (!thisNode) return;
-	if (thisNode.getAttribute('class') == 'busy') return;
-	thisNode.setAttribute('class', 'busy');
-	switch (thisNode.id) {
-		case 'push':
-			$$('#RuleList>label>div').forEach(item => { item.className = ''; });
-			(async () => {
-				await HttpPost(`/saveRssSources`, RuleSources).then(json => {
-					if (json.isSuccess) {
-						let okData = json.data;
-						if (Array.isArray(okData)) {
-							let failMsg = ``;
-							if (RuleSources.length > okData.length) {
-								RuleSources.forEach(item => {
-									if (okData.find(x => x.sourceUrl == item.sourceUrl)) { }
-									else { $(`#RuleList #${item.sourceUrl}+*`).className += 'isError'; }
-								});
-								failMsg = '\n推送失败的源将用红色字体标注!';
-							}
-							alert(`批量推送源到「阅读3.0APP」\n共计: ${RuleSources.length} 条\n成功: ${okData.length} 条\n失败: ${RuleSources.length - okData.length} 条${failMsg}`);
-						}
-						else {
-							alert(`批量推送源到「阅读3.0APP」成功!\n共计: ${RuleSources.length} 条`);
-						}
-					}
-					else {
-						alert(`批量推送源失败!\nErrorMsg: ${json.errorMsg}`);
-					}
-				}).catch(err => { alert(`批量推送源失败,无法连接到「阅读3.0APP」!\n${err}`); });
-				thisNode.setAttribute('class', '');
-			})();
-			return;
-		case 'pull':
-			showTab('源列表');
-			(async () => {
-				await HttpGet(`/getRssSources`).then(json => {
-					if (json.isSuccess) {
-						$('#RuleList').innerHTML = ''
-						localStorage.setItem('RssSources', JSON.stringify(RuleSources = json.data));
-						RuleSources.forEach(item => {
-							$('#RuleList').innerHTML += newRule(item);
-						});
-						alert(`成功拉取 ${RuleSources.length} 条源`);
-					}
-					else {
-						alert(`批量拉取源失败!\nErrorMsg: ${json.errorMsg}`);
-					}
-				}).catch(err => { alert(`批量拉取源失败,无法连接到「阅读3.0APP」!\n${err}`); });
-				thisNode.setAttribute('class', '');
-			})();
-			return;
-		case 'editor':
-			if ($('#RuleJsonString').value == '') break;
-			try {
-				json2rule(JSON.parse($('#RuleJsonString').value));
-				todo();
-			} catch (error) {
-				console.log(error);
-				alert(error);
-			}
-			break;
-		case 'conver':
-			showTab('编辑源');
-			$('#RuleJsonString').value = JSON.stringify(rule2json(), null, 4);
-			break;
-		case 'initial':
-			$$('.rules textarea').forEach(item => { item.value = '' });
-			todo();
-			break;
-		case 'undo':
-			undo()
-			break;
-		case 'redo':
-			redo()
-			break;
-		case 'debug':
-			showTab('调试源');
-			let wsOrigin = (hashParam('domain') || location.origin).replace(/^.*?:/, 'ws:').replace(/\d+$/, (port) => (parseInt(port) + 1));
-			let DebugInfos = $('#DebugConsole');
-			function DebugPrint(msg) { DebugInfos.value += `\n${msg}`; DebugInfos.scrollTop = DebugInfos.scrollHeight; }
-			let saveRule = [rule2json()];
-			HttpPost(`/saveRssSource`, saveRule[0]).then(sResult => {
-				if (sResult.isSuccess) {
-					$('#DebugConsole').value = `源《${saveRule[0].sourceName}》保存成功!开始调试...`;
-					let ws = new WebSocket(`${wsOrigin}/rssSourceDebug`);
-					ws.onopen = () => {
-						ws.send(`{"tag":"${saveRule[0].sourceUrl}", "key":""}`);
-					};
-					ws.onmessage = (msg) => {
-					    console.log('[调试]', msg);
-						DebugPrint(msg.data);
-					};
-					ws.onerror = (err) => {
-						throw `${err.data}`;
-					}
-					ws.onclose = () => {
-						thisNode.setAttribute('class', '');
-						DebugPrint(`\n调试服务已关闭!`);
-					}
-				} else throw `${sResult.errorMsg}`;
-			}).catch(err => {
-				DebugPrint(`调试过程意外中止,以下是详细错误信息:\n${err}`);
-				thisNode.setAttribute('class', '');
-			});
-			return;
-		case 'accept':
-			(async () => {
-				let saveRule = [rule2json()];
-				await HttpPost(`/saveRssSources`, saveRule).then(json => {
-					alert(json.isSuccess ? `源《${saveRule[0].sourceName}》已成功保存到「阅读3.0APP」` : `源《${saveRule[0].sourceName}》保存失败!\nErrorMsg: ${json.errorMsg}`);
-					setRule(saveRule[0]);
-				}).catch(err => { alert(`保存源失败,无法连接到「阅读3.0APP」!\n${err}`); });
-				thisNode.setAttribute('class', '');
-			})();
-			return;
-		default:
-	}
-	setTimeout(() => { thisNode.setAttribute('class', ''); }, 500);
-});
-$('#Filter').addEventListener('keydown', e => {
-	if (e.keyCode == 13) {
-		let cashList = [];
-		$('#RuleList').innerHTML = "";
-		let sKey = Filter.value ? Filter.value : '';
-		if (sKey == '') {
-			cashList = RuleSources;
-		} else {
-			let patt = new RegExp(sKey);
-			RuleSources.forEach(source => {
-				if (patt.test(source.sourceUrl) || patt.test(source.sourceName) || patt.test(source.bookSourceGroup)) {
-					cashList.push(source);
-				}
-			})
-		}
-		cashList.forEach(source => {
-			$('#RuleList').innerHTML += newRule(source);
-		})
-	}
-});
-
-// 列表规则更改事件
-$('#RuleList').addEventListener('click', e => {
-	let editRule = null;
-	if (e.target && e.target.getAttribute('name') == 'rule') {
-		editRule = rule2json();
-		json2rule(RuleSources.find(x => hex_md5(x.sourceUrl) == e.target.id));
-	} else return;
-	if (editRule.sourceUrl == '') return;
-	if (editRule.sourceName == '') editRule.sourceName = editRule.sourceUrl.replace(/.*?\/\/|\/.*/g, '');
-	setRule(editRule);
-	localStorage.setItem('RssSources', JSON.stringify(RuleSources));
-});
-// 处理列表按钮事件
-$('.tab3>.titlebar').addEventListener('click', e => {
-	let thisNode = e.target;
-	if (thisNode.nodeName != 'BUTTON') return;
-	switch (thisNode.id) {
-		case 'Import':
-			let fileImport = document.createElement('input');
-			fileImport.type = 'file';
-			fileImport.accept = '.json';
-			fileImport.addEventListener('change', () => {
-				let file = fileImport.files[0];
-				let reader = new FileReader();
-				reader.onloadend = function (evt) {
-					if (evt.target.readyState == FileReader.DONE) {
-						let fileText = evt.target.result;
-						try {
-							let fileJson = JSON.parse(fileText);
-							let newSources = [];
-							newSources.push(...fileJson);
-							if (window.confirm(`如何处理导入的源?\n"确定": 覆盖当前列表(不会删除APP源)\n"取消": 插入列表尾部(自动忽略重复源)`)) {
-								localStorage.setItem('RssSources', JSON.stringify(RuleSources = newSources));
-								$('#RuleList').innerHTML = ''
-								RuleSources.forEach(item => {
-									$('#RuleList').innerHTML += newRule(item);
-								});
-							}
-							else {
-								newSources = newSources.filter(item => !JSON.stringify(RuleSources).includes(item.sourceUrl));
-								RuleSources.push(...newSources);
-								localStorage.setItem('RssSources', JSON.stringify(RuleSources));
-								newSources.forEach(item => {
-									$('#RuleList').innerHTML += newRule(item);
-								});
-							}
-							alert(`成功导入 ${newSources.length} 条源`);
-						}
-						catch (err) {
-							alert(`导入源文件失败!\n${err}`);
-						}
-					}
-				};
-				reader.readAsText(file);
-			}, false);
-			fileImport.click();
-			break;
-		case 'Export':
-			let fileExport = document.createElement('a');
-			fileExport.download = `Rules${Date().replace(/.*?\s(\d+)\s(\d+)\s(\d+:\d+:\d+).*/, '$2$1$3').replace(/:/g, '')}.json`;
-			let myBlob = new Blob([JSON.stringify(RuleSources, null, 4)], { type: "application/json" });
-			fileExport.href = window.URL.createObjectURL(myBlob);
-			fileExport.click();
-			break;
-		case 'Delete':
-			let selectRule = $('#RuleList input:checked');
-			if (!selectRule) {
-				alert(`没有源被选中!`);
-				return;
-			}
-			if (confirm(`确定要删除选定源吗?\n(同时删除APP内源)`)) {
-				let selectRuleUrl = selectRule.id;
-				let deleteSources = RuleSources.filter(item => item.sourceUrl == selectRuleUrl); // 提取待删除的源
-				let laveSources = RuleSources.filter(item => !(item.sourceUrl == selectRuleUrl));  // 提取待留下的源
-				HttpPost(`/deleteRssSources`, deleteSources).then(json => {
-					if (json.isSuccess) {
-						let selectNode = document.getElementById(selectRuleUrl).parentNode;
-						selectNode.parentNode.removeChild(selectNode);
-						localStorage.setItem('RssSources', JSON.stringify(RuleSources = laveSources));
-						if ($('#sourceUrl').value == selectRuleUrl) {
-							$$('.rules textarea').forEach(item => { item.value = '' });
-							todo();
-						}
-						console.log(deleteSources);
-						console.log(`以上源已删除!`)
-					}
-				}).catch(err => { alert(`删除源失败,无法连接到「阅读3.0APP」!\n${err}`); });
-			}
-			break;
-		case 'ClrAll':
-			if (confirm(`确定要清空当前源列表吗?\n(不会删除APP内源)`)) {
-				localStorage.setItem('RssSources', JSON.stringify(RuleSources = []));
-				$('#RuleList').innerHTML = ''
-			}
-			break;
-		default:
-	}
-});

File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/source/css/app.b909a48a.css


+ 0 - 0
app/src/main/assets/web/bookSource/favicon.ico → app/src/main/assets/web/source/favicon.ico


+ 1 - 0
app/src/main/assets/web/source/index.html

@@ -0,0 +1 @@
+<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="./favicon.ico"><title>legado_web_source_editor</title><script defer="defer" src="./js/chunk-vendors.973d2b1d.js"></script><script defer="defer" src="./js/app.18ad945c.js"></script><link href="./css/app.b909a48a.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but legado_web_source_editor doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/source/js/app.18ad945c.js


File diff ditekan karena terlalu besar
+ 0 - 0
app/src/main/assets/web/source/js/chunk-vendors.973d2b1d.js


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini