2012-02-17 13 views
1

最近Nook Simple Touchを購入しました。私はCaliberを使って電子ブックを管理し、Nookに転送します。スクリプトを使用してepubファイルのテキストを変更するにはどうすればよいですか?

B & Nのepub仕様の非標準実装のため、Nook STは多くのソースから持ち越されたときにカバー画像を表示しません。問題は、ここで説明されていますhttp://john.nachtimwald.com/2011/08/21/nook-covers-not-showing-up/ 基本的にはヌークSTはフォーマットであることをカバーするためのXML属性が必要です。

<meta name="cover" content="id5" /> 

しかし、多くのEPUB作成者がこの方法の周りにそれらを持っている:

<meta content="id5" name="cover" /> 

そして、 Nook STはカバー画像全体を無視する。

私は手動でepubファイルのcontent.opfファイルを編集しています。これまでのところ、彼らはすべてイメージメタを持っていましたが、それはいつも「間違った」方法の周りでした(間違って、ヌークによると)。

最近、私はREGEXで遊んでいました。ほとんどの場合、PDFファイルからCalibreで変換されたepubのクリーンアップを自動化しようとしていました。私はまだREGEXの初心者です。

「名前」属性と「コンテンツ」属性の入れ替えを自動化する方法が不思議でしたか?私はそれがREGEXとスクリプティングの組み合わせで行われることができると思います。私はPythonにある他のepub関連スクリプトを知っています。私はMac(OS X)上にあり、うまく動作しているようだ。 AppleScriptも良い選択肢かもしれませんが、私は誰もがどんなプラットフォームでも動くことができるものを望んでいますが、私は他の人々がこれを役に立つと確信しています。ここで

は私が予見手順は次のとおりです。

〜を探すためにePubファイル

〜使用REGEXを抽出します。

:見つけ、程度それを変更するREGEXを使用する場合は

<meta content="???" name="cover"> 

<meta name="cover" content="???"> 

〜正しい圧縮プロセスを使用して、抽出されたファイルをepubに戻します。

私はここに情報を見つけました:http://www.mobileread.com/forums/showthread.php?t=55681正しくepubファイルを解凍する方法を説明しています。基本的には次の2つのコマンドを必要とします。

zip -X0 "full path to new epub file" mimetype 
zip -rDX9 "full path to new epub file" * -x "*.DS_Store" -x mimetype 

私はそれを発見し、を利用したことがあり、これまで(B &までN乏しいEPUB/XMLの実装を解決)どこのオンライン結果のスクリプトを投稿したいと思います。 Calibreフォーラムとモバイルフォーラムに投稿することは覚えています(私はこの2つが馴染み深いので、この問題に対する人々のディスカッションのマニュアルの修正を見てきました)。

このようなスクリプトを作成する方法を教えてくれる人がいますか?理想的には、スクリプトを作成する方法を実際に知りたいので、時間の経過とともに、自分自身でこれらの種類のものを理解することができます(特にREGEXの部分は、どのように役立つかが分かります)。

ありがとうございます。

ジョナサン

@Haldean:私は再帰的にすべてのサブフォルダ内のすべてのファイルcontent.opfを通して彼のスクリプト作品を作りに関するHaldeanにコメントで何を意味するか説明するために追加しました。

> My_expanded_epubs 
- -> epub_one_expanded 
- - - -> content.opf 
- -> epub_two_expanded 
- - - -> content.opf 
- -> epub_three_expanded 
- - - -> content.opf 
etc. 
+0

あなたが探しているメタタグを正しく識別できる正規表現がありますか? – Marcin

+2

また、B&Nに文句を言います。属性が特定の順序であることを必要とするXMLプロセッサを使用する理由はありません。 – Marcin

+0

ありがとうMarcin。私は今この問題に関してB&Nにメッセージを送っています。 – inspirednz

答えて

0

個人的に私は、正規表現(its the wrong tool)でこれをしないだろう。 XSLTを使用できますか?


編集:ここでは

はデモです。 http://www.xsltcake.com/slices/nvLRJ6

XSLT librarys for pythonの番号があります。


EDIT:

