narou 2.4.2 → 2.5.1

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/ChangeLog.md +56 -0
  4. data/README.md +56 -29
  5. data/lib/command/convert.rb +39 -7
  6. data/lib/command/diff.rb +42 -11
  7. data/lib/command/inspect.rb +1 -1
  8. data/lib/command/setting.rb +150 -45
  9. data/lib/command/tag.rb +8 -8
  10. data/lib/command/update.rb +57 -1
  11. data/lib/commandbase.rb +3 -0
  12. data/lib/converterbase.rb +17 -9
  13. data/lib/database.rb +4 -0
  14. data/lib/device/epub.rb +1 -1
  15. data/lib/device/ibooks.rb +1 -1
  16. data/lib/device/ibunko.rb +13 -6
  17. data/lib/device/kindle.rb +1 -1
  18. data/lib/device/kobo.rb +1 -1
  19. data/lib/device/reader.rb +1 -1
  20. data/lib/downloader.rb +10 -5
  21. data/lib/helper.rb +114 -3
  22. data/lib/ini.rb +3 -1
  23. data/lib/inventory.rb +3 -1
  24. data/lib/loadconverter.rb +1 -11
  25. data/lib/mailer.rb +1 -0
  26. data/lib/narou.rb +56 -5
  27. data/lib/novelconverter.rb +7 -5
  28. data/lib/novelsetting.rb +116 -63
  29. data/lib/template.rb +4 -4
  30. data/lib/version.rb +1 -1
  31. data/lib/web/appserver.rb +40 -9
  32. data/lib/web/public/resources/narou.library.js +35 -3
  33. data/lib/web/public/resources/narou.ui.js +16 -1
  34. data/lib/web/pushserver.rb +1 -0
  35. data/lib/web/settingmessages.rb +6 -3
  36. data/lib/web/views/diff_list.haml +11 -0
  37. data/lib/web/views/edit_replace_txt.haml +59 -0
  38. data/lib/web/views/help.haml +2 -2
  39. data/lib/web/views/index.haml +6 -4
  40. data/lib/web/views/layout.haml +11 -2
  41. data/lib/web/views/novels/setting.haml +51 -66
  42. data/lib/web/views/settings.haml +52 -15
  43. data/lib/web/views/style.scss +44 -2
  44. data/lib/web/views/widget.haml +6 -8
  45. data/narou.gemspec +45 -6
  46. data/spec/convert_spec.rb +1 -1
  47. data/spec/converterbase_spec.rb +25 -1
  48. data/spec/generator/convert_spec_gen.rb +1 -1
  49. data/spec/helper_spec.rb +8 -0
  50. data/spec/novelsetting_spec.rb +1 -1
  51. data/template/novel.txt.erb +1 -1
  52. data/template/setting.ini.erb +15 -3
  53. metadata +49 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c91bfba58151c94f6edb7d839ca9ccf428e349d
4
- data.tar.gz: f6c3f79bec382c7f9b7e1b1d6e9a72f4e10f045a
3
+ metadata.gz: a651bfba9ad9201bcc4ece2ebd19151387ebff02
4
+ data.tar.gz: fb010f28c7e2004fdb172362fed8dce5324f55c0
5
5
  SHA512:
6
- metadata.gz: 27708fb0d5083ea2d2521c54b06d82984a4f218cb56b45b4ee6711e4fc85b11d80592a6c2ccc5a9738ce06b6c5ecbfdb4a79bde2d38e08086b32f93e2fc7e750
7
- data.tar.gz: 4f0f637784fd7b702bb7d4cb13c7c4bf413016233407a41a838913c6f4d73a39e1f7241966a034a8b5ee9ba3a330a08b02ae49b6548cee2bdfae75d1852cb583
6
+ metadata.gz: 7ba0050ce866782f3c76d2e9dbf6aa3e6145abc2ad09175d899815e15b9be5f115582ca9a09e5762161e1492b9903d2253e4ef45cfcb062bac301b9252bff71f
7
+ data.tar.gz: 55a7ef3d3ed87d31057365eb64f91497ecc6578996fb09abce7796eb5c25d3945e5c162b5f7294e9fcad5cf0621e54c6f1816a9aa0d9fab17052ebd5598e8c22
data/.gitignore CHANGED
@@ -24,6 +24,7 @@ trash/
24
24
  .sass-cache/
25
25
  log/
26
26
  misc/
27
+ replace.txt
27
28
 
28
29
  \#*\#
