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

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

2025-05-10 09:58:27作者:董宙帆

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

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

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
178
262
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
866
513
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
183
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
261
302
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
598
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K