わたなべです.

toyofuku / juice.or.jp <toyofuku / juice.or.jp> writes:

:  ふと思ったんですが折り曲げコマンドの fold
:を ruby で書こうと思ったらどう書くのが簡単
:ですか。

70 bytes で fold したいときは unpack(a71 a*) で分割して日本
語の泣きわかれは /.$/ がマッチするかどうかで調べるという方法
をとってます.

#nkf -f70 を呼んだほうが簡単だね. やっぱ Kconv.nkf が必要か?

いちおう簡単な禁則処理も入ってます. でもかなり遅いです.

-- 
わたなべひろふみ

class String head_chars = '].,:;?!)}>' + '、。,.・:;?!’”)〕]}〉》」』】>' + 'ぁぃぅぇぉっゃゅょァィゥェォッャュョ' tail_chars = '[`({<‘“(〔[{〈《「『【<' HEAD_REGEXP = /^[#{head_chars}]/ TAIL_REGEXP = /[#{tail_chars}]$/ def fold width result = '' line = self.dup.delete!("\n") len = width + 1 while line.size != 0 left, right = line.unpack("a#{len} a*") if width < left.size if /.$/ =~ left right = $& + right left[-$&.size, $&.size] = '' else right = left[-1, 1] + right left[-1, 1] = '' end end while HEAD_REGEXP =~ right left << $& right = $' end while TAIL_REGEXP =~ left left = $` right = $& + right end if /\w+$/ =~ left word = $& before = $` if /^\w+/ =~ right if width < word.size + $&.size left << $& right = $' else left = before right = word + right end end end result << left << "\n" line = right end result end end