Closed Zacharia2 closed 9 months ago
命名为"ePub Indexer"
保证每一个doc都可以被包含在目录toc中。
输入epub实例,输出(href文件名,(标题子集))
toc = []
for item in book.get_items_of_type(ebooklib.ITEM_DOCUMENT):
content = item.get_content()
soup = BeautifulSoup(content, 'html.parser')
title_element = soup.find('title')
if title_element:
title = title_element.text.strip()
toc.append({
'title': title,
'href': item.file_name
})
检查文档是否完全被toc引用。
取toc中的href信息做成列表,与doc文档进行比对,并列出为被toc引用的doc。
check_doc_refer
你可以使用Python中的re模块来进行正则匹配和替换。下面是将第一个字符串的绝对路径转换为相对路径的示例代码:
import re
absolute_path = 'C:/Users/Snowy/Desktop/sm18/systems/Noname/elements/web_pic\\im_2023-11-09-20_39_50_plot_19.jpeg'
relative_path = re.sub(r'^[A-Z]:/', '', absolute_path).replace('\\', '/')
relative_path = "file:///[PrimaryStorage]" + relative_path
print(relative_path)
输出结果为:"file:///[PrimaryStorage]web_pic/im_2023-11-09-20_39_50_plot_19.jpeg"
在上述代码中,首先使用re.sub函数将字符串中的绝对路径部分替换为空。然后使用replace函数将路径中的反斜杠替换为正斜杠。最后,将相对路径添加到文件路径前面的字符串中,形成完整的相对路径。
文档在epub中的排列似乎是有顺序的。
metadata.opf,包含了epub所有的文档以及他们的顺序,还有所有的资源。
问题在于如何平衡toc.ncx和metadata.opf之间的问题。
书的文档是连续的线性,目录是对线性文档的树状索引。
所以吧,最好是线性顺序导入文档,而不是以树状索引导入。非要树状索引的话,不想丢信息,只能创建一个文件夹(未被引用的文档)然后将他们一股脑全放进去了。
或者,将不足的文档补全到toc里没有锚点的第一级文档里面。
要不就附加到toc标记的最近的文档中,直到下一个toc标记。这就像两个刻度之间的内容,归属于第一个刻度里面。无论是怎么样的。
那标题就从toc里面匹配获取吧。能多少个就多少个了
由于文档的连续性,应该属于前一个toc文档,或者它自己(第一级toc)。属于它自己的情况是,在第一个toc之前的都是一级toc。
所以,问题转换为根据toc对所有文档进行层次的组织。但不进行分割。
navPoint节点中,playOrder属性定义当前项在目录中显示的次序。
NCX文件(★)
NCX文件是epub电子书的又一个核心文件,用于制作电子书的目录,其文件的命名通常为toc.ncx。ncx文件也是一个xml文件。
ncx
代表“Navigation Center eXtended”,意思大致就是导航文件,这个文件与目录有直接的关系。
.ncx文件中最主要的节点是navMap。navMap节点是由许多navPoint节点组成的。而navPoint节点则是由navLabel、content两个子节点组成。
(1) navPoint节点中,playOrder属性定义当前项在目录中显示的次序。navLabel子节点中的text节点定义了每个目录的名字。
(2) content子节点的src属性定义了对应每个章节的文件的具体位置。
nvaPoint节点可以嵌套,就是书籍的目录是层级目录。
SM是以内容树存储数据的。但书是以线性阅读的。大方向的操作是,将线性内容放到内容树里面。
eindexer就是用来标注toc的。
你还得保证toc文档一一对应,不能多对一
文档必须要完全包含在目录中,否则会丢失文档。