Class: Inspector
- Inherits:
-
Object
- Object
- Inspector
- Defined in:
- lib/inspector.rb
Overview
小説の状態を監視・検査する
Constant Summary collapse
- INSPECT_LOG_NAME =
"調査ログ.txt"
- LINE_LENGTH_THRESHOLD =
400
- BRACKETS_RETURN_COUNT_THRESHOLD =
7
- END_TOUTEN_COUNT_THRESHOLD =
50
- ERROR =
1
- WARNING =
2
- INFO =
4
- ALL =
ERROR | WARNING | INFO
- KLASS_TAG =
{ ERROR => "エラー", WARNING => "警告", INFO => "INFO" }
- IGNORE_INDENT_CHAR =
"((「『〈《≪【〔―・※[〝"
- AUTO_INDENT_THRESHOLD_RATIO =
括弧等を除く全ての行のうちこの割合以上字下げされてなければ強制字下げする
0.5
Instance Attribute Summary collapse
-
#messages ⇒ Object
writeonly
Sets the attribute messages.
-
#subtitle ⇒ Object
writeonly
Sets the attribute subtitle.
Class Method Summary collapse
Instance Method Summary collapse
-
#countup_return_in_brackets(data) ⇒ Object
カギ括弧内の改行状況を調べる.
- #display(klass = ALL, target = $stdout) ⇒ Object
- #empty? ⇒ Boolean
- #error(message) ⇒ Object
- #error? ⇒ Boolean
- #info(message) ⇒ Object
- #info? ⇒ Boolean
-
#initialize(setting) ⇒ Inspector
constructor
A new instance of Inspector.
-
#inspect_end_touten_conditions(data) ⇒ Object
行末読点の状況を調べる.
-
#inspect_indent(data) ⇒ Object
行頭字下げをするべきか調べる.
-
#inspect_invalid_openclose_brackets(data, brackets, stack) ⇒ Object
かぎ括弧のとじ開きの異常部分を調査.
- #log(message) ⇒ Object
- #omit_message(strings) ⇒ Object
- #save(path = nil) ⇒ Object
-
#validate_joined_inner_brackets(raw_strings, joined_strings, brackets) ⇒ Object
連結したかぎ括弧が正常かどうか.
- #warning(message) ⇒ Object
- #warning? ⇒ Boolean
Constructor Details
#initialize(setting) ⇒ Inspector
Returns a new instance of Inspector.
36 37 38 39 40 41 42 43 |
# File 'lib/inspector.rb', line 36 def initialize(setting) @setting = setting @messages = [] @error = false @warning = false @info = false @subtitle = "" end |
Instance Attribute Details
#messages=(value) ⇒ Object (writeonly)
Sets the attribute messages
25 26 27 |
# File 'lib/inspector.rb', line 25 def (value) @messages = value end |
#subtitle=(value) ⇒ Object (writeonly)
Sets the attribute subtitle
25 26 27 |
# File 'lib/inspector.rb', line 25 def subtitle=(value) @subtitle = value end |
Class Method Details
.read_messages(setting) ⇒ Object
27 28 29 30 31 32 33 34 |
# File 'lib/inspector.rb', line 27 def self.(setting) inspect_log = File.join(setting.archive_path, INSPECT_LOG_NAME) if File.exists?(inspect_log) File.read(inspect_log) else nil end end |
Instance Method Details
#countup_return_in_brackets(data) ⇒ Object
カギ括弧内の改行状況を調べる
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/inspector.rb', line 167 def countup_return_in_brackets(data) return if @setting.enable_auto_join_in_brackets max = 0 brackets_num = 0 brackets_num_over_threshould = 0 total = 0 ConverterBase::OPENCLOSE_REGEXPS.each do |openclose| data.scan(openclose) do |match| cnt = match[0].count("\n") brackets_num += 1 total += cnt next if cnt < BRACKETS_RETURN_COUNT_THRESHOLD brackets_num_over_threshould += 1 if cnt > max max = cnt end end end info("カギ括弧内の改行状況:\n" + "検出したカギ括弧数: #{brackets_num}、そのうち#{BRACKETS_RETURN_COUNT_THRESHOLD}個以上改行を含む数: #{brackets_num_over_threshould}\n" + "1つのカギ括弧内で最大の改行数: #{max}、全カギ括弧内での改行合計: #{total}") end |
#display(klass = ALL, target = $stdout) ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/inspector.rb', line 61 def display(klass = ALL, target = $stdout) target.puts @messages.map { |msg| if msg =~ /^\[(.+)\]/ key = KLASS_TAG.key($1) if key && (klass & key) != 0 next msg end end nil }.compact.join("\n\n") end |
#empty? ⇒ Boolean
45 46 47 |
# File 'lib/inspector.rb', line 45 def empty? @messages.empty? end |
#error(message) ⇒ Object
95 96 97 98 |
# File 'lib/inspector.rb', line 95 def error() log("[#{KLASS_TAG[ERROR]}] #{}") @error = true end |
#error? ⇒ Boolean
49 50 51 |
# File 'lib/inspector.rb', line 49 def error? @error end |
#info(message) ⇒ Object
85 86 87 88 |
# File 'lib/inspector.rb', line 85 def info() log("[#{KLASS_TAG[INFO]}] #{}") @info = true end |
#info? ⇒ Boolean
57 58 59 |
# File 'lib/inspector.rb', line 57 def info? @info end |
#inspect_end_touten_conditions(data) ⇒ Object
行末読点の状況を調べる
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/inspector.rb', line 148 def inspect_end_touten_conditions(data) return if @setting.enable_auto_join_line num = 0 data.scan(/、\n /) do num += 1 end if num > 0 msg = "#{num}個の行末読点を発見しました。" if num >= END_TOUTEN_COUNT_THRESHOLD msg << "作者による手動改行により改行が多くなっています。" + \ "setting.ini の enable_auto_join_line を true にすることをお薦めします。" end info(msg) end end |
#inspect_indent(data) ⇒ Object
行頭字下げをするべきか調べる
193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/inspector.rb', line 193 def inspect_indent(data) target_line_count = 0 dont_indent_line_count = 0 data.scan(/^[^#{IGNORE_INDENT_CHAR}]/).tap { |a| target_line_count = a.count }.each { |line| head = line[0] unless head == " " || head == " " dont_indent_line_count += 1 end } ratio = dont_indent_line_count / target_line_count.to_f return ratio > AUTO_INDENT_THRESHOLD_RATIO end |
#inspect_invalid_openclose_brackets(data, brackets, stack) ⇒ Object
かぎ括弧のとじ開きの異常部分を調査
130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/inspector.rb', line 130 def inspect_invalid_openclose_brackets(data, brackets, stack) brackets.each do |bracket| buffer = data.dup while buffer =~ /#{bracket}/ match_before = $`.dup match_after = $'.dup before = ConverterBase.rebuild_brackets(match_before, stack) after = ConverterBase.rebuild_brackets(match_after, stack) error("かぎ括弧(#{bracket})が正しく閉じていません。\n" + ((before[-15..-1] || before) + bracket + after)) buffer = match_before end end end |
#log(message) ⇒ Object
81 82 83 |
# File 'lib/inspector.rb', line 81 def log() @messages << end |
#omit_message(strings) ⇒ Object
100 101 102 103 |
# File 'lib/inspector.rb', line 100 def (strings) = "in #{@subtitle}" if @subtitle.to_s.length > 0 "≫≫≫ 該当箇所 #{}\n..." + strings[0...36].gsub("\n", "\\n") + "..." end |
#save(path = nil) ⇒ Object
73 74 75 76 77 78 79 |
# File 'lib/inspector.rb', line 73 def save(path = nil) path = File.join(@setting.archive_path, INSPECT_LOG_NAME) if path.nil? open(path, "w") do |fp| fp.puts "--- ログ出力 #{Time.now} ---" display(ALL, fp) end end |
#validate_joined_inner_brackets(raw_strings, joined_strings, brackets) ⇒ Object
連結したかぎ括弧が正常かどうか
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/inspector.rb', line 108 def validate_joined_inner_brackets(raw_strings, joined_strings, brackets) error_result = false case # 連結前の文章の改行具合を調べて、改行が閾値を超えた場合意図的な改行とみなす when raw_strings.count("\n") >= BRACKETS_RETURN_COUNT_THRESHOLD warning("改行が規定の回数を超えて検出されました。" + "作者による意図的な改行とみなし、連結を中止しました。\n" + (raw_strings)) error_result = true # 連結した文章があまりにも長い場合、特殊な用途で使われている可能性がある when joined_strings.length >= LINE_LENGTH_THRESHOLD warning("連結結果が長過ぎます。連結を中止しました。" + "特殊な用途(手紙形式)等でかぎ括弧が使われている可能性があります。\n" + (raw_strings)) error_result = true end error_result end |
#warning(message) ⇒ Object
90 91 92 93 |
# File 'lib/inspector.rb', line 90 def warning() log("[#{KLASS_TAG[WARNING]}] #{}") @warning = true end |
#warning? ⇒ Boolean
53 54 55 |
# File 'lib/inspector.rb', line 53 def warning? @warning end |