29
30
 
@@ -2,6 +2,62 @@
2
2
  更新履歴 - ChangeLog
3
3
  ====================
4
4
 
5
+ 2.5.1 : 2015/07/10
6
+ ------------------
7
+ #### Bug Fix
8
+ - WEB UI において個別変換設定ページに移動するとエラーがでる問題を修正
9
+ - `inspect` コマンドを使用するとエラーがでる問題を修正
10
+
11
+
12
+ 2.5.0 : 2015/07/10
13
+ ------------------
14
+ #### 追加機能
15
+ - WEB UI の個別メニューから「差分を表示」を選択した際に、過去の差分を選択出来る
16
+ ようにしました
17
+ - WEB UI の個別メニューに「タグを編集」を追加しました
18
+ - 変換設定の各項目の共通設定を変更できる default.* 系設定を追加しました
19
+ + この共通設定は setting.ini で未設定の項目がある場合に適用されます。また、
20
+ force.* が設定されていた場合は setting.ini、共通設定ともに無視されます
21
+ + 例えば `enable_illust` の共通設定を変更したい場合、
22
+ `narou s default.enable_illust=false` とすることで変更出来ます
23
+ (WEB UIからは環境設定のページで隠しオプションを表示)
24
+ - `convert` コマンドに `--ignore-default` オプションを追加しました。変換時の
25
+ default.* 系設定を無視します
26
+ - `convert.copy-to-grouping` オプションを追加しました
27
+ + copy-to で指定したフォルダの中に更に device もしくは convert.multi-device
28
+ で指定した端末毎に振り分けるように出来ます
29
+ + 有効にするには `narou s convert.copy-to-grouping=true` を実行して下さい
30
+ - 全小説を対象にした replace.txt による置換に対応しました
31
+ + narou init を使用したフォルダに replace.txt を設置すると認識します。
32
+ WEB UI においては環境設定にて設定できます
33
+ - `update` コマンドにアップデートの順番を変更する `--sort-by` オプションが追加
34
+ されました(短縮 `-s`)
35
+ + `narou u --sort-by general_update` のように直接コマンドのオプションとして
36
+ 指定するか、 `narou s update.sort-by=general_update` と設定として保存して
37
+ 下さい
38
+ + 指定出来るのは id, last_update(更新日), title(タイトル), author(作者名),
39
+ new_arrivals_date(新着日), general_lastup(最新話掲載日) です
40
+ - WEB UI の設定画面において一部項目をセレクトボックスで選択出来るようにしました
41
+
42
+ #### 仕様変更
43
+ - default.* 系設定追加に伴い、新規DL時の setting.ini の全ての項目がコメント
44
+ アウトされた状態で生成されます。また、WEB UI の個別変換設定画面にて、各項目に
45
+ 「未設定」が追加されます
46
+ - `setting` コマンド(WEB UIにおける環境設定)の項目の順序・表示を変更しました
47
+ - `setting` コマンドの一部項目で適切な値が入力されなかった場合にエラーが出る
48
+ ようになりました
49
+ - WEB UI の個別メニュー内項目の並び順を変更しました
50
+ - WEB UI サーバ起動中にコマンドラインで更新した場合でもサーバを再起動せずに変更
51
+ が反映されるようになりました
52
+
53
+ #### Bug Fix
54
+ - `enable_insert_word_separator` を有効時に `[` が正常に禁則処理されない問題を
55
+ 修正
56
+ - i文庫形式に変換する際に `enable_illust` の設定が無視されていたのを修正
57
+ - WEB UI サーバ起動中に converter.rb を編集しても反映されなかったのを修正
58
+ - 文章中のリンクが正しく飛べない場合があったのを修正
59
+
60
+
5
61
  2.4.2 : 2015/06/07
6
62
  ------------------
7
63
  #### Bug Fix
data/README.md CHANGED
@@ -27,6 +27,62 @@ Narou.rb ― 「小説家になろう」「小説を読もう!」ダウンロ
27
27
  --------------------
28
28
 
29
29
 
