narou 2.5.2 → 2.6.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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/ChangeLog.md +54 -0
  4. data/LICENSE.txt +26 -0
  5. data/README.md +70 -84
  6. data/lib/command/alias.rb +7 -0
  7. data/lib/command/convert.rb +40 -61
  8. data/lib/command/download.rb +9 -1
  9. data/lib/command/mail.rb +24 -13
  10. data/lib/command/send.rb +18 -2
  11. data/lib/command/setting.rb +152 -34
  12. data/lib/command/tag.rb +5 -0
  13. data/lib/command/update.rb +137 -4
  14. data/lib/converterbase.rb +12 -6
  15. data/lib/database.rb +1 -1
  16. data/lib/device/ibooks.rb +6 -5
  17. data/lib/downloader.rb +85 -83
  18. data/lib/helper.rb +3 -2
  19. data/lib/html.rb +3 -0
  20. data/lib/logger.rb +20 -12
  21. data/lib/narou.rb +16 -0
  22. data/lib/novelconverter.rb +209 -75
  23. data/lib/novelinfo.rb +1 -1
  24. data/lib/novelsetting.rb +53 -29
  25. data/lib/template.rb +4 -3
  26. data/lib/version.rb +1 -1
  27. data/lib/web/appserver.rb +46 -32
  28. data/lib/web/public/resources/common.ui.js +2 -4
  29. data/lib/web/public/resources/default-style.css +37 -0
  30. data/lib/web/public/resources/narou.library.js +48 -57
  31. data/lib/web/public/resources/narou.ui.js +71 -39
  32. data/lib/web/public/theme/Cerulean/bootstrap.min.css +11 -0
  33. data/lib/web/public/theme/Cerulean/style.css +49 -0
  34. data/lib/web/public/theme/Darkly/bootstrap.min.css +11 -0
  35. data/lib/web/public/theme/Darkly/style.css +53 -0
  36. data/lib/web/public/theme/Readable/bootstrap.min.css +11 -0
  37. data/lib/web/public/theme/Readable/style.css +53 -0
  38. data/lib/web/public/theme/Slate/bootstrap.min.css +11 -0
  39. data/lib/web/public/theme/Slate/style.css +40 -0
  40. data/lib/web/public/theme/Superhero/bootstrap.min.css +11 -0
  41. data/lib/web/public/theme/Superhero/style.css +40 -0
  42. data/lib/web/public/theme/United/bootstrap.min.css +11 -0
  43. data/lib/web/public/theme/United/style.css +47 -0
  44. data/lib/web/public/theme/fonts/glyphicons-halflings-regular.eot +0 -0
  45. data/lib/web/public/theme/fonts/glyphicons-halflings-regular.svg +288 -0
  46. data/lib/web/public/theme/fonts/glyphicons-halflings-regular.ttf +0 -0
  47. data/lib/web/public/theme/fonts/glyphicons-halflings-regular.woff +0 -0
  48. data/lib/web/public/theme/fonts/glyphicons-halflings-regular.woff2 +0 -0
  49. data/lib/web/settingmessages.rb +5 -0
  50. data/lib/web/views/index.haml +15 -19
  51. data/lib/web/views/layout.haml +6 -1
  52. data/lib/web/views/novels/setting.haml +76 -75
  53. data/lib/web/views/settings.haml +111 -107
  54. data/lib/web/views/style.scss +6 -21
  55. data/narou.gemspec +49 -6
  56. data/narou.rb +3 -1
  57. data/preset/ncode.syosetu.com/n7975cr/setting.ini +7 -0
  58. data/spec/README.txt +4 -0
  59. data/spec/data/convert_test/ruby/correct_test_ruby.txt +4 -4
  60. data/template/hotentry.txt.erb +28 -0
  61. data/template/ibunko_novel.txt.erb +4 -2
  62. data/template/novel.txt.erb +6 -3
  63. data/template/setting.ini.erb +18 -2
  64. metadata +73 -8
@@ -13,6 +13,11 @@ module Narou
13
13
  "update.sort-by" => "アップデートを指定した項目順で行う",
14
14
  "default.title_date_align" => "enable_add_date_to_title で付与する日付の位置",
15
15
  "force.title_date_align" => "enable_add_date_to_title で付与する日付の位置",
