最近阅读学习了一些Flutter相关的知识, 不过纸上得来终觉浅,所以准备写一个项目练练手。
目标是一款开源的全平台全能阅读器。
# 查看所有分支
flutter channel
# 切换分支
flutter channel master
# 更新flutter sdk 和依赖包
flutter upgrade
# 仅更新packages
flutter pub upgrade
# 查看需要更新内容
flutter pub outdated
# 查看可用模拟器
flutter emulators
# 启动指定模拟器
flutter emulators --launch apple_ios_simulator
# macos也可使用一下命令打开ios模拟器
open -a Simulator
# 运行flutter项目
flutter run
执行失败,删除*.g.dart
## 项目脚本
./build_json.sh
## flutter指令
flutter pub run build_runner build
-
书架
-
书籍列表显示
-
本地书籍导入
-
书源书籍导入
-
移除书籍
-
加入书籍
-
本地书籍文件删除
-
txt文件编码格式
-
utf-8
-
utf-16le
-
utf-16be
-
utf-32le
-
utf-32be
-
gb2312
-
txt文本解析
-
目录章节匹配
-
文本宽高测量
-
章节分行解析
-
章节按行分页
-
内容展示
-
阅读内容展示
-
prev、next页预加载
-
章节目录页
-
翻页
-
区块划分和事件响应
-
滑动翻页
-
左右点击翻页
-
翻页动画
-
菜单页
-
字体样式编辑
-
阅读背景(夜间模式)
-
书源相关
-
在线书源导入
-
书源编辑
-
书源内搜索
-
书籍详情页展示
-
章节下载和存储
-
章节内容解析
-
阅读历史
-
epub支持
-
pdf支持
-
漫画支持
-
图片
-
压缩包
-
文件分享
-
点对点分享
-
微信分享
-
QQ分享
-
wifi导入
-
文本导出
-
有声阅读
-
云端同步
-
[ ]
- permission_handler
- file_picker
- sqlite数据库
- 文件读写
- Provider
- 解析书籍 存储章节信息(标题、start、end)。
- 解析章节,拆分成书页。(根据)
-
读取文件流,一边读取一边匹配换行符,记录换行符的位置
blankIndex
, 在未获取到第2个blankIndex时,需要将读取到字节流暂存。 -
读取到新的blankIndex时,将2个blankIndex间的字节内容组装成。并解码转成字符串
line
。 -
对
line
进行章节标题对正则匹配。若匹配则将blankIndex作为上一章节的结束点,新章节的开始点。 -
若未匹配成功则继续
第一步
,知道读完数据。更新最后一章的结束点为,文件的大小。
- 测量当前显示界面的尺寸width和height。
- 将章节数据根据宽度分行。
- 将行数据根据高度分页。
- 留白部分的处理。
- 爬取网页内容
- dom解析
- 网页内容特征提取
规则参考了开源阅读的书源规则, 所以可以将网上的阅读书源放到项目中使用
- 拷贝json格式书源放入到
assets/sources/
文件夹中中。 - 打开
shosai/utils/rule_convert.dart
,修改加载的json。默认加载assets/sources/book_sources.json
。 - 在应用的书源界面点击悬浮按钮会自动处理书源,会加载能够解析的书源。
- 不过仅支持部分书源格式,部分书源即使解析出来也可能存在兼容问题,可以点击书源进行编辑修改。
规则参考了开源阅读的书源规则,但是存在一定差异。
/// 获取【第一个】【a标签】的【内容】
/// 此处有3个规则
/// a: 匹配a标签
/// [[0]]: a标签的位置为index = 0。
/// $text: 获取text内容
a@[[0]]@$text
默认使用css selector
规则。
标签位置以[[]]
包裹, 排除使用[[!]]
。
从0
开始, -1
表示倒数第一个,位置依次类推, 以:
分割。
连续区间使用 ..
连接。
// 选择index为0和2的a标签
a@[[0:2]]
// 排除index为0和2
a@[[!0:2]]
// 从index=0 开始到末尾
a@[[0 .. -1]]
以$
开头表示获取属性
// 获取a标签包裹的内容
a@[[0]]@$text
// 获取href内容
$href
格式:###正则表达式##替换内容###
group获取:$
表示正则匹配到的group。
// $1 = group[1]
// $2 = group[2]
a@[[0]]@$href@###.+\D((\d+)\d{3})\D##https://www.xbiquwx.la/files/article/image/$2/$1/$1s.jpg###
参考了以下开源项目:
gedoor/legado: 阅读3.0, 阅读是一款可以自定义来源阅读网络内容的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。 (github.com)
ssssssss-team/spider-flow: 新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。 (github.com)