Merge branch 'gedoor:master' into master
This commit is contained in:
commit
5712b755fe
115 files changed
+1055
-1521
No files matched your search
@@ -32,3 +32,9 @@ updates:
|
||||
schedule:
|
||||
interval: "daily"
|
||||
registries: "*"
|
||||
|
||||
# Maintain dependencies for GitHub Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
@@ -11,7 +11,7 @@ jobs:
|
||||
if: ${{ github.event.repository.owner.id == github.event.sender.id && github.actor != 'gedoor' }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Install git
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.actor == 'gedoor' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
echo "PR_BODY=Changes in the [Git log](https://chromium.googlesource.com/chromium/src/+log/$current_cronet_version..$lastest_cronet_version)" >> $GITHUB_ENV
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
uses: peter-evans/create-pull-request@v4
|
||||
continue-on-error: true
|
||||
with:
|
||||
token: ${{ secrets.ACTIONS_TOKEN }}
|
||||
|
||||
@@ -42,11 +42,11 @@ jobs:
|
||||
VERSION: ${{ needs.prepare.outputs.version }}
|
||||
play: ${{ needs.prepare.outputs.play }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- uses: actions/cache@v2
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
@@ -81,14 +81,14 @@ jobs:
|
||||
cp -rf ${{ github.workspace }}/app/build/outputs/apk/*/*/*.apk ${{ github.workspace }}/apk/
|
||||
|
||||
- name: Upload App To Artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: legado_${{ env.product }}
|
||||
path: ${{ github.workspace }}/apk/*.apk
|
||||
|
||||
- name: Release
|
||||
if: ${{ env.product == 'app' }}
|
||||
uses: softprops/action-gh-release@59c3b4891632ff9a897f99a91d7bc557467a3a22
|
||||
uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5
|
||||
with:
|
||||
name: legado_app_${{ env.VERSION }}
|
||||
tag_name: ${{ env.VERSION }}
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
issues: write
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
- uses: actions/stale@v5
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message: '由于长期没有状态更新,该问题将于5天后自动关闭。如有需要可重新打开。'
|
||||
|
||||
@@ -47,10 +47,10 @@ jobs:
|
||||
VERSION: ${{ needs.prepare.outputs.version }}
|
||||
VERSIONL: ${{ needs.prepare.outputs.versionL }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/cache@v2
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
@@ -90,7 +90,7 @@ jobs:
|
||||
mv "$file" ${{ github.workspace }}/apk/legado_${{ env.product }}_${{ env.VERSIONL }}_$typeName.apk
|
||||
done
|
||||
- name: Upload App To Artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: legado.${{ env.product }}.${{ env.type }}
|
||||
path: ${{ github.workspace }}/apk/*.apk
|
||||
@@ -106,8 +106,8 @@ jobs:
|
||||
# 蓝奏云里的文件夹ID(阅读3测试版:2670621)
|
||||
LANZOU_FOLDER_ID: '2670621'
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/download-artifact@v2
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
path: apk/
|
||||
- working-directory: apk/
|
||||
@@ -124,8 +124,8 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event_name != 'pull_request' && github.actor == 'gedoor' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/download-artifact@v2
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
path: apk/
|
||||
- working-directory: apk/
|
||||
@@ -150,8 +150,8 @@ jobs:
|
||||
CHANNEL_ID: ${{ secrets.CHANNEL_ID }}
|
||||
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/download-artifact@v2
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
path: apk/
|
||||
- working-directory: apk/
|
||||
|
||||
+22
-12
@@ -1,9 +1,6 @@
|
||||
# [English](English.md) [中文](README.md)
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=io.legado.play.release)
|
||||
<a href="https://data.newrank.cn/m/s.html?s=NykyOzI9MS5LNQ%3D%3D" target="_blank">
|
||||
<img src="https://img.shields.io/badge/-微信关注“开源阅读”公众号-orange.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
<div align="center">
|
||||
<img width="125" height="125" src="https://github.com/gedoor/legado/raw/master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png" alt="legado"/>
|
||||
@@ -49,65 +46,76 @@ You can customize the book source, set your own rules, and capture web page data
|
||||
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-orange.svg" alt="#" align="right">
|
||||
<img src="https://img.shields.io/badge/-Top-orange.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
# Download [](#Download-)
|
||||
|
||||
#### Android
|
||||
|
||||
* [Releases](https://github.com/gedoor/legado/releases/latest)
|
||||
* [Google play - $1.99](https://play.google.com/store/apps/details?id=io.legado.play.release)
|
||||
* [Coolapk](https://www.coolapk.com/apk/io.legado.app.release)
|
||||
* [Jsdelivr](https://cdn.jsdelivr.net/gh/gedoor/release@release/)
|
||||
* [\#Beta](https://kunfei.lanzoui.com/b0f810h4b)
|
||||
* [IzzyOnDroid F-Droid Repository](https://apt.izzysoft.de/fdroid/index/apk/io.legado.app.release)
|
||||
|
||||
|
||||
#### IOS
|
||||
|
||||
* Stopped(No release) - [Github](https://github.com/gedoor/YueDuFlutter)
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-orange.svg" alt="#" align="right">
|
||||
<img src="https://img.shields.io/badge/-Top-orange.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
# Community [](#Community-)
|
||||
|
||||
#### Telegram
|
||||
[](https://t.me/yueduguanfang) [](https://t.me/legado_channels)
|
||||
|
||||
[](https://t.me/yueduguanfang) [](https://t.me/legado_channels)
|
||||
|
||||
#### Discord
|
||||
|
||||
[](https://discord.gg/VtUfRyzRXn)
|
||||
|
||||
#### Other
|
||||
|
||||
https://www.yuque.com/legado/wiki/community
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-orange.svg" alt="#" align="right">
|
||||
<img src="https://img.shields.io/badge/-Top-orange.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
# API [](#API-)
|
||||
|
||||
* Legado 3.0 The API is provided in 2 ways: `Web way` and `Content Provider way`. You can call it yourself as needed in [here](api.md).
|
||||
* One-click import by url recall reading, url format: legado://import/{path}?src={url}
|
||||
* Path Type: bookSource,rssSource,replaceRule,textTocRule,httpTTS,theme,readConfig
|
||||
* path type explanation: Book source, subscription source, replacement rules, local txt novel directory rules, online reading engine, theme, reading layout
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-orange.svg" alt="#" align="right">
|
||||
<img src="https://img.shields.io/badge/-Top-orange.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
# Other [](#Other-)
|
||||
|
||||
##### Disclaimers
|
||||
|
||||
https://gedoor.github.io/about.html
|
||||
|
||||
##### Legado 3.0
|
||||
|
||||
* [eBook sources rules](https://alanskycn.gitee.io/teachme)
|
||||
* [Update Log](/app/src/main/assets/updateLog.md)
|
||||
* [Help Documentation](/app/src/main/assets/help/appHelp.md)
|
||||
* [web](https://github.com/gedoor/legado_web_bookshelf)
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-orange.svg" alt="#" align="right">
|
||||
<img src="https://img.shields.io/badge/-Top-orange.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
# Grateful [](#Grateful-)
|
||||
|
||||
> * org.jsoup:jsoup
|
||||
> * cn.wanghaomiao:JsoupXpath
|
||||
> * com.jayway.jsonpath:json-path
|
||||
@@ -123,14 +131,16 @@ https://gedoor.github.io/about.html
|
||||
> * io.noties.markwon:image-glide
|
||||
> * com.hankcs:hanlp
|
||||
> * com.positiondev.epublib:epublib-core
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-orange.svg" alt="#" align="right">
|
||||
<img src="https://img.shields.io/badge/-Top-orange.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
# Interface [](#Interface-)
|
||||
|
||||
<img src="https://github.com/gedoor/gedoor.github.io/blob/master/static/img/legado/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B1.jpg" width="270"><img src="https://github.com/gedoor/gedoor.github.io/blob/master/static/img/legado/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B2.jpg" width="270"><img src="https://github.com/gedoor/gedoor.github.io/blob/master/static/img/legado/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B3.jpg" width="270">
|
||||
<img src="https://github.com/gedoor/gedoor.github.io/blob/master/static/img/legado/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B4.jpg" width="270"><img src="https://github.com/gedoor/gedoor.github.io/blob/master/static/img/legado/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B5.jpg" width="270"><img src="https://github.com/gedoor/gedoor.github.io/blob/master/static/img/legado/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B6.jpg" width="270">
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-orange.svg" alt="#" align="right">
|
||||
<img src="https://img.shields.io/badge/-Top-orange.svg" alt="#" align="right">
|
||||
</a>
|
||||
@@ -46,7 +46,6 @@ Legado is a free and open source novel reader for Android.
|
||||
* [Releases](https://github.com/gedoor/legado/releases/latest)
|
||||
* [Google play - $1.99](https://play.google.com/store/apps/details?id=io.legado.play.release)
|
||||
* [Coolapk](https://www.coolapk.com/apk/io.legado.app.release)
|
||||
* [Jsdelivr](https://cdn.jsdelivr.net/gh/gedoor/release@release/)
|
||||
* [\#Beta](https://kunfei.lanzoui.com/b0f810h4b)
|
||||
* [IzzyOnDroid F-Droid Repository](https://apt.izzysoft.de/fdroid/index/apk/io.legado.app.release)
|
||||
|
||||
|
||||
+3
-5
@@ -164,7 +164,7 @@ dependencies {
|
||||
implementation('androidx.constraintlayout:constraintlayout:2.1.4')
|
||||
implementation('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0')
|
||||
implementation('androidx.viewpager2:viewpager2:1.0.0')
|
||||
implementation('androidx.webkit:webkit:1.4.0')
|
||||
implementation('androidx.webkit:webkit:1.5.0')
|
||||
|
||||
//google
|
||||
implementation('com.google.android.material:material:1.6.1')
|
||||
@@ -189,8 +189,6 @@ dependencies {
|
||||
|
||||
//media
|
||||
implementation("androidx.media:media:1.6.0")
|
||||
|
||||
|
||||
implementation("com.google.android.exoplayer:exoplayer-core:$exoplayer_version")
|
||||
implementation("com.google.android.exoplayer:extension-okhttp:$exoplayer_version")
|
||||
|
||||
@@ -209,7 +207,7 @@ dependencies {
|
||||
implementation('io.github.jeremyliao:live-event-bus-x:1.8.0')
|
||||
|
||||
//规则相关
|
||||
implementation('org.jsoup:jsoup:1.15.2')
|
||||
implementation('org.jsoup:jsoup:1.15.3')
|
||||
implementation('com.jayway.jsonpath:json-path:2.7.0')
|
||||
implementation('cn.wanghaomiao:JsoupXpath:2.5.1')
|
||||
implementation(project(path: ':epublib'))
|
||||
@@ -260,7 +258,7 @@ dependencies {
|
||||
//implementation 'com.google.firebase:firebase-analytics-ktx:21.0.0'
|
||||
//implementation 'com.google.firebase:firebase-perf-ktx:20.0.6'
|
||||
|
||||
// LeakCanary
|
||||
//LeakCanary, 内存泄露检测
|
||||
//debugImplementation('com.squareup.leakcanary:leakcanary-android:2.7')
|
||||
|
||||
//com.github.AmrDeveloper:CodeView代码编辑已集成到应用内
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
{"armeabi-v7a":"a36bb21eec579e2c4bed0009eb0f1587","x86":"afce9bdd790c215374bb906919179ca5","arm64-v8a":"3ea9fa21d9b18860cfa12957c39dded1","x86_64":"717c1ebe0d1d3562f5c91c2b2606d2c2","version":"104.0.5112.69"}
|
||||
{"arm64-v8a":"11ded68691faa98fb1ab552210c8d4a8","armeabi-v7a":"4a986b523de502fc85ba6ea51f6f7184","x86_64":"80a642112fe079f3d689a6420a27e926","x86":"e72bf103350222d212bcb0b641733d43","version":"105.0.5195.77"}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"uploadUrl": "http://sy.mgz6.cc/shuyuan,{\"method\":\"POST\",\"body\": {\"file\": \"fileRequest\"},\"type\": \"multipart/form-data\"}",
|
||||
"downloadUrlRule": "$.data@js:if (result == '') \n '' \n else \n 'http://shuyuan.mgz6.cc/shuyuan/' + result",
|
||||
"downloadUrlRule": "$.data@js:if (result == '') \n '' \n else \n 'https://shuyuan.mgz6.cc/shuyuan/' + result",
|
||||
"summary": "有效期2天"
|
||||
}
|
||||
@@ -152,5 +152,4 @@ let options = {
|
||||
```
|
||||
|
||||
* 购买操作
|
||||
> 返回购买链接,可直接填写链接或者JavaScript
|
||||
> 可用变量 book chapter java(不支持AnalyzeRule函数) source
|
||||
> 可直接填写链接或者JavaScript,如果执行结果是字符串链接将会自动打开浏览器
|
||||
@@ -11,6 +11,39 @@
|
||||
* 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。
|
||||
* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
|
||||
|
||||
**2022/09/03**
|
||||
|
||||
* 更新cronet: 105.0.5195.77
|
||||
* 更新web端书源编辑 by jgckM
|
||||
|
||||
**2022/08/31**
|
||||
|
||||
* 更新cronet: 105.0.5195.68
|
||||
* 修复一些bug
|
||||
* 给书源点赞 by SJJ-dot
|
||||
* 墨水屏模式下,书籍信息页不显示模糊书籍封面作为背景
|
||||
|
||||
**2022/08/23**
|
||||
|
||||
* 验证码输入框显示来自哪个书源
|
||||
* 修复一键导入丢失url参数的问题
|
||||
|
||||
**2022/08/19**
|
||||
|
||||
* 更新cronet: 104.0.5112.97
|
||||
* 现在选择文本朗读会从选择处一直往下朗读,朗读更方便
|
||||
* 阅读界面的TXT目录正则 弹框中也支持正则标题示例
|
||||
* 一些优化 by 821938089
|
||||
* 优化epub封面加载,修复图片读取,修复目录索引问题
|
||||
* 本地内容获取时尝试HTML实体解码,优化报错提示和添加日志
|
||||
* 优化书源校验,注释Error行
|
||||
* 订阅源、书架管理添加选中所选区间
|
||||
* 优化订阅源分组显示已启用分组,订阅源管理增加已启用、已禁用、需要登录、未分组分组
|
||||
* 订阅源长按菜单添加禁用源、分组管理排序
|
||||
* 添加返回时提示放入书架设置
|
||||
* 优化备份设置子文件夹对话框内容显示和校验
|
||||
* 修复搜索手动停止滑到底又重新搜索
|
||||
|
||||
**2022/08/02**
|
||||
|
||||
* 更新cronet: 104.0.5112.69
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
@font-face{font-family:Cascadia;src:url(../fonts/Cascadia-Code-Regular-2.97c09831.ttf)}.editor{display:flex;align-items:stretch;height:100vh}.left{width:calc(50% - 55px);min-width:500px;display:inline-block}.main{width:100%;height:calc(100vh - 64px);overflow-y:auto}textarea{min-height:20px;flex:1;outline:none;border-radius:4px;border:1px solid #ccc;font-size:14px;font-family:Cascadia,Microsoft YaHei UI,Arial,serif;line-height:20px;padding:10px 10px 10px}.fixed[data-v-ab8a8a34]{position:fixed;top:100px;left:50%;transform:translateX(-50%)}.half-circle-spinner [data-v-ab8a8a34],.half-circle-spinner[data-v-ab8a8a34]{box-sizing:border-box}.half-circle-spinner[data-v-ab8a8a34]{width:60px;height:60px;border-radius:100%;position:relative}.half-circle-spinner .circle[data-v-ab8a8a34]{content:"";position:absolute;width:100%;height:100%;border-radius:100%;border:6px solid transparent}.half-circle-spinner .circle.circle-1[data-v-ab8a8a34]{border-top-color:#ff1d5e;-webkit-animation:half-circle-spinner-animation-ab8a8a34 1s infinite;animation:half-circle-spinner-animation-ab8a8a34 1s infinite}.half-circle-spinner .circle.circle-2[data-v-ab8a8a34]{border-bottom-color:#ff1d5e;-webkit-animation:half-circle-spinner-animation-ab8a8a34 1s infinite alternate;animation:half-circle-spinner-animation-ab8a8a34 1s infinite alternate}@-webkit-keyframes half-circle-spinner-animation-ab8a8a34{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes half-circle-spinner-animation-ab8a8a34{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.warm[data-v-27eae50d]{position:fixed;top:100px;left:50%;transform:translateX(-50%);color:#eee;background-color:#ff1d5e;padding:20px;border-radius:8px;font-size:18px}button[data-v-27eae50d]{float:right;width:70px;height:35px;outline:none;border:unset;border-radius:8px;font-size:14px;transition:background-color .3s ease}.success[data-v-bef92f74],button[data-v-27eae50d]:hover{color:#333;background-color:#7fffd4}.success[data-v-bef92f74]{z-index:3;position:fixed;top:100px;left:50%;transform:translateX(-50%);padding:10px;border-radius:8px}p[data-v-bef92f74]{margin:0}.menu{display:flex;flex-direction:column;justify-content:center}button[data-v-8302f478]{width:100px;height:50px;margin:5px;outline:none;padding:10px;font-size:16px;border-radius:4px;box-sizing:border-box;border:1px solid #333;background-color:transparent;transition:all .3s ease;overflow:hidden}button span[data-v-8302f478]{display:inline-block;transform:translateY(20px);opacity:0;font-size:12px;transition:all .3s ease}button[data-v-8302f478]:hover{color:#fff;background-color:gray}button:hover span[data-v-8302f478]{transform:translateY(0);opacity:1}textarea[data-v-4301c68c]{font-size:14px}input[data-v-f11ea0d0]{outline:none;height:25px;font-size:16px}textarea[data-v-f11ea0d0]{font-size:14px}.search[data-v-260cb454]{border:1px solid #ddd;border-radius:4px}input[data-v-260cb454]{text-align:center;font-size:16px;height:25px;outline:none}.tool[data-v-260cb454]{display:flex;justify-content:space-around;padding:4px 0}.tool button[data-v-260cb454]{border-radius:4px;padding:5px;outline:none;border:none;flex:1;margin:0 2px}.tool button[data-v-260cb454]:hover{background-color:#ddd}input[type=checkbox][data-v-260cb454]{transform:scale(2);margin:0 15px 0}.book_item[data-v-260cb454]{overflow:hidden;display:flex;align-items:center;margin-top:10px;padding:10px;cursor:pointer;background-color:#eee}.book_active[data-v-260cb454]{background-color:#32cd32}.book_index[data-v-260cb454]{width:auto;height:30px;text-align:center;line-height:30px;border-radius:8px;padding:0 10px;background-color:#ffb6c1}.book_info[data-v-260cb454]{display:flex;justify-content:space-between}.book_list[data-v-260cb454]{height:calc(100vh - 125px);overflow-y:auto}a[data-v-c4c82b2c]{display:block;height:25px;transition:margin-left .3s ease}a[data-v-c4c82b2c]:hover{color:red;margin-left:10px}code[data-v-c4c82b2c]{display:inline-block;font-size:16px;font-family:Cascadia Mono,JetBrains Mono,Microsoft YaHei UI,serif;background-color:#f3f4f4;border-radius:4px}.author[data-v-c4c82b2c]{position:fixed;right:20px;bottom:20px}.author a[data-v-c4c82b2c]{padding:5px 10px;border-radius:4px}.author a[data-v-c4c82b2c]:hover{box-shadow:0 0 3px 3px #ccc;background-color:#ddd}.out{min-width:620px}.out,.out .box{flex:1;display:flex;flex-flow:column}a{text-decoration:none;color:#333}body,ul{margin:0;padding:0}ul{width:100%;height:40px;display:flex}ul li{display:block;text-align:center;line-height:40px;width:16%;list-style:none;cursor:pointer}ul li:hover{color:red}.active{color:#fff!important;background-color:hsla(0,0%,50%,.459);border-bottom:unset!important}ul li[data-v-de4729c0]{border-bottom:2px solid #333}a[data-v-de4729c0]{font-size:18px;color:blue}span[data-v-3974490a]{display:flex;justify-content:space-around;width:70px;white-space:nowrap}span i[data-v-3974490a]{font-style:normal}.edit_input[data-v-3974490a]{display:flex;justify-content:space-between;align-items:center;margin:10px 5px}
|
||||
@@ -0,0 +1 @@
|
||||
@font-face{font-family:Cascadia;src:url(../fonts/Cascadia-Code-Regular-2.97c09831.ttf)}.editor{display:flex;align-items:stretch;height:100vh}.left{width:calc(50% - 55px);min-width:500px;display:inline-block}.main{width:100%;height:calc(100vh - 64px);overflow-y:auto}textarea{min-height:20px;flex:1;outline:none;border-radius:4px;border:1px solid #ccc;font-size:14px;font-family:Cascadia,Microsoft YaHei UI,Arial,serif;line-height:20px;padding:10px 10px 10px}.fixed[data-v-ab8a8a34]{position:fixed;top:100px;left:50%;transform:translateX(-50%)}.half-circle-spinner [data-v-ab8a8a34],.half-circle-spinner[data-v-ab8a8a34]{box-sizing:border-box}.half-circle-spinner[data-v-ab8a8a34]{width:60px;height:60px;border-radius:100%;position:relative}.half-circle-spinner .circle[data-v-ab8a8a34]{content:"";position:absolute;width:100%;height:100%;border-radius:100%;border:6px solid transparent}.half-circle-spinner .circle.circle-1[data-v-ab8a8a34]{border-top-color:#ff1d5e;-webkit-animation:half-circle-spinner-animation-ab8a8a34 1s infinite;animation:half-circle-spinner-animation-ab8a8a34 1s infinite}.half-circle-spinner .circle.circle-2[data-v-ab8a8a34]{border-bottom-color:#ff1d5e;-webkit-animation:half-circle-spinner-animation-ab8a8a34 1s infinite alternate;animation:half-circle-spinner-animation-ab8a8a34 1s infinite alternate}@-webkit-keyframes half-circle-spinner-animation-ab8a8a34{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes half-circle-spinner-animation-ab8a8a34{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.warm[data-v-27eae50d]{position:fixed;top:100px;left:50%;transform:translateX(-50%);color:#eee;background-color:#ff1d5e;padding:20px;border-radius:8px;font-size:18px}button[data-v-27eae50d]{float:right;width:70px;height:35px;outline:none;border:unset;border-radius:8px;font-size:14px;transition:background-color .3s ease}.success[data-v-bef92f74],button[data-v-27eae50d]:hover{color:#333;background-color:#7fffd4}.success[data-v-bef92f74]{z-index:3;position:fixed;top:100px;left:50%;transform:translateX(-50%);padding:10px;border-radius:8px}p[data-v-bef92f74]{margin:0}.menu{display:flex;flex-direction:column;justify-content:center}button[data-v-7d09e592]{width:100px;height:50px;margin:5px;outline:none;padding:10px;font-size:16px;border-radius:4px;box-sizing:border-box;border:1px solid #333;background-color:transparent;transition:all .3s ease;overflow:hidden}button span[data-v-7d09e592]{display:inline-block;transform:translateY(20px);opacity:0;font-size:12px;transition:all .3s ease}button[data-v-7d09e592]:hover{color:#fff;background-color:gray}button:hover span[data-v-7d09e592]{transform:translateY(0);opacity:1}textarea[data-v-4301c68c]{font-size:14px}input[data-v-f11ea0d0]{outline:none;height:25px;font-size:16px}textarea[data-v-f11ea0d0]{font-size:14px}.search[data-v-260cb454]{border:1px solid #ddd;border-radius:4px}input[data-v-260cb454]{text-align:center;font-size:16px;height:25px;outline:none}.tool[data-v-260cb454]{display:flex;justify-content:space-around;padding:4px 0}.tool button[data-v-260cb454]{border-radius:4px;padding:5px;outline:none;border:none;flex:1;margin:0 2px}.tool button[data-v-260cb454]:hover{background-color:#ddd}input[type=checkbox][data-v-260cb454]{transform:scale(2);margin:0 15px 0}.book_item[data-v-260cb454]{overflow:hidden;display:flex;align-items:center;margin-top:10px;padding:10px;cursor:pointer;background-color:#eee}.book_active[data-v-260cb454]{background-color:#32cd32}.book_index[data-v-260cb454]{width:auto;height:30px;text-align:center;line-height:30px;border-radius:8px;padding:0 10px;background-color:#ffb6c1}.book_info[data-v-260cb454]{display:flex;justify-content:space-between}.book_list[data-v-260cb454]{height:calc(100vh - 125px);overflow-y:auto}a[data-v-c4c82b2c]{display:block;height:25px;transition:margin-left .3s ease}a[data-v-c4c82b2c]:hover{color:red;margin-left:10px}code[data-v-c4c82b2c]{display:inline-block;font-size:16px;font-family:Cascadia Mono,JetBrains Mono,Microsoft YaHei UI,serif;background-color:#f3f4f4;border-radius:4px}.author[data-v-c4c82b2c]{position:fixed;right:20px;bottom:20px}.author a[data-v-c4c82b2c]{padding:5px 10px;border-radius:4px}.author a[data-v-c4c82b2c]:hover{box-shadow:0 0 3px 3px #ccc;background-color:#ddd}.out{min-width:620px}.out,.out .box{flex:1;display:flex;flex-flow:column}a{text-decoration:none;color:#333}body,ul{margin:0;padding:0}ul{width:100%;height:40px;display:flex}ul li{display:block;text-align:center;line-height:40px;width:16%;list-style:none;cursor:pointer}ul li:hover{color:red}.active{color:#fff!important;background-color:hsla(0,0%,50%,.459);border-bottom:unset!important}ul li[data-v-de4729c0]{border-bottom:2px solid #333}a[data-v-de4729c0]{font-size:18px;color:blue}span[data-v-3974490a]{display:flex;justify-content:space-around;width:70px;white-space:nowrap}span i[data-v-3974490a]{font-style:normal}.edit_input[data-v-3974490a]{display:flex;justify-content:space-between;align-items:center;margin:10px 5px}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
Binary file not shown.
@@ -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;
|
||||
}
|
||||
@@ -1,439 +1 @@
|
||||
<!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="bookSourceUrl" class="base" title="bookSourceUrl"
|
||||
placeholder="<必填>通常填写网站主页,例: https://www.qidian.com"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>源类型 :</div>
|
||||
<textarea rows="1" id="bookSourceType" class="base" title="bookSourceType"
|
||||
placeholder="<必填>0:文本 1:音频 2:图片 3:文件(只提供下载的网站)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>源名称 :</div>
|
||||
<textarea rows="1" id="bookSourceName" class="base" title="bookSourceName"
|
||||
placeholder="<必填>会显示在源列表"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>源分组 :</div>
|
||||
<textarea rows="1" id="bookSourceGroup" class="base" title="bookSourceGroup"
|
||||
placeholder="<选填>描述源的特征信息"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>源注释 :</div>
|
||||
<textarea rows="1" id="bookSourceComment" class="base" title="bookSourceComment"
|
||||
placeholder="<选填>描述源作者和状态"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>登录地址:</div>
|
||||
<textarea rows="1" id="loginUrl" class="base" title="loginUrl"
|
||||
placeholder="<选填>填写网站登录网址,仅在需要登录的源有用"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>登录界面:</div>
|
||||
<textarea rows="3" id="loginUi" class="base" title="loginUi"
|
||||
placeholder="<选填>自定义登录界面"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>登录检测:</div>
|
||||
<textarea rows="3" id="loginCheckJs" class="base" title="loginCheckJs"
|
||||
placeholder="<选填>登录检测js"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>并发率 :</div>
|
||||
<textarea rows="1" id="concurrentRate" class="base" title="concurrentRate"
|
||||
placeholder="<选填>并发率"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>请求头 :</div>
|
||||
<textarea rows="3" id="header" class="base" title="header"
|
||||
placeholder="<选填>客户端标识"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>链接验证:</div>
|
||||
<textarea rows="1" id="bookUrlPattern" class="base" title="bookUrlPattern"
|
||||
placeholder="<选填>当详情页URL与源URL的域名不一致时有效,用于添加网址"></textarea>
|
||||
</div>
|
||||
<p></p>
|
||||
<div><b>搜索</b></div>
|
||||
<div>
|
||||
<div>搜索地址:</div>
|
||||
<textarea rows="1" id="searchUrl" class="base" title="searchUrl"
|
||||
placeholder="[域名可省略]/search.php@kw={{key}}"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>校验文字:</div>
|
||||
<textarea rows="1" id="ruleSearch_checkKeyWord" class="ruleSearch"
|
||||
title="checkKeyWord"
|
||||
placeholder="校验关键字"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>列表规则:</div>
|
||||
<textarea rows="1" id="ruleSearch_bookList" class="ruleSearch" title="bookList"
|
||||
placeholder="选择书籍节点 (规则结果为List<Element>)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>书名规则:</div>
|
||||
<textarea rows="1" id="ruleSearch_name" class="ruleSearch" title="name"
|
||||
placeholder="选择节点书名 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>作者规则:</div>
|
||||
<textarea rows="1" id="ruleSearch_author" class="ruleSearch" title="author"
|
||||
placeholder="选择节点作者 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>分类规则:</div>
|
||||
<textarea rows="1" id="ruleSearch_kind" class="ruleSearch" title="kind"
|
||||
placeholder="选择节点分类信息 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>字数规则:</div>
|
||||
<textarea rows="1" id="ruleSearch_wordCount" class="ruleSearch" title="wordCount"
|
||||
placeholder="选择节点字数信息 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>最新章节:</div>
|
||||
<textarea rows="1" id="ruleSearch_lastChapter" class="ruleSearch"
|
||||
title="lastChapter"
|
||||
placeholder="选择节点最新章节 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>简介规则:</div>
|
||||
<textarea rows="1" id="ruleSearch_intro" class="ruleSearch" title="intro"
|
||||
placeholder="选择节点书籍简介 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>封面规则:</div>
|
||||
<textarea rows="1" id="ruleSearch_coverUrl" class="ruleSearch" title="coverUrl"
|
||||
placeholder="选择节点书籍封面 (规则结果为String类型的url)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>详情地址:</div>
|
||||
<textarea rows="1" id="ruleSearch_bookUrl" class="ruleSearch" title="bookUrl"
|
||||
placeholder="选择书籍详情页网址 (规则结果为String类型的url)"></textarea>
|
||||
</div>
|
||||
<p></p>
|
||||
<div><b>发现</b></div>
|
||||
<div>
|
||||
<div>发现地址:</div>
|
||||
<textarea rows="6" id="exploreUrl" class="base" title="exploreUrl"
|
||||
placeholder="内容能显示在发现菜单 每行一条发现分类(网址域名可省略),例: 名称1::网址(Url)1 名称2::网址(Url)2 ..."></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>列表规则:</div>
|
||||
<textarea rows="1" id="ruleExplore_bookList" class="ruleExplore" title="bookList"
|
||||
placeholder="选择书籍节点 (规则结果为List<Element>)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>书名规则:</div>
|
||||
<textarea rows="1" id="ruleExplore_name" class="ruleExplore" title="name"
|
||||
placeholder="选择节点书名 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>作者规则:</div>
|
||||
<textarea rows="1" id="ruleExplore_author" class="ruleExplore" title="author"
|
||||
placeholder="选择节点作者 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>分类规则:</div>
|
||||
<textarea rows="1" id="ruleExplore_kind" class="ruleExplore" title="kind"
|
||||
placeholder="选择节点分类信息 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>字数规则:</div>
|
||||
<textarea rows="1" id="ruleExplore_wordCount" class="ruleExplore" title="wordCount"
|
||||
placeholder="选择节点字数信息 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>最新章节:</div>
|
||||
<textarea rows="1" id="ruleExplore_lastChapter" class="ruleExplore"
|
||||
title="lastChapter"
|
||||
placeholder="选择节点最新章节 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>简介规则:</div>
|
||||
<textarea rows="1" id="ruleExplore_intro" class="ruleExplore" title="intro"
|
||||
placeholder="选择节点书籍简介 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>封面规则:</div>
|
||||
<textarea rows="1" id="ruleExplore_coverUrl" class="ruleExplore" title="coverUrl"
|
||||
placeholder="选择节点书籍封面 (规则结果为String类型的url)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>详情地址:</div>
|
||||
<textarea rows="1" id="ruleExplore_bookUrl" class="ruleExplore" title="bookUrl"
|
||||
placeholder="选择书籍详情页网址 (规则结果为String类型的url)"></textarea>
|
||||
</div>
|
||||
<p></p>
|
||||
<div><b>详情</b></div>
|
||||
<div>
|
||||
<div>预处理 :</div>
|
||||
<textarea rows="3" id="ruleBookInfo_init" class="ruleBookInfo" title="init"
|
||||
placeholder="用于加速详情信息检索,只支持AllInOne规则"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>书名规则:</div>
|
||||
<textarea rows="1" id="ruleBookInfo_name" class="ruleBookInfo" title="name"
|
||||
placeholder="选择节点书名 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>作者规则:</div>
|
||||
<textarea rows="1" id="ruleBookInfo_author" class="ruleBookInfo" title="author"
|
||||
placeholder="选择节点作者 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>分类规则:</div>
|
||||
<textarea rows="1" id="ruleBookInfo_kind" class="ruleBookInfo" title="kind"
|
||||
placeholder="选择节点分类信息 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>字数规则:</div>
|
||||
<textarea rows="1" id="ruleBookInfo_wordCount" class="ruleBookInfo"
|
||||
title="wordCount"
|
||||
placeholder="选择节点字数信息 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>最新章节:</div>
|
||||
<textarea rows="1" id="ruleBookInfo_lastChapter" class="ruleBookInfo"
|
||||
title="lastChapter"
|
||||
placeholder="选择节点最新章节 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>简介规则:</div>
|
||||
<textarea rows="1" id="ruleBookInfo_intro" class="ruleBookInfo" title="intro"
|
||||
placeholder="选择节点书籍简介 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>封面规则:</div>
|
||||
<textarea rows="1" id="ruleBookInfo_coverUrl" class="ruleBookInfo" title="coverUrl"
|
||||
placeholder="选择节点书籍封面 (规则结果为String类型的url)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>目录地址:</div>
|
||||
<textarea rows="1" id="ruleBookInfo_tocUrl" class="ruleBookInfo" title="tocUrl"
|
||||
placeholder="选择书籍详情页网址 (规则结果为String类型的url, 与详情页相同时可省略)"></textarea>
|
||||
</div>
|
||||
<p></p>
|
||||
<div><b>目录</b></div>
|
||||
<div>
|
||||
<div>列表规则:</div>
|
||||
<textarea rows="3" id="ruleToc_chapterList" class="ruleToc" title="chapterList"
|
||||
placeholder="选择目录列表的章节节点 (规则结果为List<Element>)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>章节名称:</div>
|
||||
<textarea rows="1" id="ruleToc_chapterName" class="ruleToc" title="chapterName"
|
||||
placeholder="选择章节名称 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>章节地址:</div>
|
||||
<textarea rows="1" id="ruleToc_chapterUrl" class="ruleToc" title="chapterUrl"
|
||||
placeholder="选择章节链接 (规则结果为String类型的Url)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>卷名标识:</div>
|
||||
<textarea rows="1" id="ruleToc_isVolume" class="ruleToc" title="isVolume"
|
||||
placeholder="章节名称是否是卷名 (规则结果为Bool)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>收费标识:</div>
|
||||
<textarea rows="1" id="ruleToc_isVip" class="ruleToc" title="isVip"
|
||||
placeholder="章节是否为VIP章节 (规则结果为Bool)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>购买标识:</div>
|
||||
<textarea rows="1" id="ruleToc_isPay" class="ruleToc" title="isPay"
|
||||
placeholder="章节是否为已购买 (规则结果为Bool)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>章节信息:</div>
|
||||
<textarea rows="1" id="ruleToc_updateTime" class="ruleToc" title="updateTime"
|
||||
placeholder="选择章节信息 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>翻页规则:</div>
|
||||
<textarea rows="1" id="ruleToc_nextTocUrl" class="ruleToc" title="nextTocUrl"
|
||||
placeholder="选择目录下一页链接 (规则结果为List<String>或String)"></textarea>
|
||||
</div>
|
||||
<p></p>
|
||||
<div><b>正文</b></div>
|
||||
<div>
|
||||
<div>脚本注入:</div>
|
||||
<textarea rows="3" id="ruleContent_webJs" class="ruleContent" title="webJs"
|
||||
placeholder="注入javascript,用于模拟鼠标点击等,必须有返回值,一般为String类型"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>正文规则:</div>
|
||||
<textarea rows="1" id="ruleContent_content" class="ruleContent" title="content"
|
||||
placeholder="选择正文内容 (规则结果为String)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>翻页规则:</div>
|
||||
<textarea rows="1" id="ruleContent_nextContentUrl" class="ruleContent"
|
||||
title="nextContentUrl"
|
||||
placeholder="选择下一分页(不是下一章)链接 (规则结果为String类型的Url)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>资源正则:</div>
|
||||
<textarea rows="1" id="ruleContent_sourceRegex" class="ruleContent"
|
||||
title="sourceRegex"
|
||||
placeholder="匹配资源的url特征,用于嗅探"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>替换规则:</div>
|
||||
<textarea rows="1" id="ruleContent_replaceRegex" class="ruleContent"
|
||||
title="replaceRegex"
|
||||
placeholder="多页内容合并后替换,用于正文净化"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>图片样式:</div>
|
||||
<textarea rows="1" id="ruleContent_imageStyle" class="ruleContent"
|
||||
title="imageStyle"
|
||||
placeholder="FULL:铺满 不填:默认样式"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>购买操作:</div>
|
||||
<textarea rows="1" id="ruleContent_payAction" class="ruleContent"
|
||||
title="payAction"
|
||||
placeholder="购买章节 返回链接或js"></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="enabledExplore" class="base" title="enabledExplore"
|
||||
placeholder="启用: true 关闭: false (可选,默认true)"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>搜索权重:</div>
|
||||
<textarea rows="1" id="weight" class="base" title="weight"
|
||||
placeholder="整数: 0~N (可选,默认0) | 数字越大越靠前"></textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>排序编号:</div>
|
||||
<textarea rows="1" id="customOrder" class="base" title="customOrder"
|
||||
placeholder="整数: 0~N (可选,默认0) | 数字越小越靠前"></textarea>
|
||||
</div>
|
||||
<div style="display:none;">
|
||||
<div>更新时间:</div>
|
||||
<textarea rows="1" id="lastUpdateTime" class="base" title="lastUpdateTime"
|
||||
placeholder="毫秒级时间戳 (自动生成) | 请勿手动填写"></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">
|
||||
<input type="text" class="inputbox" id="DebugKey" placeholder="输入搜索关键字,默认搜「我的」">
|
||||
<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 type="text/javascript" src="index.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
<!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>
|
||||
@@ -1,516 +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 = {};
|
||||
let searchJson = {};
|
||||
let exploreJson = {};
|
||||
let bookInfoJson = {};
|
||||
let tocJson = {};
|
||||
let contentJson = {};
|
||||
|
||||
// 基本以及其他
|
||||
$$('.rules .base').forEach(item => ruleJson[item.title] = '');
|
||||
ruleJson.lastUpdateTime = 0;
|
||||
ruleJson.customOrder = 0;
|
||||
ruleJson.weight = 0;
|
||||
ruleJson.enabled = true;
|
||||
ruleJson.enabledExplore = true;
|
||||
|
||||
// 搜索规则
|
||||
$$('.rules .ruleSearch').forEach(item => searchJson[item.title] = '');
|
||||
ruleJson.ruleSearch = searchJson;
|
||||
|
||||
// 发现规则
|
||||
$$('.rules .ruleExplore').forEach(item => exploreJson[item.title] = '');
|
||||
ruleJson.ruleExplore = exploreJson;
|
||||
|
||||
// 详情页规则
|
||||
$$('.rules .ruleBookInfo').forEach(item => bookInfoJson[item.title] = '');
|
||||
ruleJson.ruleBookInfo = bookInfoJson;
|
||||
|
||||
// 目录规则
|
||||
$$('.rules .ruleToc').forEach(item => tocJson[item.title] = '');
|
||||
ruleJson.ruleToc = tocJson;
|
||||