16
+ "difftool.arg" => "difftoolで使う引数(指定しなければ単純に新旧ファイルを引数に呼び出す)\n" \
17
+ "特殊な変数\n" \
18
+ "<b>%NEW</b> : 最新データの差分用ファイルパス\n" \
19
+ "<b>%OLD</b> : 古い方の差分用ファイルパス",
20
+ "no-color" => "コンソールのカラー表示を無効にする\n※要WEB UIサーバ再起動"
16
21
  }
17
22
  end
18
23
 
@@ -19,12 +19,12 @@
19
19
  %li#action-view-setting
20
20
  %a(href="#") 表示する項目を設定
21
21
  %li.divider
22
- %li#action-view-without-frozen.active
22
+ %li#action-view-nonfrozen
23
23
  %a(href="#")
24
24
  %span
25
25
  %span.active-ok.glyphicon.glyphicon-ok
26
26
  凍結中以外を表示
27
- %li#action-view-frozen.active
27
+ %li#action-view-frozen
28
28
  %a(href="#")
29
29
  %span
30
30
  %span.active-ok.glyphicon.glyphicon-ok
@@ -63,7 +63,7 @@
63
63
  %span.active-ok.glyphicon.glyphicon-ok
64
64
  範囲選択モード
65
65
  %span.shortcut R
66
- %li
66
+ %li.dropdown
67
67
  %a.dropdown-toggle(data-toggle="dropdown" href="#")
68
68
  タグ
69
69
  %span.caret
@@ -157,6 +157,8 @@
157
157
  %a#button-update-view(href="#") 表示されている小説を更新
158
158
  %li
159
159
  %a#button-update-general-lastup(href="#") 最新話掲載日を更新
160
+ %li
161
+ %a#button-update-force(href="#") 凍結済みでも更新
160
162
  .btn-group
161
163
  %button#button-send.btn.btn-warning(type="button") Send
162
164
  .btn-group
@@ -170,16 +172,10 @@
170
172
  %li
171
173
  %a#button-freeze-off(href="#") 選択した小説の凍結を解除
172
174
  .btn-group
173
- %button.btn.btn-danger.dropdown-toggle.enable-selected(type="button" data-toggle="dropdown")
174
- Remove
175
- %span.caret
176
- %span.sr-only Toggle Dropdown
177
- %ul.dropdown-menu(role="menu")
178
- %li
179
- %a#button-remove(href="#") 選択した小説を削除
180
- %li
181
- %a#button-remove-with-file(href="#") 選択した小説をファイルも含めて削除
182
- %button#button-convert.btn.btn-default.enable-selected(type="button" data-toggle="tooltip" |
175
+ %button#button-remove.btn.btn-danger.enable-selected(type="button" data-toggle="tooltip" |
176
+ title="選択した小説を削除") Remove |
177
+ .btn-group
178
+ %button#button-convert.btn.btn-default.enable-selected(type="button" data-toggle="tooltip" |
183
179
  title="選択した小説を変換") Convert |
184
180
  .btn-group
185
181
  %button.btn.btn-default.dropdown-toggle.enable-selected(type="button" data-toggle="dropdown")
@@ -188,13 +184,15 @@
188
184
  %span.sr-only Toggle Dropdown
189
185
  %ul.dropdown-menu(role="menu")
190
186
  %li
191
- %a#button-diff(href="#") 選択した小説の最新の差分を表示(diff)
187
+ %a#button-diff(href="#") 選択した小説の最新の差分を表示
188
+ %li
189
+ %a#button-inspect(href="#") 選択した小説の調査状況ログを表示
192
190
  %li
193
- %a#button-inspect(href="#") 選択した小説の調査状況ログを表示(inspect)
191
+ %a#button-folder(href="#") 選択した小説の保存フォルダを開く
194
192
  %li
195
- %a#button-folder(href="#") 選択した小説の保存フォルダを開く(folder)
193
+ %a#button-backup(href="#") 選択した小説のバックアップを作成
196
194
  %li
197
- %a#button-backup(href="#") 選択した小説のバックアップを作成(backup)
195
+ %a#button-setting-burn(href="#") 選択した小説の設定の未設定項目に共通設定を焼付ける
198
196
 
199
197
  %input#tag-search(type="text")
200
198
 
@@ -230,8 +228,6 @@
230
228
  %a(href="#") 送信
231
229
  %li#context-menu-remove