30
+ 2.5.1 : 2015/07/10
31
+ ------------------
32
+ #### Bug Fix
33
+ - WEB UI において個別変換設定ページに移動するとエラーがでる問題を修正
34
+ - `inspect` コマンドを使用するとエラーがでる問題を修正
35
+
36
+
37
+ 2.5.0 : 2015/07/10
38
+ ------------------
39
+ #### 追加機能
40
+ - WEB UI の個別メニューから「差分を表示」を選択した際に、過去の差分を選択出来る
41
+ ようにしました
42
+ - WEB UI の個別メニューに「タグを編集」を追加しました
43
+ - 変換設定の各項目の共通設定を変更できる default.* 系設定を追加しました
44
+ + この共通設定は setting.ini で未設定の項目がある場合に適用されます。また、
45
+ force.* が設定されていた場合は setting.ini、共通設定ともに無視されます
46
+ + 例えば `enable_illust` の共通設定を変更したい場合、
47
+ `narou s default.enable_illust=false` とすることで変更出来ます
48
+ (WEB UIからは環境設定のページで隠しオプションを表示)
49
+ - `convert` コマンドに `--ignore-default` オプションを追加しました。変換時の
50
+ default.* 系設定を無視します
51
+ - `convert.copy-to-grouping` オプションを追加しました
52
+ + copy-to で指定したフォルダの中に更に device もしくは convert.multi-device
53
+ で指定した端末毎に振り分けるように出来ます
54
+ + 有効にするには `narou s convert.copy-to-grouping=true` を実行して下さい
55
+ - 全小説を対象にした replace.txt による置換に対応しました
56
+ + narou init を使用したフォルダに replace.txt を設置すると認識します。
57
+ WEB UI においては環境設定にて設定できます
58
+ - `update` コマンドにアップデートの順番を変更する `--sort-by` オプションが追加
59
+ されました(短縮 `-s`)
60
+ + `narou u --sort-by general_update` のように直接コマンドのオプションとして
61
+ 指定するか、 `narou s update.sort-by=general_update` と設定として保存して
62
+ 下さい
63
+ + 指定出来るのは id, last_update(更新日), title(タイトル), author(作者名),
64
+ new_arrivals_date(新着日), general_lastup(最新話掲載日) です
65
+ - WEB UI の設定画面において一部項目をセレクトボックスで選択出来るようにしました
66
+
67
+ #### 仕様変更
68
+ - default.* 系設定追加に伴い、新規DL時の setting.ini の全ての項目がコメント
69
+ アウトされた状態で生成されます。また、WEB UI の個別変換設定画面にて、各項目に
70
+ 「未設定」が追加されます
71
+ - `setting` コマンド(WEB UIにおける環境設定)の項目の順序・表示を変更しました
72
+ - `setting` コマンドの一部項目で適切な値が入力されなかった場合にエラーが出る
73
+ ようになりました
74
+ - WEB UI の個別メニュー内項目の並び順を変更しました
75
+ - WEB UI サーバ起動中にコマンドラインで更新した場合でもサーバを再起動せずに変更
76
+ が反映されるようになりました
77
+
78
+ #### Bug Fix
79
+ - `enable_insert_word_separator` を有効時に `[` が正常に禁則処理されない問題を
80
+ 修正
81
+ - i文庫形式に変換する際に `enable_illust` の設定が無視されていたのを修正
82
+ - WEB UI サーバ起動中に converter.rb を編集しても反映されなかったのを修正
83
+ - 文章中のリンクが正しく飛べない場合があったのを修正
84
+
85
+
30
86
  2.4.2 : 2015/06/07
31
87
  ------------------
32
88
  #### Bug Fix
@@ -57,35 +113,6 @@ Narou.rb ― 「小説家になろう」「小説を読もう!」ダウンロ
57
113
  - 連続したミュートが正しく変換できていなかったのを修正
58
114
 
59
115
 
60
- 2.4.0 : 2015/05/16
61
- ------------------
62
- #### 追加機能
63
- - WEB UI に保存フォルダを開くためのボタンを表示する項目「保存先」を追加しました
64
- - WEB UI に項目「最新話掲載日」を追加しました
65
- + 「小説家になろう」と「ハーメルン」のみ対応しています(updateした小説から
66
- 反映されていきます)。更新が無いと反映されないため、手動で反映させたい場合
67
- はWEB UI サーバを落とした状態で `narou u --gl` コマンドを使用して下さい。
68
- (基本的に一度実行するだけで十分です)
69
-
70
- #### 仕様変更
71
- - 小説リストの「新着」及び「更新」の表示基準を調整しました
72
- - replace.txt による置換を行うタイミングを変更しました
73
- + 今までは (before→本体処理→after)*話数分→置換 という処理順だったものが、
74
- (before→本体処理→after→置換)*話数分 という処理順になりました
75
-
76
- #### Bug Fix
77
- - `enable_insert_word_separator` を有効にした場合に発生する以下の不具合を修正
78
- + 開きカッコの禁則処理が Kindle で処理されなくなる
79
- + replace.txt による置換が正常に行われない場合がある
80
- + URLが含まれている文章の単語分割が正常に行われない
81
- - あらすじだけ更新された場合にデータベースが更新されていなかった不具合を修正
82
- - 小説サイトのサーバーがダウンしている時にエラーがでる問題を修正
83
- - WEB UI の小説リストにおいて、更新・新着の表示期間が過ぎているにも関わらず、
84
- アップデート等をした際に消えない不具合を修正
85
- - ハーメルンで非公開になっている小説をアップデートするとエラーになる不具合
86
- を修正
87
-
88
-
89
116
 
