読者です 読者をやめる 読者になる 読者になる

はてダラのローカルタグ検索をRubyに移植した

Ruby

Haskell版だとその日の関係ないエントリも上がってきてしまうので、どうにかするやつをRubyで書いた。-dオプションでエントリの内容詳細も出力するようにした。

require 'optparse'
require 'kconv'

class String
  def is_int?
    return /^#{self.to_i}(\.0+)?$/ =~ self ? true : false
  end
end

def search(search,file_path,detail)
  file = File.open(file_path,"r")
  lines = []

  while line = file.gets
    lines.push line
  end

  file.close

  title_flag = FALSE
  #titleのところにlineがあればTRUE、それ以外はFALSE
  
  lines.each{|line|
    line = line.split(//e)
    if line.length == 0
      search_flag = FALSE
    else
      search_flag = TRUE
    end

    line[1..10].map{|item| search_flag = search_flag && item.is_int?}
    search_flag = line.join.include?("["+search+"]") && search_flag
    #タイトルかつ検索タグが入っているかのフラグ

    if (search_flag == TRUE) && (title_flag == FALSE)
      title_flag = TRUE
    elsif (search_flag == TRUE) && (title_flag == TRUE)
      title_flag = FALSE
    elsif (search_flag == FALSE) && (title_flag == TRUE)
      title_flag = TRUE
    elsif (search_flag == FALSE) && (title_flag == FALSE)
      title_flag = FALSE
    end
    
    if search_flag
      puts file_path
      puts line.join
    end

    if detail & title_flag
      puts line.join unless search_flag
    end
  }
end

text_files = []
dir_group = '/home/yasuhisa/.hatena/syou6162/group/syou6162/'
dir_diary = '/home/yasuhisa/.hatena/syou6162/diary/'
Dir.glob("#{dir_group}**\.txt"){|file| text_files.push file}
Dir.glob("#{dir_diary}**\.txt"){|file| text_files.push file}

search = "Haskell"
detail = FALSE

opt = OptionParser.new
opt.on('-d') {|v| detail= v }
opt.parse!(ARGV)

if ARGV.length == 0
  puts "引数が必要です。"
  #複数の検索語に対応しようと思ったけど、とりあえずタグ検索すればどうにかなるので放置
  exit
end

begin
  text_files.map{|file| search(ARGV[0],file,detail) }
rescue => ex
  raise ex.message
end