232
230
  %a(href="#") 削除
233
- %li#context-menu-remove-with-file
234
- %a(href="#") 完全に削除
235
231
  %li#context-menu-convert
236
232
  %a(href="#") 変換
237
233
  %li#context-menu-inspect
@@ -8,7 +8,12 @@
8
8
  %meta{:content => "none", :name => "robots"}/
9
9
  %title Narou.rb WEB UI #{@title ? "- #{@title}" : ""}
10
10
  %link{:href => "/favicon.ico", :rel => "shortcut icon"}/
11
- %link{:href => "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css", :rel => "stylesheet"}/
11
+ - if @bootstrap_theme
12
+ %link{:href => "/theme/#{@bootstrap_theme}/bootstrap.min.css", :rel => "stylesheet"}/
13
+ %link{:href => "/theme/#{@bootstrap_theme}/style.css", :rel => "stylesheet"}/
14
+ - else
15
+ %link{:href => "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css", :rel => "stylesheet"}/
16
+ %link{:href => "/resources/default-style.css", :rel => "stylesheet"}/
12
17
  %link{:href => "//cdn.datatables.net/plug-ins/725b2a2115b/integration/bootstrap/3/dataTables.bootstrap.css", :rel => "stylesheet"}/
13
18
  %link{:href => "//cdn.datatables.net/colreorder/1.1.2/css/dataTables.colReorder.css", :rel => "stylesheet"}/
14
19
  %link{:href => "//cdn.datatables.net/colvis/1.1.1/css/dataTables.colVis.css", :rel => "stylesheet"}/
@@ -67,85 +67,86 @@
67
67
  %p.panel-settings-link
68
68
  goto <a href="#replace-panel" data-move-to="#replace-panel">置換設定</a>
69
69
 
