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
@@ -0,0 +1,58 @@
1
+ # Copyright: Hiroshi Ichikawa <http://gimite.net/en/>
2
+ # Lincense: New BSD Lincense
3
+
4
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
5
+ require "web_socket"
6
+ require "thread"
7
+
8
+ Thread.abort_on_exception = true
9
+
10
+ if ARGV.size != 2
11
+ $stderr.puts("Usage: ruby sample/chat_server.rb ACCEPTED_DOMAIN PORT")
12
+ exit(1)
13
+ end
14
+
15
+ server = WebSocketServer.new(
16
+ :accepted_domains => [ARGV[0]],
17
+ :port => ARGV[1].to_i())
18
+ puts("Server is running at port %d" % server.port)
19
+ connections = []
20
+ history = [nil] * 20
21
+
22
+ server.run() do |ws|
23
+ begin
24
+
25
+ puts("Connection accepted")
26
+ ws.handshake()
27
+ que = Queue.new()
28
+ connections.push(que)
29
+
30
+ for message in history
31
+ next if !message
32
+ ws.send(message)
33
+ puts("Sent: #{message}")
34
+ end
35
+
36
+ thread = Thread.new() do
37
+ while true
38
+ message = que.pop()
39
+ ws.send(message)
40
+ puts("Sent: #{message}")
41
+ end
42
+ end
43
+
44
+ while data = ws.receive()
45
+ puts("Received: #{data}")
46
+ for conn in connections
47
+ conn.push(data)
48
+ end
49
+ history.push(data)
50
+ history.shift()
51
+ end
52
+
53
+ ensure
54
+ connections.delete(que)
55
+ thread.terminate() if thread
56
+ puts("Connection closed")
57
+ end
58
+ end
@@ -0,0 +1,33 @@
1
+ # Copyright: Hiroshi Ichikawa <http://gimite.net/en/>
2
+ # Lincense: New BSD Lincense
3
+
4
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
5
+ require "web_socket"
6
+
7
+ Thread.abort_on_exception = true
8
+ # WebSocket.debug = true
9
+
10
+ if ARGV.size != 2
11
+ $stderr.puts("Usage: ruby sample/echo_server.rb ACCEPTED_DOMAIN PORT")
12
+ exit(1)
13
+ end
14
+
15
+ server = WebSocketServer.new(
16
+ :accepted_domains => [ARGV[0]],
17
+ :port => ARGV[1].to_i())
18
+ puts("Server is running at port %d" % server.port)
19
+ server.run() do |ws|
20
+ puts("Connection accepted")
21
+ puts("Path: #{ws.path}, Origin: #{ws.origin}")
22
+ if ws.path == "/"
23
+ ws.handshake()
24
+ while data = ws.receive()
25
+ printf("Received: %p\n", data)
26
+ ws.send(data)
27
+ printf("Sent: %p\n", data)
28
+ end
29
+ else
30
+ ws.handshake("404 Not Found")
31
+ end
32
+ puts("Connection closed")
33
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright: Hiroshi Ichikawa <http://gimite.net/en/>
2
+ # Lincense: New BSD Lincense
3
+
4
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
5
+ require "web_socket"
6
+
7
+ if ARGV.size != 1
8
+ $stderr.puts("Usage: ruby samples/stdio_client.rb ws://HOST:PORT/")
9
+ exit(1)
10
+ end
11
+
12
+ client = WebSocket.new(ARGV[0])
13
+ puts("Connected")
14
+ Thread.new() do
15
+ while data = client.receive()
16
+ printf("Received: %p\n", data)
17
+ end
18
+ exit()
19
+ end
20
+ $stdin.each_line() do |line|
21
+ data = line.chomp()
22
+ client.send(data)
23
+ printf("Sent: %p\n", data)
24
+ end
25
+ client.close()
data/lib/web/worker.rb ADDED
@@ -0,0 +1,87 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright 2013 whiteleaf. All rights reserved.
4
+ #
5
+
6
+ require "singleton"
7
+
8
+ class Narou::Worker
9
+ include Singleton
10
+
11
+ attr_reader :size
12
+
13
+ def initialize
14
+ @queue = Queue.new
15
+ @size = 0
16
+ @mutex = Mutex.new
17
+ @worker_thread = nil
18
+ @push_server = Narou::PushServer.instance
19
+ end
20
+
21
+ def running?
22
+ !@worker_thread.!
23
+ end
24
+
25
+ def start
26
+ return if running?
27
+ @worker_thread = Thread.new do
28
+ loop do
29
+ begin
30
+ q = @queue.pop
31
+ q[:block].call
32
+ rescue SystemExit
33
+ rescue Exception => e
34
+ # Workerスレッド内での例外は表示するだけしてスレッドは生かしたままにする
35
+ STDOUT.puts $@.shift + ": #{e.message} (#{e.class})"
36
+ $@.each do |b|
37
+ STDOUT.puts " from #{b}"
38
+ end
39
+ ensure
40
+ if q[:counting]
41
+ countdown
42
+ notification_queue
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ def stop
50
+ @worker_thread.kill if @worker_thread
51
+ @worker_thread = nil
52
+ end
53
+
54
+ #
55
+ # システム用のワーカー追加。内部カウントは増やさない
56
+ #
57
+ def self.push_as_system_worker(&block)
58
+ instance.push(false, &block)
59
+ end
60
+
61
+ def self.push(&block)
62
+ instance.push(&block)
63
+ end
64
+
65
+ def push(counting = true, &block)
66
+ countup if counting
67
+ notification_queue
68
+ @queue.push(block: block, counting: counting)
69
+ end
70
+
71
+ def notification_queue
72
+ @push_server.send_all("notification.queue" => @size)
73
+ end
74
+
75
+ def countup
76
+ @mutex.synchronize do
77
+ @size += 1
78
+ end
79
+ end
80
+
81
+ def countdown
82
+ @mutex.synchronize do
83
+ @size -= 1
84
+ end
85
+ end
86
+ end
87
+
data/narou.gemspec CHANGED
@@ -32,10 +32,38 @@ Gem::Specification.new do |gem|
32
32
  install_message = <<-EOS
