narou 1.7.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of narou might be problematic. Click here for more details.

Files changed (100) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +1 -0
  3. data/ChangeLog.md +35 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE.txt +100 -0
  6. data/README.md +28 -39
  7. data/lib/color.rb +0 -2
  8. data/lib/command.rb +1 -0
  9. data/lib/command/convert.rb +33 -4
  10. data/lib/command/diff.rb +5 -4
  11. data/lib/command/download.rb +9 -1
  12. data/lib/command/flag.rb +2 -2
  13. data/lib/command/list.rb +1 -1
  14. data/lib/command/mail.rb +3 -3
  15. data/lib/command/remove.rb +2 -1
  16. data/lib/command/send.rb +7 -6
  17. data/lib/command/setting.rb +39 -95
  18. data/lib/command/tag.rb +25 -13
  19. data/lib/command/update.rb +6 -1
  20. data/lib/command/version.rb +5 -1
  21. data/lib/command/web.rb +111 -0
  22. data/lib/commandbase.rb +5 -2
  23. data/lib/commandline.rb +16 -0
  24. data/lib/converterbase.rb +20 -14
  25. data/lib/device.rb +5 -4
  26. data/lib/downloader.rb +68 -39
  27. data/lib/eventable.rb +72 -0
  28. data/lib/helper.rb +105 -37
  29. data/lib/ini.rb +2 -1
  30. data/lib/input.rb +68 -0
  31. data/lib/inventory.rb +4 -0
  32. data/lib/kindlestrip.rb +2 -2
  33. data/lib/logger.rb +41 -19
  34. data/lib/narou.rb +10 -0
  35. data/lib/narou/api.rb +1 -1
  36. data/lib/novelconverter.rb +8 -21
  37. data/lib/novelsetting.rb +79 -4
  38. data/lib/version.rb +1 -1
  39. data/lib/web/all.rb +12 -0
  40. data/lib/web/appserver.rb +612 -0
  41. data/lib/web/helper4web.rb +15 -0
  42. data/lib/web/progressbar4web.rb +32 -0
  43. data/lib/web/public/favicon.ico +0 -0
  44. data/lib/web/public/resources/bootbox.min.js +6 -0
  45. data/lib/web/public/resources/common.ui.js +143 -0
  46. data/lib/web/public/resources/dataTables.colVis.js +1113 -0
  47. data/lib/web/public/resources/help/rect_select.png +0 -0
  48. data/lib/web/public/resources/help/ssmain.png +0 -0
  49. data/lib/web/public/resources/help/tag.png +0 -0
  50. data/lib/web/public/resources/jquery.moveto.js +44 -0
  51. data/lib/web/public/resources/jquery.outerclick.js +60 -0
  52. data/lib/web/public/resources/jquery.slidenavbar.js +89 -0
  53. data/lib/web/public/resources/narou.library.js +815 -0
  54. data/lib/web/public/resources/narou.ui.js +993 -0
  55. data/lib/web/public/resources/perfect-scrollbar.min.css +5 -0
  56. data/lib/web/public/resources/perfect-scrollbar.min.js +4 -0
  57. data/lib/web/public/resources/shortcut.js +223 -0
  58. data/lib/web/public/resources/sort_asc.png +0 -0
  59. data/lib/web/public/resources/sort_desc.png +0 -0
  60. data/lib/web/public/resources/toggle-switch.css +322 -0
  61. data/lib/web/public/robots.txt +3 -0
  62. data/lib/web/public/test/jquery.outerclick.html +72 -0
  63. data/lib/web/pushserver.rb +110 -0
  64. data/lib/web/settingmessages.rb +14 -0
  65. data/lib/web/streaminginput.rb +103 -0
  66. data/lib/web/streaminglogger.rb +52 -0
  67. data/lib/web/views/about.haml +11 -0
  68. data/lib/web/views/help.haml +105 -0
  69. data/lib/web/views/index.haml +245 -0
  70. data/lib/web/views/js/widget.erb +74 -0
  71. data/lib/web/views/layout.haml +49 -0
  72. data/lib/web/views/novels/setting.haml +177 -0
  73. data/lib/web/views/settings.haml +115 -0
  74. data/lib/web/views/style.scss +737 -0
  75. data/lib/web/views/widget.haml +39 -0
  76. data/lib/web/web-socket-ruby/.gitignore +1 -0
  77. data/lib/web/web-socket-ruby/README.txt +75 -0
  78. data/lib/web/web-socket-ruby/lib/web_socket.rb +601 -0
  79. data/lib/web/web-socket-ruby/samples/chat_server.rb +58 -0
  80. data/lib/web/web-socket-ruby/samples/echo_server.rb +33 -0
  81. data/lib/web/web-socket-ruby/samples/stdio_client.rb +25 -0
  82. data/lib/web/worker.rb +87 -0
  83. data/narou.gemspec +36 -3
  84. data/narou.rb +8 -6
  85. data/preset/ncode.syosetu.com/n8725k/converter.rb +2 -1
  86. data/spec/data/convert_test/replace/correct_test_replace.txt +1 -1
  87. data/spec/data/convert_test/replace/test_replace.txt +1 -1
  88. data/spec/data/convert_test/ruby/correct_test_ruby.txt +18 -1
  89. data/spec/data/convert_test/ruby/test_ruby.txt +18 -0
  90. data/spec/downloader_spec.rb +37 -0
  91. data/spec/eventable_spec.rb +172 -0
  92. data/spec/exit_code_spec.rb +67 -0
  93. data/spec/helper_spec.rb +72 -0
  94. data/spec/input_spec.rb +76 -0
  95. data/spec/logger_spec.rb +53 -0
  96. data/spec/novelsetting_spec.rb +35 -0
  97. data/spec/worker_spec.rb +56 -0
  98. data/template/ibunko_novel.txt.erb +2 -2
  99. data/template/novel.txt.erb +2 -2
  100. metadata +213 -29