70
- #setting-panel.panel.panel-info.panel-settings
71
- .panel-heading <b>#{h @novel_title}</b> の変換設定
72
- .panel-body
73
- ・この小説専用の変換時の設定を変更出来ます(setting.ini を書き換えます)<br>
74
- ・変更を反映させるには再度変換を実行する必要があります<br>
75
- ・環境設定で force.* 系設定が有効になっている場合、ここでの該当項目は無視されます<br>
76
- ・保存するとこの小説の setting.ini に書かれているコメントは削除されます
77
- .list-group
78
- - @original_settings.each do |original|
79
- - name = original[:name]
80
- - value = @novel_setting[name]
81
- - help = original[:help].strip.gsub("\n", "<br>")
82
- - list_group_item_style = {}
83
- - force_value = @force_settings[name]
84
- - if @error_list[name]
85
- - list_group_item_style = {class: "has-error", style: "background-color:#f2dede"}
86
- - elsif force_value.nil?.!
87
- - list_group_item_style = {style: "background-color: #fcf8e3"}
88
- .list-group-item.form-group{list_group_item_style}
89
- %h4.list-group-item-heading #{name}
90
- .list-group-item-text
91
- - case original[:type]
92
- - when :boolean
93
- .switch-toggle.well.switch-3
94
- <input id="#{name}-nil" type="radio" name="#{name}" value="nil" #{value.nil? ? "checked" : ""}>
95
- %label(for="#{name}-nil")
96
- 未設定
97
- <input id="#{name}-false" type="radio" name="#{name}" value="off" #{value == false ? "checked" : ""}>
98
- %label(for="#{name}-false")
99
- しない
100
- <input id="#{name}-true" type="radio" name="#{name}" value="on" #{value ? "checked" : ""}>
101
- %label(for="#{name}-true")
102
- する
103
- %a.btn.btn-primary
104
- - when :select
105
- %div.input-style
106
- %select{name: name, class: "selectpicker show-tick"}
107
- %option(value="") 未設定
108
- - original[:select_keys].each_with_index do |key, index|
109
- %option{selected: value == key, value: key}
110
- = original[:select_summaries][index]
111
- - when :multiple
112
- %div.input-style
113
- %select{name: "#{name}[]", class: "selectpicker", multiple: true, title: "未設定"}
114
- - selected_items = value.to_s.split(",")
115
- - original[:select_keys].each_with_index do |key, index|
116
- %option{selected: selected_items.include?(key), value: key}
117
- = original[:select_summaries][index]
118
- - else
119
- %input{type:"text", name:name, value:value, class:"form-control",
120
- placeholder:Helper.variable_type_to_description(original[:type]).strip }
121
- %p #{help}
122
- .help-extra-messages
123
- %p
124
- 未設定時:
125
- - if @default_settings.include?(name)
126
- = h value_to_msg(@default_settings[name])
127
- - else
128
- = h value_to_msg(original[:value])
129
- - unless force_value.nil?
70
+ .container-settings
71
+ #setting-panel.panel.panel-info.panel-settings
72
+ .panel-heading <b>#{h @novel_title}</b> の変換設定
73
+ .panel-body
74
+ ・この小説専用の変換時の設定を変更出来ます(setting.ini を書き換えます)<br>
75
+ ・変更を反映させるには再度変換を実行する必要があります<br>
76
+ ・未設定の項目は、変換時に共通設定(default.* 系設定及びNarou.rbオリジナル設定)が適用されます<br>
77
+ ・環境設定で force.* 系設定が有効になっている場合、ここでの該当項目は無視されます<br>
78
+ .list-group
79
+ - @original_settings.each do |original|
80
+ - name = original[:name]
81
+ - value = @novel_setting[name]
82
+ - help = original[:help].strip.gsub("\n", "<br>")
83
+ - list_group_item_style = {}
84
+ - force_value = @force_settings[name]
85
+ - if @error_list[name]
86
+ - list_group_item_style = {class: "has-error", style: "background-color:#f2dede"}
87
+ - elsif force_value.nil?.!
88
+ - list_group_item_style = {style: "background-color: #fcf8e3"}
89
+ .list-group-item.form-group{list_group_item_style}
90
+ %h4.list-group-item-heading #{name}
91
+ .list-group-item-text
92
+ - case original[:type]
93
+ - when :boolean
94
+ .switch-toggle.well.switch-3
95
+ <input id="#{name}-nil" type="radio" name="#{name}" value="nil" #{value.nil? ? "checked" : ""}>
96
+ %label(for="#{name}-nil")
97
+ 未設定
98
+ <input id="#{name}-false" type="radio" name="#{name}" value="off" #{value == false ? "checked" : ""}>
99
+ %label(for="#{name}-false")
100
+ いいえ
101
+ <input id="#{name}-true" type="radio" name="#{name}" value="on" #{value ? "checked" : ""}>
102
+ %label(for="#{name}-true")
103
+ はい
104
+ %a.btn.btn-primary
105
+ - when :select
106
+ %div.input-style
107
+ %select{name: name, class: "selectpicker show-tick"}
108
+ %option(value="") 未設定
109
+ - original[:select_keys].each_with_index do |key, index|
110
+ %option{selected: value == key, value: key}
111
+ = original[:select_summaries][index]
112
+ - when :multiple
113
+ %div.input-style
114
+ %select{name: "#{name}[]", class: "selectpicker", multiple: true, title: "未設定"}
115
+ - selected_items = value.to_s.split(",")
116
+ - original[:select_keys].each_with_index do |key, index|
117
+ %option{selected: selected_items.include?(key), value: key}
118
+ = original[:select_summaries][index]
119
+ - else
120
+ %input{type:"text", name:name, value:value, class:"form-control",
121
+ placeholder:Helper.variable_type_to_description(original[:type]).strip }
122
+ %p #{help}
123
+ .help-extra-messages
130
124
  %p
131
- %b force.#{name} が有効になっています(設定値:#{h value_to_msg(force_value)})
132
- - if @error_list[name]
133
- %p.alert-danger
134
- &= @error_list[name]
135
- .clear
125
+ 未設定時:
126
+ - if @default_settings.include?(name)
127
+ = h value_to_msg(@default_settings[name])
128
+ - else
129
+ = h value_to_msg(original[:value])
130
+ - unless force_value.nil?
131
+ %p
132
+ %b force.#{name} が有効になっています(設定値:#{h value_to_msg(force_value)})
133
+ - if @error_list[name]
134
+ %p.alert-danger
135
+ &= @error_list[name]
136
+ .clear
136
137
 
137
- %p.panel-settings-link
138
- goto <a href="#setting-panel" data-move-to="#setting-panel">変換設定</a>
138
+ %p.panel-settings-link
139
+ goto <a href="#setting-panel" data-move-to="#setting-panel">変換設定</a>
139
140
 