90
117
  ----
91
118
 
@@ -90,6 +90,9 @@ module Command
90
90
  @opt.on("-v", "--verbose", "AozoraEpub3, kindlegen の標準出力を全て表示する") {
91
91
  @options["verbose"] = true
92
92
  }
93
+ @opt.on("--ignore-default", "settingコマンドのdefault系設定を無視する") {
94
+ @options["ignore-default"] = true
95
+ }
93
96
  @opt.on("--ignore-force", "settingコマンドのforce系設定を無視する") {
94
97
  @options["ignore-force"] = true
95
98
  }
@@ -172,6 +175,9 @@ module Command
172
175
  def convert_novels(argv)
173
176
  tagname_to_ids(argv)
174
177
  argv.each.with_index(1) do |target, i|
178
+ @target = target
179
+ @novel_data = nil
180
+
175
181
  Helper.print_horizontal_rule if i > 1
176
182
  if @basename
177
183
  @basename << " (#{i})" if argv.length > 1
@@ -191,6 +197,7 @@ module Command
191
197
  output_filename: @output_filename,
192
198
  display_inspector: @options["inspect"],
193
199
  ignore_force: @options["ignore-force"],
200
+ ignore_default: @options["ignore-default"],
194
201
  })
195
202
  @novel_data = Downloader.get_data_by_target(target)
196
203
  end
@@ -247,6 +254,7 @@ module Command
247
254
  output_filename: @output_filename,
248
255
  display_inspector: @options["inspect"],
249
256
  ignore_force: @options["ignore-force"],
257
+ ignore_default: @options["ignore-default"],
250
258
  })
251
259
  rescue ArgumentError => e
252
260
  if e.message =~ /invalid byte sequence in UTF-8/
@@ -305,21 +313,45 @@ module Command
305
313
  return mobi_path
306
314
  end
307
315
 
316
+ class NoSuchDirectory < StandardError; end
317
+
308
318
  #
309
319
  # convert.copy-to で指定されたディレクトリに書籍データをコピーする
310
320
  #
311
321
  def copy_to_converted_file(src_path)
322
+ copy_to_dir = get_copy_to_directory
323
+ return nil unless copy_to_dir
324
+ FileUtils.copy(src_path, copy_to_dir)
325
+ return File.join(copy_to_dir, File.basename(src_path))
326
+ rescue NoSuchDirectory => e
327
+ error "#{e.message} はフォルダではないかすでに削除されています。コピー出来ませんでした"
328
+ nil
329
+ end
330
+
331
+ #
332
+ # 書籍ファイルのコピー先を取得
333
+ #
334
+ # copy-to が設定されていなければ nil を返す。
335
+ # 存在しないディレクトリだった場合は例外を投げる
336
+ #
337
+ def get_copy_to_directory
312
338
  # 2.1.0 から convert.copy_to から convert.copy-to へ名称が変更された
313
- # (互換性維持のための処理)
339
+ # (互換性維持のため、copy_to も使えるようにはしておく)
314
340
  copy_to_dir = @options["copy-to"] || @options["copy_to"]
315
341
  return nil unless copy_to_dir
316
- if File.directory?(copy_to_dir)
317
- FileUtils.copy(src_path, copy_to_dir)
318
- return File.join(copy_to_dir, File.basename(src_path))
319
- else
320
- error "#{copy_to_dir} はフォルダではないかすでに削除されています。コピー出来ませんでした"
321
- return nil
342
+ unless File.directory?(copy_to_dir)
343
+ raise NoSuchDirectory, copy_to_dir
344
+ end
345
+ # deviceごとにフォルダ振り分けの処理
346
+ if !@options["copy-to-grouping"] || !@device
347
+ return copy_to_dir
348
+ end
349
+ copy_to_dir_with_device = File.join(copy_to_dir, @device.display_name)
350
+ unless File.directory?(copy_to_dir_with_device)
351
+ FileUtils.mkdir(copy_to_dir_with_device)
322
352
  end
