更新记录
0.0.1(2025-08-05)
以VUE方式实现小说阅读UI;UTS原生方式实现解析逻辑
平台兼容性
uni-app(4.76)
Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
√ |
√ |
× |
× |
√ |
× |
√ |
× |
× |
微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
快应用-华为 |
快应用-联盟 |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
uni-app x(4.76)
Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
× |
× |
7.0 |
× |
× |
× |
mac-novel 小说阅读器
mac-novel 是一个小说阅读器,基于 UTS 开发。内含:小说阅读 UI, 小说数据解析器, FFmpeg, TTS;
可解析 web 网站为可识别的 app 小说数据并在移动端进行朗读;
目前仅支持android 平台,后续会考虑添加 ios/h5/微信小程序 平台。
安装
uni 插件导入
使用
UI 使用
<script lang="ts" setup>
// 引入组件; ~!!注意: 这里时vue方式引入组件,引入的组件也是vue组件; 不是nvue或uvue;不是原生组件;
import MacNovel from "@/uni_modules/mac-novel/components/mac-novel/mac-novel.vue";
</script>
<template> <mac-novel></mac-novel> </template>;
UI 组件参数
参数名 |
类型 |
默认值 |
说明 |
bookName |
String |
"" |
要打开的小说名称 |
play |
Function |
undefined |
自定义播放有声小说的方法(注意:不是事件),如果不传则使用默认播放方法 |
// play类型 定义
type Play = (bookName: string, chapterName: string, startText: string) => void;
// 参数解释:
// bookName 小说名称
// chapterName 章节名称
// startText 开始播放的起始文字; 解释: 一般小说的播放不会从开头开始播放, 所以需要指定开始播放的起始文字;
UI 组件导出成员
成员名 |
类型 |
说明 |
openBook |
(bookName:string)=>boolean; |
打开小说; 与 UI 中的 bookName 对应; 当使用 UI 中的参数 bookName 时,参数变化就相当于使用了此方法 openBook |
manager |
NovelParse |
解析器,NovelParse 具体使用方法后面介绍 |
NovelParse 数据解析器 及其他原生方法使用
// 这里是引入原生方法;
import { NovelParse, Novel } from "@/uni_modules/mac-novel";
const rule: Novel.Options = {}; // 具体内容查看 Novel
const parse = new NovelParse();
所有的导出成员及各参数请参照 @/uni_modules/mac-novel/index.d.ts 内的说明.这里就不单独列出来了(内容太多).
重点说明
请务必查看 Novel.Options 的详细说明; 里面包含如何解析一个 html 的小说网站;这里提供一个示例:
// 这里参考了鬼吹灯小说网站的解析方法
const exampParseOptions: Novel.Options = {
name: "鬼吹灯",
origin: "http://wap.gdbzkz.info/",
search: {
url: "http://wap.gdbzkz.info/s.php?q={{keyword}}",
list: "body > div.article > div.block",
name: { rule: ".block_txt>h2>a", type: "text" },
author: {
rule: ".block_txt > p:nth-child(5)",
type: "text",
search: "作者:(.*)",
replace: "$1",
},
intro: { rule: "", type: "none" },
bookUrl: {
rule: ".block_txt>h2>a",
type: "href",
search: "",
replace: "",
},
lastChapter: {
rule: ".block_txt > p:nth-child(6) > a",
type: "text",
search: "[\\n\\s]+",
replace: " ",
},
coverUrl: {
rule: ".block_img > a > img",
type: "src",
search: "",
replace: "",
},
},
toc: {
chapter: {
rule: "div.cover>ul.chapter:last-of-type>li>a",
name: {
type: "realtext",
search: "^\\s*第?(\\d+)[章\\s]+(.*)$",
replace: "第$1章 $2",
},
url: {
type: "href",
},
},
nextTocUrl: {
rule: "body>div.cover>div.listpage>span.right>a",
type: "href",
},
coverUrl: {
rule: "body > div.cover > div.block > div.block_img2 > img",
type: "href",
},
author: {
rule: "body > div.cover > div.block > div.block_txt2 > p:nth-child(4)",
type: "text",
search: "作者:(.*)",
replace: "$1",
},
intro: {
rule: "body > div.cover > div.intro_info",
type: "realtext",
search: "\\s*最新章节推荐地址.*",
replace: "",
},
lastChapter: {
rule: "body > div.cover > div.block > div.block_txt2 > p:nth-child(8) > a",
type: "text",
search: "[\\n\\s]+",
replace: " ",
},
},
content: {
content: {
rule: "div.nr_nr>div",
type: "realtext",
search: "/(.*\\d+\\/\\d+页.)|(\\s+.本章未完.*)/g",
replace: "",
},
nextContentUrl: {
rule: "div.nr_page .next>a",
type: "href",
},
split: "\\n\\s*",
},
ttsUrl: {
// 这里就是使用网络tts的配置,注意: 这个url是本地的,请自行修改; 确保此url访问后,可下载为一个音频文件;
url: "http://192.168.1.253:3001/zhebenxiaoshuohenjiankang/{{keyword}}.html",
},
};