epuber 0.7.4 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +10 -2
- data/LICENSE.txt +1 -1
- data/README.md +4 -3
- data/epuber.gemspec +11 -16
- data/lib/epuber/book/contributor.rb +10 -7
- data/lib/epuber/book/file_request.rb +3 -3
- data/lib/epuber/book/target.rb +30 -33
- data/lib/epuber/book/toc_item.rb +2 -4
- data/lib/epuber/book.rb +21 -21
- data/lib/epuber/checker/bookspec_checker.rb +26 -0
- data/lib/epuber/checker/text_checker.rb +16 -7
- data/lib/epuber/checker.rb +16 -2
- data/lib/epuber/checker_transformer_base.rb +3 -6
- data/lib/epuber/command/build.rb +40 -25
- data/lib/epuber/command/from_file.rb +39 -0
- data/lib/epuber/command/init.rb +34 -32
- data/lib/epuber/command/server.rb +3 -3
- data/lib/epuber/command.rb +18 -20
- data/lib/epuber/compiler/compilation_context.rb +10 -8
- data/lib/epuber/compiler/file_database.rb +2 -4
- data/lib/epuber/compiler/file_finders/abstract.rb +36 -26
- data/lib/epuber/compiler/file_finders/imaginary.rb +40 -35
- data/lib/epuber/compiler/file_resolver.rb +79 -89
- data/lib/epuber/compiler/file_stat.rb +4 -4
- data/lib/epuber/compiler/file_types/abstract_file.rb +4 -7
- data/lib/epuber/compiler/file_types/bade_file.rb +20 -15
- data/lib/epuber/compiler/file_types/coffee_script_file.rb +1 -1
- data/lib/epuber/compiler/file_types/css_file.rb +103 -0
- data/lib/epuber/compiler/file_types/generated_file.rb +1 -1
- data/lib/epuber/compiler/file_types/image_file.rb +4 -2
- data/lib/epuber/compiler/file_types/nav_file.rb +0 -1
- data/lib/epuber/compiler/file_types/opf_file.rb +0 -1
- data/lib/epuber/compiler/file_types/source_file.rb +8 -3
- data/lib/epuber/compiler/file_types/stylus_file.rb +4 -3
- data/lib/epuber/compiler/file_types/xhtml_file.rb +67 -13
- data/lib/epuber/compiler/generator.rb +1 -2
- data/lib/epuber/compiler/meta_inf_generator.rb +1 -1
- data/lib/epuber/compiler/nav_generator.rb +10 -11
- data/lib/epuber/compiler/opf_generator.rb +26 -27
- data/lib/epuber/compiler/problem.rb +12 -21
- data/lib/epuber/compiler/xhtml_processor.rb +63 -32
- data/lib/epuber/compiler.rb +77 -25
- data/lib/epuber/config.rb +16 -10
- data/lib/epuber/dsl/attribute.rb +17 -18
- data/lib/epuber/dsl/attribute_support.rb +7 -7
- data/lib/epuber/dsl/object.rb +19 -17
- data/lib/epuber/dsl/tree_object.rb +2 -3
- data/lib/epuber/epubcheck.rb +15 -0
- data/lib/epuber/from_file/bookspec_generator.rb +371 -0
- data/lib/epuber/from_file/encryption_handler.rb +146 -0
- data/lib/epuber/from_file/from_file_executor.rb +140 -0
- data/lib/epuber/from_file/nav_file.rb +163 -0
- data/lib/epuber/from_file/opf_file.rb +219 -0
- data/lib/epuber/helper.rb +0 -1
- data/lib/epuber/lockfile.rb +7 -9
- data/lib/epuber/plugin.rb +2 -3
- data/lib/epuber/ruby_extensions/match_data.rb +1 -1
- data/lib/epuber/ruby_extensions/thread.rb +1 -0
- data/lib/epuber/server/base.styl +0 -1
- data/lib/epuber/server/basic.styl +1 -30
- data/lib/epuber/server/handlers.rb +1 -1
- data/lib/epuber/server.rb +81 -80
- data/lib/epuber/third_party/bower.rb +5 -5
- data/lib/epuber/transformer/book_transformer.rb +108 -0
- data/lib/epuber/transformer/text_transformer.rb +4 -2
- data/lib/epuber/transformer.rb +4 -2
- data/lib/epuber/user_interface.rb +49 -38
- data/lib/epuber/vendor/hash_binding.rb +9 -2
- data/lib/epuber/vendor/ruby_templater.rb +4 -8
- data/lib/epuber/vendor/version.rb +12 -12
- data/lib/epuber/version.rb +1 -1
- metadata +79 -100
- data/lib/epuber/server/fonts/AvenirNext/AvenirNext-Bold.ttf +0 -0
- data/lib/epuber/server/fonts/AvenirNext/AvenirNext-BoldItalic.ttf +0 -0
- data/lib/epuber/server/fonts/AvenirNext/AvenirNext-Italic.ttf +0 -0
- data/lib/epuber/server/fonts/AvenirNext/AvenirNext-Regular.ttf +0 -0
data/lib/epuber/command/build.rb
CHANGED
@@ -4,6 +4,7 @@ require 'fileutils'
|
|
4
4
|
require 'os'
|
5
5
|
|
6
6
|
require_relative '../command'
|
7
|
+
require_relative '../epubcheck'
|
7
8
|
|
8
9
|
module Epuber
|
9
10
|
class Command
|
@@ -25,7 +26,12 @@ module Epuber
|
|
25
26
|
].concat(super)
|
26
27
|
end
|
27
28
|
|
28
|
-
#
|
29
|
+
# To resolve problem with `compile` treating as subcommand
|
30
|
+
def self.subcommands
|
31
|
+
[]
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param [CLAide::ARGV] argv
|
29
35
|
#
|
30
36
|
def initialize(argv)
|
31
37
|
@targets_names = argv.arguments!
|
@@ -50,48 +56,47 @@ module Epuber
|
|
50
56
|
def run
|
51
57
|
super
|
52
58
|
|
53
|
-
puts "
|
59
|
+
UI.puts "building book `#{Config.instance.pretty_path_from_project(book.file_path)}`"
|
54
60
|
|
55
61
|
if @release_version
|
56
62
|
# Remove all previous versions of compiled files
|
57
|
-
|
58
|
-
build_path = Epuber::Config.instance.release_build_path(target)
|
59
|
-
|
60
|
-
if ::File.directory?(build_path)
|
61
|
-
FileUtils.remove_dir(build_path, true)
|
62
|
-
end
|
63
|
-
end
|
63
|
+
cleanup_build_folders
|
64
64
|
|
65
65
|
# Build all targets to always clean directory
|
66
66
|
targets.each do |target|
|
67
|
+
Epuber::Config.instance.release_build = true
|
68
|
+
|
67
69
|
compiler = Epuber::Compiler.new(book, target)
|
68
70
|
build_path = Epuber::Config.instance.release_build_path(target)
|
69
71
|
compiler.compile(build_path, check: true, write: @should_write,
|
70
|
-
|
71
|
-
|
72
|
+
release: true, verbose: verbose?,
|
73
|
+
use_cache: false)
|
72
74
|
|
73
75
|
archive_name = compiler.epub_name
|
74
76
|
|
75
|
-
if ::File.exist?(archive_name)
|
76
|
-
FileUtils.remove_file(archive_name)
|
77
|
-
end
|
77
|
+
FileUtils.remove_file(archive_name) if ::File.exist?(archive_name)
|
78
78
|
|
79
79
|
archive_path = compiler.archive(archive_name)
|
80
80
|
|
81
|
-
|
81
|
+
Epubcheck.check(archive_path)
|
82
82
|
|
83
|
-
convert_epub_to_mobi(archive_path, ::File.basename(archive_path, '.epub')
|
83
|
+
convert_epub_to_mobi(archive_path, "#{::File.basename(archive_path, '.epub')}.mobi") if target.create_mobi
|
84
|
+
|
85
|
+
Epuber::Config.instance.release_build = false
|
84
86
|
end
|
87
|
+
|
88
|
+
# Build all targets to always clean directory
|
85
89
|
else
|
86
90
|
targets.each do |target|
|
87
91
|
compiler = Epuber::Compiler.new(book, target)
|
88
92
|
build_path = Epuber::Config.instance.build_path(target)
|
89
|
-
compiler.compile(build_path, check: @should_check, write: @should_write, verbose: verbose?,
|
93
|
+
compiler.compile(build_path, check: @should_check, write: @should_write, verbose: verbose?,
|
94
|
+
use_cache: @use_cache)
|
90
95
|
archive_path = compiler.archive(configuration_suffix: 'debug')
|
91
96
|
|
92
|
-
|
97
|
+
Epubcheck.check(archive_path) if @should_check
|
93
98
|
|
94
|
-
convert_epub_to_mobi(archive_path, ::File.basename(archive_path, '.epub')
|
99
|
+
convert_epub_to_mobi(archive_path, "#{::File.basename(archive_path, '.epub')}.mobi") if target.create_mobi
|
95
100
|
end
|
96
101
|
end
|
97
102
|
|
@@ -103,7 +108,7 @@ module Epuber
|
|
103
108
|
# @return [Array<Epuber::Book::Target>]
|
104
109
|
#
|
105
110
|
def targets
|
106
|
-
@targets ||=
|
111
|
+
@targets ||= begin
|
107
112
|
targets = @targets_names
|
108
113
|
|
109
114
|
# when the list of targets is nil pick all available targets
|
@@ -112,7 +117,7 @@ module Epuber
|
|
112
117
|
else
|
113
118
|
targets.map { |target_name| book.target_named(target_name) }
|
114
119
|
end
|
115
|
-
|
120
|
+
end
|
116
121
|
end
|
117
122
|
|
118
123
|
def verify_all_targets_exists!
|
@@ -121,9 +126,9 @@ module Epuber
|
|
121
126
|
end
|
122
127
|
|
123
128
|
def validate_dir(path)
|
124
|
-
|
125
|
-
|
126
|
-
|
129
|
+
return unless ::File.directory?(path)
|
130
|
+
|
131
|
+
path
|
127
132
|
end
|
128
133
|
|
129
134
|
def find_calibre_app
|
@@ -141,7 +146,9 @@ module Epuber
|
|
141
146
|
::File.join(find_calibre_app, 'Contents/MacOS/ebook-convert')
|
142
147
|
elsif OS.linux?
|
143
148
|
script_path = '/usr/bin/ebook-convert'
|
144
|
-
|
149
|
+
unless ::File.executable?(script_path)
|
150
|
+
UI.error!("Can't find ebook-convert in folder /usr/bin to convert EPUB to MOBI.")
|
151
|
+
end
|
145
152
|
script_path
|
146
153
|
else
|
147
154
|
UI.error!('Unsupported OS to convert EPUB to MOBI.')
|
@@ -151,6 +158,14 @@ module Epuber
|
|
151
158
|
def convert_epub_to_mobi(epub_path, mobi_path)
|
152
159
|
system(find_calibre_convert_file, epub_path, mobi_path)
|
153
160
|
end
|
161
|
+
|
162
|
+
def cleanup_build_folders
|
163
|
+
targets.each do |target|
|
164
|
+
build_path = Epuber::Config.instance.release_build_path(target)
|
165
|
+
|
166
|
+
FileUtils.remove_dir(build_path, true) if ::File.directory?(build_path)
|
167
|
+
end
|
168
|
+
end
|
154
169
|
end
|
155
170
|
end
|
156
171
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../command'
|
4
|
+
require_relative '../from_file/from_file_executor'
|
5
|
+
|
6
|
+
module Epuber
|
7
|
+
class Command
|
8
|
+
class FromFile < Command
|
9
|
+
self.summary = 'Initialize current folder to use it as Epuber project from existing EPUB file'
|
10
|
+
self.arguments = [
|
11
|
+
CLAide::Argument.new('EPUB_FILE', true),
|
12
|
+
]
|
13
|
+
|
14
|
+
# @param [CLAide::ARGV] argv
|
15
|
+
#
|
16
|
+
def initialize(argv)
|
17
|
+
@filepath = argv.arguments!.first
|
18
|
+
|
19
|
+
super(argv)
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate!
|
23
|
+
super
|
24
|
+
|
25
|
+
help! 'You must specify path to existing EPUB file' if @filepath.nil?
|
26
|
+
help! "File #{@filepath} doesn't exists" unless File.exist?(@filepath)
|
27
|
+
|
28
|
+
existing = Dir.glob('*.bookspec')
|
29
|
+
help! "Can't reinit this folder, #{existing.first} already exists." unless existing.empty?
|
30
|
+
end
|
31
|
+
|
32
|
+
def run
|
33
|
+
super
|
34
|
+
|
35
|
+
FromFileExecutor.new(@filepath).run
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/epuber/command/init.rb
CHANGED
@@ -11,10 +11,10 @@ module Epuber
|
|
11
11
|
class Init < Command
|
12
12
|
self.summary = 'Initialize current folder to use it as Epuber project'
|
13
13
|
self.arguments = [
|
14
|
-
CLAide::Argument.new('PROJECT_NAME', false
|
14
|
+
CLAide::Argument.new('PROJECT_NAME', false),
|
15
15
|
]
|
16
16
|
|
17
|
-
# @param
|
17
|
+
# @param [CLAide::ARGV] argv
|
18
18
|
#
|
19
19
|
def initialize(argv)
|
20
20
|
@book_name = argv.arguments!.first
|
@@ -23,6 +23,8 @@ module Epuber
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def validate!
|
26
|
+
super
|
27
|
+
|
26
28
|
help! 'You must specify identifier-like name of the book as first argument' if @book_name.nil?
|
27
29
|
|
28
30
|
existing = Dir.glob('*.bookspec')
|
@@ -50,14 +52,14 @@ module Epuber
|
|
50
52
|
private
|
51
53
|
|
52
54
|
def print_good_bye(book_id)
|
53
|
-
puts
|
54
|
-
Project initialized, please review #{book_id}.bookspec file, remove comments and fill some attributes like book title.
|
55
|
-
|
55
|
+
UI.puts <<~TEXT.ansi.green
|
56
|
+
Project initialized, please review #{book_id}.bookspec file, remove comments and fill some attributes like book title.
|
57
|
+
TEXT
|
56
58
|
end
|
57
59
|
|
58
60
|
# Creates <book-id>.bookspec file from template
|
59
61
|
#
|
60
|
-
# @param
|
62
|
+
# @param [String] book_id
|
61
63
|
#
|
62
64
|
# @return [void]
|
63
65
|
#
|
@@ -71,21 +73,23 @@ END
|
|
71
73
|
|
72
74
|
# Creates <book-id>.sublime-project
|
73
75
|
#
|
74
|
-
# @param
|
76
|
+
# @param [String] book_id
|
75
77
|
#
|
76
78
|
# @return [void]
|
77
79
|
#
|
78
80
|
def write_sublime_project(book_id)
|
79
|
-
text =
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
81
|
+
text = <<~JSON
|
82
|
+
{
|
83
|
+
"folders": [
|
84
|
+
{
|
85
|
+
"follow_symlinks": true,
|
86
|
+
"path": ".",
|
87
|
+
"folder_exclude_patterns": [".epuber"],
|
88
|
+
"file_exclude_patterns": ["*.epub"]
|
89
|
+
}
|
90
|
+
]
|
91
|
+
}
|
92
|
+
JSON
|
89
93
|
|
90
94
|
write("#{book_id}.sublime-project", text)
|
91
95
|
end
|
@@ -95,7 +99,7 @@ END
|
|
95
99
|
# @return [void]
|
96
100
|
#
|
97
101
|
def write_gitignore
|
98
|
-
append_new_lines('.gitignore', <<~
|
102
|
+
append_new_lines('.gitignore', <<~TEXT)
|
99
103
|
# This is generated with `epuber init`
|
100
104
|
*.epub
|
101
105
|
*.mobi
|
@@ -104,29 +108,27 @@ END
|
|
104
108
|
.epuber/release_build/
|
105
109
|
.epuber/build_cache/
|
106
110
|
.epuber/metadata/
|
107
|
-
|
108
|
-
)
|
111
|
+
TEXT
|
109
112
|
end
|
110
113
|
|
111
114
|
def write_default_style(book_id)
|
112
|
-
write("styles/#{book_id}.styl", <<~
|
115
|
+
write("styles/#{book_id}.styl", <<~STYLUS)
|
113
116
|
// This is generated with `epuber init` script.
|
114
|
-
|
115
|
-
)
|
117
|
+
STYLUS
|
116
118
|
end
|
117
119
|
|
118
|
-
# @param
|
119
|
-
# @param
|
120
|
+
# @param [String] string text to file
|
121
|
+
# @param [String] file_path path to file
|
120
122
|
#
|
121
123
|
# @return [void]
|
122
124
|
#
|
123
125
|
def write(file_path, string)
|
124
126
|
File.write(file_path, string)
|
125
|
-
puts " #{'create'.ansi.green} #{file_path}"
|
127
|
+
UI.puts " #{'create'.ansi.green} #{file_path}"
|
126
128
|
end
|
127
129
|
|
128
|
-
# @param
|
129
|
-
# @param
|
130
|
+
# @param [String] string text to file
|
131
|
+
# @param [String] file_path path to file
|
130
132
|
#
|
131
133
|
# @return [void]
|
132
134
|
#
|
@@ -146,7 +148,7 @@ END
|
|
146
148
|
existing_content << "\n"
|
147
149
|
|
148
150
|
File.write(file_path, existing_content)
|
149
|
-
puts " #{'update'.ansi.green} #{file_path}"
|
151
|
+
UI.puts " #{'update'.ansi.green} #{file_path}"
|
150
152
|
end
|
151
153
|
|
152
154
|
# @param [String] dir_path path to dir
|
@@ -155,10 +157,10 @@ END
|
|
155
157
|
#
|
156
158
|
def create_folder(dir_path)
|
157
159
|
FileUtils.mkdir_p(dir_path)
|
158
|
-
puts " #{'create'.ansi.green} #{dir_path}/"
|
160
|
+
UI.puts " #{'create'.ansi.green} #{dir_path}/"
|
159
161
|
end
|
160
162
|
|
161
|
-
# @param
|
163
|
+
# @param [String] text
|
162
164
|
#
|
163
165
|
# @return [String] returned text without new line
|
164
166
|
#
|
@@ -167,7 +169,7 @@ END
|
|
167
169
|
result = $stdin.gets.chomp
|
168
170
|
|
169
171
|
while result.empty?
|
170
|
-
puts 'Value cannot be empty, please fill it!'.ansi.red
|
172
|
+
UI.puts 'Value cannot be empty, please fill it!'.ansi.red
|
171
173
|
print text
|
172
174
|
result = $stdin.gets.chomp
|
173
175
|
end
|
@@ -13,11 +13,11 @@ module Epuber
|
|
13
13
|
|
14
14
|
def self.options
|
15
15
|
[
|
16
|
-
['--open',
|
16
|
+
['--open', 'Opens the web page in default web browser, working only on OS X'],
|
17
17
|
].concat(super)
|
18
18
|
end
|
19
19
|
|
20
|
-
# @param
|
20
|
+
# @param [CLAide::ARGV] args
|
21
21
|
#
|
22
22
|
def initialize(args)
|
23
23
|
super
|
@@ -51,7 +51,7 @@ module Epuber
|
|
51
51
|
if @open_web_browser
|
52
52
|
system "open #{uri}"
|
53
53
|
else
|
54
|
-
puts 'Web browser can be automatically opened by adding --open flag, see --help'
|
54
|
+
UI.puts 'Web browser can be automatically opened by adding --open flag, see --help'
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
data/lib/epuber/command.rb
CHANGED
@@ -16,26 +16,24 @@ module Epuber
|
|
16
16
|
require_relative 'command/compile'
|
17
17
|
require_relative 'command/init'
|
18
18
|
require_relative 'command/server'
|
19
|
+
require_relative 'command/from_file'
|
19
20
|
|
20
21
|
self.abstract_command = true
|
21
22
|
self.command = 'epuber'
|
22
23
|
self.version = VERSION
|
23
24
|
self.description = 'Epuber, easy creating and maintaining e-book.'
|
24
|
-
self.plugin_prefixes = plugin_prefixes + %w
|
25
|
+
self.plugin_prefixes = plugin_prefixes + %w[epuber]
|
25
26
|
|
26
27
|
def self.run(argv = [])
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
UI.current_command = nil
|
38
|
-
end
|
28
|
+
UI.current_command = self
|
29
|
+
super
|
30
|
+
UI.current_command = nil
|
31
|
+
rescue Interrupt
|
32
|
+
UI.error('[!] Cancelled')
|
33
|
+
rescue StandardError => e
|
34
|
+
UI.error!(e)
|
35
|
+
|
36
|
+
UI.current_command = nil
|
39
37
|
end
|
40
38
|
|
41
39
|
def validate!
|
@@ -70,18 +68,18 @@ module Epuber
|
|
70
68
|
end
|
71
69
|
|
72
70
|
def write_lockfile
|
73
|
-
|
74
|
-
|
75
|
-
|
71
|
+
return if Epuber::Config.test?
|
72
|
+
|
73
|
+
Epuber::Config.instance.save_lockfile
|
76
74
|
end
|
77
75
|
|
78
76
|
def pre_build_checks
|
79
77
|
Config.instance.warn_for_outdated_versions!
|
80
78
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
79
|
+
return unless !Config.instance.same_version_as_last_run? && File.exist?(Config.instance.working_path)
|
80
|
+
|
81
|
+
UI.warning('Using different version of Epuber or Bade, removing all build caches')
|
82
|
+
Config.instance.remove_build_caches
|
85
83
|
end
|
86
84
|
end
|
87
85
|
end
|
@@ -32,15 +32,13 @@ module Epuber
|
|
32
32
|
#
|
33
33
|
def plugins
|
34
34
|
@plugins ||= @target.plugins.map do |path|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
file_resolver.add_file(file)
|
39
|
-
end
|
40
|
-
plugin
|
41
|
-
rescue LoadError
|
42
|
-
UI.error "Can't find plugin at path #{path}"
|
35
|
+
plugin = Plugin.new(path)
|
36
|
+
plugin.files.each do |file|
|
37
|
+
file_resolver.add_file(file)
|
43
38
|
end
|
39
|
+
plugin
|
40
|
+
rescue LoadError
|
41
|
+
UI.error "Can't find plugin at path #{path}"
|
44
42
|
end.compact
|
45
43
|
end
|
46
44
|
|
@@ -100,6 +98,10 @@ module Epuber
|
|
100
98
|
use_cache
|
101
99
|
end
|
102
100
|
|
101
|
+
def release_build?
|
102
|
+
release_build
|
103
|
+
end
|
104
|
+
|
103
105
|
def initialize(book, target)
|
104
106
|
@book = book
|
105
107
|
@target = target
|
@@ -7,7 +7,6 @@ module Epuber
|
|
7
7
|
require_relative 'file_stat'
|
8
8
|
|
9
9
|
class FileDatabase
|
10
|
-
|
11
10
|
# @return [Hash<String, Epuber::Compiler::FileStat>]
|
12
11
|
#
|
13
12
|
attr_accessor :all_files
|
@@ -66,7 +65,7 @@ module Epuber
|
|
66
65
|
end
|
67
66
|
|
68
67
|
def update_all_metadata
|
69
|
-
@all_files.
|
68
|
+
@all_files.each_key do |file_path|
|
70
69
|
update_metadata(file_path)
|
71
70
|
end
|
72
71
|
end
|
@@ -99,7 +98,7 @@ module Epuber
|
|
99
98
|
to_remove = @all_files.keys - file_paths
|
100
99
|
to_remove.each { |key| @all_files.delete(key) }
|
101
100
|
|
102
|
-
@all_files.
|
101
|
+
@all_files.each_value do |stat|
|
103
102
|
_cleanup_stat_dependency_list(file_paths, stat)
|
104
103
|
end
|
105
104
|
end
|
@@ -130,7 +129,6 @@ module Epuber
|
|
130
129
|
_cleanup_stat_dependency_list(file_paths, next_stat)
|
131
130
|
end
|
132
131
|
end
|
133
|
-
|
134
132
|
end
|
135
133
|
end
|
136
134
|
end
|
@@ -16,6 +16,8 @@ module Epuber
|
|
16
16
|
# @param [String] context_path
|
17
17
|
#
|
18
18
|
def initialize(pattern, context_path)
|
19
|
+
super()
|
20
|
+
|
19
21
|
@pattern = pattern
|
20
22
|
@context_path = context_path
|
21
23
|
end
|
@@ -48,6 +50,8 @@ module Epuber
|
|
48
50
|
# @param [Array<String>] files_paths list of founded files
|
49
51
|
#
|
50
52
|
def initialize(pattern, groups, context_path, files_paths)
|
53
|
+
super()
|
54
|
+
|
51
55
|
@pattern = pattern
|
52
56
|
@groups = Array(groups)
|
53
57
|
@context_path = context_path
|
@@ -61,16 +65,16 @@ module Epuber
|
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
64
|
-
BINARY_EXTENSIONS = %w
|
65
|
-
STATIC_EXTENSIONS = BINARY_EXTENSIONS + %w
|
68
|
+
BINARY_EXTENSIONS = %w[.png .jpeg .jpg .otf .ttf].freeze
|
69
|
+
STATIC_EXTENSIONS = BINARY_EXTENSIONS + %w[.css .js]
|
66
70
|
|
67
71
|
GROUP_EXTENSIONS = {
|
68
|
-
text:
|
69
|
-
image:
|
70
|
-
font:
|
71
|
-
style:
|
72
|
-
script: %w
|
73
|
-
}
|
72
|
+
text: %w[.xhtml .html .bade],
|
73
|
+
image: %w[.png .jpg .jpeg],
|
74
|
+
font: %w[.otf .ttf],
|
75
|
+
style: %w[.css .styl],
|
76
|
+
script: %w[.js .coffee],
|
77
|
+
}.freeze
|
74
78
|
|
75
79
|
EXTENSIONS_RENAME = {
|
76
80
|
'.styl' => '.css',
|
@@ -78,10 +82,9 @@ module Epuber
|
|
78
82
|
'.bade' => '.xhtml',
|
79
83
|
|
80
84
|
'.coffee' => '.js',
|
81
|
-
}
|
85
|
+
}.freeze
|
82
86
|
|
83
87
|
class Abstract
|
84
|
-
|
85
88
|
# @return [String] path where should look for source files
|
86
89
|
#
|
87
90
|
attr_reader :source_path
|
@@ -99,7 +102,6 @@ module Epuber
|
|
99
102
|
@ignored_patterns = []
|
100
103
|
end
|
101
104
|
|
102
|
-
|
103
105
|
# @param [Array<Symbol> | Symbol] groups
|
104
106
|
#
|
105
107
|
def assert_one_file(files, pattern: nil, groups: nil, context_path: nil)
|
@@ -113,7 +115,8 @@ module Epuber
|
|
113
115
|
# When it founds too many (more than two) it will raise MultipleFilesFoundError
|
114
116
|
#
|
115
117
|
# @param [String] pattern pattern of the desired files
|
116
|
-
# @param [Array<Symbol> | Symbol] groups list of group names, nil or empty array for all groups, for valid
|
118
|
+
# @param [Array<Symbol> | Symbol] groups list of group names, nil or empty array for all groups, for valid
|
119
|
+
# values see GROUP_EXTENSIONS
|
117
120
|
# @param [String] context_path path for root of searching, it is also defines start folder of relative path
|
118
121
|
#
|
119
122
|
# @return [Array<String>] list of founded files
|
@@ -128,7 +131,8 @@ module Epuber
|
|
128
131
|
# #source_path and after that it tries to search recursively from #source_path.
|
129
132
|
#
|
130
133
|
# @param [String] pattern pattern of the desired files
|
131
|
-
# @param [Array<Symbol>] groups list of group names, nil or empty array for all groups, for valid values see
|
134
|
+
# @param [Array<Symbol>] groups list of group names, nil or empty array for all groups, for valid values see
|
135
|
+
# GROUP_EXTENSIONS
|
132
136
|
# @param [String] context_path path for root of searching, it is also defines start folder of relative path
|
133
137
|
#
|
134
138
|
# @return [Array<String>] list of founded files
|
@@ -141,7 +145,9 @@ module Epuber
|
|
141
145
|
searching_path = ::File.expand_path(context_path, @source_path_abs)
|
142
146
|
|
143
147
|
unless searching_path.start_with?(@source_path_abs)
|
144
|
-
raise
|
148
|
+
raise <<~ERROR
|
149
|
+
You can't search from folder (#{searching_path}) that is not sub folder of the source_path (#{source_path}) expanded to (#{@source_path_abs}).
|
150
|
+
ERROR
|
145
151
|
end
|
146
152
|
|
147
153
|
files = __find_files(pattern, groups, searching_path)
|
@@ -152,7 +158,7 @@ module Epuber
|
|
152
158
|
end
|
153
159
|
|
154
160
|
if files.empty? && search_everywhere && !pattern.start_with?('**')
|
155
|
-
files = __find_files(
|
161
|
+
files = __find_files("**/#{pattern}", groups, @source_path_abs, searching_path || @source_path_abs)
|
156
162
|
end
|
157
163
|
|
158
164
|
files
|
@@ -161,13 +167,14 @@ module Epuber
|
|
161
167
|
# Looks for all files from #source_path recursively
|
162
168
|
#
|
163
169
|
# @param [String] pattern pattern of the desired files
|
164
|
-
# @param [Array<Symbol>] groups list of group names, nil or empty array for all groups, for valid values see
|
170
|
+
# @param [Array<Symbol>] groups list of group names, nil or empty array for all groups, for valid values see
|
171
|
+
# GROUP_EXTENSIONS
|
165
172
|
# @param [String] context_path path for root of searching, it is also defines start folder of relative path
|
166
173
|
#
|
167
174
|
# @return [Array<String>] list of founded files
|
168
175
|
#
|
169
176
|
def find_all(pattern, groups: nil, context_path: @source_path_abs)
|
170
|
-
__find_files(
|
177
|
+
__find_files("**/#{pattern}", groups, context_path)
|
171
178
|
end
|
172
179
|
|
173
180
|
# @param [Array<String>] paths list of file paths
|
@@ -187,7 +194,7 @@ module Epuber
|
|
187
194
|
end.flatten
|
188
195
|
|
189
196
|
paths.select do |file_path|
|
190
|
-
valid_extensions.include?(::File.extname(file_path))
|
197
|
+
valid_extensions.include?(::File.extname(file_path).downcase)
|
191
198
|
end
|
192
199
|
end
|
193
200
|
end
|
@@ -209,7 +216,8 @@ module Epuber
|
|
209
216
|
# Looks for files at given context path, if there is no file, it will try again with pattern for any extension
|
210
217
|
#
|
211
218
|
# @param [String] pattern pattern of the desired files
|
212
|
-
# @param [Array<Symbol>] groups list of group names, nil or empty array for all groups, for valid values see
|
219
|
+
# @param [Array<Symbol>] groups list of group names, nil or empty array for all groups, for valid values see
|
220
|
+
# GROUP_EXTENSIONS
|
213
221
|
# @param [String] context_path path for root of searching, it is also defines start folder of relative path
|
214
222
|
# @param [String] orig_context_path original context path, wo it will work nicely with iterative searching
|
215
223
|
#
|
@@ -222,23 +230,25 @@ module Epuber
|
|
222
230
|
files = __core_find_files(pattern, groups, context_path, orig_context_path)
|
223
231
|
|
224
232
|
# try to find files with any extension
|
225
|
-
files = __core_find_files(pattern
|
233
|
+
files = __core_find_files("#{pattern}.*", groups, context_path, orig_context_path) if files.empty?
|
226
234
|
|
227
235
|
files
|
228
236
|
end
|
229
237
|
|
230
|
-
# Core method for finding files, it only search for files, filter by input groups and map the final paths to
|
238
|
+
# Core method for finding files, it only search for files, filter by input groups and map the final paths to
|
239
|
+
# pretty relative paths from context_path
|
231
240
|
#
|
232
241
|
# @param [String] pattern pattern of the desired files
|
233
|
-
# @param [Array<Symbol>] groups list of group names, nil or empty array for all groups, for valid values see
|
242
|
+
# @param [Array<Symbol>] groups list of group names, nil or empty array for all groups, for valid values see
|
243
|
+
# GROUP_EXTENSIONS
|
234
244
|
# @param [String] context_path path for root of searching, it is also defines start folder of relative path
|
235
245
|
# @param [String] orig_context_path original context path, wo it will work nicely with iterative searching
|
236
246
|
#
|
237
247
|
# @return [Array<String>] list of founded files
|
238
248
|
#
|
239
249
|
def __core_find_files(pattern, groups, context_path, orig_context_path = context_path)
|
240
|
-
context_path =
|
241
|
-
orig_context_path =
|
250
|
+
context_path = File.dirname(context_path) if __core_file?(context_path)
|
251
|
+
orig_context_path = File.dirname(orig_context_path) if __core_file?(orig_context_path)
|
242
252
|
|
243
253
|
full_pattern = File.expand_path(pattern, context_path)
|
244
254
|
file_paths = __core_find_files_from_pattern(full_pattern).map(&:unicode_normalize)
|
@@ -258,11 +268,11 @@ module Epuber
|
|
258
268
|
self.class.relative_paths_from(file_paths, orig_context_path)
|
259
269
|
end
|
260
270
|
|
261
|
-
def __core_find_files_from_pattern(
|
271
|
+
def __core_find_files_from_pattern(_pattern)
|
262
272
|
raise 'Implement this in subclass'
|
263
273
|
end
|
264
274
|
|
265
|
-
def __core_file?(
|
275
|
+
def __core_file?(_path)
|
266
276
|
raise 'Implement this in subclass'
|
267
277
|
end
|
268
278
|
end
|