# epub **Repository Path**: hunter__fox/epub ## Basic Information - **Project Name**: epub - **Description**: 生成/维护epub文件 - **Primary Language**: Python - **License**: BSD-2-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-10-27 - **Last Updated**: 2022-11-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 生成与维护epub文档的工具 ## createepub() 使用`createepub`来生成一个epub文档. ### 语法 `createepub(filename, source[, showlog=True][, meta=None])`
**必需参数:**
- `filename`
一个字符串,它是将要生成的epub文档名,如果它已经存在,新的文档将履盖它. - `source`
是一个可以被for迭代的对象,它的每一项是一个OPF.XhtmlDoc对象.
**可选参数:**
- `showlog`
是一个逻辑值,它指出是否在控制台上输出生成过程的简要信息,默认为True. - `meta`
是一个字典,它包含了创建生成器的所有参数,默认为`None`. 这个字典中的信息将被记录到epub文档中,它们将在重新生成这个epub文档时被使用. ### 示例: ``` from Iterators import iter_txt createepub(filename=bookname, source=iter_txt(file='mybook.txt'), showlog=False) ``` 我们可以使用`getgenerator()`来完成建立生成器实例的工作, 它使我们可以重用meta这个字典: ``` bookname='mybook.epub' # 生成器iter_txt最少只需要指定参数file kwgs = {'_generator': 'Iterators.iter_txt', 'file': 'mybook.txt'} iter = getgenerator(**kwgs) createepub(filename=bookname, source=iter, showlog=False, meta=kwgs) ``` 这样做的好处是,将我们修改了mybook.txt中的内容时, 可以使用`recreate()`来更简单的重新生成这个epub文档, 因为它会使用记录到epub文档中的meta字典重新建立相应的生成器. ## getgenerator() 以指定参数创建一个生成器实例 ### 语法 `recreate(_generator, **kwgs)` **必需参数:**
`_generator`
一个字符串,迭代器的名字,格式为`[package_name.][module_name.]generator_name` **可选参数:**
`args`
如果初始化迭代器需要参数以指名参数的形式传递它们 ### 示例 ``` iter = getgenerator(_generator='Iterators.iter_txt', file='mybook.txt') ``` 或者如`createepub`中示例那样: ``` kwgs = {'_generator': 'Iterators.iter_txt', 'file': 'mybook.txt'} iter = getgenerator(**kwgs) ``` ## recreate() 可以使用`recreate`来重新生成之前使用`createepub`生成的epub文档. 这种方式比`createepub`需要的参数更少. ### 语法 `recreate(epub_file: str, showlog=True)`
**必需参数:**
- `epub_file`
指出要重新生成的epub文件.
**可选参数:**
- `showlog`
的用法与`createepub`中一样. ### 示例 ``` recreate('mybook.epub') ``` 当mybook.epub是使用`createepub`生成的, 并且通过参数`meta`传递了完整有效的生成器信息时, 它就可以再次重新生成这个文档了. ## 生成器 `createepub`第二个参数需要指定一个生成器, 这个生成器应当是可以被`for`枚举/迭代的, 每次迭代得到的应当是一个有效的XhtmlDoc实例(它在OPF模块中定义). 在Iterators模块中,提供了 - iter_page - iter_url - iter_txt - iter_dir - iter_files 这些比较常用的生成器,如果这些不能满足使用需要, 可以自定义一个生成器,它的基本写法如下: ``` def my_iter(): for ...: yield XhtmlDoc(...) ``` *必要时,我们可以使用一些爬虫框架来进行迭代.* ## XhtmlDoc 它用于传递一个xhtml文档的内容.
**核心属性:**
- `filename`
是它在epub包中的文件名, 需要在生成器中使用一些方法来确保每个生成的XhtmlDoc实例都使用不同的filename. - `title`
文档的title,它会使用在xhml文档的head.title与body.h1中 - `data`
是文档的内容,它应当是一段html标记文本,它将插入到body.h1之后.
**扩展属性:**
- `parentsrc`默认值为`''`
为了在epub中实现多层的导航,可以将parentsrc指定为相应的上级文档的filename. - `complete`默认值为`True`
用于先迭代出文档,之后再完成它的内容.因为一些情况下, 我们可能需要先生成一个文档供其它文档去引用为上级文档, 但出于效率考虑,它的内容我们可能需要在完成这些下级文档的过程中逐步完成, 我们可以先产生这个文档,但指定它的complete=False,迭代出它, 在完成它的全部内容后,再设置complete=True.
需要注意,如果没有将complete设置为True,这些未完成的文档有可能不会被写入到epub中, 那么epub文档阅读器有可能提示这是一个无效的epub文档. - `translator`默认为`None`
html翻译器.
如果要生产复杂的页面内容,比如对代码进行语法着色等,可以指定一个翻译器, 它应当能接受一个参数(`XhtmlDoc.data`),并返回等价的html代码.
一般情况下,我们可以直接生产html代码块作为`XhtmlDoc.data`的值, 此时我们无须关注这个属性. ## default_textengine() 基本的行处理器,它只是简单的将每一行作为一个段落,前置两个全角空格后放入到`

`标记对中. ## autoname() 它可以迭代出不重复的xhtml文档名.可以在生成器中使用它为每个XhtmlDoc实例生成一个不重复的名称.
如果有多个生成器共同工作,这将是很有必要的. ### 语法 `autoname([fmt])`
fmt默认值为`'{}.xhtml'`.其中的{}部分将在每次迭代时替换为一个自增的数. ## htmltodoc() 根据html流中的内容生成XhtmlDoc的title与data. ### 语法 `htmltodoc(html, filename, titlere, linere[, textengine])`
**参数说明**
- html
一段html内容 - filename
用于从html中提取文档标题的正则表达式(SRE_Pattern). - titlere
用于从html中提取每一行文档的(SRE_Pattern). - linere(可选的)
行处理器,它用于对提取的每一行文档进行预处理.它应当是一个函数/方法, 接受一段文本,返回处理后的文本.
默认的行处理器default_textengine已经完成简单的处理 ## filetodoc() 以一个txt文档的内容生成一个XhtmlDoc文档 ### 语法 `filetodoc(filename[, encode][, textengine])` ## dirtodoc() 将指定目录中的文件做成一个列表,以此生成一个XhtmlDoc对象 ### 语法 `dirtodoc(path,dirnames)` **参数说明**
- path
指出要列表的目录,要求使用`/`作为路径分隔符.
- dirnames
一个已经注册的目录字典,注册目录为key,对应的文件名为value ### 示例 ``` doc = dirtodoc('c:/windows/IdentityCRL', {'c:': 'dir1.xhtml', 'c:/windows': 'dir2.xhtml', 'c:/windows/CSC': 'dir3.xhtml', 'c:/windows/IdentityCRL': 'dir4.xhtml'}) ``` ## getfileencode() 测试得到文本类型文件可能使用的编码格式(仅限中文). 它并不是总是正确的,而且也比较浪费时间. 因此不是必要的时候不要使用它. ### 语法 `getfileencode(file)` ### 示例 ``` ?getfileencode('C:/Documents/nodes/2006_03_17.txt') ?getfileencode(''D:/Python/baseweb\\core\\logon.py') ```