Text-Processing

文本處理:將目錄文本轉換為 djvu 書籤格式?

  • July 20, 2011

通常在一本書的目錄中,每一行代表一個章節或章節,並以頁碼結尾,例如,

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

其中要點是左右括號的配對,用於以樹狀組織章節和章節,每個書籤項目的雙引號和每個頁碼前面都有 a #。行和縮進之間的分隔只是為了方便手動查看和編輯書籤文本文件,並沒有關係。

我的問題是:

  1. 我想知道是否有一些方便的方法可以將純文字文件的目錄轉換為djvu書籤格式,可以盡可能減少人工處理?這可以通過文本處理應用程序,或在某種程式語言下程式,或兩者結合來實現。
  2. 正如Dennis Williamson的相關回复所建議的那樣,

您正在做的事情開始看起來有點像 XML。也許您應該使用真實的東西並使用適當的工具來操縱它。

一個快速的Google出現了 djvuxml。可以使用適當的 Python 或 Perl 模組或 shell 實用程序(如 xmlstarlet)輕鬆操作 XML 文件。

我想知道djvu書籤格式是否類似於XML格式(我承認我對XML還不熟悉,但如果在這裡有幫助的話願意學習)?可以使用 XML 工具將內容表的文本文件轉換為 djvu 書籤格式嗎?

這是一個試圖產生體面縮進的 awk 腳本。它假定輸入格式正確(例如,前面的行3.2.2必須是3.1or 3.1.something,not 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 表達式

引用自:https://unix.stackexchange.com/questions/17046