140
- - @replace_panel_var = { title: "<b>#{h @novel_title}</b> の置換設定",
141
- panel_class: "panel-info",
142
- body_class: "",
143
- body: ["・この小説の文章を置換する設定を行うことが出来ます(replace.txt を書き換えます)",
144
- "・変更を反映させるには再度変換を実行する必要があります",
145
- "・保存するとこの小説の replace.txt に書かれているコメントは削除されます"] }
146
- = haml :edit_replace_txt
141
+ - @replace_panel_var = { title: "<b>#{h @novel_title}</b> の置換設定",
142
+ panel_class: "panel-info",
143
+ body_class: "",
144
+ body: ["・この小説の文章を置換する設定を行うことが出来ます(replace.txt を書き換えます)",
145
+ "・変更を反映させるには再度変換を実行する必要があります",
146
+ "・保存するとこの小説の replace.txt に書かれているコメントは削除されます"] }
147
+ = haml :edit_replace_txt
147
148
 
148
- %input(type="submit" value="設定を保存" class="btn btn-info" style="float:none")
149
+ %input(type="submit" value="設定を保存" class="btn btn-info" style="float:none")
149
150
 
150
151
  #console-dialog.modal.fade(tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true")
151
152
  .modal-dialog
@@ -10,10 +10,22 @@
10
10
  container: "body",
11
11
  width: "100%"
12
12
  });
13
+
14
+ var storage = new Narou.Storage;
15
+ // 直前に開いていたタブを復元
16
+ var related_active_tab = storage.get("related_active_tab");
17
+ if (related_active_tab) {
18
+ $('a[href="#' + related_active_tab + '"]').tab("show");
19
+ }
20
+ // 開いたタブを記憶しておく
21
+ $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
22
+ var active_tab = (e.target + "").split("#")[1];
23
+ storage.set("related_active_tab", active_tab);
24
+ storage.save();
25
+ })
13
26
  });
14
27
 
15
28
  %form(action="/settings" method="POST")
16
- %input(type="hidden" name="view_invisible" value="#{@view_invisible ? 1 : 0}")
17
29
  .navbar.navbar-default.navbar-fixed-top(role="navigation")
18
30
  .container
19
31
  .navbar-header
@@ -38,115 +50,107 @@
38
50
  %span#queue 0
39
51
 
40
52
  .container.container-main.theme-showcase(role="main")
41
- - @setting_variables.each do |scope, variables|
42
- - inventory = Inventory.load("#{scope}_setting", scope)
43
- - unless @view_invisible
44
- -# 隠しパラメータは配列の最初の方に集めておく
45
- -# (リストの最後に隠しパラメータがあると、リストの最下部の表示が切れるため)
46
- - variables = variables.select { |_, v| v[:invisible] }.merge(variables.reject { |_, v| v[:invisible] })
53
+ .container-settings
54
+ - inventory = Inventory.load("local_setting", :local).merge(Inventory.load("global_setting", :global))
55
+ - local_and_global_variables = @setting_variables[:local].merge(@setting_variables[:global])
56
+ - tab_info = Command::Setting.get_setting_tab_info
57
+ - error_tabs = @error_list.map { |name, _| local_and_global_variables[name][:tab] }.uniq
47
58
 
48
- %p.panel-settings-link
49
- - if scope == :local
50
- goto <a href="#global" data-move-to="#global">Global Variables</a>
51
-
52
- <a href="#replace-panel" data-move-to="#replace-panel">置換設定</a>
53
- - else
54
- goto <a href="#local" data-move-to="#local">Local Variables</a>
55
-
56
- <a href="#replace-panel" data-move-to="#replace-panel">置換設定</a>
59
+ %p
60
+ %ul.nav.nav-pills(role="tablist")
61
+ - Command::Setting.get_setting_tab_names.each.with_index do |(key, name), index|
62
+ %li(role="presentation"){class: index == 0 ? "active" : nil}
63
+ %a{ href: "##{key}", :"aria-controls" => "#{key}", role: "tab", :"data-toggle" => "tab" }
64
+ = name
65
+ - if error_tabs.include?(key)
66
+ %span.text-danger.glyphicon.glyphicon-exclamation-sign
67
+ %li(role="presentation")
68
+ %a(href="#replace" aria-controls="replace" role="tab" data-toggle="tab")
69
+ 置換設定
57
70
 