353
+ copy_to_dir_with_device
323
354
  end
355
+ private :get_copy_to_directory
324
356
  end
325
357
  end
@@ -125,6 +125,11 @@ module Command
125
125
  str !~ /^\d{4}\.\d{2}\.\d{2}@\d{2}[;.]\d{2}[;.]\d{2}$/
126
126
  end
127
127
 
128
+ def version_string_to_time(string)
129
+ ymd, hms = string.split("@")
130
+ Helper.date_string_to_time("#{ymd} #{hms.tr(".", ":")}")
131
+ end
132
+
128
133
  def clean_diff(id)
129
134
  cache_root_dir = Downloader.get_cache_root_dir(id)
130
135
  print Database.instance.get_data("id", id)["title"] + " の"
@@ -227,29 +232,55 @@ module Command
227
232
  end
228
233
  end
229
234
  temp = Tempfile.open([temp_prefix, ".txt"])
230
- temp.write(Template.get("diff.txt", binding))
235
+ temp.write(Template.get("diff.txt", binding, 1.0))
231
236
  temp.close
232
237
  temp
233
238
  end
234
239
 
235
- def display_diff_list(id)
240
+ def get_diff_list(id)
241
+ list = {
242
+ id: id,
243
+ title: Database.instance.get_data("id", id)["title"],
244
+ list: []
245
+ }
236
246
  cache_list = get_sorted_cache_list(id)
237
- print Database.instance.get_data("id", id)["title"] + " の"
238
- if cache_list.empty?
239
- puts "差分はひとつもありません"
240
- return
241
- end
242
- puts "差分一覧"
247
+ return list if cache_list.empty?
243
248
  cache_list.each.with_index(1) do |cache_path, i|
244
- puts "<bold><yellow>#{File.basename(cache_path)} -#{i}</yellow></bold>".termcolor
249
+ objects = []
250
+ version_string = File.basename(cache_path)
251
+ data = {
252
+ number: i,
253
+ version_string: version_string,
254
+ time: version_string_to_time(version_string),
255
+ objects: objects
256
+ }
257
+ list[:list].push(data)
245
258
  cache_section_list = Dir.glob(File.join(cache_path, "*.yaml"))
246
259
  if cache_section_list.length > 0
247
260
  cache_section_list.map { |section_path|
248
261
  File.basename(section_path, ".yaml").split(" ", 2)
249
262
  }.sort_by { |v| v[0].to_i }.each { |index, subtitle|
250
- puts " 第#{index}部分 #{subtitle}"
263
+ objects.push({ index: index, subtitle: subtitle })
251
264
  }
252
- else
265
+ end
266
+ end
267
+ list
268
+ end
269
+
270
+ def display_diff_list(id)
271
+ list = get_diff_list(id)
272
+ print "#{list[:title]} の"
273
+ if list[:list].empty?
274
+ puts "差分はひとつもありません"
275
+ return
276
+ end
277
+ puts "差分一覧"
278
+ list[:list].each do |data|
279
+ puts "<bold><yellow>#{data[:version_string]} -#{data[:number]}</yellow></bold>".termcolor
280
+ data[:objects].each do |object|
281
+ puts " 第#{object[:index]}部分 #{object[:subtitle]}"
282
+ end
283
+ if data[:objects].empty?
253
284
  puts " (最新話のみのアップデート)"
254
285
  end
255
286
  end
@@ -53,7 +53,7 @@ module Command
53
53
 
54
54
  def display_log(title)
55
55
  puts "(#{title} の小説状態調査状況ログ)"
56
- novel_setting = NovelSetting.load(title, false)
56
+ novel_setting = NovelSetting.load(title, false, false)
57
57
  puts Inspector.read_messages(novel_setting) || "調査ログがまだ無いようです"
58
58
  end
59
59
  end
@@ -11,6 +11,8 @@ module Command
11
11
  class Setting < CommandBase
12
12
  include Narou::Eventable
13
13
 
14
+ class InvalidSelectValue < StandardError; end
15
+
14
16
  def self.oneline_help
15
17
  "各コマンドの設定を変更します"
16
18
  end
@@ -22,6 +24,8 @@ module Command
22
24
  ・各コマンドの設定の変更が出来ます。