data/lib/eventable.rb ADDED
@@ -0,0 +1,72 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright 2013 whiteleaf. All rights reserved.
4
+ #
5
+
6
+ module Narou::Eventable
7
+ EVENTS_CONTAINER = {}
8
+
9
+ def self.included(base)
10
+ super
11
+ base.extend(ClassMethods)
12
+ EVENTS_CONTAINER[base] = {}
13
+ end
14
+
15
+ class NonBlockError < StandardError; end
16
+
17
+ module ClassMethods
18
+ def add_event_listener(event_name, &block)
19
+ raise NonBlockError unless block_given?
20
+ stack = EVENTS_CONTAINER[self][event_name] ||= []
21
+ stack.push(block)
22
+ end
23
+
24
+ def trigger_event(event_name, *argv)
25
+ stack = EVENTS_CONTAINER[self][event_name]
26
+ return unless stack
27
+ stack.each do |block|
28
+ block.call(*argv)
29
+ end
30
+ end
31
+ end
32
+
33
+ def add_event_listener(event_name, once = false, &block)
34
+ raise NonBlockError unless block_given?
35
+ @__events_container ||= {}
36
+ stack = @__events_container[event_name] ||= []
37
+ stack.push([block, once])
38
+ end
39
+
40
+ def remove_event_listener(event_name, &block)
41
+ @__events_container ||= {}
42
+ if block_given?
43
+ events = @__events_container[event_name]
44
+ if events
45
+ events.reject! do |values|
46
+ values[0] == block
47
+ end
48
+ end
49
+ else
50
+ @__events_container.delete(event_name)
51
+ end
52
+ end
53
+
54
+ def trigger_event(event_name, *argv)
55
+ @__events_container ||= {}
56
+ stack = @__events_container[event_name]
57
+ return unless stack
58
+ stack.reject! do |block, once|
59
+ block.call(*argv)
60
+ once
61
+ end
62
+ end
63
+
64
+ alias :on :add_event_listener
65
+ alias :off :remove_event_listener
66
+ alias :trigger :trigger_event
67
+
68
+ def one(event_name, &block)
69
+ add_event_listener(event_name, true, &block)
70
+ end
71
+ end
72
+
data/lib/helper.rb CHANGED
@@ -51,30 +51,6 @@ module Helper
51
51
  require "io/console"