58
- .panel.panel-primary.panel-settings
59
- .panel-heading{id: scope} #{scope.capitalize} Variables
60
- .panel-body.list-group-item-info
61
- ・各コマンドの設定の変更が出来ます<br>
62
- - if scope == :local
63
- - if @view_invisible
64
- ・default.* 系の設定は個別の変換設定で未設定の項目の挙動を指定することが出来ます<br>
65
- ・force.* 系の設定は個別設定、default.* 等の設定を無視して反映されるようになります<br>
66
- ・default_args.* 系の設定は、各種コマンドのオプションを省略した場合に使用されるオプションを指定出来ます<br>
67
- - else
68
- ・Global な設定はユーザープロファイルに保存され、すべての narou コマンドで使われます<br>
69
- - if @view_invisible
70
- ・隠しオプションを非表示にするには<a href="?##{scope}"><u>ここをクリック</u></a><br>
71
+ -# :tab が設定されていないものを hidden として設定しておく
72
+ - local_and_global_variables.each do |name, value|
73
+ - unless value[:tab]
74
+ - item = inventory[name]
75
+ - if value[:type] == :boolean
76
+ - hidden_value = convert_boolean_to_on_off(item)
71
77
  - else
72
- ・隠しオプションを表示するには<a href="?view_invisible=1##{scope}"><u>ここをクリック</u></a><br>
73
- .list-group
74
- - variables.each do |name, value|
75
- - item = inventory[name]
76
- - unless @view_invisible
77
- - if value[:invisible]
78
- - if value[:type] == :boolean
79
- - hidden_value = convert_boolean_to_on_off(item)
80
- - else
81
- - hidden_value = item
82
- %input{type:"hidden", name:name, value:hidden_value}
83
- - next
84
- - message = Narou::SETTING_VARIABLES_WEBUI_MESSAGES[name] || value[:help]
85
- - message = message.strip.gsub("\n", "<br>")
86
- - error_style = {class: "has-error", style: "background-color:#f2dede"}
87
- .list-group-item.form-group{@error_list[name] ? error_style : {}}
88
- %h4.list-group-item-heading #{name}
89
- .list-group-item-text
90
- - case value[:type]
91
- - when :boolean
92
- - if name =~ /^(force|default)\./
93
- .switch-toggle.well.switch-3
94
- <input id="#{name}-nil" type="radio" name="#{name}" value="nil" #{item.nil? ? "checked" : ""}>
95
- %label(for="#{name}-nil")
96
- 未設定
97
- <input id="#{name}-false" type="radio" name="#{name}" value="off" #{item == false ? "checked" : ""}>
98
- %label(for="#{name}-false")
99
- しない
100
- <input id="#{name}-true" type="radio" name="#{name}" value="on" #{item ? "checked" : ""}>
101
- %label(for="#{name}-true")
102
- する
103
- %a.btn.btn-primary
104
- - else
105
- %label.switch-light.well
106
- <input type="checkbox" name="#{name}" #{item ? "checked" : ""}>
107
- - if name == "over18"
108
- %span
109
- %span いいえ
110
- %span はい
111
- - else
112
- %span
113
- %span しない
114
- %span する
115
- %a.btn.btn-primary
116
- - when :select
117
- %div.input-style
118
- %select{name: name, class: "selectpicker show-tick"}
119
- %option(value="") 未設定
120
- - value[:select_keys].each_with_index do |key, index|
121
- %option{selected: item == key, value: key}
122
- = value[:select_summaries][index]
123
- - when :multiple
124
- %div.input-style
125
- %select{name: "#{name}[]", class: "selectpicker", multiple: true, title: "未設定"}
126
- - selected_items = item.to_s.split(",")
127
- - value[:select_keys].each_with_index do |key, index|
128
- %option{selected: selected_items.include?(key), value: key}
129
- = value[:select_summaries][index]
130
- - else
131
- %input{type:"text", name:name, value:item, class:"form-control",
132
- placeholder:Helper.variable_type_to_description(value[:type]).strip }
133
- %p
134
- = message != "" ? message : "&nbsp;"
135
- - if @error_list[name]
136
- %p.alert-danger
137
- = @error_list[name]
138
- .clear
78
+ - hidden_value = item
79
+ %input{type:"hidden", name:name, value:hidden_value}
139
80
 
