通常在一本书的目录中,每一行代表一个章节或一节,并以其页码结尾,例如,
1 first chapter 10
1.1 first section 11
1.1.1 first subsection 12
1.2 second section 13
2 second chapter 14
2.1 first section 16
2.2 second section 13
上例中 djvu 文件的书签格式为
(bookmarks
("1 first chapter" "#10"
("1.1 first section" "#11"
("1.1.1 first subsection" "#12" ))
("1.2 second section" "#13" ))
("2 second chapter" "#14"
("2.1 first section" "#16" )
("2.2 second section" "#13" ))
)
其中要点是左右括号的配对,以实现节和章节的树状组织,每个书签项的双引号,以及每个页码前面都有一个#
.行与缩进的分隔只是为了方便手动查看和编辑书签文本文件,根本没有关系。
我的问题是:
- 我想知道是否有一些方便的方法将目录的纯文本文件转换为 djvu 书签格式,这可以尽可能减少手动处理?这可以通过文本处理应用程序、或在某种编程语言下编程、或两者的组合来实现。
-
您正在做的事情开始看起来有点像 XML。也许你应该使用真实的东西并使用适当的工具来操纵它。
快速谷歌搜索一下就会出现 djvuxml。可以使用适当的 Python 或 Perl 模块或 shell 实用程序(如 xmlstarlet)轻松操作 XML 文件。
我想知道 djvu 书签格式是否类似于 XML 格式(我承认我还不熟悉 XML,但愿意学习它,如果它可以在这里提供帮助)?能否使用 XML 工具将目录文本文件转换为 djvu 书签格式?
答案1
这是一个 awk 脚本,尝试产生合适的缩进。它假设输入格式正确(例如,前面的行3.2.2
必须是3.1
or 3.1.something
,而不是3
)。
#! /usr/bin/awk -f
BEGIN { printf "(bookmarks"; depth = 1; }
{
level = split($1, s, ".");
while (level < depth) {--depth; printf ")";}
print "";
depth = level + 1;
gsub(/[\\"]/, "\\&");
page = $NF;
sub(/ +[^ ]*$/,"");
for (i in s) printf " ";
printf "(\"%s\" \"#%s\"", $0, page;
}
END { while (depth-- > 0) printf ")"; print ""; }
DJVU 语法与 XML 无关;这些都是s-表达式。
答案2
任何编程语言都能够解析您的输入例子正确。
选择一种编程语言,然后解析输入,首先用“.”分隔输入。首先是“ ”,其次是“ ”。
我会使用 Perl,但开发人员最熟悉的任何语言都可以正常工作。
请记住,只有输入遵循严格的语法,自动解决方案才会起作用。 除非这是一个已知的标准,否则不会有任何预制工具将其转换为 XML 或 djvu。