テキスト処理:目次テキストを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" ))
)

要点は、セクションと章のツリー型構成を達成するための左右の角かっこペア、各ブックマーク項目の二重引用符、#ブックマークテキストファイルの手動ビューと編集を容易にするために、各ページ番号の前に.line区切りを使用することです。です。それはまったく問題ではありません。

私の質問は次のとおりです

  1. 私はディレクトリのプレーンテキストファイルをdjvuブックマーク形式に変換することで手動処理をできるだけ減らす便利な方法があるかどうか疑問に思います。これは、テキスト処理アプリケーションまたはプログラミング言語でプログラムすることも、2つの組み合わせで行うこともできます。
  2. 提案通り関連回答渡すデニス・ウィリアムソン

    あなたがやっていることは少しXMLのように見え始めました。おそらく、実際のものを使用し、適切なツールを使用して操作する必要があります。

    クイックGoogle検索でdjvuxmlが表示されます。 XMLファイルは、適切なPythonやPerlモジュール、xmlstarletなどのシェルユーティリティを使用して簡単に操作できます。

    djvuのブックマーク形式がXML形式と似ているかどうか疑問に思います。 XMLツールを使用して目次テキストファイルをdjvuブックマーク形式に変換できますか?

答え1

これは適切なインデントを生成しようとするawkスクリプトです。入力が正しい形式であると仮定します(たとえば、前の行はまたはで3.2.2なければなりません)。3.13.1.something3

#! /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に変換するための事前構築されたツールはありません。

関連情報