52
52
  end
53
53
 
54
- #
55
- # キーボード入力による確認をする
56
- #
57
- # :default: エンターを押した場合に返ってくる値
58
- # :nontty_default: pipe等から接続された場合に返ってくる値
59
- #
60
- def confirm(message, default = false, nontty_default = true)
61
- return nontty_default unless STDIN.tty?
62
- confirm_msg = "#{message} (y/n)?: "
63
- STDOUT.print confirm_msg # Logger でロギングされないように直接標準出力に表示
64
- while input = $stdin.getch
65
- STDOUT.puts input
66
- case input.downcase
67
- when "y"
68
- return true
69
- when "n"
70
- return false
71
- else
72
- return default if input.strip == ""
73
- STDOUT.print confirm_msg
74
- end
75
- end
76
- end
77
-
78
54
  def open_browser_linux(address, error_message)
79
55
  %w(xdg-open firefox w3m).each do |browser|
80
56
  system(%!#{browser} "#{address}"!)
@@ -85,7 +61,7 @@ module Helper
85
61
 
86
62
  def open_directory(path, confirm_message = nil)
87
63
  if confirm_message
88
- return unless confirm(confirm_message, false, false)
64
+ return unless Narou::Input.confirm(confirm_message, false, false)
89
65
  end
90
66
  case determine_os
91
67
  when :windows
@@ -173,6 +149,95 @@ module Helper
173
149
  [extracted_str, illust_chuki_array]
174
150
  end
175
151
 
152
+ class InvalidVariableType < StandardError
153
+ def initialize(type)
154
+ super("値が #{Helper.variable_type_to_description(type).rstrip} ではありません")
155
+ end
156
+ end
157
+
158
+ class UnknownVariableType < StandardError
159
+ def initialize(type)
160
+ super("unknwon variable type (:#{type})")
161
+ end
162
+ end
163
+
164
+ class InvalidVariableName < StandardError; end
165
+
166
+ #
167
+ # 与えられた型情報の意味文字列を取得
168
+ #
169
+ def variable_type_to_description(type)
170
+ case type
171
+ when :boolean
172
+ "true/false "
173
+ when :integer
174
+ "整数 "
175
+ when :float
176
+ "小数点数 "
177
+ when :string
178
+ "文字列 "
179
+ when :directory
180
+ "フォルダパス"
181
+ when :file
182
+ "ファイルパス"
183
+ else
184
+ raise UnknownVariableType, type
185
+ end
186
+ end
187
+
188
+ #
189
+ # 文字列データを指定された型にキャストする
190
+ #
191
+ def string_cast_to_type(value, type)
192
+ result = nil
193
+ case type
194
+ when :boolean
195
+ case value.strip.downcase
196
+ when "true"
197
+ result = true
198
+ when "false"
199
+ result = false
200
+ else
201
+ raise InvalidVariableType, type
202
+ end
203
+ when :integer
204
+ begin
205
+ result = Integer(value)
206
+ rescue
207
+ raise InvalidVariableType, type
208
+ end
209
+ when :float
210
+ begin
211
+ result = Float(value)
212
+ rescue
213
+ raise InvalidVariableType, type
214
+ end
215
+ when :directory, :file
216
+ if File.method("#{type}?").call(value)
217
+ result = File.expand_path(value)
218
+ else
219
+ raise InvalidVariableType, type
220
+ end
221
+ when :string
222
+ result = value
223
+ else
224
+ raise UnknownVariableType, type
225
+ end
226
+ result
227
+ end
228
+
229
+ TYPE_OF_VALUE = {
230
+ TrueClass => :boolean, FalseClass => :boolean, Fixnum => :integer,
231
+ Float => :float, String => :string
232
+ }
233
+
234
+ #
235
+ # Rubyの変数がなんの型かシンボルで取得
236
+ #
237
+ def type_of_value(value)
238
+ TYPE_OF_VALUE[value.class]
239
+ end
240
+
176
241
  #
177
242
  # 外部コマンド実行中の待機ループの処理を書けるクラス
178
243
  #
@@ -191,19 +256,22 @@ module Helper
191
256
  sleep(sleep_time)
192
257
  end
193
258
  }.tap { |th|
194
- if Helper.engine_jruby?
195
- # MEMO:
196
- # Open3.capture3 - 全く動かない
197
- # `` バッククウォート - 出力が文字化けする
198
- res = Open3.popen3(command) { |i, o, e|
199
- i.close
200
- `cd` # create dummy Process::Status object to $?
201
- [o.read, e.read, $?]
202
- }
203
- else
204
- res = Open3.capture3(command)
259
+ begin
260
+ if Helper.engine_jruby?
261
+ # MEMO:
262
+ # Open3.capture3 - 全く動かない
263
+ # `` バッククウォート - 出力が文字化けする
264
+ res = Open3.popen3(command) { |i, o, e|
265
+ i.close
266
+ `cd` # create dummy Process::Status object to $?
267
+ [o.read, e.read, $?]
268
+ }
269
+ else
270
+ res = Open3.capture3(command)
271
+ end
272
+ ensure
273
+ th.kill
205
274
  end
206
- th.kill
207
275
  return res
208
276
  }
