epuber 0.7.4 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|