あなたが正規表現でそれを行う上で主張する場合、あなたがこのようなパッテンたいでしょう:
<meta content="([^"]+)" name="([^"]+)" \/>

を私はdisclaimer that this is the wrong toolでこれを言うと、エッジケースがありますこれは信頼できないものになり、私はそれをお勧めしません。

http://regexr.com?301uq

+0

提案していただきありがとうございます。あなたが提供したリンクを見てきました。手元の作業を自動化する一環として、XSLTを使用する方法がわかりません。助言がありますか? リンク先のページにもリンクしています。私は前進する方法を見つけ出すことができなかった。 – inspirednz

+0

私は正規表現が問題のXML属性の位置を突き止める方法ではない理由についてもっと学びました。私はまだ確信していないが、それは非常に簡単なものを見つけるために正規表現を使用することはできません。それは正規表現の限界に対する私の無知のせいかもしれません。 – inspirednz

+0

@inspiredlife:合法的なXMLパーサに必要な順序でプロパティを出力させる方法がない可能性があるため、regexesは正しいツールだと言います。ドキュメント全体を解析するソリューションは、影響を受ける実装。対照的に、 'sed'のようなツールは、変更したい文書の部分だけを編集できるようにします。 – Marcin

2

あなたは(私は良いオプションだと思うもの)シェルスクリプトで行くために喜んでいるなら、あなたはsedのワンライナーを使用することができます。

sed 's/<meta content="\(.*\)" name="cover" \/>/<meta name="cover" content="\1" \/>/' [your-file] 

すべて置き換える必要があることメタの行には、content属性が最初に来て、正しい順序で1つある。それと同等のPythonの翻訳は次のようになります。

import re 
import sys 
with open(sys.argv[1]) as f: 
    for line in f: 
    # Match this line to the wrong-way-around meta tag, put the content in group 1 
    m = re.match(r'<meta content="(.*)" name="cover" />', line) 
    if not m: 
     print line 
    else: 
     print '<meta name="cover" content="%s" />' % m.group(1) 
+0

正規表現はスペーシングの変化に強くないことに注意してください。 – Marcin

+0

ありがとうHaldean。 Pythonは、私の頭をかぶるための比較的単純な言語のように見えます。私はおそらく25年前に遊んだベーシックを思い出させる。彼が言及した理由のために、Marcinが提供した正規表現を使って、これを試してみるでしょう。 – inspirednz

+0

@Haldean:Pythonを使ってepubファイルを解凍して再パックする方法を知っていますか?私はどこにでもその情報を表示することはできません。それは私の元の投稿で指定された方法でそれを行う必要があります。 – inspirednz

-1

私はzapthedingbat's answerに同意:これはXMLの問題であり、それでは、具体的XML、すなわちXSLTのために設計されたツールを使用してみましょう。

XSLTを初めて使用したので、このソリューションを試すにはXSLTプロセッサが必要です。 * nixを使用している場合、xsltprocはコマンドラインプロセッサであり、ほとんどの場合、デフォルトでインストールされています。そうでない場合は、選択した言語にXSL変換を実行するためのAPIがあるかどうかを確認する必要があります。ここで

属性を並べ替えるための非常に単純な一般的なソリューションです:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="@*|node()"> 
    <!-- copy everything as is --> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="meta"> 
    <!-- except for the <meta/> element, reverse the attribute order --> 
    <meta name="{@name}" content="{@content}"/> 
    </xsl:template> 
</xsl:stylesheet> 

ここにあなたの例です:

$ xsltproc so.xsl so.xml 

と結果:

<root> 
    <meta content="id5" name="cover" /> 
</root> 

xsltprocとXSLTを実行します:

<root> 
    <meta name="cover" content="id5"/> 
</root> 
+0

なぜdownvote? * –

+0

XML処理の種類は非常に魅力的ではありません。有効なマークアップが他のバグを引き起こすかどうかわからないからです。ターゲットテキスト編集はここで必要なものです。 – Marcin

+0

@Marcin "魅力的"ではないですか? –

1

私はあなたが解凍されたファイルで動作するようにsedを使用することを示唆している、とのようなものだろう:このバージョンは余分または欠落スペース、またはスラッシュに対処することを

sed -e 's/<[ ]*meta[ ]*content[ ]*=[ ]*"\(.*\)"[ ]*name[ ]*=[ ]*"cover"[ ]*\/*[ ]*>/<meta name="cover" content="\1" \/>/g' 

注意を。

xmlプロセッサーを使用することができます(lxmlを使用してpythonスクリプトを提案します)。編集で作成された無効なマークアップがないことを確認することができます。

完全に準拠したXMLプロセッサが完全に合法であり、あなたの隅の他のバグを引き起こす可能性があるため、操作を実行するためのXMLツールの使用は魅力的ではありません。 sedを使用すると、文書の一部だけを編集することができます。

+0

これを考えて徹底してくれてありがとう。私はあなたの提案をまもなく試してみる(すべての午後オフラインになっているので、応答が遅れる)。タグの操作がすべて良ければ、私が解決したいもう一つのステップは他のステップをどう扱うかです。たとえば、epubを展開し、正規表現チェックを実行し、epubを再パックします。誰かがNook STにサイドロードしたいepubファイルをたくさん持っている場合は、ほとんどの時間をアンパックして再パックするだけです。スクリプトをファイル上で実行し、その中のすべてのepubファイルを再帰的に処理するのはいいでしょう。 – inspirednz

+0

Calibre(私が思い出したもの)を使って、epubs自体をかなり簡単に一括検証することができます。良いアイデアだろうか。ありがとう。 – inspirednz

+0

@inspiredlife:開梱などの問題がある場合は、別の質問を投稿することをお勧めします。 – Marcin

関連する問題