209
277
  end
data/lib/ini.rb CHANGED
@@ -106,7 +106,8 @@ class Ini
106
106
  fp.puts("[#{section}]")
107
107
  end
108
108
  values.each do |key, value|
109
- fp.puts(key + DELIMITER + value)
109
+ value = "\"#{value}\"" if value.kind_of?(String)
110
+ fp.puts("#{key} #{DELIMITER} #{value}")
110
111
  end
111
112
  end
112
113
  end
data/lib/input.rb ADDED
@@ -0,0 +1,68 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright 2013 whiteleaf. All rights reserved.
4
+ #
5
+
6
+ require "termcolorlight"
7
+
8
+ module Narou
9
+ module Input
10
+ module_function
11
+
12
+ #
13
+ # 肯定か否定かの確認を入力
14
+ #
15
+ # default: エンターを押した場合に返ってくる値
16
+ # nontty_default: pipe等から接続された場合に返ってくる値
17
+ # @return: yes = true, no = false
18
+ #
19
+ def confirm(message, default = false, nontty_default = true)
20
+ return nontty_default unless $stdin.tty?
21
+ confirm_msg = "#{message} (y/n)?: "
22
+ print confirm_msg
23
+ while input = $stdin.getch
24
+ puts input
25
+ case input.downcase
26
+ when "y"
27
+ return true
28
+ when "n"
29
+ return false
30
+ else
31
+ return default if input.strip == ""
32
+ print confirm_msg
33
+ end
34
+ end
35
+ end
36
+
37
+ #
38
+ # 選択肢を表示して選択させる
39
+ #
40
+ # choices: { 選択肢: 説明 } のハッシュ形式で渡す。選択出来ない状況(pipe等)の場合に返す
41
+ # 値は :default の要素を返す。:default がない場合は先頭の要素
42
+ # @return: 選ばれた選択肢を返す
43
+ #
44
+ # @example:
45
+ # choices = { "ja" => "日本語", "en" => "English", default: "ja" }
46
+ # Narou::Input.choose("select a language?", choices)
47
+ #
48
+ def choose(title, message, choices)
49
+ default = choices[:default] || choices.first[0]
50
+ return default unless $stdin.tty?
51
+ puts title
52
+ puts message
53
+ choices.each do |name, help|
54
+ next if name == :default
55
+ puts "<bold>#{name}</bold>: #{help}".termcolor
56
+ end
57
+ loop do
58
+ print "> "
59
+ input = $stdin.gets.strip.downcase
60
+ if key = choices.keys.delete(input)
61
+ return key
62
+ end
63
+ puts "選択肢の中にありません。もう一度入力して下さい"
64
+ end
65
+ end
66
+ end
67
+ end
68
+
data/lib/inventory.rb CHANGED
@@ -22,6 +22,10 @@ module Inventory
22
22
  }
23
23
  end
24
24
 
25
+ def self.clear
26
+ @@cache = {}
27
+ end
28
+
25
29
  def init(name, scope)
26
30
  dir = case scope
27
31
  when :local