23
25
  ・Global な設定はユーザープロファイルに保存され、すべての narou コマンドで使われます
24
26
  ・下の一覧は一部です。すべてを確認するには -a オプションを付けて確認して下さい
27
+ ・default. で始まる設定は、setting.ini で未設定時の項目の挙動を指定することが出来ます
28
+ ・force. で始まる設定は、setting.ini や default.* 等の指定を全て無視して項目の挙動を強制出来ます
25
29
 
26
30
  Local Variable List:
27
31
  <name> <value> 説明
@@ -71,7 +75,25 @@ module Command
71
75
  unless scope
72
76
  raise Helper::InvalidVariableName, "#{name} は不明な名前です"
73
77
  end
74
- casted_value = Helper.string_cast_to_type(value, SETTING_VARIABLES[scope][name][0])
78
+ variable_definition = SETTING_VARIABLES[scope][name]
79
+ case variable_definition[:type]
80
+ when :select
81
+ select_values = variable_definition[:select_keys]
82
+ unless select_values.include?(value)
83
+ raise InvalidSelectValue, "不明な値です。#{select_values.join(", ")} の中から指定して下さい"
84
+ end
85
+ casted_value = value
86
+ when :multiple
87
+ select_values = variable_definition[:select_keys]
88
+ value.split(",").each do |input_value|
89
+ unless select_values.include?(input_value)
90
+ raise InvalidSelectValue, "不明な値です。#{select_values.join(", ")} の中から指定して下さい"
91
+ end
92
+ end
93
+ casted_value = value
94
+ else
95
+ casted_value = Helper.string_cast_to_type(value, variable_definition[:type])
96
+ end
75
97
  [scope, casted_value]
76
98
  end
77
99
 
@@ -152,7 +174,7 @@ module Command
152
174
  end
153
175
  begin
154
176
  scope, casted_value = casting_variable(name, value)
155
- rescue Helper::InvalidVariableName, Helper::InvalidVariableType => e
177
+ rescue Helper::InvalidVariableName, Helper::InvalidVariableType, InvalidSelectValue => e
156
178
  output_error(e.message, name)
157
179
  next
158
180
  end
@@ -199,9 +221,9 @@ module Command
199
221
  def get_variable_list_strings(scope)
200
222
  result = ""
201
223
  SETTING_VARIABLES[scope].each do |name, info|
202
- if @options["all"] || info[2] != INVISIBLE
203
- type_description = Helper.variable_type_to_description(info[0])
204
- result << " <bold><green>#{name.ljust(18)}</green></bold> #{type_description} #{info[1]}\n".termcolor
224
+ if @options["all"] || !info[:invisible]
225
+ type_description = Helper.variable_type_to_description(info[:type])
226
+ result << " <bold><green>#{name.ljust(18)}</green></bold> #{type_description} #{info[:help]}\n".termcolor
205
227
  end
206
228
  end
207
229
  result
@@ -219,57 +241,140 @@ module Command
219
241
  SETTING_VARIABLES
220
242
  end
221
243
 
