わたなべです. 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