文本处理:将目录文本转换为 djvu 书签格式?

文本处理:将目录文本转换为 djvu 书签格式?

通常在一本书的目录中,每一行代表一个章节或一节,并以其页码结尾,例如,

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" ))
)

其中要点是左右括号的配对,以实现节和章节的树状组织,每个书签项的双引号,以及每个页码前面都有一个#.行与缩进的分隔只是为了方便手动查看和编辑书签文本文件,根本没有关系。

我的问题是:

  1. 我想知道是否有一些方便的方法将目录的纯文本文件转换为 djvu 书签格式,这可以尽可能减少手动处理?这可以通过文本处理应用程序、或在某种编程语言下编程、或两者的组合来实现。
  2. 正如建议的那样相关回复经过丹尼斯·威廉姆森,

    您正在做的事情开始看起来有点像 XML。也许你应该使用真实的东西并使用适当的工具来操纵它。

    快速谷歌搜索一下就会出现 djvuxml。可以使用适当的 Python 或 Perl 模块或 shell 实用程序(如 xmlstarlet)轻松操作 XML 文件。

    我想知道 djvu 书签格式是否类似于 XML 格式(我承认我还不熟悉 XML,但愿意学习它,如果它可以在这里提供帮助)?能否使用 XML 工具将目录文本文件转换为 djvu 书签格式?

答案1

这是一个 awk 脚本,尝试产生合适的缩进。它假设输入格式正确(例如,前面的行3.2.2必须是3.1or 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。

相关内容