段落字数制限

きちんと章立てせずにだらだら長い文章を書くことを抑制するために、指定した文字数を超える連続する段落がある場合警告する機能を搭載した。

通常、段落はブロックによるan Arrayであるので、マークアップではなくPureDocクラスで面倒をみることにした。

# Paragraph element.
# For notify length for too long flat text.
def p(*text)

text = block_given? ? yield : text

if @par_length_limit

if text.join.length < @par_length_limit
STDERR.puts "*WARNING : A single paragraph is too long (#{text.join.length} characters.)"
end
end

return text

end

基本的な値の取得も面倒を見るようになった。

制限文字数はユーザーが@par_length_lumitを設定する。設定しなければ機能しない。

インデント

HTMLでの出力を基本としてきたため、いままで改行すら入れていなかったが、ちょっとひどいのでインデントも入れることにした。

インデントの考え方としては、reading spaceを含めタグで始まる行をインデントする。このため、ネストしているものはこのインデント処理が複数呼ばれることになり、うまく処理できる。また、codeなどについては触らないようにできる。

改行については各エレメントのフォーマッタで面倒をみる。といっても、大半はstdメタメソッドで作られているので触るところは少ない。さらに、stringifyメソッドによってインデント処理とともにString化も行う。これにより、各エレメントは必ず文字列を返す、という仕様に統一された(これまでは文字列または配列を返していたが、Array#to_sが変更された現在、その仕様は不適切となった)。

ちなみに、stringifyに渡されてくる時点では文字列か配列かが確定できないので、これを処理して一旦文字列にしたあと(改行処理もする)、String#each_lineでインデントしてから、配列をまた文字列にしている。アルゴリズムとして効率はよくないが、開発を優先した。

ちなみに、インデントは@indent_spacesにセットするか、もしくは$puredoc_indent_spaces環境変数にセットすることでコントロールできる。デフォルトはタブ文字ひとつである。

これに伴って、要素はインラインかどうかを判定するためのキーワード引数が追加された。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください