µTidylib(TidyのPython Wrapper)に関するメモ
Tidy オプションの簡易リファレンスを読み、 Python版のµTidylibで色々試してみた。まず共通の注意点。
- オプション名は公式にはダッシュ(-)で連結された名前になっているが、µTidylibではアンダースコア(_)で連結した名前でも通る。どちらでも良い。
- 不明なオプションを指定してパースするとtidy.error.InvalidOptionError。しかしTidyのオプションとしてvalidでも、µTidylibがサポートしていないとこの例外が発生することがある。decorate-inferred-ulというオプションで確認した。
- 有効/無効を切り替えるタイプのオプションは1/0またはTrue/Falseで指定。このときNoneタイプを指定すると例外を引き起こすことがあるのでbool値の変換を期待してはならない。
- 不明な要素などが登場するとエラーとなり、デフォルトでは何も出力されない(強制的に出力させることもできるが、推奨されていない)。しかしこのとき例外が引き起こされる訳ではなく、エラーの情報は結果オブジェクトのerrorsプロパティに「警告」と共にリスト型で列挙されている。何も出力されないというのは、Tidyがその文書をどう扱えばよいのか分からないことを意味しており、警告レベルとは別にユーザに告知すべきだと思うのだが。というわけで自分用にはParseErrorクラスを定義して、エラーが出たらraiseするようにしてみた。
tidy.parse
メソッドの戻り値はtidy.lib._Document
オブジェクトだが、それをresとすると、[e for e in res.errors if e.severity == "E"]
とすれば警告を除いてエラーだけをリストできる(と書いた方がPython使いには分かりやすいかと)。エラーがなければもちろん空リストになるわな。
- というかそもそも、µTidylibのparse/parseStringメソッドは何も出力しない。Tidyオプションでstdoutやstderrを指定しても何の効果もないということ。出力するには明示的にprint文やwriteメソッドを使わなければならない。
以下、注意の必要なオプションについて。
- fix-backslash
- URI中のバックスラッシュを単純にスラッシュに置換するらしい。%5Cに置換しようよ。しかもこのオプション、デフォルトで有効になっているというのだから怖い。
- doctype
- "strict"を指定すると、HTMLなら4.01 Strict、XHTMLなら1.0 Strictな文書型宣言を吐く。
- "transitional"を指定すると、HTMLなら4.01 Transitional、XHTMLなら1.0 Transitionalの文書型宣言を吐く。
- "omit"を指定すると、文書型宣言を吐かない。
- デフォルトでは"auto"で、HTML3.2とかになってしまうので、このオプションは明示的な指定が必須のような気がする。
- ユーザー定義のものも指定できるらしいがTidy的に不要だろう。確認する気無し。
- char-encoding
- 文字符号化方式を指定。us-asciiとかでない限りたぶん必須のオプション。input-encodingとoutput-encodingを別々に指定することもできる。
- drop-proprietary-attributes
- 不明な属性を消去。デフォルトは無効。有効でも無効でも一応警告は出されるが、エラーにはならない。Tidyは単純な属性名の書き間違いを修正してくれるわけでないので、テキストエディタの強調表示などで要素名、属性名を確認できるようにしておいた方が良いと思った。
- output-bom
- Byte-Order-Markをつけるか否か。デフォルトは"auto"になっていて、入力するHTML文書に従う。しかし「間違って付いちゃった」的なBOMを自動で消去して欲しいので、無効にしておいた方がいいような気がする。いつの間にかBOMをつけているテキストエディタは結構ある。
- wrap
- 折り返す文字数を指定(int型)。デフォルトは68文字。0を指定すれば折り返されない。
- tidy-mark
- 「Tidyを使ったよ」情報をmeta要素として吐くか否か。デフォルトで有効になっているので侮れない。
- indent
- シリアライザ系によくあるソースのインデント用のオプション。終了タグを省略するモードだとかなりお粗末。XHTMLならソースなんか見ないからFalseがいい。HTMLならフラットに書くからやっぱりFalse。
- hide-endtags
- 確認した限りでは、省略可能なタグは終了タグに限らず全て省略しているような気配を感じる。
- output-xhtml
- XHTMLで出力する。デフォルトでは無効。hide-endtags等のオプションは無視され、少なくともwell-formed XMLが吐かれる。
- add-xml-decl
- 冒頭にXML宣言を吐く。デフォルトでは無効。
- show-body-only
- これを指定すると入力を文書断片として扱うようになる。parseStringメソッドで"
<dt>
被定義語句<dd>
定義"という文字列をパースすれば、単に<dl>
タグを付けてくれるといった感じ。日記やブログ用に便利かもしれない。
追記
add-xml-declオプションの説明にNote that if the input already includes an <?xml ... ?> declaration then this option will be ignored.
とある。XML宣言のあるXHTML文書はValidなHTMLに変換できないのか。
webmaster@jintrick.net
公開: 2007年12月26日
カテゴリ: HTML
,Python