首页
/ KOReader文件选择器排序功能增强:按最后阅读日期排序并置底已完成书籍

KOReader文件选择器排序功能增强:按最后阅读日期排序并置底已完成书籍

2025-05-10 19:49:55作者:董宙帆

在KOReader电子书阅读器的文件管理模块中,用户经常需要对书籍列表进行排序操作。现有的排序功能虽然提供了多种选项,但对于阅读进度管理仍存在优化空间。本文将深入分析一个针对文件选择器(FileChooser)的排序功能增强方案,该方案实现了按最后阅读日期排序的同时,将已完成的书籍自动置底显示。

技术背景

KOReader的文件选择器采用Lua语言实现,其排序机制基于以下几个核心组件:

  1. 文件属性缓存系统:记录每个文件的访问时间(access time)、修改时间等元数据
  2. 书籍元数据系统:通过DocSettings模块存储阅读进度、书籍状态等信息
  3. 自然排序算法:处理文件名中的数字序列,实现更人性化的排序

功能需求分析

当前系统存在以下使用痛点:

  1. 标准"最后阅读日期"排序会将所有书籍混排,不便区分进行中与已完成的阅读项目
  2. 虽然可以通过"隐藏已完成"功能过滤,但需要频繁切换视图状态
  3. 进度百分比排序无法准确反映最近活跃的阅读项目

技术实现方案

提出的增强方案通过在排序函数中引入状态判断逻辑,实现了智能化的混合排序:

access_finished_last = {
    text = "last read date – finished last",
    menu_order = 100,
    can_collate_mixed = false,
    init_sort_func = function(cache)
        -- 自然排序预处理
        local natsort, cache = sort.natsort_cmp(cache)
        
        -- 自定义排序逻辑
        local sortfunc = function(a, b)
            if a.sort_access == b.sort_access then
                return natsort(a.text, b.text)
            elseif a.sort_access == 1 then  -- 已完成书籍置底
                return false
            elseif b.sort_access == 1 then
                return true
            else
                return a.sort_access > b.sort_access  -- 正常按访问时间排序
            end
        end
        return sortfunc, cache
    end,
    -- 数据预处理函数
    item_func = function(item)
        local book_info = BookList.getBookInfo(item.path)
        item.opened = book_info.been_opened
        local access_time = item.attr.access
        local sort_access
        
        if item.opened then
            -- 状态判断:完成=1.0,放弃=-0.01
            if book_info.status == "complete" then
                sort_access = 1.0
            elseif book_info.status == "abandoned" then
                sort_access = -0.01
            end
        end
        item.sort_access = sort_access or access_time or -1
    end,
    -- 显示格式化函数
    mandatory_func = function(item)
        return item.opened and datetime.secondsToDateTime(item.attr.access) or "–"
    end,
}

关键技术点

  1. 状态优先级设计

    • 已完成书籍(status=complete)强制赋予1.0的排序值
    • 放弃阅读书籍(status=abandoned)赋予-0.01的排序值
    • 其他书籍保持原始访问时间戳
  2. 混合排序算法

    • 首先处理特殊状态书籍的置顶/置底
    • 其次按访问时间降序排列
    • 最后对同名情况使用自然排序
  3. 性能优化

    • 利用现有的书籍元数据缓存系统
    • 避免重复计算文件属性
    • 采用惰性加载策略

用户体验提升

该方案实现了以下改进:

  1. 保持阅读活跃书籍在列表顶部
  2. 自动归档已完成书籍至列表底部
  3. 无需手动切换视图状态
  4. 保留完整书籍列表的上下文信息

兼容性考虑

方案设计时已考虑:

  1. 向后兼容现有的文件属性系统
  2. 适配不同存储设备的访问时间记录方式
  3. 处理缺失元数据的边缘情况

总结

这个KOReader文件选择器排序增强方案通过巧妙的算法设计,在不增加系统复杂度的前提下,显著提升了书籍管理的便利性。其设计思路也可应用于其他需要智能排序的电子文档管理场景,展示了如何通过元数据组合使用来创造更符合用户心智模型的功能体验。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
205
2.18 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
208
285
pytorchpytorch
Ascend Extension for PyTorch
Python
62
95
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
977
575
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
9
1
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
550
86
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
1.02 K
399
communitycommunity
本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息
393
27
MateChatMateChat
前端智能化场景解决方案UI库,轻松构建你的AI应用,我们将持续完善更新,欢迎你的使用与建议。 官网地址:https://matechat.gitcode.com
1.2 K
133