class PrettyPrint

要約

pretty printing アルゴリズムのためのクラスです。改行の位置を探し、きれいなインデントを施します。

デフォルトでは、このクラスは文字列を扱います。また、文字1バイトが出力幅の中で1カラムを占めると仮定しています。しかし、以下のメソッドに対して適切な引数を与えることで、そうでない場合にも利用できます。

ですので、このクラスは以下のようなことにも応用が可能です。

目次

特異メソッド
format new singleline_format
インスタンスメソッド
breakable flush genspace group indent maxwidth nest newline output text

特異メソッド

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
[PARAM] output:
出力先を指定します。output は << メソッドを持っていなければなりません。
[PARAM] maxwidth:
行の最大幅を指定します。ただし、改行できないものが渡された場合は、実際の出力幅は maxwidth を越えることがあります。
[PARAM] newline:
改行に使われます。
[PARAM] genspace:
空白の生成に使われる Proc オブジェクトを指定します。生成したい空白の幅を表す整数を引数として呼ばれます。
new(output = '', maxwidth = 79, newline = "\n") -> PrettyPrint[permalink][rdoc]
new(output = '', maxwidth = 79, newline = "\n") {|width| ...} -> PrettyPrint

pretty printing のためのバッファを生成します。 output は出力先です。output は << メソッドを持っていなければなりません。 << メソッドには

のどれかひとつが引数として与えられます。

ブロックが指定された場合は、空白を生成するために使われます。ブロックは、生成したい空白の幅を表す整数を引数として呼ばれます。ブロックが指定されない場合は、空白を生成するために {|width| ' ' * width} が使われます。

[PARAM] output:
出力先を指定します。output は << メソッドを持っていなければなりません。
[PARAM] maxwidth:
行の最大幅を指定します。ただし、改行できないものが渡された場合は、実際の出力幅は maxwidth を越えることがあります。
[PARAM] newline:
改行に使われます。
singleline_format(output = '', maxwidth = 79, newline = "\n", genspace = lambda{|n| ' ' * n}) {|pp| ...} -> object[permalink][rdoc]

PrettyPrint オブジェクトを生成し、それを引数としてブロックを実行します。 PrettyPrint.format に似ていますが、改行しません。

引数 maxwidth, newline と genspace は無視されます。ブロック中の breakable の実行は、改行せずに text の実行であるかのように扱います。

[PARAM] output:
出力先を指定します。output は << メソッドを持っていなければなりません。
[PARAM] maxwidth:
無視されます。
[PARAM] newline:
無視されます。
[PARAM] genspace:
無視されます。

インスタンスメソッド

breakable(sep = ' ') -> ()[permalink][rdoc]
breakable(sep, width = sep.length) -> ()

「必要ならここで改行出来る」ということを自身に通知します。もしその位置で改行されなければ、width カラムのテキスト sep が出力の際にそこに挿入されます。

[PARAM] sep:
改行が起きなかった場合に挿入されるテキストを文字列で指定します。
[PARAM] width:
テキスト sep は width カラムであると仮定されます。指定されなければ、 sep.length が利用されます。例えば 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 は、改行するならば全て同時に改行します。

[PARAM] indent:
グループのインデントの深さを指定します。
[PARAM] open_obj:
指定された場合、self.text(open_obj, open_width) がブロックが実行される前に呼ばれます。開き括弧などを出力するのに使用されます。
[PARAM] close_obj:
指定された場合、self.text(close_obj, close_width) がブロックが実行された後に呼ばれます。閉じ括弧などを出力するのに使用されます。
[PARAM] open_width:
open_obj のカラムを指定します。
[PARAM] close_width:
close_obj のカラムを指定します。
indent -> Integer[permalink][rdoc]

現在のインデントの深さを返します。

maxwidth -> Integer[permalink][rdoc]

自身の幅を返します。

nest(indent) {...} -> ()[permalink][rdoc]

自身の現在のインデントを indent だけ増加させてから、ブロックを実行し、元に戻します。

[PARAM] indent:
インデントの増加分を整数で指定します。
newline -> String[permalink][rdoc]

自身の改行文字を返します。

output -> object[permalink][rdoc]

自身の output を返します。

text(obj) -> ()[permalink][rdoc]
text(obj, width = obj.length) -> ()

obj を width カラムのテキストとして自身に追加します。

[PARAM] obj:
自身に追加するテキストを文字列で指定します。
[PARAM] width:
obj のカラムを指定します。指定されなかった場合、obj.length が利用されます。