Link

首页

Tweet

书单

about me

Command

Category

基于终端的阅读器开发


我相对比较喜欢读书,但只读两种书,至少现在如此。一类是用于吃饭的书,编程类书籍,一类是供我休闲的书籍,各类小说。当然,在小说的种类上我也是有一定偏好的,例如,同事安利我的王小波的书,则安安静静的躺在书架上。

言归正传,前几日同事分享给我一些电子书,怎奈mac系统中没有让我心仪的阅读器,虽然ibook已经接近完美,但并不支持txt文本文件,借此机会用golang实现了一个基于终端的阅读器,方便自己读小说使用。

先来看一下最终的界面样式:

考虑到易用性问题,我必须寻找一款方便的终端绘图库,让界面开发起来更加容易一些。在C语言应用中,我们可以选择ncurses库,该库可以方便我们开发基于简单图形的终端程序,而该库并没有golang实现,在github一桶寻找后,我最终锁定了一个名为termui的第三方库,大家可以在termui的github主页中找到该库。

我将该工具分为两部分,界面绘图部分,与配置记录部分。先来说说配置相关的一些情况。

全部配置文件

上次编写博客系统的时候,发现一个比较不错的配置文件格式:toml,该格式的好处在于方便的映射为golang中的结构,同时配置信息无二义性,配置起来比较准确。在这个阅读器中,我们无需使用如此复杂的结构,仅需要告诉工具,我们的电子书文件所存放的路径。然后工具会扫描此路径下的所有文件(不包含子目录)。这些文件应该全部为文本文件。

而配置文件的内容,则仅有一句话,内容如下:

/Users/mebius/Documents/story/

该目录为电子书所存放的路径。

在业务逻辑中,我们需要在启动时,先行读取配置文件内容,然后进行后续逻辑操作。

进度配置信息

在读取全部配置信息后,我们要记录不同书籍阅读的进度。但如何记录唯一电子书文件?可以使用文件名称,但一旦文件名发生变化,则所对应的进度则丢失。如果记录路径,也会发生问题。最终,我将每个图书文件生成对应的MD5值,这样即使文件名称和路径发生变化,都不会丢失进度信息,只要文件内容不发生变化。你也可以选取其他编码形式,只要唯一对应即可。

与之对应的还有一个记录文件进度的值,该值则记录阅读的位置,使用一个int来进行记录即可。

界面逻辑

借助termui库,开发界面相对就容易很多,你可以借助该库搭建自己的控件,同时绑定对应的键盘相应事件,针对不同界面,对不同键盘事件进行交互操作。

在界面部分,我封装了一个UIBar的控件,用于显示操作提示,也是在画面最下方的工具条。同时两个界面,列表界面和阅读界面分别放到了两个界面封装中。最终的界面切换操作则由UI封装进行管理。

开源代码

如果大家需要,或者有兴趣可以在我们的command-book项目仓中拉取代码并编译为自己的工具使用。