140
- %p.panel-settings-link
141
- goto <a href="#local" data-move-to="#local">Local Variables</a>
142
-
143
- <a href="#global" data-move-to="#global">Global Variables</a>
81
+ .tab-content
82
+ - Command::Setting.get_setting_tab_names.each.with_index do |(key, _), index|
83
+ .tab-pane{ role: "tabpanel", id: "#{key}", class: index == 0 ? "active" : nil }
84
+ .panel.panel-info.panel-settings
85
+ - if tab_info.has_key?(key)
86
+ .panel-heading
87
+ = tab_info[key]
88
+ .list-group
89
+ - local_and_global_variables.each do |name, value|
90
+ - next if value[:tab] != key
91
+ - item = inventory[name]
92
+ - need_clear = false
93
+ - message = Narou::SETTING_VARIABLES_WEBUI_MESSAGES[name] || value[:help]
94
+ - message = message.strip.gsub("\n", "<br>")
95
+ - error_style = {class: "has-error", style: "background-color:#f2dede"}
96
+ .list-group-item.form-group{@error_list[name] ? error_style : {}}
97
+ %h4.list-group-item-heading #{name}
98
+ .list-group-item-text
99
+ - case value[:type]
100
+ - when :boolean
101
+ - if name =~ /^(force|default)\./
102
+ .switch-toggle.well.switch-3
103
+ <input id="#{name}-nil" type="radio" name="#{name}" value="nil" #{item.nil? ? "checked" : ""}>
104
+ %label(for="#{name}-nil")
105
+ 未設定
106
+ <input id="#{name}-false" type="radio" name="#{name}" value="off" #{item == false ? "checked" : ""}>
107
+ %label(for="#{name}-false")
108
+ いいえ
109
+ <input id="#{name}-true" type="radio" name="#{name}" value="on" #{item ? "checked" : ""}>
110
+ %label(for="#{name}-true")
111
+ はい
112
+ %a.btn.btn-primary
113
+ - else
114
+ %label.switch-light.well
115
+ <input type="checkbox" name="#{name}" #{item ? "checked" : ""}>
116
+ %span
117
+ %span いいえ
118
+ %span はい
119
+ %a.btn.btn-primary
120
+ - when :select
121
+ %div.input-style
122
+ %select{name: name, class: "selectpicker show-tick"}
123
+ %option(value="") 未設定
124
+ - value[:select_keys].each_with_index do |key, index|
125
+ %option{selected: item == key, value: key}
126
+ = value[:select_summaries][index]
127
+ - need_clear = true
128
+ - when :multiple
129
+ %div.input-style
130
+ %select{name: "#{name}[]", class: "selectpicker", multiple: true, title: "未設定"}
131
+ - selected_items = item.to_s.split(",")
132
+ - value[:select_keys].each_with_index do |key, index|
133
+ %option{selected: selected_items.include?(key), value: key}
134
+ = value[:select_summaries][index]
135
+ - need_clear = true
136
+ - else
137
+ %input{type:"text", name:name, value:item, class:"form-control",
138
+ placeholder:Helper.variable_type_to_description(value[:type]).strip }
139
+ - need_clear = true
140
+ %p
141
+ = message != "" ? message : "&nbsp;"
142
+ - if @error_list[name]
143
+ %p.alert-danger
144
+ = @error_list[name]
145
+ - if need_clear
146
+ .clearfix
144
147
 
145
- - @replace_panel_var = { title: "全小説対象の置換設定",
146
- panel_class: "panel-primary",
147
- body_class: "list-group-item-info",
148
- body: ["・全ての小説に対する置換設定を行うことが出来ます",
149
- "・変更を反映させるには再度変換を実行する必要があります"] }
150
- = haml :edit_replace_txt
148
+ .tab-pane(role="tabpanel" id="replace")
149
+ - @replace_panel_var = { title: "全小説対象の置換設定",
150
+ panel_class: "panel-info",
151
+ body_class: "list-group-item-default",
152
+ body: ["・全ての小説に対する置換設定を行うことが出来ます",
153
+ "・変更を反映させるには再度変換を実行する必要があります"] }
154
+ = haml :edit_replace_txt
151
155
 
152
- %input(type="submit" value="設定を保存" class="btn btn-info" style="float:none")
156
+ %input(type="submit" value="設定を保存" class="btn btn-info" style="float:none")