222
- INVISIBLE = true
223
-
224
244
  SETTING_VARIABLES = {
225
245
  local: {
226
- # 変数名 => [受け付ける型, 説明(, 不可視化フラグ)]
227
- "convert.no-epub" => [:boolean, "EPUB変換を無効にするか"],
228
- "convert.no-mobi" => [:boolean, "MOBI変換を無効にするか"],
229
- "convert.no-strip" => [:boolean, "MOBIのstripを無効にするか\n" +
230
- " " * 6 + "※注意:KDP用のMOBIはstripしないでください"],
231
- "convert.no-zip" => [:boolean, "i文庫用のzipファイル作成を無効にするか"],
232
- "convert.no-open" => [:boolean, "変換時に保存フォルダを開かないようにするか"],
233
- "convert.copy-to" => [:directory, "変換したらこのフォルダにコピーする\n" +
234
- " " * 6 + "※注意:存在しないフォルダだとエラーになる"],
235
- "convert.copy_to" => [:directory, "copy-toの昔の書き方(非推奨)", INVISIBLE],
236
- "convert.inspect" => [:boolean, "常に変換時に調査結果を表示するか"],
237
- "convert.multi-device" => [:string, "複数の端末用に同時に変換する。deviceよりも優先される。端末名をカンマ区切りで入力。ただのEPUBを出力したい場合はepubを指定"],
238
- "download.interval" => [:float, "各話DL時に指定した秒数待機する。デフォルト0"],
239
- "download.wait-steps" => [:integer, "この値で指定した話数ごとにウェイトを入れる\n" +
240
- " " * 6 + "※注意:11以上を設定してもなろうの場合は10話ごとにウェイトが入ります"],
241
- "download.use-subdirectory" => [:boolean, "小説を一定数ごとにサブフォルダへ分けて保存するか\n" +
242
- " " * 6 + "※注意:小説を大量に同一フォルダに保存するとパフォーマンスが劣化する回避策"],
243
- "send.without-freeze" => [:boolean, "一括送信時に凍結された小説は対象外に"],
244
- "send.backup-bookmark" => [:boolean, "一括送信時に栞データを自動でバックアップするか(KindlePW系用)"],
245
- "update.strong" => [:boolean, "更新漏れが無い様に改稿日の分は必ずDLするか"],
246
- "update.logging" => [:boolean, "更新時のログを保存するかどうか"],
247
- "update.convert-only-new-arrival" => [:boolean, "更新時に新着のみ変換を実行するかどうか"],
248
- "device" => [:string, "変換、送信対象の端末(sendの--help参照)"],
249
- "multiple-delimiter" => [:string, "--multiple指定時の区切り文字"],
246
+ # 変数名 => { type: 受け付ける型, help: 説明[, invisible: 不可視化フラグ,
247
+ # select_keys: 選択肢型の時のキー(配列),
248
+ # select_summaries: 選択肢型の時のキーの概要(配列)] }
249
+ "device" => {
250
+ type: :select,
251
+ help: "変換、送信対象の端末(sendの--help参照)",
252
+ select_keys: Device::DEVICES.keys,
253
+ select_summaries: Device::DEVICES.values.map { |d| d::DISPLAY_NAME }
254
+ },
255
+ "update.strong" => {
256
+ type: :boolean, help: "更新漏れが無い様に改稿日の分は必ずDLするか"
257
+ },
258
+ "update.logging" => {
259
+ type: :boolean, help: "更新時のログを保存するかどうか"
260
+ },
261
+ "update.convert-only-new-arrival" => {
262
+ type: :boolean, help: "更新時に新着のみ変換を実行するかどうか"
263
+ },
264
+ "update.sort-by" => {
265
+ type: :select,
266
+ help: "アップデートを指定した項目順で行う\n#{Narou.update_sort_key_summaries(40)}",
267
+ select_keys: Narou::UPDATE_SORT_KEYS.keys,
268
+ select_summaries: Narou::UPDATE_SORT_KEYS.values
269
+ },
270
+ "convert.copy-to" => {
271
+ type: :directory,
272
+ help: "変換したらこのフォルダにコピーする\n" \
273
+ " ※注意:存在しないフォルダだとエラーになる"
274
+ },
275
+ "convert.copy-to-grouping" => {
276
+ type: :boolean, help: "copy-toで指定したフォルダの中で更にdevice毎にフォルダを振り分ける"
277
+ },
278
+ "convert.copy_to" => {
279
+ type: :directory, help: "copy-toの昔の書き方(非推奨)", invisible: true
280
+ },
281
+ "convert.no-epub" => {
282
+ type: :boolean, help: "EPUB変換を無効にするか", invisible: true
283
+ },
284
+ "convert.no-mobi" => {
285
+ type: :boolean, help: "MOBI変換を無効にするか", invisible: true
286
+ },
287
+ "convert.no-strip" => {
288
+ type: :boolean,
289
+ help: "MOBIのstripを無効にするか\n" \
290
+ " ※注意:KDP用のMOBIはstripしないでください",
291
+ invisible: true
292
+ },
293
+ "convert.no-zip" => {
294
+ type: :boolean, help: "i文庫用のzipファイル作成を無効にするか", invisible: true
295
+ },
296
+ "convert.no-open" => {
297
+ type: :boolean, help: "変換時に保存フォルダを開かないようにするか"
298
+ },
299
+ "convert.inspect" => {
300
+ type: :boolean, help: "常に変換時に調査結果を表示するか"
301
+ },
302
+ "convert.multi-device" => {
303
+ type: :multiple,
304
+ help: "複数の端末用に同時に変換する。deviceよりも優先される。" \
305
+ "端末名をカンマ区切りで入力。ただのEPUBを出力したい場合はepubを指定",
306
+ select_keys: Device::DEVICES.keys,
307
+ select_summaries: Device::DEVICES.values.map { |d| d::DISPLAY_NAME }
308
+ },
309
+ "download.interval" => {
310
+ type: :float, help: "各話DL時に指定した秒数待機する。デフォルト0"
311
+ },
312
+ "download.wait-steps" => {
313
+ type: :integer,
314
+ help: "この値で指定した話数ごとにウェイトを入れる\n" \
315
+ " ※注意:11以上を設定してもなろうの場合は10話ごとにウェイトが入ります"
316
+ },
317
+ "download.use-subdirectory" => {
318
+ type: :boolean,
319
+ help: "小説を一定数ごとにサブフォルダへ分けて保存するか\n" \
320
+ " ※注意:小説を大量に同一フォルダに保存するとパフォーマンスが劣化する回避策"
321
+ },
322
+ "send.without-freeze" => {
323
+ type: :boolean, help: "一括送信時に凍結された小説は対象外に"
324
+ },
325
+ "send.backup-bookmark" => {
326
+ type: :boolean, help: "一括送信時に栞データを自動でバックアップするか(KindlePW系用)"
327
+ },
328
+ "multiple-delimiter" => {
329
+ type: :string, help: "--multiple指定時の区切り文字"
330
+ },
250
331
  },
251
332
  global: {
252
- "aozoraepub3dir" => [:directory, "AozoraEpub3のあるフォルダを指定", INVISIBLE],
253
- "difftool" => [:string, "Diffで使うツールのパスを指定する"],
254
- "difftool.arg" => [:string, "difftoolで使う引数を設定(オプション)"],
255
- "no-color" => [:boolean, "カラー表示を無効にするか"],
256
- "server-port" => [:integer, "WEBサーバ起動時のポート"],
257
- "server-bind" => [:string, "WEBサーバのホスト制限(未設定時:起動PCのIP)", INVISIBLE],
258
- "over18" => [:boolean, "18歳以上かどうか", INVISIBLE],
259
- "dismiss-notice" => [:boolean, "お知らせを消すかどうか", INVISIBLE],
333
+ "aozoraepub3dir" => {
334
+ type: :directory, help: "AozoraEpub3のあるフォルダを指定", invisible: true
335
+ },
336
+ "difftool" => {
337
+ type: :string, help: "Diffで使うツールのパスを指定する"
338
+ },
339
+ "difftool.arg" => {
340
+ type: :string, help: "difftoolで使う引数を設定(オプション)"
341
+ },
342
+ "no-color" => {
343
+ type: :boolean, help: "カラー表示を無効にするか"
344
+ },
345
+ "server-port" => {
346
+ type: :integer, help: "WEBサーバ起動時のポート"
347
+ },
348
+ "server-bind" => {
349
+ type: :string, help: "WEBサーバのホスト制限(未設定時:起動PCのIP)", invisible: true
350
+ },
351
+ "over18" => {
352
+ type: :boolean, help: "18歳以上かどうか", invisible: true
353
+ },
354
+ "dismiss-notice" => {
355
+ type: :boolean, help: "お知らせを消すかどうか", invisible: true
356
+ },
260
357
  }
261
358
  }
