2009/12/20

class Search

github.com/midore/mdiary
の最近変更した箇所

$ ./mdiary-run.rb -st 'music'

を実行すると、ファイル content 内容に'music'を含むファイルがあるか検索する。
検索結果がゼロでなければ

1	[+] [2009/12/10 Thu AM 00:00:00] [music] (tower)
2	[+] [2009/12/11 Fri PM 17:04:36] [music] (diary)

と結果を返す。

この場合、
class ChoiceDir の中でSearch クラスを呼びだす。
mdiary-main.rb

252       Search.new(@word, @now_dir, st).base if @now_dir


Search の base method は、View の set_i_ary を呼び出す。
set_i_ary は、Search の get_diary を使用して一つづつファイルを処理する。

get_diary は @st が nil でなければ find_content にパス をわたす。
find_content はうけとったパスのファイルを一行づつ読み検索対象文字列を探す。
対象文字列がみつかった場合、ary_to_h をかえす。ary_to_h がかえす中身は Hash。
get_diary の中の to_obj は、Hash がかえってきた場合、その Hash をもとに Diary.new() する。

method "get_diary" in mdiary-main.rb

370     def get_diary(x)
371       begin
372         h = find_index(x) unless @st
373         h = find_content(x) unless @st.nil?
374         to_obj(h) unless h.nil?
375       rescue
376         return nil
377       end
378     end


method "find_content" in mdiary-io.rb

 38     def find_content(path)
 39       i, m = nil, nil
 40       a, mark = [], /^--content$/
 41       IO.foreach(path){|line|
 42         if line.match(mark)
 43           i = true; next
 44         end
 45         (i.nil?) ? a.push(line) : m = line.match(@word)
 46         break if m
 47       }
 48       return ary_to_h(a, path) if m
 49     end

0 件のコメント: