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.
- checksums.yaml +5 -13
- data/.gitignore +1 -0
- data/ChangeLog.md +35 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +100 -0
- data/README.md +28 -39
- data/lib/color.rb +0 -2
- data/lib/command.rb +1 -0
- data/lib/command/convert.rb +33 -4
- data/lib/command/diff.rb +5 -4
- data/lib/command/download.rb +9 -1
- data/lib/command/flag.rb +2 -2
- data/lib/command/list.rb +1 -1
- data/lib/command/mail.rb +3 -3
- data/lib/command/remove.rb +2 -1
- data/lib/command/send.rb +7 -6
- data/lib/command/setting.rb +39 -95
- data/lib/command/tag.rb +25 -13
- data/lib/command/update.rb +6 -1
- data/lib/command/version.rb +5 -1
- data/lib/command/web.rb +111 -0
- data/lib/commandbase.rb +5 -2
- data/lib/commandline.rb +16 -0
- data/lib/converterbase.rb +20 -14
- data/lib/device.rb +5 -4
- data/lib/downloader.rb +68 -39
- data/lib/eventable.rb +72 -0
- data/lib/helper.rb +105 -37
- data/lib/ini.rb +2 -1
- data/lib/input.rb +68 -0
- data/lib/inventory.rb +4 -0
- data/lib/kindlestrip.rb +2 -2
- data/lib/logger.rb +41 -19
- data/lib/narou.rb +10 -0
- data/lib/narou/api.rb +1 -1
- data/lib/novelconverter.rb +8 -21
- data/lib/novelsetting.rb +79 -4
- data/lib/version.rb +1 -1
- data/lib/web/all.rb +12 -0
- data/lib/web/appserver.rb +612 -0
- data/lib/web/helper4web.rb +15 -0
- data/lib/web/progressbar4web.rb +32 -0
- data/lib/web/public/favicon.ico +0 -0
- data/lib/web/public/resources/bootbox.min.js +6 -0
- data/lib/web/public/resources/common.ui.js +143 -0
- data/lib/web/public/resources/dataTables.colVis.js +1113 -0
- data/lib/web/public/resources/help/rect_select.png +0 -0
- data/lib/web/public/resources/help/ssmain.png +0 -0
- data/lib/web/public/resources/help/tag.png +0 -0
- data/lib/web/public/resources/jquery.moveto.js +44 -0
- data/lib/web/public/resources/jquery.outerclick.js +60 -0
- data/lib/web/public/resources/jquery.slidenavbar.js +89 -0
- data/lib/web/public/resources/narou.library.js +815 -0
- data/lib/web/public/resources/narou.ui.js +993 -0
- data/lib/web/public/resources/perfect-scrollbar.min.css +5 -0
- data/lib/web/public/resources/perfect-scrollbar.min.js +4 -0
- data/lib/web/public/resources/shortcut.js +223 -0
- data/lib/web/public/resources/sort_asc.png +0 -0
- data/lib/web/public/resources/sort_desc.png +0 -0
- data/lib/web/public/resources/toggle-switch.css +322 -0
- data/lib/web/public/robots.txt +3 -0
- data/lib/web/public/test/jquery.outerclick.html +72 -0
- data/lib/web/pushserver.rb +110 -0
- data/lib/web/settingmessages.rb +14 -0
- data/lib/web/streaminginput.rb +103 -0
- data/lib/web/streaminglogger.rb +52 -0
- data/lib/web/views/about.haml +11 -0
- data/lib/web/views/help.haml +105 -0
- data/lib/web/views/index.haml +245 -0
- data/lib/web/views/js/widget.erb +74 -0
- data/lib/web/views/layout.haml +49 -0
- data/lib/web/views/novels/setting.haml +177 -0
- data/lib/web/views/settings.haml +115 -0
- data/lib/web/views/style.scss +737 -0
- data/lib/web/views/widget.haml +39 -0
- data/lib/web/web-socket-ruby/.gitignore +1 -0
- data/lib/web/web-socket-ruby/README.txt +75 -0
- data/lib/web/web-socket-ruby/lib/web_socket.rb +601 -0
- data/lib/web/web-socket-ruby/samples/chat_server.rb +58 -0
- data/lib/web/web-socket-ruby/samples/echo_server.rb +33 -0
- data/lib/web/web-socket-ruby/samples/stdio_client.rb +25 -0
- data/lib/web/worker.rb +87 -0
- data/narou.gemspec +36 -3
- data/narou.rb +8 -6
- data/preset/ncode.syosetu.com/n8725k/converter.rb +2 -1
- data/spec/data/convert_test/replace/correct_test_replace.txt +1 -1
- data/spec/data/convert_test/replace/test_replace.txt +1 -1
- data/spec/data/convert_test/ruby/correct_test_ruby.txt +18 -1
- data/spec/data/convert_test/ruby/test_ruby.txt +18 -0
- data/spec/downloader_spec.rb +37 -0
- data/spec/eventable_spec.rb +172 -0
- data/spec/exit_code_spec.rb +67 -0
- data/spec/helper_spec.rb +72 -0
- data/spec/input_spec.rb +76 -0
- data/spec/logger_spec.rb +53 -0
- data/spec/novelsetting_spec.rb +35 -0
- data/spec/worker_spec.rb +56 -0
- data/template/ibunko_novel.txt.erb +2 -2
- data/template/novel.txt.erb +2 -2
- 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
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
i
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
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
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
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
|
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
|
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
|
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
|
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
|
-
|
94
|
-
|
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
|
-
|
134
|
+
puts "<bold><red>[ERROR]</red></bold> ".termcolor + str
|
113
135
|
end
|
114
136
|
|
115
|
-
$stdout = Logger.
|
116
|
-
$stderr = LoggerError.
|
137
|
+
$stdout = Narou::Logger.new
|
138
|
+
$stderr = Narou::LoggerError.new
|