おいしい料理を評することほど愚かなことはない

Tsukasa OISHI

 ユルさんがまだ仕事から帰ってきていなかったので、kaeruspoonをいじくって待つことにしました。とても寒くてエアコンが追いつかない中、キーボードを叩きます。今回はkaeruspoonの独自記法に関する機能の実装。最初はcontrollerにコードを書いていたのだけど、おかしいことに気づいてhelper上でメソッドを作りました。preタグの扱いにちょっと考えたけど、とりあえず勢いで以下のように実装です。

  def view_text(text)
    text_list = Array.new

    pos = 0
    while start_pos = text.index(start_mark, pos)
      if start_pos != pos
        text_list << {:name => "text", :start => pos, :end => start_pos -1}
      end

      end_pos = text.index(end_mark, start_pos)
      if end_pos
        text_list << {:name => "pre", :start => start_pos, :end => end_pos}
        pos = end_pos + end_mark.length
      else
        text_list.pop
        text_list << {:name => "text", :start => pos, :end => -1}
        pos = -1
      end
    end

    if text_list.empty?
      text_list << {:name => "text", :start => 0, :end => -1}
    else
      if (pos != -1) && (text.index(start_mark, pos) == nil)
        text_list << {:name => "text", :start => pos, :end => -1}
      end
    end

    html = ''
    text_list.each do |part|
      if part[:name] == "text"
        part_text = text[part[:start]..part[:end]].strip
        part_text = exchange_http(part_text)
        part_text = exchange_strong(part_text)
        part_text = part_text.gsub("\n", "<br/>")
        html <<  '<p>' + part_text + '</p>'
      else
        part_text = text[(part[:start] + start_mark.length)..(part[:end] - 1)]
        part_text = h(part_text)
        html << '<pre>' + part_text + '</pre>'
      end
    end

    return html
  end

start_mark, end_markに関しては実際はメソッド内で定義しているのだけど、ここでは省略しています。
 リファクタリングはまだしてません。もっと全然スマートにできそうですが、その前に掲示板機能を作っちゃおうと思います。リファクタリングは最後回しです。サンデープログラマですね。TDDも全然やってないし。いけませんいけません。

 ユルさんがシチューを作ってくれました。のんびりした夜を過ごしています。