Zacharia2 / SuperMemo-Toolkit

SuperMemo 增强工具(CLI命令行)。包含图链整理、EPUB图书转换导入、Latex公式转图片等。
GNU General Public License v2.0
25 stars 3 forks source link

【严重】目录不等于文档。 #7

Closed Zacharia2 closed 9 months ago

Zacharia2 commented 11 months ago

文档必须要完全包含在目录中,否则会丢失文档。

Zacharia2 commented 11 months ago

命名为"ePub Indexer"

Zacharia2 commented 11 months ago

保证每一个doc都可以被包含在目录toc中。

  1. 提取目录信息:

输入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
        })
Zacharia2 commented 11 months ago

检查文档是否完全被toc引用。

Zacharia2 commented 11 months ago

取toc中的href信息做成列表,与doc文档进行比对,并列出为被toc引用的doc。

Zacharia2 commented 11 months ago

check_doc_refer

Zacharia2 commented 11 months ago

你可以使用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函数将路径中的反斜杠替换为正斜杠。最后,将相对路径添加到文件路径前面的字符串中,形成完整的相对路径。

Zacharia2 commented 11 months ago

文档在epub中的排列似乎是有顺序的。

metadata.opf,包含了epub所有的文档以及他们的顺序,还有所有的资源。

Zacharia2 commented 11 months ago

问题在于如何平衡toc.ncx和metadata.opf之间的问题。

Zacharia2 commented 11 months ago

书的文档是连续的线性,目录是对线性文档的树状索引。

所以吧,最好是线性顺序导入文档,而不是以树状索引导入。非要树状索引的话,不想丢信息,只能创建一个文件夹(未被引用的文档)然后将他们一股脑全放进去了。

或者,将不足的文档补全到toc里没有锚点的第一级文档里面。

Zacharia2 commented 11 months ago

要不就附加到toc标记的最近的文档中,直到下一个toc标记。这就像两个刻度之间的内容,归属于第一个刻度里面。无论是怎么样的。

Zacharia2 commented 11 months ago

那标题就从toc里面匹配获取吧。能多少个就多少个了

Zacharia2 commented 11 months ago

由于文档的连续性,应该属于前一个toc文档,或者它自己(第一级toc)。属于它自己的情况是,在第一个toc之前的都是一级toc。

Zacharia2 commented 11 months ago

所以,问题转换为根据toc对所有文档进行层次的组织。但不进行分割。

Zacharia2 commented 11 months ago

navPoint节点中,playOrder属性定义当前项在目录中显示的次序。

Zacharia2 commented 11 months ago

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节点可以嵌套,就是书籍的目录是层级目录。

Zacharia2 commented 11 months ago

SM是以内容树存储数据的。但书是以线性阅读的。大方向的操作是,将线性内容放到内容树里面。

Zacharia2 commented 11 months ago

eindexer就是用来标注toc的。

Zacharia2 commented 10 months ago

你还得保证toc文档一一对应,不能多对一