33
33
  #{"*" * 79}
34
34
 
35
- 1.7.2 : 2014/11/26
35
+ 2.0.0 : 2014/12/26
36
36
  ------------------
37
+ #### 追加機能
38
+ - `web` コマンドを実装しました。ブラウザベースによるWEB UIを使うことが出来ます
39
+ + `narou web` でWEBサーバを起動し、自動的にブラウザが開きます
40
+ + ブラウザは可能な限り最新を推奨。IEは9以下は動きません
41
+ - `download.use-subdirectory` オプションが追加されました。小説IDの先頭数文字で
42
+ サブフォルダを作成しグループ分けすることで、大量の小説を管理する場合のパフォ
43
+ ーマンス劣化に対応します
44
+ + `narou s download.use-subdirectory=true` として設定出来ます
45
+ + すでに管理済みの小説の保存フォルダは変更されません
46
+ - ダウンロード時やアップデート時の最後に、容量不足等で書籍データを送信出来なか
47
+ ったファイル一覧を表示するようにしました
48
+
49
+ #### 仕様変更
50
+ - 終了コードを整理しました
51
+ + 正常終了時:0
52
+ + 異常終了時:127
53
+ + updateコマンド及びdownloadコマンドで失敗した場合:失敗した小説の数
54
+ + settingコマンド:設定でエラーになった数
55
+ - 見出しリスト.txt を保存しなくなりました
56
+
37
57
  #### Bug Fix
38
- - デバイスの容量不足で送信に失敗した小説が、再度送信されない問題を修正
58
+ - 新規ダウンロードする際にエラーになる場合があったのを修正 #53
59
+ - 小説家になろうのルビ仕様に準拠していない書式があったのを修正
60
+
61
+ |が存在していなく、かつ《 》内に自動ルビ化対象文字以外がある場合に
62
+ ルビ化はされない
63
+
64
+ - 上記修正に伴い、ログ・ホライズン(n8725k)の converter.rb を差し替えました
65
+ - Java がインストールされていない場合でも EPUB ファイルの作成が成功したと表示
66
+ されてしまうのを修正 #55
39
67
 
40
68
 
41
69
  narou コマンドのインストール or アップデートが完了しました。
@@ -54,8 +82,13 @@ narou コマンドのインストール or アップデートが完了しまし
54
82
  gem.files = `git ls-files`.split("\n") << Narou.create_git_commit_version
55
83
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
56
84
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
57
- gem.add_runtime_dependency 'termcolorlight', '~> 1.0', '>= 1.0.0'
85
+ gem.add_runtime_dependency 'termcolorlight', '~> 1.0', '>= 1.1.1'
58
86
  gem.add_runtime_dependency 'rubyzip', '~> 1.1', '>= 1.1.0'
59
87
  gem.add_runtime_dependency 'pony', '~> 1.8'
60
88
  gem.add_runtime_dependency 'diff-lcs', '~> 1.2', '>= 1.2.5'
89
+ gem.add_runtime_dependency 'sinatra', '~> 1.4', '>= 1.4.5'
90
+ gem.add_runtime_dependency 'sinatra-contrib', '~> 1.4', '>= 1.4.2'
91
+ gem.add_runtime_dependency 'sass', '~> 3.4', '>= 3.4.4'
92
+ gem.add_runtime_dependency 'haml', '~> 4.0', '>= 4.0.5'
61
93
  end
