epuber 0.7.4 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -2
- data/README.md +2 -1
- data/epuber.gemspec +10 -12
- data/lib/epuber/book/contributor.rb +0 -1
- data/lib/epuber/book/file_request.rb +1 -1
- data/lib/epuber/book/target.rb +20 -23
- data/lib/epuber/book/toc_item.rb +2 -4
- data/lib/epuber/book.rb +19 -19
- data/lib/epuber/checker/bookspec_checker.rb +26 -0
- data/lib/epuber/checker/text_checker.rb +2 -1
- data/lib/epuber/checker.rb +16 -2
- data/lib/epuber/checker_transformer_base.rb +2 -5
- data/lib/epuber/command/build.rb +34 -24
- data/lib/epuber/command/init.rb +23 -23
- data/lib/epuber/command/server.rb +2 -2
- data/lib/epuber/command.rb +17 -20
- data/lib/epuber/compiler/compilation_context.rb +10 -8
- data/lib/epuber/compiler/file_database.rb +0 -2
- data/lib/epuber/compiler/file_finders/abstract.rb +33 -23
- data/lib/epuber/compiler/file_finders/imaginary.rb +40 -35
- data/lib/epuber/compiler/file_resolver.rb +77 -88
- data/lib/epuber/compiler/file_stat.rb +4 -4
- data/lib/epuber/compiler/file_types/abstract_file.rb +3 -4
- data/lib/epuber/compiler/file_types/bade_file.rb +12 -7
- data/lib/epuber/compiler/file_types/coffee_script_file.rb +1 -1
- 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/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 +5 -6
- data/lib/epuber/compiler/opf_generator.rb +22 -23
- data/lib/epuber/compiler/problem.rb +12 -21
- data/lib/epuber/compiler/xhtml_processor.rb +61 -31
- data/lib/epuber/compiler.rb +66 -19
- data/lib/epuber/config.rb +13 -7
- data/lib/epuber/dsl/attribute.rb +16 -17
- data/lib/epuber/dsl/attribute_support.rb +3 -3
- data/lib/epuber/dsl/object.rb +17 -15
- data/lib/epuber/dsl/tree_object.rb +2 -3
- data/lib/epuber/epubcheck.rb +15 -0
- data/lib/epuber/helper.rb +0 -1
- data/lib/epuber/lockfile.rb +7 -9
- data/lib/epuber/plugin.rb +1 -2
- 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 +67 -66
- data/lib/epuber/third_party/bower.rb +5 -5
- data/lib/epuber/transformer/text_transformer.rb +4 -2
- data/lib/epuber/transformer.rb +2 -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 +1 -5
- data/lib/epuber/vendor/version.rb +10 -10
- data/lib/epuber/version.rb +1 -1
- metadata +67 -69
- 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/dsl/object.rb
CHANGED
@@ -49,11 +49,10 @@ module Epuber
|
|
49
49
|
|
50
50
|
next unless attr.required? && value.nil?
|
51
51
|
|
52
|
-
if attr.singularize?
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
52
|
+
raise ValidationError, "missing required attribute `#{key.to_s.singularize}|#{key}`" if attr.singularize?
|
53
|
+
|
54
|
+
|
55
|
+
raise ValidationError, "missing required attribute `#{key}`"
|
57
56
|
end
|
58
57
|
end
|
59
58
|
|
@@ -74,21 +73,16 @@ module Epuber
|
|
74
73
|
# @return [Self]
|
75
74
|
#
|
76
75
|
def self.from_string(string, file_path = nil)
|
77
|
-
# rubocop:disable Lint/Eval
|
78
76
|
obj = if file_path
|
79
|
-
eval(string, nil, file_path)
|
77
|
+
eval(string, nil, file_path) # rubocop:disable Security/Eval
|
80
78
|
else
|
81
|
-
eval(string)
|
79
|
+
eval(string) # rubocop:disable Security/Eval
|
82
80
|
end
|
83
|
-
# rubocop:enable Lint/Eval
|
84
81
|
|
85
82
|
unless obj.is_a?(self)
|
86
83
|
msg = "Invalid object #{obj.class}, expected object of class #{self}"
|
87
84
|
|
88
|
-
if file_path
|
89
|
-
msg += ", loaded from file #{file_path}"
|
90
|
-
|
91
|
-
end
|
85
|
+
msg += ", loaded from file #{file_path}" if file_path
|
92
86
|
|
93
87
|
raise StandardError, msg
|
94
88
|
end
|
@@ -121,6 +115,10 @@ module Epuber
|
|
121
115
|
#
|
122
116
|
attr_accessor :attributes_values
|
123
117
|
|
118
|
+
def respond_to_missing?(name, include_private = false)
|
119
|
+
@attributes_values.key?(name) || super
|
120
|
+
end
|
121
|
+
|
124
122
|
# Raise exception when there is used some unknown method or attribute
|
125
123
|
#
|
126
124
|
# This is just for creating better message in raised exception
|
@@ -129,9 +127,13 @@ module Epuber
|
|
129
127
|
#
|
130
128
|
def method_missing(name, *args)
|
131
129
|
if /([^=]+)=?/ =~ name
|
132
|
-
attr_name =
|
130
|
+
attr_name = ::Regexp.last_match(1)
|
133
131
|
location = caller_locations.first
|
134
|
-
|
132
|
+
message = <<~MSG
|
133
|
+
Unknown attribute or method `#{attr_name}` for class `#{self.class}` in file `#{location.path}:#{location.lineno}`
|
134
|
+
MSG
|
135
|
+
|
136
|
+
raise NameError, message
|
135
137
|
else
|
136
138
|
super
|
137
139
|
end
|
@@ -10,7 +10,7 @@ module Epuber
|
|
10
10
|
def initialize(parent = nil)
|
11
11
|
super()
|
12
12
|
|
13
|
-
@parent
|
13
|
+
@parent = parent
|
14
14
|
@sub_items = []
|
15
15
|
|
16
16
|
parent.sub_items << self unless parent.nil?
|
@@ -94,8 +94,7 @@ module Epuber
|
|
94
94
|
|
95
95
|
protected
|
96
96
|
|
97
|
-
attr_writer :parent
|
98
|
-
attr_writer :sub_items
|
97
|
+
attr_writer :parent, :sub_items
|
99
98
|
end
|
100
99
|
end
|
101
100
|
end
|
data/lib/epuber/helper.rb
CHANGED
data/lib/epuber/lockfile.rb
CHANGED
@@ -18,18 +18,16 @@ module Epuber
|
|
18
18
|
# @return [self]
|
19
19
|
#
|
20
20
|
def self.from_file(file_path)
|
21
|
-
if File.exist?(file_path)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
hash = if File.exist?(file_path)
|
22
|
+
YAML.safe_load(File.read(file_path))
|
23
|
+
else
|
24
|
+
{}
|
25
|
+
end
|
26
26
|
|
27
27
|
# backward compatibility for version 0.5 and older
|
28
|
-
if hash.include?('version')
|
29
|
-
hash['epuber_version'] = hash.delete('version')
|
30
|
-
end
|
28
|
+
hash['epuber_version'] = hash.delete('version') if hash.include?('version')
|
31
29
|
|
32
|
-
inst =
|
30
|
+
inst = new(hash)
|
33
31
|
inst.defined_from_file = file_path
|
34
32
|
yield inst if hash.empty? && block_given?
|
35
33
|
inst
|
data/lib/epuber/plugin.rb
CHANGED
@@ -18,7 +18,7 @@ module Epuber
|
|
18
18
|
super(file_path)
|
19
19
|
@instances = []
|
20
20
|
|
21
|
-
eval(::File.read(file_path), binding, file_path)
|
21
|
+
eval(::File.read(file_path), binding, file_path) # rubocop:disable Security/Eval
|
22
22
|
end
|
23
23
|
|
24
24
|
# @param [Symbol] name name of the plugin function
|
@@ -97,7 +97,6 @@ module Epuber
|
|
97
97
|
end.flatten
|
98
98
|
end
|
99
99
|
|
100
|
-
|
101
100
|
# @return [Array<Checker>]
|
102
101
|
#
|
103
102
|
def checkers
|
@@ -17,7 +17,7 @@ class MatchData
|
|
17
17
|
#
|
18
18
|
def line_number
|
19
19
|
n = pre_match_lines.length
|
20
|
-
n += 1 if n
|
20
|
+
n += 1 if n.zero? # it can't be zero, this happens only when the match is at the beginning of file or string
|
21
21
|
n
|
22
22
|
end
|
23
23
|
|
data/lib/epuber/server/base.styl
CHANGED
@@ -9,7 +9,7 @@ body, div, html, p
|
|
9
9
|
|
10
10
|
|
11
11
|
body
|
12
|
-
font-family
|
12
|
+
font-family system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
13
13
|
font-weight normal
|
14
14
|
font-size 20px
|
15
15
|
|
@@ -184,32 +184,3 @@ p.file
|
|
184
184
|
span.arrow
|
185
185
|
font-family monospace
|
186
186
|
color text_color
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
@font-face
|
194
|
-
font-family AvenirNext
|
195
|
-
font-style normal
|
196
|
-
font-weight bold
|
197
|
-
src url(fonts/AvenirNext/AvenirNext-Bold.ttf)
|
198
|
-
|
199
|
-
@font-face
|
200
|
-
font-family AvenirNext
|
201
|
-
font-style italic
|
202
|
-
font-weight bold
|
203
|
-
src url(fonts/AvenirNext/AvenirNext-BoldItalic.ttf)
|
204
|
-
|
205
|
-
@font-face
|
206
|
-
font-family AvenirNext
|
207
|
-
font-style italic
|
208
|
-
font-weight normal
|
209
|
-
src url(fonts/AvenirNext/AvenirNext-Italic.ttf)
|
210
|
-
|
211
|
-
@font-face
|
212
|
-
font-family AvenirNext
|
213
|
-
font-style normal
|
214
|
-
font-weight normal
|
215
|
-
src url(fonts/AvenirNext/AvenirNext-Regular.ttf)
|
data/lib/epuber/server.rb
CHANGED
@@ -23,9 +23,9 @@ require_relative 'third_party/bower'
|
|
23
23
|
|
24
24
|
|
25
25
|
module Epuber
|
26
|
-
|
27
26
|
# API:
|
28
|
-
# [LATER] /file/<path-or-pattern> -- displays pretty file (image, text file) (for example: /file/text/s01.xhtml or
|
27
|
+
# [LATER] /file/<path-or-pattern> -- displays pretty file (image, text file) (for example: /file/text/s01.xhtml or
|
28
|
+
# /file/text/s01.bade)
|
29
29
|
#
|
30
30
|
class Server < Sinatra::Base
|
31
31
|
require_relative 'server/handlers'
|
@@ -42,11 +42,9 @@ module Epuber
|
|
42
42
|
body = pretty(env, e)
|
43
43
|
end
|
44
44
|
|
45
|
-
unless body.is_a?(Array)
|
46
|
-
body = [body]
|
47
|
-
end
|
45
|
+
body = [body] unless body.is_a?(Array)
|
48
46
|
|
49
|
-
[500, { 'Content-Type'
|
47
|
+
[500, { 'Content-Type' => content_type,
|
50
48
|
'Content-Length' => Rack::Utils.bytesize(body.join).to_s },
|
51
49
|
body]
|
52
50
|
end
|
@@ -118,7 +116,7 @@ module Epuber
|
|
118
116
|
|
119
117
|
super() do |server|
|
120
118
|
$stderr = old_stderr
|
121
|
-
puts "Started development server on #{server.host}:#{server.port}"
|
119
|
+
UI.puts "Started development server on #{server.host}:#{server.port}"
|
122
120
|
|
123
121
|
host = if server.host == '0.0.0.0'
|
124
122
|
'localhost'
|
@@ -134,11 +132,11 @@ module Epuber
|
|
134
132
|
@verbose = verbose
|
135
133
|
@default_thin_logger ||= Thin::Logging.logger
|
136
134
|
|
137
|
-
|
135
|
+
if verbose
|
136
|
+
Thin::Logging.logger = @default_thin_logger
|
137
|
+
else
|
138
138
|
Thin::Logging.logger = Logger.new(nil)
|
139
139
|
Thin::Logging.logger.level = :fatal
|
140
|
-
else
|
141
|
-
Thin::Logging.logger = @default_thin_logger
|
142
140
|
end
|
143
141
|
|
144
142
|
set :logging, verbose
|
@@ -152,20 +150,18 @@ module Epuber
|
|
152
150
|
end
|
153
151
|
|
154
152
|
def self.start_listening_if_needed
|
155
|
-
return unless
|
153
|
+
return unless listener.nil?
|
156
154
|
|
157
155
|
self.listener = Listen.to(Config.instance.project_path, debug: true) do |modified, added, removed|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
$stderr.puts e.backtrace
|
164
|
-
end
|
156
|
+
changes_detected(modified, added, removed)
|
157
|
+
rescue StandardError => e
|
158
|
+
# print error, do not send error further, listener will die otherwise
|
159
|
+
warn e
|
160
|
+
warn e.backtrace
|
165
161
|
end
|
166
162
|
|
167
|
-
listener.ignore(
|
168
|
-
listener.ignore(
|
163
|
+
listener.ignore(/\.idea/)
|
164
|
+
listener.ignore(/#{Config.instance.working_path}/)
|
169
165
|
listener.ignore(%r{#{Config::WORKING_PATH}/})
|
170
166
|
|
171
167
|
listener.start
|
@@ -183,7 +179,6 @@ module Epuber
|
|
183
179
|
self.class.build_path
|
184
180
|
end
|
185
181
|
|
186
|
-
|
187
182
|
# @param level [Symbol]
|
188
183
|
# @param message [String]
|
189
184
|
#
|
@@ -192,13 +187,13 @@ module Epuber
|
|
192
187
|
def self._log(level, message)
|
193
188
|
case level
|
194
189
|
when :ui
|
195
|
-
puts message
|
190
|
+
UI.puts message
|
196
191
|
when :info
|
197
|
-
puts "INFO: #{message}" if verbose
|
192
|
+
UI.puts "INFO: #{message}" if verbose
|
198
193
|
when :get
|
199
|
-
puts " GET: #{message}" if verbose
|
194
|
+
UI.puts " GET: #{message}" if verbose
|
200
195
|
when :ws
|
201
|
-
puts " WS: #{message}" if verbose
|
196
|
+
UI.puts " WS: #{message}" if verbose
|
202
197
|
else
|
203
198
|
raise "Unknown log level #{level}"
|
204
199
|
end
|
@@ -226,9 +221,9 @@ module Epuber
|
|
226
221
|
# @return [Epuber::Book::File, nil]
|
227
222
|
#
|
228
223
|
def spine_file_at(index)
|
229
|
-
|
230
|
-
|
231
|
-
|
224
|
+
return unless !file_resolver.nil? && index >= 0 && index < file_resolver.spine_files.count
|
225
|
+
|
226
|
+
file_resolver.spine_files[index]
|
232
227
|
end
|
233
228
|
|
234
229
|
# @param [String] path
|
@@ -238,15 +233,14 @@ module Epuber
|
|
238
233
|
def self.relative_path_to_book_file(path)
|
239
234
|
file = file_resolver.file_with_source_path(path)
|
240
235
|
return if file.nil?
|
236
|
+
|
241
237
|
file.pkg_destination_path
|
242
238
|
end
|
243
239
|
|
244
240
|
def add_script_file_to_head(html_doc, file_name, *args)
|
245
241
|
source = File.read(File.expand_path("server/#{file_name}", File.dirname(__FILE__)))
|
246
242
|
|
247
|
-
if File.extname(file_name) == '.coffee'
|
248
|
-
source = CoffeeScript.compile(source)
|
249
|
-
end
|
243
|
+
source = CoffeeScript.compile(source) if File.extname(file_name) == '.coffee'
|
250
244
|
|
251
245
|
args.each do |hash|
|
252
246
|
hash.each do |key, value|
|
@@ -302,14 +296,16 @@ module Epuber
|
|
302
296
|
head = html_doc.at_css('head')
|
303
297
|
node = case type
|
304
298
|
when :style
|
305
|
-
html_doc.create_element('link',
|
299
|
+
html_doc.create_element('link', href: "/server/raw/#{file_path}", rel: 'stylesheet', type: 'text/css')
|
306
300
|
when :js
|
307
301
|
html_doc.create_element('script', src: "/server/raw/#{file_path}", type: 'text/javascript')
|
308
302
|
else
|
309
303
|
raise "Unknown file type `#{type}`"
|
310
304
|
end
|
311
305
|
|
312
|
-
return if head.css('script, link').any?
|
306
|
+
return if head.css('script, link').any? do |n|
|
307
|
+
(!n['href'].nil? && n['href'] == node['href']) || (!n['src'].nil? && n['src'] == node['src'])
|
308
|
+
end
|
313
309
|
|
314
310
|
head.add_child(node)
|
315
311
|
end
|
@@ -338,24 +334,22 @@ module Epuber
|
|
338
334
|
self.target = new_target
|
339
335
|
else
|
340
336
|
self.target = book.targets.first
|
341
|
-
_log :ui, "[!] Not found previous target after reloading bookspec file, jumping to first #{
|
337
|
+
_log :ui, "[!] Not found previous target after reloading bookspec file, jumping to first #{target.name}"
|
342
338
|
end
|
343
339
|
end
|
344
340
|
|
345
341
|
def self._compile_book
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
self.file_resolver = compiler.file_resolver
|
342
|
+
compiler = Epuber::Compiler.new(book, target)
|
343
|
+
compiler.compile(build_path)
|
344
|
+
self.file_resolver = compiler.file_resolver
|
350
345
|
|
351
|
-
|
352
|
-
|
353
|
-
|
346
|
+
true
|
347
|
+
rescue StandardError => e
|
348
|
+
self.file_resolver = compiler.file_resolver
|
354
349
|
|
355
|
-
|
350
|
+
Epuber::UI.error("Compile error: #{e}", location: e)
|
356
351
|
|
357
|
-
|
358
|
-
end
|
352
|
+
false
|
359
353
|
end
|
360
354
|
|
361
355
|
def self.compile_book(&completion)
|
@@ -366,12 +360,12 @@ module Epuber
|
|
366
360
|
|
367
361
|
@compilation_thread = Thread.new do
|
368
362
|
result = _compile_book
|
369
|
-
completion
|
363
|
+
completion&.call(result)
|
370
364
|
end
|
371
365
|
|
372
|
-
|
373
|
-
|
374
|
-
|
366
|
+
return unless completion.nil?
|
367
|
+
|
368
|
+
@compilation_thread.join
|
375
369
|
end
|
376
370
|
|
377
371
|
# @param message [String]
|
@@ -387,7 +381,8 @@ module Epuber
|
|
387
381
|
# @param type [Symbol]
|
388
382
|
def self.notify_clients(type, data = nil)
|
389
383
|
_log :info, "Notifying clients with type #{type.inspect}"
|
390
|
-
raise "Not known type `#{type}`" unless [
|
384
|
+
raise "Not known type `#{type}`" unless %i[styles reload compile_start compile_end].include?(type)
|
385
|
+
|
391
386
|
message = {
|
392
387
|
name: type,
|
393
388
|
}
|
@@ -406,17 +401,17 @@ module Epuber
|
|
406
401
|
files_paths.select { |file| file_resolver.file_with_source_path(file) || book.file_path == file }
|
407
402
|
end
|
408
403
|
|
409
|
-
# @param
|
410
|
-
# @param
|
411
|
-
# @param
|
404
|
+
# @param modified [Array<String>]
|
405
|
+
# @param added [Array<String>]
|
406
|
+
# @param removed [Array<String>]
|
412
407
|
#
|
413
|
-
def self.changes_detected(
|
414
|
-
all_changed = (
|
408
|
+
def self.changes_detected(modified, added, removed)
|
409
|
+
all_changed = (modified + added + removed).uniq.map(&:unicode_normalize)
|
415
410
|
|
416
411
|
reload_bookspec if all_changed.any? { |file| file == book.file_path }
|
417
412
|
|
418
413
|
changed = filter_not_project_files(all_changed) || []
|
419
|
-
return if changed.count
|
414
|
+
return if changed.count.zero?
|
420
415
|
|
421
416
|
notify_clients(:compile_start)
|
422
417
|
|
@@ -440,11 +435,15 @@ module Epuber
|
|
440
435
|
# remove nil paths (for example bookspec can't be found so the relative path is nil)
|
441
436
|
changed.compact!
|
442
437
|
|
443
|
-
|
444
|
-
|
445
|
-
|
438
|
+
changed_only_styles = changed.all? do |file|
|
439
|
+
file.end_with?(*Epuber::Compiler::FileFinders::GROUP_EXTENSIONS[:style])
|
440
|
+
end
|
441
|
+
|
442
|
+
if changed.size.positive? && changed_only_styles
|
443
|
+
notify_clients(:styles, changed)
|
444
|
+
else
|
446
445
|
notify_clients(:reload, changed)
|
447
|
-
|
446
|
+
end
|
448
447
|
end
|
449
448
|
end
|
450
449
|
|
@@ -460,12 +459,12 @@ module Epuber
|
|
460
459
|
ws.onopen do
|
461
460
|
sockets << ws
|
462
461
|
|
463
|
-
ws.send({name: :hello}.to_json)
|
462
|
+
ws.send({ name: :hello }.to_json)
|
464
463
|
|
465
464
|
thread = Thread.new do
|
466
465
|
loop do
|
467
466
|
sleep(10)
|
468
|
-
ws.send({name: :heartbeat}.to_json)
|
467
|
+
ws.send({ name: :heartbeat }.to_json)
|
469
468
|
end
|
470
469
|
end
|
471
470
|
end
|
@@ -490,6 +489,7 @@ module Epuber
|
|
490
489
|
mtime = File.mtime(file_path)
|
491
490
|
last_modified(mtime)
|
492
491
|
etag(mtime.to_s)
|
492
|
+
cache_control :public, :must_revalidate
|
493
493
|
|
494
494
|
case File.extname(file_path)
|
495
495
|
when '.styl'
|
@@ -571,11 +571,11 @@ module Epuber
|
|
571
571
|
full_path = File.expand_path(path, build_path)
|
572
572
|
|
573
573
|
case File.extname(full_path)
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
574
|
+
when '.xhtml'
|
575
|
+
content_type :xhtml
|
576
|
+
handle_xhtml_file(full_path)
|
577
|
+
else
|
578
|
+
handle_file(full_path)
|
579
579
|
end
|
580
580
|
end
|
581
581
|
end
|
@@ -621,6 +621,7 @@ module Epuber
|
|
621
621
|
get '/raw/*' do
|
622
622
|
path = find_file
|
623
623
|
next not_found if path.nil?
|
624
|
+
|
624
625
|
handle_file(File.expand_path(path, build_path))
|
625
626
|
end
|
626
627
|
|
@@ -5,12 +5,12 @@ module Epuber
|
|
5
5
|
class Bower
|
6
6
|
class << self
|
7
7
|
JS_COMPONENTS = {
|
8
|
-
jquery:
|
9
|
-
cookies:
|
10
|
-
uri:
|
11
|
-
spin:
|
8
|
+
jquery: 'jquery/dist/',
|
9
|
+
cookies: 'cookies-js/dist/',
|
10
|
+
uri: 'uri.js/src/',
|
11
|
+
spin: 'spin.js/',
|
12
12
|
keymaster: 'keymaster/',
|
13
|
-
}
|
13
|
+
}.freeze
|
14
14
|
|
15
15
|
def path_to_js(component)
|
16
16
|
path = JS_COMPONENTS[component]
|
@@ -5,7 +5,6 @@ require_relative '../transformer'
|
|
5
5
|
module Epuber
|
6
6
|
class Transformer
|
7
7
|
class TextTransformer < Transformer
|
8
|
-
|
9
8
|
# @return [String]
|
10
9
|
#
|
11
10
|
attr_accessor :text
|
@@ -51,7 +50,10 @@ module Epuber
|
|
51
50
|
@text.gsub!(pattern, replacement, &block)
|
52
51
|
end
|
53
52
|
|
54
|
-
|
53
|
+
if multiple_times && !result.nil?
|
54
|
+
result = replace_all(pattern, replacement, multiple_times: multiple_times,
|
55
|
+
&block)
|
56
|
+
end
|
55
57
|
result
|
56
58
|
end
|
57
59
|
end
|
data/lib/epuber/transformer.rb
CHANGED
@@ -10,8 +10,8 @@ module Epuber
|
|
10
10
|
#
|
11
11
|
def self.map_source_type__class
|
12
12
|
{
|
13
|
-
:
|
14
|
-
:
|
13
|
+
result_text_xhtml_string: TextTransformer,
|
14
|
+
source_text_file: TextTransformer,
|
15
15
|
}.merge(super)
|
16
16
|
end
|
17
17
|
end
|