data/lib/kindlestrip.rb CHANGED
@@ -231,7 +231,7 @@ if __FILE__ == $0
231
231
  puts "Usage:"
232
232
  puts " %s <infile> <outfile> <strippeddatafile>" % File.basename(__FILE__)
233
233
  puts "<strippeddatafile> is optional."
234
- exit 1
234
+ exit Narou::EXIT_ERROR_CODE
235
235
  else
236
236
  infile = ARGV[0]
237
237
  outfile = ARGV[1]
@@ -243,7 +243,7 @@ if __FILE__ == $0
243
243
  end
244
244
  rescue StripException => e
245
245
  warn "Error: #{e.message}"
246
- exit 1
246
+ exit Narou::EXIT_ERROR_CODE
247
247
  end
248
248
  end
249
249
  end
data/lib/logger.rb CHANGED
@@ -3,8 +3,8 @@
3
3
  # Copyright 2013 whiteleaf. All rights reserved.
4
4
  #
5
5
 
6
- require "singleton"
7
6
  require "stringio"
7
+ require "termcolorlight"
8
8
  require_relative "color"
9
9
 
10
10
  if $disable_color
@@ -15,7 +15,9 @@ if $disable_color
15
15
  end
16
16
  end
17
17
 
18
- module LoggerModule
18
+ module Narou end unless defined?(Narou)
19
+
20
+ module Narou::LoggerModule
19
21
  def initialize
20
22
  super
21
23
  @is_silent = false
@@ -49,6 +51,24 @@ module LoggerModule
49
51
  self.silent = tmp
50
52
  end
51
53
 
54
+ #
55
+ # 標準出力($stdout)のバッファリング+取得
56
+ #
57
+ # キャプチャー用途なので標準エラーはキャプチャーしない
58
+ # ansicolor_strip :: エスケープシーケンスを除去するか
59
+ #
60
+ def capture(ansicolor_strip = true, &block)
61
+ raise "#capture block given" unless block
62
+ temp_stream = $stdout
63
+ $stdout = self.class.new
64
+ $stdout.silence do
65
+ block.call
66
+ end
67
+ buffer = $stdout.string
68
+ $stdout = temp_stream
69
+ ansicolor_strip ? strip_color(buffer) : buffer
70
+ end
71
+
52
72
  def strip_color(str)
53
73
  if $disable_color
54
74
  str
@@ -72,14 +92,9 @@ module LoggerModule
72
92
  end
73
93
  end
74
94
 
75
- class Logger < StringIO
76
- include Singleton
77
- include LoggerModule
95
+ class Narou::Logger < StringIO
96
+ include Narou::LoggerModule
78
97
 
79
- def self.get
80
- instance
81
- end
82
-
83
98
  def write(str)
84
99
  str = str.to_s
85
100
  if str.encoding == Encoding::ASCII_8BIT
@@ -88,15 +103,14 @@ class Logger < StringIO
88
103
  super(str)
89
104
  write_console(str, STDOUT)
90
105
  end
91
- end
92
106
 
93
- class LoggerError < StringIO
94
- include Singleton
95
- include LoggerModule
96
-
97
- def self.get
98
- instance
107
+ def tty?
108
+ STDOUT.tty?
99
109
  end
110
+ end
111
+
112
+ class Narou::LoggerError < StringIO
113
+ include Narou::LoggerModule
100
114
 
101
115
  def write(str)
102
116
  str = str.to_s
@@ -106,11 +120,19 @@ class LoggerError < StringIO
106
120
  super(str)
107
121
  write_console(str, STDERR)
108
122
  end
123
+
124
+ def tty?
125
+ STDERR.tty?
126
+ end
127
+ end
128
+
129
+ def warn(str)
130
+ puts str
109
131
  end
110
132
 
111
133
  def error(str)
112
- warn "<bold><red>[ERROR]</red></bold> #{str.escape}".termcolor
134
+ puts "<bold><red>[ERROR]</red></bold> ".termcolor + str
113
135
  end
114
136
 
115
- $stdout = Logger.get
116
- $stderr = LoggerError.get
137
+ $stdout = Narou::Logger.new
138
+ $stderr = Narou::LoggerError.new