94
+
data/narou.rb CHANGED
@@ -6,7 +6,7 @@
6
6
  # Copyright 2013 whiteleaf. All rights reserved.
7
7
  #
8
8
 
9
- $debug = File.exist?(File.join(File.expand_path(File.dirname($0)), "debug"))
9
+ $debug = File.exist?(File.join(File.expand_path(File.dirname(__FILE__)), "debug"))
10
10
  Encoding.default_external = Encoding::UTF_8
11
11
 
12
12
  if ARGV.delete("--time")
@@ -17,8 +17,8 @@ if ARGV.delete("--time")
17
17
  end
18
18
 
19
19
  require_relative "lib/inventory"
20
- display_backtrace = ARGV.delete("--backtrace")
21
- display_backtrace ||= $debug
20
+ $display_backtrace = ARGV.delete("--backtrace")
21
+ $display_backtrace ||= $debug
22
22
  $disable_color = ARGV.delete("--no-color")
23
23
  $disable_color ||= Inventory.load("global_setting", :global)["no-color"]
24
24
 
@@ -30,9 +30,11 @@ rescue_level = $debug ? Exception : StandardError
30
30
 
31
31
  begin
32
32
  CommandLine.run(ARGV.map { |v| v.dup })
33
+ rescue SystemExit => e
34
+ exit e.status
33
35
  rescue rescue_level => e
34
- warn $@.shift + ": #{e.message} (#{e.class})"
35
- if display_backtrace
36
+ warn $@.shift + ": #{e.message.encode(Encoding::UTF_8)} (#{e.class})"
37
+ if $display_backtrace
36
38
  $@.each do |b|
37
39
  warn " from #{b}"
38
40
  end
@@ -40,6 +42,6 @@ rescue rescue_level => e
40
42
  warn " エラーが発生したため終了しました。"
41
43
  warn " 詳細なエラーは --backtrace オプションを付けて再度実行して下さい。"
42
44
  end
43
- exit 1
45
+ exit Narou::EXIT_ERROR_CODE
44
46
  end
45
47
 
@@ -9,6 +9,8 @@
9
9
  converter "n8725k ログ・ホライズン" do
10
10
  def before(io, element_type)
11
11
  super
12
+ io.string.gsub!("ルビ:", "")
13
+ io
12
14
  end
13
15
 
14
16
  def after(io, element_type)
@@ -21,7 +23,6 @@ converter "n8725k ログ・ホライズン" do
21
23
  end
22
24
  end
23
25
  end
24
- data.gsub!("ルビ:", "")
25
26
  data.gsub!("ロエ二", "ロエ2")
26
27
  end
27
28
  io
