lib/tidgrep/cli.rb in tidtools-0.0.2 vs lib/tidgrep/cli.rb in tidtools-0.0.3
- old
+ new
@@ -1,90 +1,252 @@
+# -*- coding: utf-8 -*-
require File.join(File.dirname(__FILE__), '../tidtools/tiddle')
require 'optparse'
module Tidgrep
- class CLI
- def self.isValidOption(file_name, title, keyword)
- return false if !file_name
- return title || keyword
- end
+ # 圧縮表示時のパラメータ
+ MATCH_LINE_COMP_NUM = 5
- def self.execute(stdout, arguments=[])
- title = nil
- regexp_option = 0
- file_name = ENV['TIDGREP_PATH']
- report = false
- match_rule = "grep"
+ MATCH_ONLY_TITLE_COMP_NUM = 5
+ MATCH_TIDDLE_LINE_NUM = 3
+ MATCH_TIDDLE_COMP_NUM = 5
+
+ MATCH_TWEET_LINE_NUM = 3
+ MATCH_TWEET_COMP_NUM = 5
+
+ class Tidgrep
+ def initialize
+ @file_name = ENV['TIDGREP_PATH']
+ @title = nil
+ @regexp_option = 0
+ @report = false
+ @match_rule = "line"
+ @is_comp = false
+ end
+
+ def setupParam(stdout, arguments)
opt = OptionParser.new('tidgrep [option] keyword')
- opt.on('-f FILE_NAME', '--filename FILE_NAME', 'TiddlyWiki file name') {|v| file_name = v }
- opt.on('-t TITLE', '--title TITLE', 'match title') {|v| title = v }
- opt.on('-i', '--ignore', 'ignore case') {|v| regexp_option |= Regexp::IGNORECASE }
- opt.on('-r', '--report', 'disp report') {|v| report = true }
- opt.on('-m MATCH_RULE', '--match MATCH_RULE', 'match rule [grep, tiddle, hr]') {|v| match_rule = v; p match_rule }
+ opt.on('-f FILE_NAME', '--filename FILE_NAME', 'TiddlyWiki file name') {|v| @file_name = v }
+ opt.on('-t TITLE', '--title TITLE', 'match title') {|v| @title = v }
+ opt.on('-i', '--ignore', 'ignore case') {|v| @regexp_option |= Regexp::IGNORECASE }
+ opt.on('-r', '--report', 'disp report') {|v| @report = true }
+ opt.on('-m MATCH_RULE', '--match MATCH_RULE', 'match rule [line, tiddle, tweet]') {|v| @match_rule = v }
+ opt.on('-c', '--comp', 'compression disp') {|v| @is_comp = true; @report = true }
opt.parse!(arguments)
+
+ @title_regexp = @title && Regexp.new(@title, @regexp_option)
- keyword = ARGV[0]
+ @content_regexps = []
+ arguments.each do |keyword|
+ @content_regexps << Regexp.new(keyword, @regexp_option)
+ end
- if (!isValidOption(file_name, title, keyword))
+ unless validOption?
puts opt.help
exit
end
+ end
- tiddles = Tiddle.parse_sort_modified(file_name)
+ def validOption?
+ return false if !@file_name
+ return @title || @content_regexps.size > 0
+ end
+
+ def match?(target)
+ @content_regexps.each do |content_regexp|
+ return false if content_regexp !~ target
+ end
+ return true
+ end
+
+ def match_line
+ tiddles = Tiddle.parse_sort_modified(@file_name)
+
match_lines = 0
- total_lines = 0
+ search_lines = 0
match_tiddles = 0
- title_regexp = title && Regexp.new(title, regexp_option)
- content_regexp = keyword && Regexp.new(keyword, regexp_option)
+ is_limit = false
tiddles.each do |tiddle|
- next if (title && tiddle.title !~ title_regexp)
+ next if (@title && tiddle.title !~ @title_regexp)
is_match_tiddle = false
line_no = 1
- if (content_regexp)
- tiddle.content.each_line do |line|
- if (content_regexp =~ line)
- case match_rule
- when "grep"
- puts "#{tiddle.title}:#{line_no}:#{line}"
- match_lines += 1
- unless is_match_tiddle
- match_tiddles += 1
- is_match_tiddle = true
- end
- when "tiddle"
- match_lines += 1
- unless is_match_tiddle
- puts "--- #{tiddle.title} --------------------"
- match_tiddles += 1
- is_match_tiddle = true
- end
- puts "#{line}"
- when "hr"
+ tiddle.content.each_line do |line|
+ if (match? line)
+ match_lines += 1
+
+ unless is_limit
+ puts "#{tiddle.title}:#{line_no}:#{line}"
+
+ if (@is_comp && match_lines >= MATCH_LINE_COMP_NUM)
+ is_limit = true
+ print ".\n.\n"
end
end
- line_no += 1
- total_lines += 1
+
+
+ unless is_match_tiddle
+ match_tiddles += 1
+ is_match_tiddle = true
+ end
end
- else
+ line_no += 1
+ search_lines += 1
+ end
+ end
+
+ if (@report)
+ puts "------------------------------"
+ puts "search lines : #{search_lines}"
+ puts "match lines : #{match_lines}"
+ puts "total tiddles : #{tiddles.size}"
+ puts "match tiddles : #{match_tiddles}"
+ end
+ end
+
+ def match_only_title
+ tiddles = Tiddle.parse_sort_modified(@file_name)
+
+ match_tiddles = 0
+
+ is_limit = false
+
+ tiddles.each do |tiddle|
+ next if (@title && tiddle.title !~ @title_regexp)
+
+ match_tiddles += 1
+
+ unless is_limit
puts tiddle.title
+
+ if (@is_comp && match_tiddles >= MATCH_ONLY_TITLE_COMP_NUM)
+ is_limit = true
+ print ".\n.\n"
+ end
+ end
+ end
+
+ if (@report)
+ puts "------------------------------"
+ puts "total tiddles : #{tiddles.size}"
+ puts "match tiddles : #{match_tiddles}"
+ end
+ end
+
+ def match_tiddle
+ tiddles = Tiddle.parse_sort_modified(@file_name)
+
+ search_tiddles = 0
+ match_tiddles = 0
+
+ is_limit = false
+
+ tiddles.each do |tiddle|
+ next if (@title && tiddle.title !~ @title_regexp)
+ search_tiddles += 1
+
+ if (match? tiddle.content)
match_tiddles += 1
- is_match_tiddle = true
+
+ unless is_limit
+ puts "--- #{tiddle.title} --------------------"
+
+ unless @is_comp
+ puts tiddle.content
+ else
+ print tiddle.content.split(/\n/)[0..(MATCH_TIDDLE_LINE_NUM - 1)].join("\n") + "\n.\n"
+ end
+
+ if (@is_comp && match_tiddles >= MATCH_TIDDLE_COMP_NUM)
+ is_limit = true
+ print ".\n.\n"
+ end
+ end
end
+ end
+ if (@report)
+ puts "------------------------------"
+ puts "total tiddles : #{tiddles.size}"
+ puts "search tiddles : #{search_tiddles}"
+ puts "match tiddles : #{match_tiddles}"
end
+ end
- if (report)
+ def match_tweet
+ tiddles = Tiddle.parse_sort_modified(@file_name)
+
+ search_tweets = 0
+ match_tweets = 0
+
+ is_limit = false
+
+ tiddles.each do |tiddle|
+ next if (@title && tiddle.title !~ @title_regexp)
+ is_match_tiddle = false
+
+ tweets = tiddle.content.split(/^----+\n/)
+ search_tweets += tweets.size
+
+ tweets.each do |tweet|
+ if (match? tweet)
+ match_tweets += 1
+ unless is_limit
+ unless is_match_tiddle
+ puts "--- #{tiddle.title} --------------------"
+ is_match_tiddle = true
+ else
+ puts "----\n"
+ end
+
+ unless @is_comp
+ print tweet
+ else
+ print tweet.split(/\n/)[0..(MATCH_TWEET_LINE_NUM - 1)].join("\n") + "\n.\n"
+ end
+
+ if (@is_comp && match_tweets >= MATCH_TWEET_COMP_NUM)
+ is_limit = true
+ print ".\n.\n"
+ end
+ end
+ end
+ end
+ end
+
+ if (@report)
puts "------------------------------"
- if (content_regexp)
- puts "match lines : #{match_lines}"
- puts "total lines : #{total_lines}"
+ puts "search tweets : #{search_tweets}"
+ puts "match tweets : #{match_tweets}"
+ end
+ end
+
+ def execute(stdout, arguments=[])
+ # パラメータの設定
+ setupParam(stdout, arguments)
+
+ # マッチルールごとに処理を変える
+ if (@content_regexps.size > 0)
+ case @match_rule
+ when "line"
+ match_line
+ when "tiddle"
+ match_tiddle
+ when "tweet"
+ match_tweet
end
- puts "match tiddles : #{match_tiddles}"
- puts "total tiddles : #{tiddles.size}"
+ else
+ match_only_title
end
+ end
+
+ end
+
+ class CLI
+ def self.execute(stdout, arguments=[])
+ Tidgrep.new.execute(stdout, arguments)
end
end
end