更新记录

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",
  },
};

隐私、权限声明

1. 本插件需要申请的系统权限列表:

INTERNET,READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。