ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Legado 阅读 3.0 书源「发现 URL」配置规范:JSON 多入口、Flexbox 布局与分页变量实战

Legado 阅读 3.0 书源「发现 URL」配置规范:JSON 多入口、Flexbox 布局与分页变量实战 移动开发前端应用【免费下载链接】legado-with-MD3使用 Material Design 3 全新设计的阅读 3.0项目地址https://gitcode.com/gh_mirrors/le/legado-with-MD3点击查看免费下载本文围绕 Legado阅读 3.0书源的「发现 URL」字段展开讲解如何用 JSON 数组为一个书源定义多个发现页入口分类、榜单等配置每个入口的标题、URL 与 Flexbox 布局样式并深入解析{{page}}分页变量的底层实现、与首页模块kindTitle的联动机制以及源码层面的解析与缓存逻辑。读完本文你将能够独立为任意书源编写可用的多入口发现 URL并理解其从配置到渲染的完整链路。1. 字段位置在哪里配置发现 URL在书源编辑器书源管理 → 编辑书源中找到发现选项卡其中存在「发现 URL」字段发现 → 发现 URL该字段对应书源数据结构中的exploreUrl属性。在源码中BookSource实体app/src/main/java/io/legado/app/data/entities/BookSource.kt以var exploreUrl: String? null存储该配置其相邻字段还包括enabledExplore是否启用发现与ruleExplore发现规则三者共同构成一个书源的“发现”能力。注意Legado 的术语中“发现”指按分类/榜单浏览书籍区别于关键词“搜索”。exploreUrl定义发现页的入口地址ruleExplore定义从响应中解析书籍列表的规则二者配套使用。2. 数据结构JSON 数组定义多个入口「发现 URL」支持通过 JSON 数组定义多个发现页入口。每个入口是一个对象核心字段如下字段类型必须说明titleString是入口标题显示在发现页列表中urlString是目标 URL支持{{page}}分页变量styleObject否Flexbox 布局配置在源码中每个入口会被解析为ExploreKind数据类app/src/main/java/io/legado/app/data/entities/rule/ExploreKind.kt。从源码结构看ExploreKind还包含type、action、chars、default、viewName等扩展字段其中type的枚举值包括url、text、button、toggle、select对应源码中ExploreKind.Type对象说明发现入口不仅限于纯链接还可扩展为按钮、开关、下拉等交互形式title与url两个基础字段则是所有形式的共同骨架。style 布局属性style对象用于精细控制该入口在发现页中的布局表现属性如下属性类型说明layout_flexGrowInt弹性增长比例layout_flexShrinkInt弹性收缩比例layout_alignSelfString交叉轴对齐方式layout_flexBasisPercentInt基础尺寸百分比-1 为自动layout_wrapBeforeBoolean是否强制换行这些属性与FlexChildStyle数据类一一对应app/src/main/java/io/legado/app/data/entities/rule/FlexChildStyle.kt。结合源码实现可以补充以下取值细节layout_flexGrow源码中实际类型为Float默认值0F。在布局计算中flexGrow 0f的入口会被赋予更大的默认跨度见下文第 7 节的布局算法。layout_flexShrink默认1F表示可收缩。layout_alignSelf默认auto。FlexChildStyle.alignSelf()方法FlexChildStyle.kt将其映射为 Flexbox 的标准对齐值auto、flex_start、flex_end、center、baseline、stretch非法值回退为auto。layout_flexBasisPercent默认-1F自动。在apply()方法中直接写入FlexboxLayout.LayoutParams.flexBasisPercent。layout_wrapBefore默认false置true时该入口强制从新的一行开始排列。此外FlexChildStyle还含有一个源码注释标记为“自定义的内部水平对齐属性”的layout_justifySelf默认auto供需要时扩展使用。3. 完整 JSON 示例以下示例定义了一个书源的三个榜单入口热门榜、新书榜、完本榜均使用{{page}}分页变量[ { title: 热门榜, url: https://example.com/rank/hot?page{{page}} }, { title: 新书榜, url: https://example.com/rank/new?page{{page}} }, { title: 完本榜, url: https://example.com/rank/finish?page{{page}} } ]若需要调整入口在发现页中的视觉权重可叠加style例如让“热门榜”占满整行[ { title: 热门榜, url: https://example.com/rank/hot?page{{page}}, style: { layout_flexGrow: 1, layout_flexBasisPercent: -1, layout_wrapBefore: true } }, { title: 新书榜, url: https://example.com/rank/new?page{{page}} } ]4. 两种格式字符串与 JSON 数组「发现 URL」支持两种填写格式具体使用哪一种取决于书源需要多少个发现入口格式说明适用场景字符串直接填写 URL如https://example.com/explore单个发现页JSON 数组定义多个入口多个分类/榜单入口即使不写 JSONexploreUrl也可以填写 JS 动态脚本js或js:前缀用于运行时生成入口列表这部分在源码exploreKinds()中有完整支持详见第 7 节。5. 分页变量 {{page}}Legado 自动递增页码URL 中可使用{{page}}变量实现分页Legado 会自动递增页码https://example.com/rank?page{{page}}该变量的实际处理发生在请求链路中。发现书籍时WebBook.exploreBookAwait()app/src/main/java/io/legado/app/model/webBook/WebBook.kt构造AnalyzeUrl并传入page参数随后AnalyzeUrl.evalJS()将page注入 JS 绑定环境bindings[page] page // app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt#L369这意味着{{page}}不只是一个简单的文本替换占位符而是作为运行时变量同时暴露给规则脚本书源作者既可以在 URL 中直接引用{{page}}也可以在发现规则或 JS 脚本中读取page变量做更复杂的翻页逻辑。翻页时Legado 从第 1 页开始每次加载下一页自动对page递增。6. 与首页模块的关系kindTitle 自动绑定发现 URL 定义的入口可被首页模块的kindTitle字段引用。当首页模块的kindTitle与某个发现入口的title完全匹配时模块会自动使用该入口的 URL 和规则。首页模块的kindTitle字段说明见 docs/spec/homepage-modules.md。数据绑定逻辑docs/spec/homepage-modules.md优先按kindTitle在源exploreKinds()返回的列表中进行完全一致匹配若模块显式提供url则直接使用优先级高于kindTitle若kindTitle未匹配且无url则回退至源的主exploreUrl。从实现看该联动在首页模块加载时发生HomepageViewModel中会调用source.exploreKinds()获取源的全部发现入口然后按标题精确查找app/src/main/java/io/legado/app/ui/main/homepage/HomepageViewModel.kt。因此发现 URL 中入口的title必须与首页模块kindTitle逐字一致含空格、大小写否则匹配失败并触发降级逻辑。7. 源码级解析exploreKinds() 如何把配置变成入口列表「发现 URL」的解析集中在 app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt 的BookSource.exploreKinds()其处理流程如下缓存优先以MD5(bookSourceUrl exploreUrl)作为缓存 keygetExploreKindsKey()见 BookSourceExtensions.kt。该设计的好处是分类配置一旦修改MD5 自动变化无需手动刷新缓存。exploreUrl为空时直接返回空列表。互斥加锁按书源 URL 持有Mutex避免并发重复解析。JS 动态生成若exploreUrl以js或js:开头则先执行 JS 脚本把脚本返回值作为入口配置字符串结果写入 ACache 缓存key 同上。两种入口格式解析若配置字符串是 JSON 数组isJsonArray()直接用 GSON 反序列化为ListExploreKind否则按正则(|\n)切分为多个“分类字符串”每个分类用::分隔title与url旧版兼容格式如热门榜::https://...。错误处理解析异常时仍返回一个ERROR:前缀的ExploreKind便于在界面中直观排查。对应的缓存清理入口是clearExploreKindsCache()BookSourceExtensions.kt同时清除内存缓存exploreKindsMap与磁盘缓存ACache书源配置变更后即可调用刷新。8. 布局渲染style 属性如何生效发现页的入口采用 Flexbox 风格布局。FlexChildStyle.apply()FlexChildStyle.kt将各属性写入FlexboxLayout.LayoutParamsflexGrow、flexShrink、alignSelf、flexBasisPercent、isWrapBefore。在发现分类入口的布局计算calculateExploreKindRows()app/src/main/java/io/legado/app/ui/widget/components/explore/ExploreKindLayout.kt中每个入口的占用跨度由以下规则决定ExploreKindLayout.ktwrapBefore true或flexBasisPercent 1.0f独占整行span maxSpanflexBasisPercent 0按maxSpan * flexBasisPercent取整作为跨度钳制在 1maxSpanflexGrow 0f默认跨度 3其余情况默认跨度 2。同时算法会自动“填充行尾”当一行未占满时若同行跨度一致则均分剩余空间否则把剩余空间追加到最后一个入口ExploreKindLayout.kt。因此仅凭layout_flexGrow、layout_flexBasisPercent、layout_wrapBefore三个属性即可实现“入口占半行”“强制换行”“整行大按钮”等常见布局诉求。9. 配置建议与注意事项title 唯一且稳定title既显示在发现页列表也是首页模块kindTitle的匹配键建议使用简短、无歧义、不含换行的命名避免与其它入口重复。{{page}} 与规则联动翻页依赖page变量的注入URL 中务必保留{{page}}若站点首页 URL 不带分页参数可写成...?page{{page}}Legado 会自动从第 1 页开始递增。JSON 语法严格exploreUrl是标准 JSON 数组时注意引号、逗号完整style属性名以layout_开头与源码字段逐一对应不要混淆大小写。兼容旧格式exploreKinds()仍支持标题::URL的/换行分隔旧格式但 JSON 数组能表达style等扩展属性新书源建议统一使用 JSON 数组。缓存时机修改exploreUrl后由于缓存 key 基于 MD5 计算会自动失效重建若改动的是书源其它字段可通过源码中的clearExploreKindsCache()逻辑或重新加载书源刷新分类缓存。10. 相关文档与源码索引配置规范原文docs/dev/discovery-url.md首页模块配置规范kindTitle联动docs/spec/homepage-modules.md书源实体exploreUrl/homepageModules字段BookSource.kt发现入口数据类ExploreKindExploreKind.ktFlexbox 布局样式FlexChildStyleFlexChildStyle.ktexploreKinds()解析与缓存逻辑BookSourceExtensions.kt发现书籍请求链路page注入WebBook.kt、AnalyzeUrl.kt发现入口布局算法ExploreKindLayout.kt首页模块与发现入口的绑定实现HomepageViewModel.kt赞分享移动开发前端应用【免费下载链接】legado-with-MD3使用 Material Design 3 全新设计的阅读 3.0项目地址https://gitcode.com/gh_mirrors/le/legado-with-MD3点击查看免费下载相关推荐Legado 阅读 3.0 源开发文档全览规则语法、URL 配置与源字段规范详解Legado 阅读 3.0 源开发文档全览规则语法、URL 配置与源字段规范详解 本文以 Legado阅读 3.0基于 Material Design 3移动开发前端应用阅读 3.0 书源 JS 规则完全指南Rhino 引擎、内置变量与 java 扩展 API 实战阅读 3.0 书源 JS 规则完全指南Rhino 引擎、内置变量与 java 扩展 API 实战 本文基于 Legado阅读 3.0内置帮助文档 jsHe移动开发前端应用Legado 阅读 3.0 在线朗读HTTP TTS规则编写指南URL 规则语法、JS 参数与源码实现解析Legado 阅读 3.0 在线朗读HTTP TTS规则编写指南URL 规则语法、JS 参数与源码实现解析 导读 在线朗读规则是 Legado阅读 3.移动开发前端应用上一篇Novu数据库索引优化提升通知查询性能的技巧下一篇终极指南如何通过MagicAnimate模型剪枝实现文件体积减小50%同时保持动画性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表