calibre 子分组(Subgroups)实战:用分层自定义列管理书籍流派(Genre)层级

发布时间:2026/9/11 22:53:06
calibre 子分组(Subgroups)实战:用分层自定义列管理书籍流派(Genre)层级
calibre 子分组Subgroups实战用分层自定义列管理书籍流派Genre层级【免费下载链接】calibreThe official source code repository for the calibre ebook manager项目地址: https://gitcode.com/GitHub_Trending/ca/calibre本教程源自 calibre 官方手册 sub_groups.rst讲解如何在 calibre 书库中为书籍建立子分组Subgroups体系——例如按流派Genre组织书籍形成类似子文件夹的层级树但完全不动硬盘上的文件。读完本文你将掌握创建层次化自定义列的完整流程自定义列 → 声明为层级 → 填充数据、层级标签在标签浏览器中的树状展示与五态搜索技巧、用虚拟书库限定Restrict流派范围以及用subitems()模板函数在保存到磁盘等场景提取流派层级实现按流派自动建文件夹归档。什么是子分组书库内的软层级很多用户希望把书库中的书籍组织成子分组就像子文件夹一样。最常见诉求是建立流派genre层级但也有大量其他应用场景有人按学科 课程编号组织教材有人按送礼对象 礼物主题管理赠品记录。本文以流派为例展开讲解。需要特别强调子分组不是硬盘上的文件夹。启用子分组后书籍不会被复制或移动calibre 的书库文件结构完全不受影响。子分组只是在书库内部提供一种组织、展示和检索书籍的方式。从常见需求出发一个合格的子分组体系必须满足三点子分组如某个流派直接包含书本身而不是书籍分类——这正是它与 calibre 用户分类User categories的本质区别一本书可以同时属于多个子分组流派——这使它区别于物理文件文件夹一个文件只能在一个文件夹里子分组必须形成层级hierarchy子分组之下还能再有子分组。其中前两点用普通的标签Tags就能做到给书打上流派标签后就能在标签浏览器或搜索中找到该流派的书一本书可以有多个标签。真正难以满足的是第三点——普通标签没有层级结构。calibre 的层级hierarchy特性补上了这块拼图。层级树长什么样假设你的流派结构大致如下Genre . History .. Japanese .. Military .. Roman . Mysteries .. English .. Vampire . Science Fiction .. Alternate History .. Military .. Space Opera . Thrillers .. Crime .. Horror 等等开启层级特性后这些流派会以树形呈现在标签浏览器中。最外层Genre是一个自定义列存放所有流派含有子流派的流派旁边会出现一个小三角点击可展开如 History、Science Fiction 所示参见 manual/images/sg_tree.jpg。点击某个流派即可搜索具有该流派或其子流派的所有书。例如点击 Science Fiction会命中 Alternate History、Military、Space Opera 三个子流派下的所有书点击 Alternate History 则只命中该子流派本身的书。当然一本书可以有多个流派若一本书同时具有 Space Opera 与 Military 两个流派那么点击两者中的任何一个都能看到它。从图中还能看到流派 Military 在 History 与 Science Fiction 下各出现一次。由于处在层级中它们是两个独立的流派——一本书可以只属于其中一个也可以在逻辑合理时同时属于两个。例如温斯顿·丘吉尔《第二次世界大战》可归入 History.Military而大卫·韦伯的 Honor Harrington 系列可归入 Science Fiction.Military同时还可归入 Science Fiction.Space Opera。当一个流派已经存在即至少一本书拥有该流派你可以直接把书从书库视图拖到标签浏览器中该流派上快速为其应用流派也可以在元数据编辑器中操作下文详述。三步完成配置Setup配置层级体系只需三步① 创建自定义列② 告诉 calibre 该列按层级对待③ 为书籍添加流派数据。第一步创建自定义列按常规方式创建自定义列Preferences - Add your own columns偏好设置 → 添加自定义列。本教程示例使用查找名lookup name#genre、列标题headingGenre。关键点列类型必须选择 Comma-separated text, like tags, shown in the Tag browser逗号分隔文本类似标签显示在标签浏览器中参见 manual/images/sg_cc.jpg。第二步声明该列为层级重启 calibre 后进入Preferences - Look feel - Tag browser - Hierarchy and searching偏好设置 → 外观 → 标签浏览器 → 层级与搜索将刚才创建的 Genre 列勾选为具有层级项目hierarchical items。从源码看这一设置最终保存在书库偏好项categories_using_hierarchy中。标签浏览器模型在 model.py 中通过is_key_a_hierarchical_category()判断某列是否按层级处理其判定逻辑是该列的 key 不在[authors, publisher, news, formats, rating]排除列表中该 key 已出现在categories_using_hierarchy偏好里且标签浏览器当前的排序方式为按名称sort by name。三者同时满足才会启用层级树显示。这也印证了下文关于标签浏览器须按名称排序的注意事项。第三步为书籍添加流派层级数据的本质配置完成时列里还没有任何流派。一个流派只有出现在至少一本书上才算存在。要理解如何首次添加流派需要先弄清流派在书籍元数据中长什么样。层级体系的本质是把若干用英文句点.分隔的短语拼成一个条目。沿用流派示例这些条目形如History.Military、Mysteries.Vampire、Science Fiction.Space Opera。因此要创建新流派只需选择一本应属于该流派的书编辑其元数据在刚创建的自定义列中输入新条目。例如想给某本漫画书赋予新流派 Comics 及其子流派 Superheroes可对该书执行编辑元数据Edit metadata在 Custom metadata自定义元数据选项卡中输入Comics.Superheroes参见 manual/images/sg_genre.jpg请忽略图中其他自定义列。完成后标签浏览器中即出现对应层级参见 manual/images/sg_tb.jpg。此后要把该流派应用到其他书上只需把书拖到该流派上或像上面一样在编辑元数据时原样添加即可。注意层级树显示只有在标签浏览器设置为按名称排序sort items by name时才有效。这是默认设置可通过标签浏览器底部的Configure配置按钮检查确认。搜索五态循环的层级检索搜索流派最直接的方式是使用标签浏览器点击想看的流派即可。点击带子流派的流派会显示该流派 所有子流派的书。但这里有个疑问一个流派有子流派并不代表它自己就不能是独立的流派。例如一本书可以只具有流派History而没有History.Military。如何只搜索History的书标签浏览器的搜索机制知道条目是否有子节点。当条目有子节点时点击它会循环遍历 5 种搜索状态普通条目只有 3 种依次为点击状态图标搜索含义第 1 种绿色加号仅该流派本身的书如History第 2 种双加号该流派及其所有子流派的书如HistoryHistory.Military第 3 种红色减号排除该确切流派的书第 4 种双减号排除该流派及其子流派的书第 5 种无标记回到初始状态即不进行任何搜索界面示意参见 manual/images/sg_search.jpg这一交互在源码中有清晰对应标签浏览器视图 view.py 在构建Search for子菜单时会检查tag.is_hierarchical 5state且条目存在子节点满足条件才追加该流派及其子流派与排除该流派及其子流派两个额外动作而模型 model.py 定义了五种搜索状态常量TAG_SEARCH_STATES {clear: 0, mark_plus: 1, mark_plusplus: 2, mark_minus: 3, mark_minusminus: 4}即clear / mark_plus / mark_plusplus / mark_minus / mark_minusminus分别对应无标记、加号、双加号、减号、双减号与上表一一对应。有子节点的层级条目点击循环 5 态无子节点条目则只在 3 态无标记 / 加号 / 减号间切换。限制Restrictions把流派变成虚拟书库如果你搜索某流派后将其保存为已保存搜索Saved search就能在 restrict to限定为输入框中使用它从而创建一个只包含该流派书籍的虚拟书库Virtual library。这在需要在流派内部继续做其他搜索或批量管理/更新该流派书籍的元数据时非常有用。沿用本教程示例创建一个名为History.Japanese的已保存搜索的步骤是在标签浏览器中点击流派 Japanese其搜索表达式会自动填入搜索框在已保存搜索输入框中输入History.Japanese点击 Save search保存搜索按钮右侧绿色带白色加号的方框参见 manual/images/sg_restrict.jpg。创建完成后即可将其作为限制条件使用参见 manual/images/sg_restrict2.jpg配合虚拟书库特性后续所有操作搜索、浏览、编辑元数据都自动限定在该流派范围内。实用模板函数用 subitems() 提取流派层级你可能希望在模板Template中使用流派信息例如保存到磁盘Save to disk或发送到设备Send to device时的文件命名/目录组织。此时的问题往往是如何取出最外层流派名calibre 为此提供了模板函数subitems()。例如假设你想把最外层流派加入保存到磁盘模板从而按流派建文件夹形如History/The Gathering Storm - Churchill, Winston。做法是提取层级的第一层并在前面加上斜杠以表示应创建子文件夹。下面的模板即可实现{#genre:subitems(0,1)||/}{title} - {authors}其含义是对#genre列的值调用subitems(0,1)取出第一层流派再与/模板分隔符及书名作者组合History因此成为路径前缀。subitems函数的完整语义记录在 src/calibre/utils/formatter_functions.pyBuiltinSubitems模板函数手册见 manual/template_lang.rstsubitems(value, start_index, end_index)—— 将value视为逗号分隔的类标签层级条目列表每个条目内部用句点分隔提取每个条目中从start_index到end_index的分量并合并为新列表自动去重。句点分隔列表中的第一个子项索引为 0索引为负数时从列表末尾倒数特殊情况下end_index为 0 表示到列表末尾。源码中的求值逻辑formatter_functions.py还揭示了一个实现细节切分组件时并非机械地按句点劈开而是使用正则(?[^\.\s])\.(?[^\.\s])即只把两侧都不是句点或空白的句点当作层级分隔符从而避免空格、省略号等场景被误切。合并时按排序键sort_key排序并以,连接。官方文档给出的运行示例若#genre列含A.B.C{#genre:subitems(0,1)}返回A{#genre:subitems(0,2)}返回A.B{#genre:subitems(1,0)}返回B.C从索引 1 到末尾若#genre列含A.B.C, D.E两个条目{#genre:subitems(0,1)}返回A, D{#genre:subitems(0,2)}返回A.B, D.E小结calibre 的子分组特性用自定义列 层级声明的轻量组合在书库内部实现了类似子文件夹的多级分类体系且不触碰硬盘文件结构。其核心要点可概括为本质层级 用句点拼接的多级短语条目放在逗号分隔文本类型的自定义列中启用创建自定义列后在标签浏览器 → 层级与搜索中把该列标记为层级项目并保持标签浏览器按名称排序填充通过编辑元数据输入父级.子级形式的值或直接把书拖到已有流派上检索带子节点的层级条目支持加号 / 双加号 / 减号 / 双减号四类搜索配合已保存搜索可实现按流派限定的虚拟书库输出模板函数subitems(start, end)可从层级值中提取任意层级的子项用于保存到磁盘、发送到设备等场景的目录与命名。掌握这套机制后无论是按流派、学科、收藏主题还是任何自定义多级分类组织书库都能在不动文件的前提下获得清晰、可检索的层级视图。【免费下载链接】calibreThe official source code repository for the calibre ebook manager项目地址: https://gitcode.com/GitHub_Trending/ca/calibre创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考