YAML/JSON/XMLをpp(pretty print)するコマンドを作った。
rubyのppをコマンドにした。いろいろ読んでppで出力。
- XMLやJSONに改行が入ってなくて読みにくいとき
- 日本語がエスケープされててよめないとき
- パースできるか確認したいとき
などに。
使い方
$ pp --help
pp [options] [file|URI]
-y, --yaml parse YAML and pp.
-j, --json parse JSON and pp.
-x, --xml parse XML using REXML and pp.
-X, --xmlsimple parse XML using XMLSimple and pp.
-t, --text do not parse. print plain text.ファイル・URLを指定しなかった場合は、標準入力から読み込む。入力の種類をオプションで指定しなかった場合は、拡張子やcontent-typeから判断する。
例
# railsのデータベース設定ファイル(yaml)をパースして表示
$ pp config/database.yml
{"development"=>
{"socket"=>"/opt/local/var/run/mysqld/mysqld.sock",
"reconnect"=>false,
"encoding"=>"utf8",
"username"=>"root",
"adapter"=>"mysql",
"password"=>nil,
"database"=>"pptest_development",
"pool"=>5},
"production"=>
{"socket"=>"/opt/local/var/run/mysqld/mysqld.sock",
"reconnect"=>false,
"encoding"=>"utf8",
"username"=>"root",
"adapter"=>"mysql",
"password"=>nil,
"database"=>"pptest_production",
"pool"=>5},
"test"=>
{"socket"=>"/opt/local/var/run/mysqld/mysqld.sock",
"reconnect"=>false,
"encoding"=>"utf8",
"username"=>"root",
"adapter"=>"mysql",
"password"=>nil,
"database"=>"pptest_test",
"pool"=>5}}
# はてブのJSON取得
$ pp http://b.hatena.ne.jp/entry/json/http://www.hatena.ne.jp/
{"eid"=>"370",
"title"=>"はてな",
"url"=>"http://www.hatena.ne.jp/",
"related"=>
[{"eid"=>"651",
"title"=>
"ソーシャル・ネットワーキング サービス [mixi(ミクシィ)]",
"url"=>"http://mixi.jp/",
"entry_url"=>"http://b.hatena.ne.jp/entry/mixi.jp/",
"count"=>"3152"},
{"eid"=>"398",
"title"=>"Google",
"url"=>"http://www.google.co.jp/",
"entry_url"=>"http://b.hatena.ne.jp/entry/www.google.co.jp/",
"count"=>"3913"},
{"eid"=>"18",
"title"=>"Yahoo! JAPAN",
"url"=>"http://www.yahoo.co.jp/",
"entry_url"=>"http://b.hatena.ne.jp/entry/www.yahoo.co.jp/",
"count"=>"6911"},
{"eid"=>"375",
"title"=>"livedoor",
"url"=>"http://www.livedoor.com/",
"entry_url"=>"http://b.hatena.ne.jp/entry/www.livedoor.com/",
"count"=>"1090"},
{"eid"=>"93",
"title"=>"はてなブックマーク",
"url"=>"http://b.hatena.ne.jp/",
"entry_url"=>"http://b.hatena.ne.jp/entry/b.hatena.ne.jp/",
"count"=>"3404"}],
"screenshot"=>
"http://screenshot.hatena.ne.jp/images/200x150/c/2/6/b/d/f015f87fcf44a513f4744
d853fe22504bc3.jpg",
"entry_url"=>"http://b.hatena.ne.jp/entry/www.hatena.ne.jp/",
"bookmarks"=>
[{"user"=>"javaholic",
"timestamp"=>"2010/01/08 01:15:24",
"tags"=>["お気に入り"],
"comment"=>"はてなブックマークトップ"},
{"user"=>"rainbowfoop",
"timestamp"=>"2010/01/07 23:29:56",
"tags"=>["はてな"],
"comment"=>""},
{"user"=>"hosiuo",
"timestamp"=>"2010/01/06 17:10:05",
"tags"=>
["はてな",
"ポータル",
"webサービス",
"検索",
"blog",
"bookmark"],
"comment"=>"今更ながらブックマーク"},
:
:
{"user"=>"masakiyo_tanaka",
"timestamp"=>"2005/02/10 22:42:33",
"tags"=>[],
"comment"=>""}],
"count"=>"3456"}
# XMLをxml-simpleでパース
$ pp -X http://www.google.co.jp/crossdomain.xml
{"site-control"=>[{"permitted-cross-domain-policies"=>"by-content-type"}]}
# XMLをREXMLでパースしてフォーマット
$ pp http://www.google.co.jp/crossdomain.xml
<?xml version='1.0'?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control
permitted-cross-domain-policies = "by-content-type" />
</cross-domain-policy>
# XMLを標準入力から読んでパース
$ svn info --xml | pp -X
# twitterのパブリックタイムラインを表示
$ pp http://twitter.com/statuses/public_timeline.json
$ pp http://twitter.com/statuses/public_timeline.rss
# -t(--text)で生のソースを出力
$ pp -t http://twitter.com/statuses/public_timeline.json
alias
~/.zshrc
alias json='pp -j' alias xml='pp -x' alias yaml='pp -y'
で、
$ yaml config/database.yml
とできる。