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
@@ -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
|
-
|
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.
|
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(
|
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
|
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
|
@@ -85,7 +85,7 @@ whiteleaf
|
|
85
85
|
|漢字《ぁんァヶー・AZaz》 NG(ルビ化されず)
|
86
86
|
|
87
87
|
|漢字《ぁんァヶー・》 OK
|
88
|
-
|
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
|
+
|