@@ -5,7 +5,7 @@ whiteleaf
5
5
  [#3字下げ][#ここから中見出し]replace.txtテスト[#ここで中見出し終わり]
6
6
 
7
7
 
8
-  |東京特許許可局局長《とうきょうとっきょきょかきょくきょくちょう》
8
+  |東京特許許可局《とうきょうとっきょきょかきょく》
9
9
 
10
10
   HOGEHOGE
11
11
   BぷよでやるPUYOPUYOは楽しいよ
@@ -4,7 +4,7 @@ whiteleaf
4
4
  [#改ページ]
5
5
  replace.txtテスト
6
6
 
7
- 東京特許許可局局長《ルビ:とうきょうとっきょきょかきょくきょくちょう》
7
+ |東京特許許可局《ルビ:とうきょうとっきょきょかきょく》
8
8
 
9
9
 
10
10
  ほげほげ
@@ -85,7 +85,7 @@ whiteleaf
85
85
   |漢字《ぁんァヶー・AZaz》 NG(ルビ化されず)
86
86
 
87
87
   |漢字《ぁんァヶー・》 OK
88
-  |漢字《ぁんァヶー・﹅》 NG(ルビ化されず)
88
+  漢字※[#始め二重山括弧]ぁんァヶー・﹅※[#終わり二重山括弧] NG(ルビ化されず)
89
89
   |漢字《ぁんァヶー・AZaz》 NG(ルビ化されず)
90
90
   |漢字《ぁんァヶー・AZaz》 NG(ルビ化されず)
91
91
 
@@ -97,6 +97,10 @@ whiteleaf
97
97
   |漢字《かんじ》  OK
98
98
   かんじ(漢字)  NG
99
99
   ※[#縦線]かんじ(漢字)  NG
100
+  漢字(漢字)  NG
101
+  ※[#縦線]かんじ(漢字まじり)  NG
102
+  漢字(漢字まじり)  NG
103
+  漢字(ひらがな漢字)  NG
100
104
 
101
105
   |ルビ《るび》
102
106
   ルビ※[#始め二重山括弧]るび※[#終わり二重山括弧]
@@ -106,6 +110,19 @@ whiteleaf
106
110
   |漢字《かんじ》  OK
107
111
   かんじ※[#始め二重山括弧]漢字※[#終わり二重山括弧]  NG
108
112
   |かんじ《漢字》  OK
113
+  漢字※[#始め二重山括弧]漢字※[#終わり二重山括弧]  NG
114
+  漢字※[#始め二重山括弧]漢字まじり※[#終わり二重山括弧]  NG
115
+  漢字※[#始め二重山括弧]ひらがな漢字※[#終わり二重山括弧]  NG
116
+  |漢字《漢字》  OK
117
+  |漢字《漢字まじり》  OK
118
+  |漢字《ひらがな漢字》  OK
119
+
120
+  境界値チェック
121
+    一二三四五六七八九〇一二三四五六七八九〇
122
+  |漢字《いろはにほへとちりぬるをわかよたれそつね》 二〇文字 OK
123
+  漢字(いろはにほへとちりぬるをわかよたれそつねな) 二一文字 NG
124
+  |漢字《いろはにほへとちりぬるをわかよたれそつね》 二〇文字 OK
125
+  漢字※[#始め二重山括弧]いろはにほへとちりぬるをわかよたれそつねな※[#終わり二重山括弧] 二一文字 NG
109
126
 
110
127
  [#二分アキ]※[#始め二重山括弧]心の声※[#終わり二重山括弧]
111
128
 
@@ -130,6 +130,10 @@ RPG(あーるぴーじー)  OK
130
130
  漢字(かんじ)  OK
131
131
  かんじ(漢字)  NG
132
132
  |かんじ(漢字)  NG
133
+ 漢字(漢字)  NG
134
+ |かんじ(漢字まじり)  NG
135
+ 漢字(漢字まじり)  NG
136
+ 漢字(ひらがな漢字)  NG
133
137
 
134
138
 
135
139
  |ルビ《るび》
@@ -140,6 +144,20 @@ RPG《あーるぴーじー》  OK
140
144
  漢字《かんじ》  OK
141
145
  かんじ《漢字》  NG
142
146
  |かんじ《漢字》  OK
147
+ 漢字《漢字》  NG
148
+ 漢字《漢字まじり》  NG
149
+ 漢字《ひらがな漢字》  NG
150
+ |漢字《漢字》  OK
151
+ |漢字《漢字まじり》  OK
152
+ |漢字《ひらがな漢字》  OK
153
+
154
+
155
+ 境界値チェック
156
+    12345678901234567890
157
+ 漢字(いろはにほへとちりぬるをわかよたれそつね) 20文字 OK
158
+ 漢字(いろはにほへとちりぬるをわかよたれそつねな) 21文字 NG
159
+ 漢字《いろはにほへとちりぬるをわかよたれそつね》 20文字 OK
160
+ 漢字《いろはにほへとちりぬるをわかよたれそつねな》 21文字 NG
143
161
 
144
162
 
145
163
  《心の声》
@@ -0,0 +1,37 @@
1
+ # -*- Encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2013 whiteleaf. All rights reserved.
4
+ #
5
+
6
+ require_relative "../lib/downloader"
7
+
8
+ describe Downloader do
9
+ describe ".create_subdirecotry_name" do
10
+ context "小説家になろうのタイトルが渡された場合" do
11
+ it do
12
+ expect(Downloader.create_subdirecotry_name("n9669bk 無職転生 - 異世界行ったら本気だす -")).to eq "96"
13
+ end
14
+
15
+ it do
16
+ expect(Downloader.create_subdirecotry_name("n8725k ログ・ホライズン")).to eq "87"
17
+ end
18
+ end
19
+
20
+ context "なろう以外のタイトルが渡された場合" do
21
+ it do
22
+ expect(Downloader.create_subdirecotry_name("15041 とある能力の代償")).to eq "15"
23
+ end
24
+
25
+ it do
26
+ expect(Downloader.create_subdirecotry_name("40151 異界渡りの魔法使い")).to eq "40"
27
+ end
28
+ end
29
+
30
+ context "1文字のタイトルが渡された場合" do
31
+ it { expect(Downloader.create_subdirecotry_name("n")).to eq "" }
32
+ it { expect(Downloader.create_subdirecotry_name("1")).to eq "1" }
33
+ it { expect(Downloader.create_subdirecotry_name("a")).to eq "a" }
34
+ end
35
+ end
36
+ end
37
+