pretty printing アルゴリズムのためのクラスです。改行の位置を探し、きれいなインデントを施します。
デフォルトでは、このクラスは文字列を扱います。また、文字1バイトが出力幅の中で1カラムを占めると仮定しています。しかし、以下のメソッドに対して適切な引数を与えることで、そうでない場合にも利用できます。
ですので、このクラスは以下のようなことにも応用が可能です。
format(output = '', maxwidth = 79, newline = "\n", genspace = lambda{|n| ' ' * n}) {|pp| ...} -> object
[permalink][rdoc]PrettyPrint オブジェクトを生成し、それを引数としてブロックを実行します。与えられた output を返します。
以下と同じ働きをするもので簡便のために用意されています。
require 'prettyprint' begin pp = PrettyPrint.new(output, maxwidth, newline, &genspace) ... pp.flush output end
new(output = '', maxwidth = 79, newline = "\n") -> PrettyPrint
[permalink][rdoc]new(output = '', maxwidth = 79, newline = "\n") {|width| ...} -> PrettyPrint
pretty printing のためのバッファを生成します。 output は出力先です。output は << メソッドを持っていなければなりません。 << メソッドには
のどれかひとつが引数として与えられます。
ブロックが指定された場合は、空白を生成するために使われます。ブロックは、生成したい空白の幅を表す整数を引数として呼ばれます。ブロックが指定されない場合は、空白を生成するために {|width| ' ' * width} が使われます。
singleline_format(output = '', maxwidth = 79, newline = "\n", genspace = lambda{|n| ' ' * n}) {|pp| ...} -> object
[permalink][rdoc]PrettyPrint オブジェクトを生成し、それを引数としてブロックを実行します。 PrettyPrint.format に似ていますが、改行しません。
引数 maxwidth, newline と genspace は無視されます。ブロック中の breakable の実行は、改行せずに text の実行であるかのように扱います。
breakable(sep = ' ') -> ()
[permalink][rdoc]breakable(sep, width = sep.length) -> ()
「必要ならここで改行出来る」ということを自身に通知します。もしその位置で改行されなければ、width カラムのテキスト sep が出力の際にそこに挿入されます。
flush -> ()
[permalink][rdoc]バッファされたデータを出力します。
genspace -> Proc
[permalink][rdoc]空白を生成する Proc を返します。
group(indent = 0, open_obj = '', close_obj = '', open_width = open_obj.length, close_width = close_obj.length) {...} -> ()
[permalink][rdoc]与えられたブロックを実行します。ブロック内で自身に追加される文字列やオブジェクトは、1行にまとめて表示してもよい同じグループに属すると仮定されます。
もう少し詳しく説明します。pretty printing アルゴリズムはインデントと改行を、ツリー構造を作ることによって決定します。そして、group メソッドは子ノードの作成と子ノードのインデントの深さの決定を担当します。
同じノード内で呼ばれた breakable は、改行するならば全て同時に改行します。
indent -> Integer
[permalink][rdoc]現在のインデントの深さを返します。
maxwidth -> Integer
[permalink][rdoc]自身の幅を返します。
nest(indent) {...} -> ()
[permalink][rdoc]自身の現在のインデントを indent だけ増加させてから、ブロックを実行し、元に戻します。
newline -> String
[permalink][rdoc]自身の改行文字を返します。
output -> object
[permalink][rdoc]自身の output を返します。
text(obj) -> ()
[permalink][rdoc]text(obj, width = obj.length) -> ()
obj を width カラムのテキストとして自身に追加します。