262
359
 
263
- NovelSetting::DEFAULT_SETTINGS.each do |default|
264
- SETTING_VARIABLES[:local]["force." + default[:name]] = [
265
- Helper.type_of_value(default[:value]), "\n " + default[:help], INVISIBLE
266
- ]
360
+ %w(default force).each do |kind|
361
+ NovelSetting::ORIGINAL_SETTINGS.each do |default|
362
+ value = {
363
+ type: default[:type],
364
+ help: "\n " + default[:help],
365
+ invisible: true,
366
+ select_keys: default[:select_keys],
367
+ select_summaries: default[:select_summaries]
368
+ }
369
+ SETTING_VARIABLES[:local]["#{kind}." + default[:name]] = value
370
+ end
267
371
  end
268
372
 
269
373
  Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), "*.rb"))) do |path|
270
374
  cmd_name = File.basename(path, ".rb")
271
- SETTING_VARIABLES[:local]["default_args." + cmd_name] =
272
- [:string, "#{cmd_name} コマンドのデフォルトオプション", INVISIBLE]
375
+ SETTING_VARIABLES[:local]["default_args." + cmd_name] = {
376
+ type: :string, help: "#{cmd_name} コマンドのデフォルトオプション", invisible: true
377
+ }
273
378
  end
274
379
 
275
380
  SETTING_VARIABLES.freeze