根据 OpenDocument 格式文件和其他档案的内容生成文本信息。
项目描述
根据 OpenDocument 格式文件和其他档案的内容生成文本信息。
生成的信息包括存档成员的名称、未压缩大小和修改时间等元数据。
计算校验和,并对每个执行基本文件类型检测。
对于确定包含 UTF-8 文本的每个成员,将输出文件中的行。
odfit与odt2txt之类的工具在用途上相似,但在操作上和细节级别上不同,后者将存档的文本模式渲染输出为文档。
这意味着它提供了更完整的数据集,包括嵌入的宏、格式和其他详细信息。
二进制文件的信息仅限于元数据和散列,包括 SHA1 校验和。
XML 文件将被漂亮地打印,以使其内容更容易区分。
设置
odfit脚本可以使用标准库的模块补充。
它将尝试使用lxml包进行 XML 漂亮打印,但如有必要,将回退到标准库模块。
因此应该可以在任何 Python 2.6 或更高版本中使用odfit,而无需安装。
这意味着可执行模块文件odfit.py 可以与源代码库一起分发,具有一定的可靠性。
早于 2.6 的 Python 也可以工作,但该脚本尚未经过测试。
如果lxml可用,则在处理不正确或不完整的 XML 时,XML 处理将更快(> 3 倍)并且更健壮。
除了直接运行脚本odfit.py 之外,还可以从源代码或通过PyPI安装该模块。这将导致在系统范围内安装等效脚本,从而在系统路径上启用命令odfit 。
用法
odfit是一个命令行工具。
要获取档案成员的列表,请运行例如
$ odfit some_file.odt
对于典型的 OpenOffice 文档,这将产生多行数据。
odfit主要用于git等版本控制系统,以识别 OpenDocument 格式文件版本之间的更改。
例如,对于 git 1.6.1 或更高版本,设置一个 repo 以使用odfit生成git diff列表可以通过以下方式完成
将行添加到.git/config或等效项以设置odf驱动程序名称的textconv选项:
[diff "odf"] textconv=odfit -D通过在 repo 工作树或.git/info/attributes中的.gitattributes文件中添加如下行,将各种 ODF 文件类型与odf驱动程序名称相关联:
*.odt diff=odf *.ods diff=odf *.odp diff=odf *.odb diff=odf
odfdump的-D选项指示它忽略每个存档成员的时间戳。每当保存新版本的文档时,OpenOffice 似乎都会为所有成员重置此时间戳。因此,这条数据没有意义,通常不应显示为差异的一部分。出于这个原因,我希望在生成转储以进行比较时通常应该传递-D 。
更多信息(基于使用odt2txt而不是odfit)可从git wiki获得。
odfit也适用于其他 pkzip 格式的档案。请参阅BUGS、ISSUES 和 WARNINGS中有关文件类型检测的说明。
输出格式
元数据头
每个包含文件的输出将由一系列标题行组成,每个标题行都以成员文件名和一个冒号为前缀,后跟两个空格。例如:
path/to/member/file: date_time: 2010-10-12T21:32:24 path/to/member/file: file_size: 42 path/to/member/file: CRC: 4144865272
每行包含一个名称/值对,由附加的冒号和空格分隔。
包含在标头中的元数据是存储在存档文件本身中的元数据,加上sha1元素的例外,它是由odfit从存档成员的数据中计算出来的。
并非所有成员属性都被转储。如果给定存档成员非空,则转储的属性是:
时间戳:date_time
评论
额外的
文件大小
CRC-32 校验和:CRC
只有在命令行上没有传递-D选项时才会输出时间戳。
在这些属性之后,将输出另外两个标题行,包含成员的 SHA-1 哈希和检测到的文件类型。检测到的文件类型将是 binary、utf-8(包含 ASCII)或unknown。
内容部分
在标头之后,可打印文件(文件类型为utf-8的文件)将转储其内容。
内容部分的输出类似于标题部分的输出。
不是名称/值对,而是输出文件的行。
文件名和内容之间的分隔符是两个冒号和一个空格。
例如:
path/to/member/file:: The first line of the file path/to/member/file:: The second line of the file path/to/member/file:: The third line of the file
如果文件未被检测为二进制文件,则假定该文件是可打印的。有关详细信息,请参阅文件类型检测。
XML 文件
名称以.xml结尾的文件的内容 将在转储之前通过 XML 整理例程传递。
这旨在通过拆分包含多个元素的长行来使输出更具差异性。
因此,包含格式不正确的 XML 的文件的存在可能会导致错误。对于使用 OpenOffice 创建的文档,这应该不是问题。
错误、问题和警告
二进制文件类型检测使用与git diff相同的愚蠢算法:在文件的前 8000 个字节内扫描空值。这适用于 ASCII 或 UTF-8 文本,但会错误地检测为 UTF-16 等编码中的二进制文件。
没有计划保证版本之间的一致性。因此,不应将使用旧版本odfit 创建的转储与使用较新版本创建的转储进行比较。即使使用相同版本的odfit,由于不同的依赖关系,同一文档的转储可能会有所不同: odfit将根据本地安装的内容使用不同的 XML 包,并且 XML 文件的漂亮打印输出将根据使用的 XML 包而有所不同. 如果本地可用,将使用lxml包。
输出格式仅用于读取和比较目的。它不打算成为原件的可逆翻译,即使对于仅包含文本文件的档案也是如此。特别是,包含 ':' 字符的文件名没有正确转义。包含具有相同文件名的成员的文件的转储中将存在额外的歧义。
我还没有检查 odf 文件成员的顺序是否稳定。 odfit目前在输出之前不对成员进行排序:成员输出按存档文件顺序完成。这意味着对等文件的转储进行比较可能最终会显示出显着差异。
可以进行许多性能优化,特别是如果将脚本重新设计为 diff 例程。例如,拥有两个比较文档的知识将允许 odfit仅输出已更改文件的 XML。SHA-1 比较也不太可能检测到 CRC-32 比较无法检测到的变化。
odfit未使用 2.6 以外的 Python 版本进行测试。这意味着几乎不能保证它可以在任何特定系统上运行,因为 2.5 甚至 2.4 在该领域并不少见。
执照
odfit是 Ted Tibbetts 的版权 2010,并根据 FreeBSD 许可证获得许可。
有关详细信息,请参阅文件复制。