转移帮助文档路径,并纳入web服务
This commit is contained in:
@@ -27,7 +27,7 @@ require(['markdownit', 'highlight'], (mdit, hljs) => {
|
||||
},
|
||||
});
|
||||
|
||||
const path = '../md/';
|
||||
const path = '/help/md/';
|
||||
const file = location.hash.slice(1).trim();
|
||||
if (!file) return;
|
||||
fetch(`${path}${file}.md`)
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
```java
|
||||
public enum MimeTypeEnum {
|
||||
|
||||
AAC("acc", "AAC音频", "audio/aac"),
|
||||
|
||||
ABW("abw", "AbiWord文件", "application/x-abiword"),
|
||||
|
||||
ARC("arc", "存档文件", "application/x-freearc"),
|
||||
|
||||
AVI("avi", "音频视频交错格式", "video/x-msvideo"),
|
||||
|
||||
AZW("azw", "亚马逊Kindle电子书格式", "application/vnd.amazon.ebook"),
|
||||
|
||||
BIN("bin", "任何类型的二进制数据", "application/octet-stream"),
|
||||
|
||||
BMP("bmp", "Windows OS / 2位图图形", "image/bmp"),
|
||||
|
||||
BZ("bz", "BZip存档", "application/x-bzip"),
|
||||
|
||||
BZ2("bz2", "BZip2存档", "application/x-bzip2"),
|
||||
|
||||
CSH("csh", "C-Shell脚本", "application/x-csh"),
|
||||
|
||||
CSS("css", "级联样式表(CSS)", "text/css"),
|
||||
|
||||
CSV("csv", "逗号分隔值(CSV)", "text/csv"),
|
||||
|
||||
DOC("doc", "微软Word文件", "application/msword"),
|
||||
|
||||
DOCX("docx", "Microsoft Word(OpenXML)", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"),
|
||||
|
||||
EOT("eot", "MS Embedded OpenType字体", "application/vnd.ms-fontobject"),
|
||||
|
||||
EPUB("epub", "电子出版物(EPUB)", "application/epub+zip"),
|
||||
|
||||
GZ("gz", "GZip压缩档案", "application/gzip"),
|
||||
|
||||
GIF("gif", "图形交换格式(GIF)", "image/gif"),
|
||||
|
||||
HTM("htm", "超文本标记语言(HTML)", "text/html"),
|
||||
|
||||
HTML("html", "超文本标记语言(HTML)", "text/html"),
|
||||
|
||||
ICO("ico", "图标格式", "image/vnd.microsoft.icon"),
|
||||
|
||||
ICS("ics", "iCalendar格式", "text/calendar"),
|
||||
|
||||
JAR("jar", "Java存档", "application/java-archive"),
|
||||
|
||||
JPEG("jpeg", "JPEG图像", "image/jpeg"),
|
||||
|
||||
JPG("jpg", "JPEG图像", "image/jpeg"),
|
||||
|
||||
JS("js", "JavaScript", "text/javascript"),
|
||||
|
||||
JSON("json", "JSON格式", "application/json"),
|
||||
|
||||
JSONLD("jsonld", "JSON-LD格式", "application/ld+json"),
|
||||
|
||||
MID("mid", "乐器数字接口(MIDI)", "audio/midi"),
|
||||
|
||||
MIDI("midi", "乐器数字接口(MIDI)", "audio/midi"),
|
||||
|
||||
MJS("mjs", "JavaScript模块", "text/javascript"),
|
||||
|
||||
MP3("mp3", "MP3音频", "audio/mpeg"),
|
||||
|
||||
MPEG("mpeg", "MPEG视频", "video/mpeg"),
|
||||
|
||||
MPKG("mpkg", "苹果安装程序包", "application/vnd.apple.installer+xml"),
|
||||
|
||||
ODP("odp", "OpenDocument演示文稿文档", "application/vnd.oasis.opendocument.presentation"),
|
||||
|
||||
ODS("ods", "OpenDocument电子表格文档", "application/vnd.oasis.opendocument.spreadsheet"),
|
||||
|
||||
ODT("odt", "OpenDocument文字文件", "application/vnd.oasis.opendocument.text"),
|
||||
|
||||
OGA("oga", "OGG音讯", "audio/ogg"),
|
||||
|
||||
OGV("ogv", "OGG视频", "video/ogg"),
|
||||
|
||||
OGX("ogx", "OGG", "application/ogg"),
|
||||
|
||||
OPUS("opus", "OPUS音频", "audio/opus"),
|
||||
|
||||
OTF("otf", "otf字体", "font/otf"),
|
||||
|
||||
PNG("png", "便携式网络图形", "image/png"),
|
||||
|
||||
PDF("pdf", "Adobe 可移植文档格式(PDF)", "application/pdf"),
|
||||
|
||||
PHP("php", "php", "application/x-httpd-php"),
|
||||
|
||||
PPT("ppt", "Microsoft PowerPoint", "application/vnd.ms-powerpoint"),
|
||||
|
||||
PPTX("pptx", "Microsoft PowerPoint(OpenXML)", "application/vnd.openxmlformats-officedocument.presentationml.presentation"),
|
||||
|
||||
RAR("rar", "RAR档案", "application/vnd.rar"),
|
||||
|
||||
RTF("rtf", "富文本格式", "application/rtf"),
|
||||
|
||||
SH("sh", "Bourne Shell脚本", "application/x-sh"),
|
||||
|
||||
SVG("svg", "可缩放矢量图形(SVG)", "image/svg+xml"),
|
||||
|
||||
SWF("swf", "小型Web格式(SWF)或Adobe Flash文档", "application/x-shockwave-flash"),
|
||||
|
||||
TAR("tar", "磁带存档(TAR)", "application/x-tar"),
|
||||
|
||||
TIF("tif", "标记图像文件格式(TIFF)", "image/tiff"),
|
||||
|
||||
TIFF("tiff", "标记图像文件格式(TIFF)", "image/tiff"),
|
||||
|
||||
TS("ts", "MPEG传输流", "video/mp2t"),
|
||||
|
||||
TTF("ttf", "ttf字体", "font/ttf"),
|
||||
|
||||
TXT("txt", "文本(通常为ASCII或ISO 8859- n", "text/plain"),
|
||||
|
||||
VSD("vsd", "微软Visio", "application/vnd.visio"),
|
||||
|
||||
WAV("wav", "波形音频格式", "audio/wav"),
|
||||
|
||||
WEBA("weba", "WEBM音频", "audio/webm"),
|
||||
|
||||
WEBM("webm", "WEBM视频", "video/webm"),
|
||||
|
||||
WEBP("webp", "WEBP图像", "image/webp"),
|
||||
|
||||
WOFF("woff", "Web开放字体格式(WOFF)", "font/woff"),
|
||||
|
||||
WOFF2("woff2", "Web开放字体格式(WOFF)", "font/woff2"),
|
||||
|
||||
XHTML("xhtml", "XHTML", "application/xhtml+xml"),
|
||||
|
||||
XLS("xls", "微软Excel", "application/vnd.ms-excel"),
|
||||
|
||||
XLSX("xlsx", "微软Excel(OpenXML)", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),
|
||||
|
||||
XML("xml", "XML", "application/xml"),
|
||||
|
||||
XUL("xul", "XUL", "application/vnd.mozilla.xul+xml"),
|
||||
|
||||
ZIP("zip", "ZIP", "application/zip"),
|
||||
|
||||
MIME_3GP("3gp", "3GPP audio/video container", "video/3gpp"),
|
||||
|
||||
MIME_3GP_WITHOUT_VIDEO("3gp", "3GPP audio/video container doesn't contain video", "audio/3gpp2"),
|
||||
|
||||
MIME_3G2("3g2", "3GPP2 audio/video container", "video/3gpp2"),
|
||||
|
||||
MIME_3G2_WITHOUT_VIDEO("3g2", "3GPP2 audio/video container doesn't contain video", "audio/3gpp2"),
|
||||
|
||||
MIME_7Z("7z", "7-zip存档", "application/x-7z-compressed")
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,29 @@
|
||||
# 书源管理界面帮助
|
||||
|
||||
* 书源右上角标志
|
||||
* 绿点表示书源有发现,且启用了发现
|
||||
* 红点表示书源有发现,但是未启用
|
||||
* 没有标志表示此书源没有发现
|
||||
* 右上角有分组菜单,可以按分组筛选书源
|
||||
* 右上角更多菜单里包含
|
||||
* 新建书源
|
||||
* 本地导入
|
||||
* 网络导入
|
||||
* 二维码导入
|
||||
* 分享选中源
|
||||
* 选择源的更多操作在右下角的菜单里面,操作都是针对选择的书源
|
||||
* 启用所选
|
||||
* 禁用所选
|
||||
* 添加分组
|
||||
* 移除分组
|
||||
* 启用发现
|
||||
* 禁用发现
|
||||
* 置顶所选
|
||||
* 置底所选
|
||||
* 导出所选
|
||||
* 校验所选
|
||||
* 校验书源可批量校验书源,由于网络等原因结果仅限参考
|
||||
* "校验成功"是指所选的校验项目全部通过
|
||||
* 可正常识别搜索为空、发现为空、搜索(发现)目录为空、搜索(发现)正文为空、校验超时、js执行错误导致的失效,其余的原因视为网站失效
|
||||
* 校验搜索优先使用书源填写的校验关键词,不存在时使用用户输入的关键词
|
||||
* 校验结束后会自动筛选"失效"书源
|
||||
@@ -0,0 +1,20 @@
|
||||
# 订阅源管理界面帮助
|
||||
|
||||
* 订阅源可以通过规则订阅一些网络内容
|
||||
* 书源右上角标志
|
||||
* 绿点表示书源有发现,且启用了发现
|
||||
* 红点表示书源有发现,但是未启用
|
||||
* 没有标志表示此书源没有发现
|
||||
* 右上角有分组菜单,可以按分组筛选书源
|
||||
* 右上角更多菜单里包含
|
||||
* 新建订阅源
|
||||
* 本地导入
|
||||
* 网络导入
|
||||
* 二维码导入
|
||||
* 分享选中源
|
||||
* 选择源的更多操作在右下角的菜单里面,操作都是针对选择的书源
|
||||
* 启用所选
|
||||
* 禁用所选
|
||||
* 置顶所选
|
||||
* 置底所选
|
||||
* 导出所选
|
||||
@@ -0,0 +1,222 @@
|
||||
# 帮助文档
|
||||
|
||||
【温馨提醒】 *本帮助可以在“**我的**”——右上角帮助按钮再次打开,更新前一定要做好备份,以免数据丢失!*
|
||||
|
||||
## 新人必读
|
||||
|
||||
### 1. 为什么第一次安装好之后什么东西都没有?
|
||||
阅读只是一个转码工具,不提供内容。
|
||||
|
||||
### 2. 正文出现缺字漏字、内容缺失或排版错乱等情况,如何处理?
|
||||
有可能是净化规则出现问题,先关闭替换净化并刷新,再观察是否正常。如果正常说明净化规则存在误杀,如果关闭后仍然出现相关问题,请点击源链接查看原文与正文是否相同,如果不同,再进行反馈。
|
||||
|
||||
### 3. 漫画源看书显示乱码,如何解决?
|
||||
【异次元】和【阅读】是两个不同的软件,**两个软件的源并不通用**,请导入【阅读】的支持的漫画源!
|
||||
|
||||
## 书源相关
|
||||
|
||||
### 1. 如何导入本地书源文件?
|
||||
以导入 QQ 接收到的书源文件为例:
|
||||
* 下载群文件里的书源文件;
|
||||
* 打开【阅读】软件;
|
||||
* 点击“**我的**”——“**书源管理**”;
|
||||
* 点击右上角选择“**本地导入**”;
|
||||
* 左下角选择书源文件所在的路径;
|
||||
* 点击书源文件导入;
|
||||
* 导入后返回书源管理界面;
|
||||
|
||||
**【注】**
|
||||
1. *新版 QQ 文件下载路径:`Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/`。*
|
||||
2. *书源格式后缀有 .txt 和 .json,其中 .json 文件在某些情况下可能无法导入,需要修改后缀为 .txt 才可导入。*
|
||||
|
||||

|
||||
|
||||
### 2. 如何新建大佬发的单独书源?
|
||||
* 复制书源代码;
|
||||
* 打开阅读软件;
|
||||
* 点击“**我的**”——“**书源管理**”;
|
||||
* 右上角“**⁝**”——“**+ 新建书源**”;
|
||||
* 进入后点击右上角“**⁝**”——“**粘贴源**”;
|
||||
* 粘贴完成后点击上方保存“**🖫**”按钮;
|
||||
* 本次新建单独书源操作完成。
|
||||
|
||||
**【注】** *如果书源有错误或者复制不全会显示格式错误,请重新复制。*
|
||||
|
||||
### 3. 为什么导入 2.0 书源后无法阅读?
|
||||
部分 2.0 书源并不适用于 3.0 版本的阅读,建议导入后进行筛选。
|
||||
|
||||
### 4. 【阅读】2.0 数据如何导入【阅读】3.0?
|
||||
先对【阅读】2.0 的数据进行备份,然后进入【阅读】3.0,点击“**我的**”,选择“**备份与恢复**”,再点击“**导入旧版本数据**”。
|
||||
|
||||
### 5. 如何给朋友分享我的书源?
|
||||
* 打开【阅读】软件;
|
||||
* 点击备份;
|
||||
* 打开手机系统自带的文件管理;
|
||||
* 在手机内置存储根目录找到 `YueDu3.0` 文件夹;
|
||||
* 找到 `myBookSource.json`,长按选择分享;
|
||||
* 选择微信分享或者 QQ 分享;
|
||||
* 选择你要分享的好友点击发送;
|
||||
* 好友接收后在手机内置存储根目录找到 `myBookSource.json` 文件;
|
||||
* 复制该文件到手机内置存储根目录找到 `YueDu3.0` 文件夹(如已有该文件请先删除该文件或者备份到其他地方再复制到文件夹);
|
||||
* 打开【阅读】软件点击恢复。
|
||||
|
||||
**【注】**
|
||||
1. *备份路径如已修改过请在修改后的路径下查找书源文件。*
|
||||
2. *Android 10 及以下版本系统,新版 QQ 文件接收路径在 `Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/`,旧版 QQ 文件接收路径则在 `Tencent/QQfile_recv/`;新版微信文件接收路径在 `Android/data/com.tencent.mobileqq/Tencent/MicroMsg/Download`,旧版微信文件接收路径则在 `Tencent/MicroMsg/Download`。*
|
||||
3. *Android 11 及以上系统版本用户,由于系统限制,无法访问 `Android/data` 目录。*
|
||||
|
||||
### 6. 效验书源显示失效就说明书源不能用了吗?
|
||||
效验书源只是测试书源,可以做为参考,但失效了不代表书源不能用了。
|
||||
|
||||
### 7. “发现”和正版书源能不能使用?
|
||||
发现和正版书源只能用来找书或看排行榜,不能用来看书,如需看书请切换书源。
|
||||
|
||||
### 8. 为什么书源这么多,“发现”里却只有一点点?
|
||||
书源想要在发现界面里显示需要在书源里添加发现规则,并不是所有书源都有发现规则。
|
||||
|
||||
## 本地/WebDav远程书籍相关
|
||||
|
||||
### 1. 目前阅读支持哪些格式的本地书籍?
|
||||
目前支持 TXT 和 EPUB 格式。
|
||||
|
||||
### 2. 如何导入本地/WebDav远程书籍?
|
||||
本地:在书架页面点击右上角“**⁝**”,选择“**添加本地**”,授予相关权限后即可导入本地书籍。也可在文件管理器中使用【阅读】打开相关书籍。
|
||||
|
||||
远程:在主页面点击右上角 “**⁝**”,选择 **WebDav书籍**,正确配置好后即可看到上传的远程书籍,点击 **加入书架** 按钮导入即可。
|
||||
|
||||
### 3. 如何上传本地书籍到 WebDav 远程?
|
||||
长按本地书籍,进入书籍详情页,点击右上角 “**⁝**”,选择 **上传WebDav**,等待几秒后即可上传到远程。
|
||||
|
||||
或进入书籍缓存页面,点击右上角 “**⁝**”,选择 **导出到 WebDav**,在书籍导出时便可同时上传到远程。
|
||||
|
||||
### 4. 导入 TXT 文件提示“LoadTocError”或“List is empty”是怎么回事?
|
||||
* 请先去应用详情中确认是否授予了【阅读】“读写手机存储”的权限。
|
||||
* 自动识别目录失败,可能是相关目录规则未开启,请点击右上角的换源按钮手动更换目录规则。
|
||||
|
||||
如果尝试所有规则均无法识别,请在 GitHub 上提交 Issue 并附上相关 TXT 文件,也可以发送邮件至 i@qnmlgb.trade(标题:legado 本地文件章节无法识别;内容对其具体情况进行简要说明,附件上传相关 TXT 文件)。
|
||||
|
||||
### 5. 如何下载书籍到本地?
|
||||
把在线书籍加入到书架后,在书架页面点击右上角,选择“**离线缓存**”即可。
|
||||
|
||||
### 6. 如何自定义导出的 TXT 或 EPUB 文件名称?
|
||||
* 点击“**离线缓存**“——”**导出文件名**“
|
||||
* 使用方法:
|
||||
- 导出文件名支持 js 语法
|
||||
- 可用变量: name(书名)和 author(作者)
|
||||
- 示例:
|
||||
> name + "作者:" + author
|
||||
- 导出文件名:
|
||||
> Legado 是最好的在线阅读软件 作者: kunfei
|
||||
|
||||
**【注】** *name、author 等变量与字符串的拼接都需要在 JSON 上下文环境中进行,即必须使用 `{}` 将变量与字符串包裹起来。*
|
||||
|
||||
### 7. 为什么我打开本地的 TXT 文件,显示内容却是乱码?
|
||||
部分编码在阅读上会识别错误,建议先用文本编辑器转换为常用的 UTF-8 格式。
|
||||
|
||||
### 8. 阅读对部分把正文(如所有含引号的句子)识别成标题,如何解决?
|
||||
点击右上角更换目录规则即可。
|
||||
|
||||
## 书籍界面相关
|
||||
|
||||
### 1. 如何刷新书架?
|
||||
在书架界面下拉即可刷新。
|
||||
|
||||
### 2. 书架界面书籍右上角的红色或者灰色背景小数字代表什么?
|
||||
红色代表书籍有更新,灰色代表无更新,数字代表未读章节。
|
||||
|
||||
### 3. 如何查看书籍详情?
|
||||
长按书籍即可查看。
|
||||
|
||||
### 4. 如何对书架上的书进行删除、切换书架的操作?
|
||||
书籍详情页操作即可。
|
||||
|
||||
### 5. 如何禁止或允许某本书更新?
|
||||
书籍详情页,点击右上角——“**允许更新**”。
|
||||
|
||||
### 6. 如何更换小说封面、名字、作者或简介?
|
||||
书籍详情页,点击右上角修改按钮。
|
||||
|
||||
### 7. 怎么使用自定义字体?
|
||||
阅读界面——“**字体**”——点击右上角选择字体文件路径。
|
||||
|
||||
### 8. 目前支持哪些格式的字体文件?
|
||||
目前支持 TTF 和 OTF 格式。
|
||||
|
||||
### 9. 书籍经常“正在加载中”怎么办?
|
||||
在线书籍出现这个问题通常是由于源质量不好或不兼容引起的,可以换其它源多试试;本地书籍出现这个问题大概率是目录规则问题,手动切换规则可以解决。
|
||||
|
||||
### 10. 书籍内容只有标题,正文内容是路径怎么办?
|
||||
通常是缓存路径引起的,更换缓存路径即可。
|
||||
|
||||
### 11. 看书时如遇到“目录为空”、“加载失败”或长串英文等情况怎么办?
|
||||
在线书籍一般是书源问题,切换或更新书源即可。本地书籍请尝试手动更换目录规则。
|
||||
|
||||
### 12. 为什么每一章的最后一页,阅读的文字和横线背景总是对不齐?
|
||||
请在“**设置**”——“**文字底部对齐**”选项中关闭底部对齐,再调整排版。
|
||||
|
||||
### 13. 漫画源或图片章节只能看到第一页,如何解决?
|
||||
请先查看原网页是否正常,若正常,请在书籍阅读界面点击右上角的“**⁝**”按钮,在弹出的菜单中,选择“**翻页动画(本书)**”,将翻页动画更改为“**滚动**”。
|
||||
|
||||
### 14. 阅读图片章节、漫画或 EPUB 插图时,图片被缩放到一页中,以至无法看清,如何处理?
|
||||
* 临时处理方案:长按图片可以进行双指缩放。图片章节请先参考 Q13 中的方案将翻页动画更改为“**滚动**”。
|
||||
* 3.0 旧版可以点击书籍界面的章节标题进入“**编辑书源**”界面,在“**正文**”——“**图片样式**”中填入 *`full`*,保存更改,刷新当前章节即可。
|
||||
* 3.0 新版可以直接在书籍阅读界面点击右上角的“**⁝**”按钮,选择“**图片样式**”——***`full`***。
|
||||
|
||||
|
||||
## 替换净化相关
|
||||
|
||||
### 1. 替换净化是什么?
|
||||
替换净化可以去除书籍内容里的广告、错别字、屏蔽词等。
|
||||
|
||||
### 2. 如何自己填写净化替换规则?
|
||||
* 第一行:替换规则名称。请根据自己需求对替换净化规则进行命名;
|
||||
* 第二行:分组。净化规则的分组组别;
|
||||
* 第三行:替换规则。填写需要被替换的内容;
|
||||
* 第四行:替换为。填写想替换成的内容(如不填则默认表示删除第三行里填写的内容);
|
||||
* 第五行:替换范围,选填书名或者源名。填写此替换净化规则需要对哪本书籍或者哪个书源生效(如不填则对所有书籍和书源生效)。
|
||||
|
||||
**【注】** *如常规去除方法去除不掉,则需要勾选“使用正则表达式”,同时第三行里的替换规则也需要按照正则表达式来填写(正则表达式填写方法可自行网上搜索学习)。*
|
||||
|
||||
|
||||
## 备份相关
|
||||
|
||||
### 1. 云备份在哪?
|
||||
“**我的**”——“**备份与恢复**”——“**WebDav 设置**”。
|
||||
|
||||
### 2. 如何操作进行云备份?
|
||||
* 侧栏设置,WebDav 设置;
|
||||
* 正确填写 WebDAV 服务器地址、账号和密码;
|
||||
* 无需操作,APP 默认每天自动云备份一次。
|
||||
|
||||
作者在此诚挚推荐使用【坚果云】进行 WebDav 备份。
|
||||
|
||||
如果直接在手机上注册,须下载【坚果云】APP,步骤较为繁琐。推荐在电脑上进行操作:
|
||||
1. 打开注册链接:https://www.jianguoyun.com/d/signup ;
|
||||
2. 注册后,进入坚果云;
|
||||
3. 点击右上角账户名处选择“**账户信息**”,然后选择“**安全选项**”;
|
||||
4. 在“**安全选项**”中找到“**第三方应用管理**”,并选择“**添加应用**”,输入名称(如“阅读”)后,会生成密码,选择完成;
|
||||
5. 其中 `https://dav.jianguoyun.com/dav/` 就是填入“**WebDAV 服务器地址**”的内容,“**使用情况**”后面的邮箱地址就是你的“**WebDAV 账号**”,点击“**显示密码**“后得到的密码就是你的“**WebDAV 密码**”。
|
||||
|
||||
### 3. 关于云备份的相关说明
|
||||
|
||||
在正确设置好云备份的情况下,APP 默认每天自动云备份一次,当日多次手动云备份会对当日的旧云备份文件进行覆盖,并不会覆盖之前及之后不同日期的备份文件,每天所自动云备份的文件会按照日期进行命名。
|
||||
|
||||
### 4. 本地备份和云备份都能备份哪些东西?
|
||||
书架、看书进度、搜索记录、书源、替换和 APP 设置等都会备份,基本涵盖所有内容。
|
||||
|
||||
### 5. 出现某些未知 Bug 怎么办?
|
||||
清除软件数据试试看,不行再进行反馈。
|
||||
|
||||
|
||||
## 其他
|
||||
|
||||
### 1. 如何听书?
|
||||
可以使用手机自带的朗读引擎,也可使用第三方如 Google(谷歌)或小米等朗读引擎。
|
||||
|
||||
【具体操作】*安装——系统设置——其他高级设置——辅助功能——TTS 输出——选择安装的朗读引擎(不同品牌手机的操作方法及步骤也不同,视情况而定)。*
|
||||
|
||||
### 2. 如何设置屏幕方向、屏幕显示时长、显示/隐藏状态栏、显示/隐藏导航栏、音量键翻页、长按选择文本、点击总是翻下一页或自定义翻页按键?
|
||||
阅读界面——“**设置**”(可上划,下面还有其他设置)。
|
||||
|
||||
### 3. 搜索的时候感觉手机卡顿,如何解决?
|
||||
“**我的**”——“**其他设置**”——调低“**更新和搜索线程数**”。
|
||||
@@ -0,0 +1,22 @@
|
||||
# 书源调试
|
||||
|
||||
* 调试搜索>>输入关键字,如:
|
||||
```
|
||||
系统
|
||||
```
|
||||
* 调试发现>>输入发现URL,如:
|
||||
```
|
||||
月票榜::https://www.qidian.com/rank/yuepiao?page={{page}}
|
||||
```
|
||||
* 调试详情页>>输入详情页URL,如:
|
||||
```
|
||||
https://m.qidian.com/book/1015609210
|
||||
```
|
||||
* 调试目录页>>输入目录页URL,如:
|
||||
```
|
||||
++https://www.zhaishuyuan.com/read/30394
|
||||
```
|
||||
* 调试正文页>>输入正文页URL,如:
|
||||
```
|
||||
--https://www.zhaishuyuan.com/chapter/30394/20940996
|
||||
```
|
||||
@@ -0,0 +1,7 @@
|
||||
## 字典规则说明
|
||||
|
||||
* 字典规则是用在正文文字选择菜单字典里的规则,通常用来做翻译或者查找
|
||||
* urlRule
|
||||
* 同书源的url规则
|
||||
* showRule
|
||||
* 用来提取显示到对话框里面内容的规则
|
||||
@@ -0,0 +1,15 @@
|
||||
# 在线朗读规则说明
|
||||
|
||||
* 在线朗读规则为url规则,同书源url
|
||||
* js参数
|
||||
```
|
||||
speakText //朗读文本
|
||||
speakSpeed //朗读速度,5-50
|
||||
```
|
||||
* 例:
|
||||
```
|
||||
http://tts.baidu.com/text2audio,{
|
||||
"method": "POST",
|
||||
"body": "tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=5003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio"
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,409 @@
|
||||
# js变量和函数
|
||||
|
||||
书源规则中使用js可访问以下变量
|
||||
> java 变量-当前类
|
||||
> baseUrl 变量-当前url,String
|
||||
> result 变量-上一步的结果
|
||||
> book 变量-[书籍类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/Book.kt)
|
||||
> chapter 变量-[当前目录类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/BookChapter.kt)
|
||||
> source 变量-[基础书源类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/BaseSource.kt)
|
||||
> cookie 变量-[cookie操作类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/help/http/CookieStore.kt)
|
||||
> cache 变量-[缓存操作类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/help/CacheManager.kt)
|
||||
> title 变量-当前标题,String
|
||||
> src 内容,源码
|
||||
> nextChapterUrl 变量 下一章节url
|
||||
|
||||
## 当前类对象的可使用的部分方法
|
||||
|
||||
### [RssJsExtensions](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/ui/rss/read/RssJsExtensions.kt)
|
||||
> 只能在订阅源`shouldOverrideUrlLoading`规则中使用
|
||||
> 订阅添加跳转url拦截, js, 返回true拦截,js变量url,可以通过js打开url
|
||||
> 例子https://github.com/gedoor/legado/discussions/3259
|
||||
|
||||
* 调用阅读搜索
|
||||
|
||||
```
|
||||
java.searchBook(
|
||||
bookName)
|
||||
```
|
||||
|
||||
* 添加书架
|
||||
|
||||
```
|
||||
java.addBook(bookUrl)
|
||||
```
|
||||
|
||||
### [AnalyzeUrl](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt) 部分函数
|
||||
> js中通过java.调用,只在`登录检查JS`规则中有效
|
||||
```
|
||||
initUrl() //重新解析url,可以用于登录检测js登录后重新解析url重新访问
|
||||
getHeaderMap().putAll(source.getHeaderMap(true)) //重新设置登录头
|
||||
getStrResponse( jsStr: String? = null, sourceRegex: String? = null) //返回访问结果,文本类型,书源内部重新登录后可调用此方法重新返回结果
|
||||
getResponse(): Response //返回访问结果,网络朗读引擎采用的是这个,调用登录后在调用这方法可以重新访问,参考阿里云登录检测
|
||||
```
|
||||
|
||||
### [AnalyzeRule](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt) 部分函数
|
||||
* 获取文本/文本列表
|
||||
> `mContent` 待解析源代码,默认为当前页面
|
||||
> `isUrl` 链接标识,默认为`false`
|
||||
```
|
||||
java.getString(ruleStr: String?, mContent: Any? = null, isUrl: Boolean = false)
|
||||
java.getStringList(ruleStr: String?, mContent: Any? = null, isUrl: Boolean = false)
|
||||
```
|
||||
* 设置解析内容
|
||||
|
||||
```
|
||||
java.setContent(content: Any?, baseUrl: String? = null):
|
||||
```
|
||||
|
||||
* 获取Element/Element列表
|
||||
|
||||
> 如果要改变解析源代码,请先使用`java.setContent`
|
||||
|
||||
```
|
||||
java.getElement(ruleStr: String)
|
||||
java.getElements(ruleStr: String)
|
||||
```
|
||||
|
||||
* 重新搜索书籍/重新获取目录url
|
||||
|
||||
> 可以在刷新目录之前使用,有些书源书籍地址和目录url会变
|
||||
|
||||
```
|
||||
java.reGetBook()
|
||||
java.refreshTocUrl()
|
||||
```
|
||||
* 变量存取
|
||||
|
||||
```
|
||||
java.get(key)
|
||||
java.put(key, value)
|
||||
```
|
||||
|
||||
### [js扩展类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/help/JsExtensions.kt) 部分函数
|
||||
|
||||
* 链接解析[JsURL](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/utils/JsURL.kt)
|
||||
|
||||
```
|
||||
java.toURL(url): JsURL
|
||||
java.toURL(url, baseUrl): JsURL
|
||||
```
|
||||
* 网络请求
|
||||
|
||||
```
|
||||
java.ajax(urlStr): String
|
||||
java.ajaxAll(urlList: Array<String>): Array<StrResponse?>
|
||||
//返回Response 方法body() code() message() header() raw() toString()
|
||||
java.connect(urlStr): StrResponse
|
||||
|
||||
java.post(url: String, body: String, headerMap: Map<String, String>): Connection.Response
|
||||
|
||||
java.get(url: String, headerMap: Map<String, String>): Connection.Response
|
||||
|
||||
java.head(url: String, headerMap: Map<String, String>): Connection.Response
|
||||
|
||||
* 使用webView访问网络
|
||||
* @param html 直接用webView载入的html, 如果html为空直接访问url
|
||||
* @param url html内如果有相对路径的资源不传入url访问不了
|
||||
* @param js 用来取返回值的js语句, 没有就返回整个源代码
|
||||
* @return 返回js获取的内容
|
||||
java.webView(html: String?, url: String?, js: String?): String?
|
||||
|
||||
* 使用webView获取跳转url
|
||||
java.webViewGetOverrideUrl(html: String?, url: String?, js: String?, overrideUrlRegex: String): String?
|
||||
|
||||
* 使用webView获取资源url
|
||||
java.webViewGetSource(html: String?, url: String?, js: String?, sourceRegex: String): String?
|
||||
|
||||
* 使用内置浏览器打开链接,可用于获取验证码 手动验证网站防爬
|
||||
* @param url 要打开的链接
|
||||
* @param title 浏览器的标题
|
||||
java.startBrowser(url: String, title: String)
|
||||
|
||||
* 使用内置浏览器打开链接,并等待网页结果 .body()获取网页内容
|
||||
java.startBrowserAwait(url: String, title: String): StrResponse
|
||||
```
|
||||
* 调试
|
||||
```
|
||||
java.log(msg)
|
||||
java.logType(var)
|
||||
```
|
||||
* 获取用户输入的验证码
|
||||
```
|
||||
java.getVerificationCode(imageUrl)
|
||||
```
|
||||
* 弹窗提示
|
||||
```
|
||||
java.longToast(msg: Any?)
|
||||
java.toast(msg: Any?)
|
||||
```
|
||||
* 从网络(由java.cacheFile实现)、本地读取JavaScript文件,导入上下文请手动`eval(String(...))`
|
||||
```
|
||||
java.importScript(url)
|
||||
//相对路径支持android/data/{package}/cache
|
||||
java.importScript(relativePath)
|
||||
java.importScript(absolutePath)
|
||||
```
|
||||
* 缓存网络文件
|
||||
```
|
||||
获取
|
||||
java.cacheFile(url)
|
||||
java.cacheFile(url,saveTime)
|
||||
执行内容
|
||||
eval(String(java.cacheFile(url)))
|
||||
删除缓存文件
|
||||
cache.delete(java.md5Encode16(url))
|
||||
```
|
||||
* 获取网络压缩文件里面指定路径的数据 *可替换Zip Rar 7Z
|
||||
```
|
||||
java.get*StringContent(url: String, path: String): String
|
||||
|
||||
java.get*StringContent(url: String, path: String, charsetName: String): String
|
||||
|
||||
java.get*ByteArrayContent(url: String, path: String): ByteArray?
|
||||
|
||||
```
|
||||
* base64
|
||||
> flags参数可省略,默认Base64.NO_WRAP,查看[flags参数说明](https://blog.csdn.net/zcmain/article/details/97051870)
|
||||
```
|
||||
java.base64Decode(str: String)
|
||||
java.base64Decode(str: String, charset: String)
|
||||
java.base64DecodeToByteArray(str: String, flags: Int)
|
||||
java.base64Encode(str: String, flags: Int)
|
||||
```
|
||||
* ByteArray
|
||||
```
|
||||
Str转Bytes
|
||||
java.strToBytes(str: String)
|
||||
java.strToBytes(str: String, charset: String)
|
||||
Bytes转Str
|
||||
java.bytesToStr(bytes: ByteArray)
|
||||
java.bytesToStr(bytes: ByteArray, charset: String)
|
||||
```
|
||||
* Hex
|
||||
```
|
||||
HexString 解码为字节数组
|
||||
java.hexDecodeToByteArray(hex: String)
|
||||
hexString 解码为utf8String
|
||||
java.hexDecodeToString(hex: String)
|
||||
utf8 编码为hexString
|
||||
java.hexEncodeToString(utf8: String)
|
||||
```
|
||||
* 标识id
|
||||
```
|
||||
java.randomUUID()
|
||||
java.androidId()
|
||||
```
|
||||
* 繁简转换
|
||||
```
|
||||
将文本转换为简体
|
||||
java.t2s(text: String): String
|
||||
将文本转换为繁体
|
||||
java.s2t(text: String): String
|
||||
```
|
||||
* 文件
|
||||
> 所有对于文件的读写删操作都是相对路径,只能操作阅读缓存/android/data/{package}/cache/内的文件
|
||||
```
|
||||
//文件下载 url用于生成文件名,返回文件路径
|
||||
downloadFile(url: String): String
|
||||
//文件解压,zipPath为压缩文件路径,返回解压路径
|
||||
unArchiveFile(zipPath: String): String
|
||||
unzipFile(zipPath: String): String
|
||||
unrarFile(zipPath: String): String
|
||||
un7zFile(zipPath: String): String
|
||||
//文件夹内所有文件读取
|
||||
getTxtInFolder(unzipPath: String): String
|
||||
//读取文本文件
|
||||
readTxtFile(path: String): String
|
||||
//删除文件
|
||||
deleteFile(path: String)
|
||||
```
|
||||
|
||||
### [js加解密类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/help/JsEncodeUtils.kt) 部分函数
|
||||
|
||||
> 提供在JavaScript环境中快捷调用crypto算法的函数,由[hutool-crypto](https://www.hutool.cn/docs/#/crypto/概述)实现
|
||||
> 由于兼容性问题,hutool-crypto当前版本为5.8.22
|
||||
|
||||
> 其他没有添加的算法可在JavaScript中使用`JavaImporter`[调用](https://m.jb51.net/article/92138.htm)Java,例子可参考`朗读引擎-阿里云语音`
|
||||
|
||||
> 注意阅读app会屏蔽部分java类调用,见[RhinoClassShutter](https://github.com/gedoor/legado/blob/master/modules/rhino1.7.3/src/main/java/com/script/rhino/RhinoClassShutter.kt)
|
||||
|
||||
> 注意:如果输入的参数不是Utf8String 可先调用`java.hexDecodeToByteArray java.base64DecodeToByteArray`转成ByteArray
|
||||
* 对称加密
|
||||
> 输入参数key iv 支持ByteArray|**Utf8String**
|
||||
```
|
||||
// 创建Cipher
|
||||
java.createSymmetricCrypto(transformation, key, iv)
|
||||
```
|
||||
>解密加密参数 data支持ByteArray|Base64String|HexString|InputStream
|
||||
```
|
||||
//解密为ByteArray String
|
||||
cipher.decrypt(data)
|
||||
cipher.decryptStr(data)
|
||||
//加密为ByteArray Base64字符 HEX字符
|
||||
cipher.encrypt(data)
|
||||
cipher.encryptBase64(data)
|
||||
cipher.encryptHex(data)
|
||||
```
|
||||
* 非对称加密
|
||||
> 输入参数 key支持ByteArray|**Utf8String**
|
||||
```
|
||||
//创建cipher
|
||||
java.createAsymmetricCrypto(transformation)
|
||||
//设置密钥
|
||||
.setPublicKey(key)
|
||||
.setPrivateKey(key)
|
||||
|
||||
```
|
||||
> 解密加密参数 data支持ByteArray|Base64String|HexString|InputStream
|
||||
```
|
||||
//解密为ByteArray String
|
||||
cipher.decrypt(data, usePublicKey: Boolean? = true
|
||||
)
|
||||
cipher.decryptStr(data, usePublicKey: Boolean? = true
|
||||
)
|
||||
//加密为ByteArray Base64字符 HEX字符
|
||||
cipher.encrypt(data, usePublicKey: Boolean? = true
|
||||
)
|
||||
cipher.encryptBase64(data, usePublicKey: Boolean? = true
|
||||
)
|
||||
cipher.encryptHex(data, usePublicKey: Boolean? = true
|
||||
)
|
||||
```
|
||||
* 签名
|
||||
> 输入参数 key 支持ByteArray|**Utf8String**
|
||||
```
|
||||
//创建Sign
|
||||
java.createSign(algorithm)
|
||||
//设置密钥
|
||||
.setPublicKey(key)
|
||||
.setPrivateKey(key)
|
||||
```
|
||||
> 签名参数 data支持ByteArray|inputStream|String
|
||||
```
|
||||
//签名输出 ByteArray HexString
|
||||
sign.sign(data)
|
||||
sign.signHex(data)
|
||||
```
|
||||
* 摘要
|
||||
```
|
||||
java.digestHex(data: String, algorithm: String,): String?
|
||||
|
||||
java.digestBase64Str(data: String, algorithm: String,): String?
|
||||
```
|
||||
* md5
|
||||
```
|
||||
java.md5Encode(str)
|
||||
java.md5Encode16(str)
|
||||
```
|
||||
* HMac
|
||||
```
|
||||
java.HMacHex(data: String, algorithm: String, key: String): String
|
||||
|
||||
java.HMacBase64(data: String, algorithm: String, key: String): String
|
||||
```
|
||||
|
||||
## book对象的可用属性
|
||||
### 属性
|
||||
> 使用方法: 在js中或{{}}中使用book.属性的方式即可获取.如在正文内容后加上 ##{{book.name+"正文卷"+title}} 可以净化 书名+正文卷+章节名称(如 我是大明星正文卷第二章我爸是豪门总裁) 这一类的字符.
|
||||
```
|
||||
bookUrl // 详情页Url(本地书源存储完整文件路径)
|
||||
tocUrl // 目录页Url (toc=table of Contents)
|
||||
origin // 书源URL(默认BookType.local)
|
||||
originName //书源名称 or 本地书籍文件名
|
||||
name // 书籍名称(书源获取)
|
||||
author // 作者名称(书源获取)
|
||||
kind // 分类信息(书源获取)
|
||||
customTag // 分类信息(用户修改)
|
||||
coverUrl // 封面Url(书源获取)
|
||||
customCoverUrl // 封面Url(用户修改)
|
||||
intro // 简介内容(书源获取)
|
||||
customIntro // 简介内容(用户修改)
|
||||
charset // 自定义字符集名称(仅适用于本地书籍)
|
||||
type // 0:text 1:audio
|
||||
group // 自定义分组索引号
|
||||
latestChapterTitle // 最新章节标题
|
||||
latestChapterTime // 最新章节标题更新时间
|
||||
lastCheckTime // 最近一次更新书籍信息的时间
|
||||
lastCheckCount // 最近一次发现新章节的数量
|
||||
totalChapterNum // 书籍目录总数
|
||||
durChapterTitle // 当前章节名称
|
||||
durChapterIndex // 当前章节索引
|
||||
durChapterPos // 当前阅读的进度(首行字符的索引位置)
|
||||
durChapterTime // 最近一次阅读书籍的时间(打开正文的时间)
|
||||
canUpdate // 刷新书架时更新书籍信息
|
||||
order // 手动排序
|
||||
originOrder //书源排序
|
||||
variable // 自定义书籍变量信息(用于书源规则检索书籍信息)
|
||||
```
|
||||
|
||||
## chapter对象的部分可用属性
|
||||
> 使用方法: 在js中或{{}}中使用chapter.属性的方式即可获取.如在正文内容后加上 ##{{chapter.title+chapter.index}} 可以净化 章节标题+序号(如 第二章 天仙下凡2) 这一类的字符.
|
||||
```
|
||||
url // 章节地址
|
||||
title // 章节标题
|
||||
baseUrl //用来拼接相对url
|
||||
bookUrl // 书籍地址
|
||||
index // 章节序号
|
||||
resourceUrl // 音频真实URL
|
||||
tag //
|
||||
start // 章节起始位置
|
||||
end // 章节终止位置
|
||||
variable //变量
|
||||
```
|
||||
|
||||
## source对象的部分可用函数
|
||||
* 获取书源url
|
||||
```
|
||||
source.getKey()
|
||||
```
|
||||
* 书源变量存取
|
||||
```
|
||||
source.setVariable(variable: String?)
|
||||
source.getVariable()
|
||||
```
|
||||
|
||||
* 登录头操作
|
||||
```
|
||||
source.getLoginHeader()
|
||||
source.getLoginHeaderMap().get(key: String)
|
||||
source.putLoginHeader(header: String)
|
||||
source.removeLoginHeader()
|
||||
```
|
||||
* 用户登录信息操作
|
||||
> 使用`登录UI`规则,并成功登录,阅读自动加密保存登录UI规则中除type为button的信息
|
||||
```
|
||||
source.getLoginInfo()
|
||||
source.getLoginInfoMap().get(key: String)
|
||||
source.removeLoginInfo()
|
||||
```
|
||||
## cookie对象的部分可用函数
|
||||
```
|
||||
获取全部cookie
|
||||
cookie.getCookie(url)
|
||||
获取cookie某一键值
|
||||
cookie.getKey(url,key)
|
||||
删除cookie
|
||||
cookie.removeCookie(url)
|
||||
```
|
||||
|
||||
## cache对象的部分可用函数
|
||||
> saveTime单位:秒,可省略
|
||||
> 保存至数据库和缓存文件(50M),保存的内容较大时请使用`getFile putFile`
|
||||
```
|
||||
保存
|
||||
cache.put(key: String, value: Any , saveTime: Int)
|
||||
读取数据库
|
||||
cache.get(key: String): String?
|
||||
删除
|
||||
cache.delete(key: String)
|
||||
缓存文件内容
|
||||
cache.putFile(key: String, value: String, saveTime: Int)
|
||||
读取文件内容
|
||||
cache.getFile(key: String): String?
|
||||
保存到内存
|
||||
cache.deleteMemory(key: String)
|
||||
cache.getFromMemory(key: String): Any?
|
||||
cache.putMemory(key: String, value: Any)
|
||||
|
||||
```
|
||||
@@ -0,0 +1,46 @@
|
||||
# 阅读界面帮助文档
|
||||
|
||||
## 阅读界面主菜单
|
||||
* 顶部操作
|
||||
* 章节名称:点击可编辑书源
|
||||
* 章节url:点击可打开浏览器浏览
|
||||
* 菜单:**不同类型的书籍显示的菜单不同**。详情请查看菜单文字,长按菜单图标可显示文字
|
||||
* 中间左侧-亮度调节
|
||||
* 亮度调节的顶端有跟随系统亮度的开关,打开后亮度跟随系统,关闭后才可以调节亮度条
|
||||
* 底部操作
|
||||
* 4个圆形按钮依次为 全文搜索✧自动翻页✧替换净化✧切换夜间模式
|
||||
* 上一章✧下一章中间的进度条为页数进度,要快速跳转章节点击目录按钮进入目录快速跳转
|
||||
* 目录->目录和书签界面
|
||||
* 朗读->单击开始朗读,长按进入朗读设置界面
|
||||
* 界面->所有排版设置都在里面
|
||||
* 设置->其它一些设置,找不到的设置去这里看看,可滚动
|
||||
|
||||
## 全文搜索
|
||||
搜索本地缓存或者本地文件,不能搜索在线内容
|
||||
书籍字数、净化规则数量、简繁转化、文章分段都会影响到搜索速度,请酌情启用
|
||||
|
||||
## 朗读设置界面
|
||||
* 后台->进入后台朗读,可以做一些其它事
|
||||
* 设置->朗读引擎设置,可以切换本地TTS和在线朗读,在线朗读可自定义
|
||||
|
||||
## 排版设置界面
|
||||
* 白天模式和夜间模式背景不同布局相同
|
||||
* 共用布局->启用共用布局时所有背景使用同一布局,关闭共用布局则每个背景单独布局
|
||||
* 长按背景可进入文字颜色和背景设置界面
|
||||
|
||||
## 其它设置界面
|
||||
* 屏幕方向
|
||||
* 屏幕超时
|
||||
* 隐藏状态栏
|
||||
* 扩展到刘海
|
||||
* 隐藏导航栏
|
||||
* 文字两端对齐
|
||||
* 文字底部对齐
|
||||
* 音量键翻页
|
||||
* 点击翻页
|
||||
* 朗读时音量键翻页
|
||||
* 自动换源->书源被删除时自动切换到其它书源
|
||||
* 长按选择文本
|
||||
* 显示亮度调节控件
|
||||
* 点击区域设置
|
||||
* 自定义翻页按键
|
||||
@@ -0,0 +1,204 @@
|
||||
# 正则表达式学习
|
||||
|
||||
- [基本匹配]
|
||||
- [元字符]
|
||||
- [英文句号]
|
||||
- [字符集]
|
||||
- [否定字符集]
|
||||
- [重复]
|
||||
- [星号]
|
||||
- [加号]
|
||||
- [问号]
|
||||
- [花括号]
|
||||
- [字符组]
|
||||
- [分支结构]
|
||||
- [转义特殊字符]
|
||||
- [定位符]
|
||||
- [插入符号]
|
||||
- [美元符号]
|
||||
- [简写字符集]
|
||||
- [断言]
|
||||
- [正向先行断言]
|
||||
- [负向先行断言]
|
||||
- [正向后行断言]
|
||||
- [负向后行断言]
|
||||
- [标记]
|
||||
- [不区分大小写]
|
||||
- [全局搜索]
|
||||
- [多行匹配]
|
||||
- [常用正则表达式]
|
||||
|
||||
## 1. 基本匹配
|
||||
|
||||
正则表达式只是我们用于在文本中检索字母和数字的模式。例如正则表达式 `cat`,表示: 字母 `c` 后面跟着一个字母 `a`,再后面跟着一个字母 `t`。<pre>"cat" => The <a href="#learn-regex"><strong>cat</strong></a> sat on the mat</pre>
|
||||
|
||||
正则表达式 `123` 会匹配字符串 "123"。通过将正则表达式中的每个字符逐个与要匹配的字符串中的每个字符进行比较,来完成正则匹配。
|
||||
正则表达式通常区分大小写,因此正则表达式 `Cat` 与字符串 "cat" 不匹配。<pre>"Cat" => The cat sat on the <a href="#learn-regex"><strong>Cat</strong></a></pre>
|
||||
|
||||
## 2. 元字符
|
||||
|
||||
元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符写在方括号内的时候有特殊含义。
|
||||
元字符如下:
|
||||
|
||||
|元字符|描述|
|
||||
|:----:|----|
|
||||
|.|匹配除换行符以外的任意字符。|
|
||||
|[ ]|字符类,匹配方括号中包含的任意字符。|
|
||||
|[^ ]|否定字符类。匹配方括号中不包含的任意字符|
|
||||
|*|匹配前面的子表达式零次或多次|
|
||||
|+|匹配前面的子表达式一次或多次|
|
||||
|?|匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。|
|
||||
|{n,m}|花括号,匹配前面字符至少 n 次,但是不超过 m 次。|
|
||||
|(xyz)|字符组,按照确切的顺序匹配字符xyz。|
|
||||
|||分支结构,匹配符号之前的字符或后面的字符。|
|
||||
|\|转义符,它可以还原元字符原来的含义,允许你匹配保留字符 <code>[ ] ( ) { } . * + ? ^ $ \ |</code>|
|
||||
|^|匹配行的开始|
|
||||
|$|匹配行的结束|
|
||||
|
||||
## 2.1 英文句号
|
||||
|
||||
英文句号 `.` 是元字符的最简单的例子。元字符 `.` 可以匹配任意单个字符。它不会匹配换行符和新行的字符。例如正则表达式 `.ar`,表示: 任意字符后面跟着一个字母 `a`,
|
||||
再后面跟着一个字母 `r`。<pre>".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.</pre>
|
||||
|
||||
## 2.2 字符集
|
||||
|
||||
字符集也称为字符类。方括号被用于指定字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。
|
||||
例如正则表达式 `[Tt]he`,表示: 大写 `T` 或小写 `t` ,后跟字母 `h`,再后跟字母 `e`。<pre>"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage.</pre>
|
||||
|
||||
然而,字符集中的英文句号表示它字面的含义。正则表达式 `ar[.]`,表示小写字母 `a`,后面跟着一个字母 `r`,再后面跟着一个英文句号 `.` 字符。<pre>"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a></pre>
|
||||
|
||||
### 2.2.1 否定字符集
|
||||
|
||||
一般来说插入字符 `^` 表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。例如正则表达式 `[^c]ar`,表示: 除了字母 `c` 以外的任意字符,后面跟着字符 `a`,
|
||||
再后面跟着一个字母 `r`。<pre>"[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.</pre>
|
||||
|
||||
## 2.3 重复
|
||||
|
||||
以下元字符 `+`,`*` 或 `?` 用于指定子模式可以出现多少次。这些元字符在不同情况下的作用不同。
|
||||
|
||||
### 2.3.1 星号
|
||||
|
||||
该符号 `*` 表示匹配上一个匹配规则的零次或多次。正则表达式 `a*` 表示小写字母 `a` 可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。
|
||||
例如正则表达式 `[a-z]*`,表示: 一行中可以包含任意数量的小写字母。<pre>"[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21.</pre>
|
||||
|
||||
该 `*` 符号可以与元符号 `.` 用在一起,用来匹配任意字符串 `.*`。该 `*` 符号可以与空格符 `\s` 一起使用,用来匹配一串空格字符。
|
||||
例如正则表达式 `\s*cat\s*`,表示: 零个或多个空格,后面跟小写字母 `c`,再后面跟小写字母 `a`,再再后面跟小写字母 `t`,后面再跟零个或多个空格。<pre>"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex"><strong>cat</strong></a>.</pre>
|
||||
|
||||
### 2.3.2 加号
|
||||
|
||||
该符号 `+` 匹配上一个字符的一次或多次。例如正则表达式 `c.+t`,表示: 一个小写字母 `c`,后跟任意数量的字符,后跟小写字母 `t`。<pre>"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>.</pre>
|
||||
|
||||
### 2.3.3 问号
|
||||
|
||||
在正则表达式中,元字符 `?` 用来表示前一个字符是可选的。该符号匹配前一个字符的零次或一次。
|
||||
例如正则表达式 `[T]?he`,表示: 可选的大写字母 `T`,后面跟小写字母 `h`,后跟小写字母 `e`。<pre>"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.</pre><pre>"[T]?he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in t<a href="#learn-regex"><strong>he</strong></a> garage.</pre>
|
||||
|
||||
## 2.4 花括号
|
||||
|
||||
在正则表达式中花括号(也被称为量词 ?)用于指定字符或一组字符可以重复的次数。例如正则表达式 `[0-9]{2,3}`,表示: 匹配至少2位数字但不超过3位(0到9范围内的字符)。<pre>"[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.</pre>
|
||||
|
||||
我们可以省略第二个数字。例如正则表达式 `[0-9]{2,}`,表示: 匹配2个或更多个数字。如果我们也删除逗号,则正则表达式 `[0-9]{2}`,表示: 匹配正好为2位数的数字。<pre>"[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.</pre><pre>"[0-9]{2}" => The number was 9.<a href="#learn-regex"><strong>99</strong></a><a href="#learn-regex"><strong>97</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.</pre>
|
||||
|
||||
## 2.5 字符组
|
||||
|
||||
字符组是一组写在圆括号内的子模式 `(...)`。正如我们在正则表达式中讨论的那样,如果我们把一个量词放在一个字符之后,它会重复前一个字符。
|
||||
但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。
|
||||
例如正则表达式 `(ab)*` 表示匹配零个或多个的字符串 "ab"。我们还可以在字符组中使用元字符 `|`。例如正则表达式 `(c|g|p)ar`,表示: 小写字母 `c`、`g` 或 `p` 后面跟字母 `a`,后跟字母 `r`。<pre>"(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.</pre>
|
||||
|
||||
## 2.6 分支结构
|
||||
|
||||
在正则表达式中垂直条 `|` 用来定义分支结构,分支结构就像多个表达式之间的条件。现在你可能认为这个字符集和分支机构的工作方式一样。
|
||||
但是字符集和分支结构巨大的区别是字符集只在字符级别上有作用,然而分支结构在表达式级别上依然可以使用。
|
||||
例如正则表达式 `(T|t)he|car`,表示: 大写字母 `T` 或小写字母 `t`,后面跟小写字母 `h`,后跟小写字母 `e` 或小写字母 `c`,后跟小写字母 `a`,后跟小写字母 `r`。<pre>"(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage.</pre>
|
||||
|
||||
## 2.7 转义特殊字符
|
||||
|
||||
正则表达式中使用反斜杠 `\` 来转义下一个字符。这将允许你使用保留字符来作为匹配字符 `{ } [ ] / \ + * . $ ^ | ?`。在特殊字符前面加 `\`,就可以使用它来做匹配字符。
|
||||
例如正则表达式 `.` 是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配 `.` 字符,正则表达式 `(f|c|m)at\.?`,表示: 小写字母 `f`、`c` 或者 `m` 后跟小写字母 `a`,后跟小写字母 `t`,后跟可选的 `.` 字符。<pre>"(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a></pre>
|
||||
|
||||
## 2.8 定位符
|
||||
|
||||
在正则表达式中,为了检查匹配符号是否是起始符号或结尾符号,我们使用定位符。
|
||||
定位符有两种类型: 第一种类型是 `^` 检查匹配字符是否是起始字符,第二种类型是 `$`,它检查匹配字符是否是输入字符串的最后一个字符。
|
||||
|
||||
### 2.8.1 插入符号
|
||||
|
||||
插入符号 `^` 符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们使用正则表达式 `^a` (如果a是起始符号)匹配字符串 `abc`,它会匹配到 `a`。
|
||||
但是如果我们使用正则表达式 `^b`,它是匹配不到任何东西的,因为在字符串 `abc` 中 "b" 不是起始字符。
|
||||
让我们来看看另一个正则表达式 `^(T|t)he`,这表示: 大写字母 `T` 或小写字母 `t` 是输入字符串的起始符号,后面跟着小写字母 `h`,后跟小写字母 `e`。<pre>"(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage.</pre><pre>"^(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.</pre>
|
||||
|
||||
### 2.8.2 美元符号
|
||||
|
||||
美元 `$` 符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式 `(at\.)$`,表示: 小写字母 `a`,后跟小写字母 `t`,后跟一个 `.` 字符,且这个匹配器必须是字符串的结尾。<pre>"(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a></pre><pre>"(at\.)$" => The fat cat sat on the m<a href="#learn-regex"><strong>at.</strong></a></pre>
|
||||
|
||||
## 3. 简写字符集
|
||||
|
||||
正则表达式为常用的字符集和常用的正则表达式提供了简写。简写字符集如下:
|
||||
|
||||
|简写|描述|
|
||||
|:----:|----|
|
||||
|.|匹配除换行符以外的任意字符|
|
||||
|\w|匹配所有字母和数字的字符: `[a-zA-Z0-9_]`|
|
||||
|\W|匹配非字母和数字的字符: `[^\w]`|
|
||||
|\d|匹配数字: `[0-9]`|
|
||||
|\D|匹配非数字: `[^\d]`|
|
||||
|\s|匹配空格符: `[\t\n\f\r\p{Z}]`|
|
||||
|\S|匹配非空格符: `[^\s]`|
|
||||
|
||||
## 4. 断言
|
||||
|
||||
后行断言和先行断言有时候被称为断言,它们是特殊类型的 ***非捕获组*** (用于匹配模式,但不包括在匹配列表中)。当我们在一种特定模式之前或者之后有这种模式时,会优先使用断言。
|
||||
例如我们想获取输入字符串 `$4.44 and $10.88` 中带有前缀 `$` 的所有数字。我们可以使用这个正则表达式 `(?<=\$)[0-9\.]*`,表示: 获取包含 `.` 字符且前缀为 `$` 的所有数字。
|
||||
以下是正则表达式中使用的断言:
|
||||
|
||||
|符号|描述|
|
||||
|:----:|----|
|
||||
|?=|正向先行断言|
|
||||
|?!|负向先行断言|
|
||||
|?<=|正向后行断言|
|
||||
|?<!|负向后行断言|
|
||||
|
||||
### 4.1 正向先行断言
|
||||
|
||||
正向先行断言认为第一部分的表达式必须是先行断言表达式。返回的匹配结果仅包含与第一部分表达式匹配的文本。
|
||||
要在一个括号内定义一个正向先行断言,在括号中问号和等号是这样使用的 `(?=...)`。先行断言表达式写在括号中的等号后面。
|
||||
例如正则表达式 `(T|t)he(?=\sfat)`,表示: 匹配大写字母 `T` 或小写字母 `t`,后面跟字母 `h`,后跟字母 `e`。
|
||||
在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配 `The` 或 `the` 后面跟着 `fat`。<pre>"(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.</pre>
|
||||
|
||||
### 4.2 负向先行断言
|
||||
|
||||
当我们需要从输入字符串中获取不匹配表达式的内容时,使用负向先行断言。负向先行断言的定义跟我们定义的正向先行断言一样,
|
||||
唯一的区别是不是等号 `=`,我们使用否定符号 `!`,例如 `(?!...)`。
|
||||
我们来看看下面的正则表达式 `(T|t)he(?!\sfat)`,表示: 从输入字符串中获取全部 `The` 或者 `the` 且不匹配 `fat` 前面加上一个空格字符。<pre>"(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.</pre>
|
||||
|
||||
### 4.3 正向后行断言
|
||||
|
||||
正向后行断言是用于获取在特定模式之前的所有匹配内容。正向后行断言表示为 `(?<=...)`。例如正则表达式 `(?<=(T|t)he\s)(fat|mat)`,表示: 从输入字符串中获取在单词 `The` 或 `the` 之后的所有 `fat` 和 `mat` 单词。<pre>"(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>.</pre>
|
||||
|
||||
### 4.4 负向后行断言
|
||||
|
||||
负向后行断言是用于获取不在特定模式之前的所有匹配的内容。负向后行断言表示为 `(?<!...)`。例如正则表达式 `(?<!(T|t)he\s)(cat)`,表示: 在输入字符中获取所有不在 `The` 或 `the` 之后的所有单词 `cat`。<pre>"(?<!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>.</pre>
|
||||
|
||||
## 5. 标记
|
||||
|
||||
标记也称为修饰符,因为它会修改正则表达式的输出。这些标志可以以任意顺序或组合使用,并且是正则表达式的一部分。
|
||||
|
||||
|标记|描述|
|
||||
|:----:|----|
|
||||
|i|不区分大小写: 将匹配设置为不区分大小写。|
|
||||
|g|全局搜索: 搜索整个输入字符串中的所有匹配。|
|
||||
|m|多行匹配: 会匹配输入字符串每一行。|
|
||||
|
||||
* **数字**: `\d+$`
|
||||
* **用户名**: `^[\w\d_.]{4,16}$`
|
||||
* **字母数字字符**: `^[a-zA-Z0-9]*$`
|
||||
* **带空格的字母数字字符**: `^[a-zA-Z0-9 ]*$`
|
||||
* **小写字母**: `[a-z]+$`
|
||||
* **大写字母**: `[A-Z]+$`
|
||||
* **网址**: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$`
|
||||
* **日期 (MM/DD/YYYY)**: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$`
|
||||
* **日期 (YYYY/MM/DD)**: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$`
|
||||
* **求更求转发致谢**: `[\((【].*?[求更谢乐发推].*?[】)\)]`
|
||||
* **查找最新章节**: `您可以.*?查找最新章节`
|
||||
* **ps/PS**: `(?i)ps\b.*`
|
||||
* **Html标签**: `<[^>]+?>`
|
||||
@@ -0,0 +1,6 @@
|
||||
# 替换管理界面帮助
|
||||
|
||||
* 替换规则是用来替换正文内容的一种规则
|
||||
* 菜单可以新建和导入规则
|
||||
* 可以拖动排序
|
||||
* 可以选择操作
|
||||
@@ -0,0 +1,196 @@
|
||||
# 源规则帮助
|
||||
|
||||
* [阅读3.0(Legado)规则说明](https://mgz0227.github.io/The-tutorial-of-Legado/)
|
||||
* [书源帮助文档](https://mgz0227.github.io/The-tutorial-of-Legado/Rule/source.html)
|
||||
* [订阅源帮助文档](https://mgz0227.github.io/The-tutorial-of-Legado/Rule/rss.html)
|
||||
* 辅助键盘❓中可插入URL参数模板,打开帮助,js教程,正则教程,选择文件
|
||||
* 规则标志, {{......}}内使用规则必须有明显的规则标志,没有规则标志当作js执行
|
||||
```
|
||||
@@ 默认规则,直接写时可以省略@@
|
||||
@XPath: xpath规则,直接写时以//开头可省略@XPath
|
||||
@Json: json规则,直接写时以$.开头可省略@Json
|
||||
: regex规则,不可省略,只可以用在书籍列表和目录列表
|
||||
```
|
||||
* jsLib
|
||||
> 注入JavaScript到RhinoJs引擎中,支持两种格式,可实现[函数共用](https://github.com/gedoor/legado/wiki/JavaScript%E5%87%BD%E6%95%B0%E5%85%B1%E7%94%A8)
|
||||
|
||||
> `JavaScript Code` 直接填写JavaScript片段
|
||||
> `{"example":"https://www.example.com/js/example.js", ...}` 自动复用已经下载的js文件
|
||||
|
||||
* 并发率
|
||||
> 并发限制,单位ms,可填写两种格式
|
||||
|
||||
> `1000` 访问间隔1s
|
||||
> `20/60000` 60s内访问次数20
|
||||
|
||||
* 书源类型: 文件
|
||||
> 对于类似知轩藏书提供文件整合下载的网站,可以在书源详情的下载URL规则获取文件链接
|
||||
|
||||
> 通过截取下载链接或文件响应头头获取文件信息,获取失败会自动拼接`书名` `作者`和下载链接的`UrlOption`的`type`字段
|
||||
|
||||
> 压缩文件解压缓存会在下次启动后自动清理,不会占用额外空间
|
||||
|
||||
* CookieJar
|
||||
> 启用后会自动保存每次返回头中的Set-Cookie中的值,适用于验证码图片一类需要session的网站
|
||||
|
||||
* 登录UI
|
||||
> 不使用内置webView登录网站,需要使用`登录URL`规则实现登录逻辑,可使用`登录检查JS`检查登录结果
|
||||
> 版本20221113重要更改:按钮支持调用`登录URL`规则里面的函数,必须实现`login`函数
|
||||
```
|
||||
规则填写示范
|
||||
[
|
||||
{
|
||||
name: "telephone",
|
||||
type: "text"
|
||||
},
|
||||
{
|
||||
name: "password",
|
||||
type: "password"
|
||||
},
|
||||
{
|
||||
name: "注册",
|
||||
type: "button",
|
||||
action: "http://www.yooike.com/xiaoshuo/#/register?title=%E6%B3%A8%E5%86%8C"
|
||||
},
|
||||
{
|
||||
name: "获取验证码",
|
||||
type: "button",
|
||||
action: "getVerificationCode()"
|
||||
}
|
||||
]
|
||||
```
|
||||
* 登录URL
|
||||
> 可填写登录链接或者实现登录UI的登录逻辑的JavaScript
|
||||
```
|
||||
示范填写
|
||||
function login() {
|
||||
java.log("模拟登录请求");
|
||||
java.log(source.getLoginInfoMap());
|
||||
}
|
||||
function getVerificationCode() {
|
||||
java.log("登录UI按钮:获取到手机号码"+result.get("telephone"))
|
||||
}
|
||||
|
||||
登录按钮函数获取登录信息
|
||||
result.get("telephone")
|
||||
login函数获取登录信息
|
||||
source.getLoginInfo()
|
||||
source.getLoginInfoMap().get("telephone")
|
||||
source登录相关方法,可在js内通过source.调用,可以参考阿里云语音登录
|
||||
login()
|
||||
getHeaderMap(hasLoginHeader: Boolean = false)
|
||||
getLoginHeader(): String?
|
||||
getLoginHeaderMap(): Map<String, String>?
|
||||
putLoginHeader(header: String)
|
||||
removeLoginHeader()
|
||||
setVariable(variable: String?)
|
||||
getVariable(): String?
|
||||
AnalyzeUrl相关函数,js中通过java.调用
|
||||
initUrl() //重新解析url,可以用于登录检测js登录后重新解析url重新访问
|
||||
getHeaderMap().putAll(source.getHeaderMap(true)) //重新设置登录头
|
||||
getStrResponse( jsStr: String? = null, sourceRegex: String? = null) //返回访问结果,文本类型,书源内部重新登录后可调用此方法重新返回结果
|
||||
getResponse(): Response //返回访问结果,网络朗读引擎采用的是这个,调用登录后在调用这方法可以重新访问,参考阿里云登录检测
|
||||
```
|
||||
|
||||
* 发现url格式
|
||||
```json
|
||||
[
|
||||
{
|
||||
"title": "xxx",
|
||||
"url": "",
|
||||
"style": {
|
||||
"layout_flexGrow": 0,
|
||||
"layout_flexShrink": 1,
|
||||
"layout_alignSelf": "auto",
|
||||
"layout_flexBasisPercent": -1,
|
||||
"layout_wrapBefore": false
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
* 请求头,支持http代理,socks4 socks5代理设置
|
||||
```
|
||||
socks5代理
|
||||
{
|
||||
"proxy":"socks5://127.0.0.1:1080"
|
||||
}
|
||||
http代理
|
||||
{
|
||||
"proxy":"http://127.0.0.1:1080"
|
||||
}
|
||||
支持代理服务器验证
|
||||
{
|
||||
"proxy":"socks5://127.0.0.1:1080@用户名@密码"
|
||||
}
|
||||
注意:这些请求头是无意义的,会被忽略掉
|
||||
```
|
||||
|
||||
* url添加js参数,解析url时执行,可在访问url时处理url,例
|
||||
```
|
||||
https://www.baidu.com,{"js":"java.headerMap.put('xxx', 'yyy')"}
|
||||
https://www.baidu.com,{"js":"java.url=java.url+'yyyy'"}
|
||||
```
|
||||
|
||||
* 增加js方法,用于重定向拦截
|
||||
* `java.get(urlStr: String, headers: Map<String, String>)`
|
||||
* `java.post(urlStr: String, body: String, headers: Map<String, String>)`
|
||||
* 对于搜索重定向的源,可以使用此方法获得重定向后的url
|
||||
```
|
||||
(()=>{
|
||||
if(page==1){
|
||||
let url='https://www.yooread.net/e/search/index.php,'+JSON.stringify({
|
||||
"method":"POST",
|
||||
"body":"show=title&tempid=1&keyboard="+key
|
||||
});
|
||||
return java.put('surl',String(java.connect(url).raw().request().url()));
|
||||
} else {
|
||||
return java.get('surl')+'&page='+(page-1)
|
||||
}
|
||||
})()
|
||||
或者
|
||||
(()=>{
|
||||
let base='https://www.yooread.net/e/search/';
|
||||
if(page==1){
|
||||
let url=base+'index.php';
|
||||
let body='show=title&tempid=1&keyboard='+key;
|
||||
return base+java.put('surl',java.post(url,body,{}).header("Location"));
|
||||
} else {
|
||||
return base+java.get('surl')+'&page='+(page-1);
|
||||
}
|
||||
})()
|
||||
```
|
||||
|
||||
* 图片链接支持修改headers
|
||||
```
|
||||
let options = {
|
||||
"headers": {"User-Agent": "xxxx","Referrer":baseUrl,"Cookie":"aaa=vbbb;"}
|
||||
};
|
||||
'<img src="'+src+","+JSON.stringify(options)+'">'
|
||||
```
|
||||
|
||||
* 字体解析使用
|
||||
> 使用方法,在正文替换规则中使用,原理根据f1字体的字形数据到f2中查找字形对应的编码
|
||||
```
|
||||
<js>
|
||||
(function(){
|
||||
var b64=String(src).match(/ttf;base64,([^\)]+)/);
|
||||
if(b64){
|
||||
var f1 = java.queryBase64TTF(b64[1]);
|
||||
var f2 = java.queryTTF("https://alanskycn.gitee.io/teachme/assets/font/Source Han Sans CN Regular.ttf");
|
||||
return java.replaceFont(result, f1, f2);
|
||||
}
|
||||
return result;
|
||||
})()
|
||||
</js>
|
||||
```
|
||||
|
||||
* 购买操作
|
||||
> 可直接填写链接或者JavaScript,如果执行结果是网络链接将会自动打开浏览器,js返回true自动刷新目录和当前章节
|
||||
|
||||
* 图片解密
|
||||
> 适用于图片需要二次解密的情况,直接填写JavaScript,返回解密后的`ByteArray`
|
||||
> 部分变量说明:java(仅支持[js扩展类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/help/JsExtensions.kt)),result为待解密图片的`ByteArray`,src为图片链接
|
||||
|
||||
* 封面解密
|
||||
> 同图片解密 其中result为待解密封面的`inputStream`
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,60 @@
|
||||
# WebDav 书籍简明使用教程
|
||||
|
||||
> 本帮助页会在第一次进入时弹出,后续则不再出现,如想查看,请点击右上角 “**⁝**” > 帮助 查看此页。
|
||||
|
||||
虽然阅读主要是用来看网络小说的工具,但为了方便书友,也提供了一些本地书籍阅读的简单支持(epub、txt)
|
||||
|
||||
但阅读本地书籍的一个难题就是如何在多设备上同步阅读进度以及书籍,假如换了设备之后,原来设备上的本地书籍也要再次手动导入,不太方便。
|
||||
|
||||
阅读本身没有自己的服务器,没有类似多看、微信读书那种服务器存储的可能性,但是,阅读支持 WebDav 备份,那么我们也可以利用 WebDav 来同步书籍。
|
||||
|
||||
### 前提条件
|
||||
1. 配置好书籍存储位置(WebDav书籍下载存储到的位置):依次点击我的/其他设置/书籍存储位置,选择书籍保存位置即可。
|
||||
|
||||
2. 配置好 WebDav 备份(WebDav书籍的保存位置):我的/备份与恢复/WebDav设置。这里需要配置 WebDav 备份的服务器地址、账号、密码。详细的配置方案这里不赘述,请看这篇文章:[坚果云注册与配置 · 语雀 (yuque.com)](https://www.yuque.com/legado/wiki/fkx510) 或点击该页面右上角的帮助按钮,查看配置方法。
|
||||
|
||||
### 上传书籍到 WebDav
|
||||
|
||||
配置好 WebDav 后,从主界面进入 WebDav 书籍页没有任何书籍显示,这是很正常的,因为我们WebDav的服务器上还没有任何书籍。
|
||||
|
||||
目前将书籍上传到 WebDav 的方式有三种:
|
||||
|
||||
1. App 上传已导入的本地书籍。
|
||||
|
||||
长按已导入的本地书籍进入书籍详情 > 右上角 “**⁝**” 找到 **上传 WebDav** ,点击,等待几秒后即可上传成功。
|
||||
|
||||
2. App 上传已缓存的网络书籍。
|
||||
|
||||
主界面右上角点击更多设置 > 点击缓存/导出,在此页面右上角 “**⁝**” 找到 **导出到 WebDav** 并勾选。那么在书籍导出的时候便会自动上传一份到 WebDav 服务器中。
|
||||
|
||||
3. 使用坚果云客户端/自建WebDav服务客户端上传。
|
||||
|
||||
对于大部分用户来说,App上传足够了,但有些用户书籍数量可能比较大,那么我们不建议您一本一本通过 App 上传,更好的方式是使用您所使用的 WebDav 服务的客户端批量上传。
|
||||
|
||||
假设我们使用的坚果云的 WebDav 服务,进入 [坚果云官网](https://www.jianguoyun.com/d/home#/) ,下载对应平台的客户端安装运行,找到文件夹目录 legado/books ,这里就是存放书籍的位置,您可以批量将书籍上传到该文件夹下。
|
||||
|
||||
**不管是使用上述的任何一种方式上传的书籍,为了确保上传无误,请您最好在上传书籍后进入 WebDav 书籍页 检查是否能看到已经上传的书籍。**
|
||||
|
||||
### 下载 WebDav 书籍到本地
|
||||
|
||||
与上传方式的多种多样不同,下载书籍到本地的方式比较朴素。
|
||||
|
||||
在 **WebDav 书籍页** 浏览已经上传的书籍,找到自己要下载的书籍,点击 **加入书架** 按钮,软件则会自动下载该书籍到本地并加入到书架中。
|
||||
|
||||
### 注意事项
|
||||
|
||||
- 如果使用的是坚果云的 WebDav 服务,免费流量限额对于同步App设置等以及 **少量的书籍** 足够了。但是如果是频繁需要上传/下载书籍的用户流量可能就不太够用了,请注意个人的用量,避免出现超出限额影响 App 设置等的同步。
|
||||
|
||||
### 常见问题
|
||||
|
||||
- 进入 **WebDav书籍页** 提示 "获取WebDav书籍出错 webDav 没有配置"。
|
||||
|
||||
> 这是因为没有配置 WebDav 同步服务,按照上文 前提条件 中提到的配置 Webdav 同步的方法配置好就行了。
|
||||
|
||||
- A 设备上传的本地书籍能否在 B 设备上看到,是否能够自动加到书架?
|
||||
|
||||
> 如果 A 设备和 B 设备配置了相同的 WebDav 服务,那么 B 在 **WebDav 书籍页** 就能看到 A 上传的书籍。但是无法直接在书架上看到该书籍,这个可能后续会想方案来做,目前必须自己在 **WebDav 书籍页** 找到该书籍手动点击 **加入书架** 导入才行。
|
||||
|
||||
- 本地书籍的阅读进度/书签等是否同步?
|
||||
|
||||
> 可以同步。
|
||||
@@ -0,0 +1,19 @@
|
||||
# WebDav备份教程
|
||||
|
||||
### 阅读支持云备份,采用WebDav协议,所有支持WebDav的云盘都可以,建议采用坚果云,每月免费1G流量,用来备份阅读足够了,下面就采用坚果云来讲解配置步骤.
|
||||
|
||||
1. 打开坚果云网站 https://www.jianguoyun.com/d/home#/
|
||||
2. 如果没有注册过坚果云先注册一下
|
||||
3. 登录坚果云
|
||||
4. 右上角用户名点开点账户信息
|
||||
5. 点击安全选项
|
||||
6. 在第三方管理里添加应用
|
||||
7. 将应用示例里的服务器地址,用户名,和密码填到阅读的WebDav设置里
|
||||
8. 阅读的WebDav配置在我的-备份与恢复,创建子文件夹选项保持默认即可
|
||||
9. 设置完成后手动执行一下备份,看看是否成功
|
||||
10. 恢复时选择想要恢复的备份文件
|
||||
|
||||
### 自动备份说明
|
||||
|
||||
* 设置好备份之后每次退出App会自动进行备份
|
||||
* WebDav同一天的备份会覆盖,不同日期的备份不会覆盖
|
||||
Reference in New Issue
Block a user