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
@@ -6,7 +6,6 @@ module Epuber
|
|
6
6
|
require_relative 'abstract_file'
|
7
7
|
|
8
8
|
class SourceFile < AbstractFile
|
9
|
-
|
10
9
|
# @return [String] relative source path
|
11
10
|
#
|
12
11
|
attr_reader :source_path
|
@@ -22,6 +21,8 @@ module Epuber
|
|
22
21
|
# @param [String] source_path relative path from project root to source file
|
23
22
|
#
|
24
23
|
def initialize(source_path)
|
24
|
+
super()
|
25
|
+
|
25
26
|
@source_path = source_path
|
26
27
|
end
|
27
28
|
|
@@ -95,7 +96,9 @@ module Epuber
|
|
95
96
|
UI.print_processing_debug_info("Writing compiled version to #{pkg_destination_path}")
|
96
97
|
self.class.write_to_file!(content, final_destination_path)
|
97
98
|
else
|
98
|
-
UI.print_processing_debug_info(
|
99
|
+
UI.print_processing_debug_info(<<~MSG)
|
100
|
+
Not writing to disk ... compiled version at #{pkg_destination_path} is same
|
101
|
+
MSG
|
99
102
|
end
|
100
103
|
end
|
101
104
|
|
@@ -104,7 +107,9 @@ module Epuber
|
|
104
107
|
UI.print_processing_debug_info("Writing processed version to #{pkg_destination_path}")
|
105
108
|
self.class.write_to_file!(content, final_destination_path)
|
106
109
|
else
|
107
|
-
UI.print_processing_debug_info(
|
110
|
+
UI.print_processing_debug_info(<<~MSG)
|
111
|
+
Not writing to disk ... processed version at #{pkg_destination_path} is same
|
112
|
+
MSG
|
108
113
|
end
|
109
114
|
end
|
110
115
|
end
|
@@ -5,9 +5,9 @@ require 'epuber-stylus'
|
|
5
5
|
module Epuber
|
6
6
|
class Compiler
|
7
7
|
module FileTypes
|
8
|
-
require_relative '
|
8
|
+
require_relative 'css_file'
|
9
9
|
|
10
|
-
class StylusFile <
|
10
|
+
class StylusFile < CSSFile
|
11
11
|
# @param [Compiler::CompilationContext] compilation_context
|
12
12
|
#
|
13
13
|
def process(compilation_context)
|
@@ -19,7 +19,8 @@ module Epuber
|
|
19
19
|
Stylus.define('__book_title', compilation_context.book.title)
|
20
20
|
Stylus.define('__const', compilation_context.target.constants)
|
21
21
|
|
22
|
-
|
22
|
+
css = Stylus.compile(File.new(abs_source_path))
|
23
|
+
write_compiled(process_css(css, compilation_context))
|
23
24
|
|
24
25
|
update_metadata!
|
25
26
|
end
|
@@ -12,6 +12,21 @@ module Epuber
|
|
12
12
|
#
|
13
13
|
attr_accessor :toc_item
|
14
14
|
|
15
|
+
# @return [Array<String>]
|
16
|
+
#
|
17
|
+
attr_accessor :global_ids
|
18
|
+
|
19
|
+
# @return [Array<String>]
|
20
|
+
#
|
21
|
+
attr_accessor :global_links
|
22
|
+
|
23
|
+
def initialize(source_path)
|
24
|
+
super
|
25
|
+
|
26
|
+
self.global_ids = []
|
27
|
+
self.global_links = []
|
28
|
+
end
|
29
|
+
|
15
30
|
# @param [Book::Target] target
|
16
31
|
# @param [FileResolver] file_resolver
|
17
32
|
#
|
@@ -22,8 +37,9 @@ module Epuber
|
|
22
37
|
Array(file_resolver.file_from_request(default_style_request))
|
23
38
|
end.flatten
|
24
39
|
|
40
|
+
dirname = Pathname.new(File.dirname(final_destination_path))
|
25
41
|
default_styles.map do |style|
|
26
|
-
Pathname.new(style.final_destination_path).relative_path_from(
|
42
|
+
Pathname.new(style.final_destination_path).relative_path_from(dirname).to_s
|
27
43
|
end
|
28
44
|
end
|
29
45
|
|
@@ -37,8 +53,9 @@ module Epuber
|
|
37
53
|
Array(file_resolver.file_from_request(default_style_request))
|
38
54
|
end.flatten
|
39
55
|
|
56
|
+
dirname = Pathname.new(File.dirname(final_destination_path))
|
40
57
|
default_scripts.map do |style|
|
41
|
-
Pathname.new(style.final_destination_path).relative_path_from(
|
58
|
+
Pathname.new(style.final_destination_path).relative_path_from(dirname).to_s
|
42
59
|
end
|
43
60
|
end
|
44
61
|
|
@@ -58,10 +75,7 @@ module Epuber
|
|
58
75
|
end
|
59
76
|
end
|
60
77
|
|
61
|
-
|
62
|
-
if compilation_context.should_write
|
63
|
-
self.class.write_to_file(xhtml_content, abs_source_path)
|
64
|
-
end
|
78
|
+
self.class.write_to_file(xhtml_content, abs_source_path) if compilation_context.should_write
|
65
79
|
|
66
80
|
xhtml_content
|
67
81
|
end
|
@@ -88,9 +102,7 @@ module Epuber
|
|
88
102
|
XHTMLProcessor.xml_doc_from_str_with_errors(content, source_path)
|
89
103
|
end
|
90
104
|
|
91
|
-
if compilation_context.release_build && xhtml_doc.errors.count
|
92
|
-
process_nokogiri_errors(errors)
|
93
|
-
end
|
105
|
+
process_nokogiri_errors(errors) if compilation_context.release_build && xhtml_doc.errors.count.positive?
|
94
106
|
|
95
107
|
UI.print_step_processing_time('adding missing elements') do
|
96
108
|
XHTMLProcessor.add_missing_root_elements(xhtml_doc, book.title, target.epub_version)
|
@@ -120,13 +132,13 @@ module Epuber
|
|
120
132
|
XHTMLProcessor.resolve_mathml_namespace(xhtml_doc)
|
121
133
|
|
122
134
|
UI.print_step_processing_time('investigating properties') do
|
123
|
-
|
124
|
-
|
125
|
-
|
135
|
+
properties << :remote_resources if XHTMLProcessor.using_remote_resources?(xhtml_doc)
|
136
|
+
properties << :scripted if XHTMLProcessor.using_javascript?(xhtml_doc)
|
137
|
+
properties << :mathml if XHTMLProcessor.using_mathml?(xhtml_doc)
|
126
138
|
end
|
127
139
|
|
128
140
|
xhtml_string = UI.print_step_processing_time('converting to XHTML') do
|
129
|
-
|
141
|
+
xhtml_doc.to_s
|
130
142
|
end
|
131
143
|
|
132
144
|
# perform transformations
|
@@ -145,6 +157,12 @@ module Epuber
|
|
145
157
|
end
|
146
158
|
end
|
147
159
|
|
160
|
+
if xhtml_string.include?('="$')
|
161
|
+
xhtml_doc = XHTMLProcessor.xml_document_from_string(xhtml_string, final_destination_path)
|
162
|
+
self.global_ids = XHTMLProcessor.find_global_ids(xhtml_doc)
|
163
|
+
self.global_links = XHTMLProcessor.find_global_links(xhtml_doc)
|
164
|
+
end
|
165
|
+
|
148
166
|
xhtml_string
|
149
167
|
end
|
150
168
|
|
@@ -153,6 +171,42 @@ module Epuber
|
|
153
171
|
def process(compilation_context)
|
154
172
|
write_processed(common_process(load_source(compilation_context), compilation_context))
|
155
173
|
end
|
174
|
+
|
175
|
+
# @param [Compiler::CompilationContext] compilation_context
|
176
|
+
# @param [Hash<String, XHTMLFile>] global_ids
|
177
|
+
#
|
178
|
+
def process_global_ids(compilation_context, global_ids)
|
179
|
+
return if self.global_ids.empty? && global_links.empty?
|
180
|
+
|
181
|
+
xhtml_doc = XHTMLProcessor.xml_document_from_string(File.read(final_destination_path), final_destination_path)
|
182
|
+
|
183
|
+
XHTMLProcessor.find_global_ids_nodes(xhtml_doc).each do |node|
|
184
|
+
id = node['id']
|
185
|
+
node['id'] = id[1..-1]
|
186
|
+
end
|
187
|
+
|
188
|
+
XHTMLProcessor.find_global_links_nodes(xhtml_doc).each do |node|
|
189
|
+
href = node['href'][1..-1]
|
190
|
+
|
191
|
+
dest_file = global_ids[href]
|
192
|
+
if dest_file
|
193
|
+
rel_path = Pathname(dest_file.final_destination_path.unicode_normalize)
|
194
|
+
.relative_path_from(Pathname(File.dirname(final_destination_path.unicode_normalize))).to_s
|
195
|
+
|
196
|
+
node['href'] = "#{rel_path}##{href}"
|
197
|
+
else
|
198
|
+
message = "Can't find global id '#{href}' from link in file #{source_path}"
|
199
|
+
location = UserInterface::Location.new(path: final_destination_path, lineno: node.line)
|
200
|
+
if compilation_context.release_build?
|
201
|
+
UI.error!(message, location: location)
|
202
|
+
else
|
203
|
+
UI.warning(message, location: location)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
write_processed(xhtml_doc.to_s)
|
209
|
+
end
|
156
210
|
end
|
157
211
|
end
|
158
212
|
end
|
@@ -12,7 +12,6 @@ module Nokogiri
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
15
|
module Epuber
|
17
16
|
class Compiler
|
18
17
|
class Generator
|
@@ -55,7 +54,7 @@ module Epuber
|
|
55
54
|
builder = Nokogiri::XML::Builder.new(encoding: 'utf-8') do |xml|
|
56
55
|
@xml = xml
|
57
56
|
|
58
|
-
block
|
57
|
+
block&.call(xml)
|
59
58
|
|
60
59
|
@xml = nil
|
61
60
|
end
|
@@ -15,7 +15,7 @@ module Epuber
|
|
15
15
|
generate_xml do |xml|
|
16
16
|
xml.container(version: 1.0, xmlns: 'urn:oasis:names:tc:opendocument:xmlns:container') do
|
17
17
|
xml.rootfiles do
|
18
|
-
@file_resolver.package_files.select { |file| file.
|
18
|
+
@file_resolver.package_files.select { |file| file.is_a?(FileTypes::OPFFile) }.each do |file|
|
19
19
|
path = file.pkg_destination_path
|
20
20
|
xml.rootfile('full-path' => path, 'media-type' => MIME::Types.of(path).first.content_type)
|
21
21
|
end
|
@@ -9,7 +9,6 @@ module Epuber
|
|
9
9
|
require_relative 'generator'
|
10
10
|
|
11
11
|
class NavGenerator < Generator
|
12
|
-
|
13
12
|
NCX_NAMESPACES = {
|
14
13
|
'xmlns' => 'http://www.daisy.org/z3986/2005/ncx/',
|
15
14
|
}.freeze
|
@@ -26,10 +25,10 @@ module Epuber
|
|
26
25
|
|
27
26
|
# resource page http://www.idpf.org/epub/301/spec/epub-contentdocs.html#sec-xhtml-nav-def-types-landmarks
|
28
27
|
LANDMARKS_MAP = {
|
29
|
-
landmark_cover:
|
30
|
-
landmark_start_page: { type: %w
|
31
|
-
landmark_copyright:
|
32
|
-
landmark_toc:
|
28
|
+
landmark_cover: { type: 'cover', text: 'Cover page' },
|
29
|
+
landmark_start_page: { type: %w[bodymatter ibooks:reader-start-page], text: 'Start Reading' },
|
30
|
+
landmark_copyright: { type: 'copyright-page', text: 'Copyright page' },
|
31
|
+
landmark_toc: { type: 'toc', text: 'Table of contents' },
|
33
32
|
}.freeze
|
34
33
|
|
35
34
|
# Generates XML for toc document, the structure differs depend on epub_version
|
@@ -95,7 +94,7 @@ module Epuber
|
|
95
94
|
@xml.ncx(nav_namespaces, version: '2005-1') do
|
96
95
|
# head
|
97
96
|
@xml.head do
|
98
|
-
@xml.meta(name: 'dtb:uid', content:
|
97
|
+
@xml.meta(name: 'dtb:uid', content: @target.identifier || "urn:isbn:#{@target.isbn}")
|
99
98
|
end
|
100
99
|
|
101
100
|
# title
|
@@ -112,7 +111,7 @@ module Epuber
|
|
112
111
|
end
|
113
112
|
end
|
114
113
|
|
115
|
-
# @param
|
114
|
+
# @param [Array<Epuber::Book::TocItem>] toc_items
|
116
115
|
#
|
117
116
|
def visit_toc_items(toc_items)
|
118
117
|
iterate_lambda = lambda do
|
@@ -121,7 +120,7 @@ module Epuber
|
|
121
120
|
end
|
122
121
|
end
|
123
122
|
|
124
|
-
if @target.epub_version >= 3 && toc_items.length
|
123
|
+
if @target.epub_version >= 3 && toc_items.length.positive? && contains_item_with_title(toc_items)
|
125
124
|
@xml.ol do
|
126
125
|
iterate_lambda.call
|
127
126
|
end
|
@@ -134,7 +133,7 @@ module Epuber
|
|
134
133
|
toc_items.any? { |a| a.title || contains_item_with_title(a.sub_items) }
|
135
134
|
end
|
136
135
|
|
137
|
-
# @param
|
136
|
+
# @param [Epuber::Book::TocItem] toc_item
|
138
137
|
#
|
139
138
|
def visit_toc_item(toc_item)
|
140
139
|
result_file_path = pretty_path_for_toc_item(toc_item)
|
@@ -166,7 +165,7 @@ module Epuber
|
|
166
165
|
|
167
166
|
# --------------- landmarks -----------------------------
|
168
167
|
|
169
|
-
# @param
|
168
|
+
# @param [Array<Epuber::Book::TocItem>] toc_items
|
170
169
|
#
|
171
170
|
def landmarks_visit_toc_items(toc_items)
|
172
171
|
toc_items.each do |child_item|
|
@@ -174,7 +173,7 @@ module Epuber
|
|
174
173
|
end
|
175
174
|
end
|
176
175
|
|
177
|
-
# @param
|
176
|
+
# @param [Epuber::Book::TocItem] toc_item
|
178
177
|
#
|
179
178
|
def landmarks_visit_toc_item(toc_item)
|
180
179
|
landmarks = toc_item.landmarks
|
@@ -11,20 +11,19 @@ require_relative '../book/toc_item'
|
|
11
11
|
module Epuber
|
12
12
|
class Compiler
|
13
13
|
class OPFGenerator < Generator
|
14
|
-
|
15
14
|
EPUB2_NAMESPACES = {
|
16
|
-
'xmlns'
|
17
|
-
'xmlns:dc'
|
15
|
+
'xmlns' => 'http://www.idpf.org/2007/opf',
|
16
|
+
'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
|
18
17
|
'xmlns:opf' => 'http://www.idpf.org/2007/opf',
|
19
18
|
}.freeze
|
20
19
|
|
21
20
|
EPUB3_NAMESPACES = {
|
22
|
-
'prefix'
|
21
|
+
'prefix' => 'rendition: http://www.idpf.org/vocab/rendition/',
|
23
22
|
'xmlns:epub' => 'http://www.idpf.org/2007/ops',
|
24
23
|
}.freeze
|
25
24
|
|
26
25
|
IBOOKS_NAMESPACES = {
|
27
|
-
'prefix'
|
26
|
+
'prefix' => 'rendition: http://www.idpf.org/vocab/rendition/# ibooks: http://vocabulary.itunes.apple.com/rdf/ibooks/vocabulary-extensions-1.0/',
|
28
27
|
'xmlns:ibooks' => 'http://apple.com/ibooks/html-extensions',
|
29
28
|
}.freeze
|
30
29
|
|
@@ -32,32 +31,32 @@ module Epuber
|
|
32
31
|
LANDMARKS_MAP = {
|
33
32
|
|
34
33
|
# my favorite
|
35
|
-
landmark_cover:
|
34
|
+
landmark_cover: 'cover',
|
36
35
|
landmark_start_page: 'text',
|
37
|
-
landmark_copyright:
|
38
|
-
landmark_toc:
|
36
|
+
landmark_copyright: 'copyright-page',
|
37
|
+
landmark_toc: 'toc',
|
39
38
|
|
40
39
|
# others
|
41
|
-
landmark_title:
|
42
|
-
landmark_index:
|
43
|
-
landmark_glossary:
|
44
|
-
landmark_acknowledgements:
|
45
|
-
landmark_bibliography:
|
46
|
-
landmark_colophon:
|
47
|
-
landmark_dedication:
|
48
|
-
landmark_epigraph:
|
49
|
-
landmark_foreword:
|
40
|
+
landmark_title: 'title-page',
|
41
|
+
landmark_index: 'index',
|
42
|
+
landmark_glossary: 'glossary',
|
43
|
+
landmark_acknowledgements: 'acknowledgements',
|
44
|
+
landmark_bibliography: 'bibliography',
|
45
|
+
landmark_colophon: 'colophon',
|
46
|
+
landmark_dedication: 'dedication',
|
47
|
+
landmark_epigraph: 'epigraph',
|
48
|
+
landmark_foreword: 'foreword',
|
50
49
|
landmark_list_of_illustrations: 'loi',
|
51
|
-
landmark_list_of_tables:
|
52
|
-
landmark_notes:
|
53
|
-
landmark_preface:
|
50
|
+
landmark_list_of_tables: 'lot',
|
51
|
+
landmark_notes: 'notes',
|
52
|
+
landmark_preface: 'preface',
|
54
53
|
|
55
54
|
}.freeze
|
56
55
|
|
57
56
|
PROPERTIES_MAP = {
|
58
57
|
cover_image: 'cover-image',
|
59
|
-
navigation:
|
60
|
-
scripted:
|
58
|
+
navigation: 'nav',
|
59
|
+
scripted: 'scripted',
|
61
60
|
remote_resources: 'remote-resources',
|
62
61
|
mathml: 'mathml',
|
63
62
|
}.freeze
|
@@ -164,7 +163,7 @@ module Epuber
|
|
164
163
|
attrs['media-type'] = mime_type_for(file)
|
165
164
|
|
166
165
|
properties = file.properties
|
167
|
-
if properties.length
|
166
|
+
if properties.length.positive? && @target.epub_version >= 3
|
168
167
|
pretty_properties = properties.to_a.map { |property| PROPERTIES_MAP[property] }.join(' ')
|
169
168
|
attrs['properties'] = pretty_properties
|
170
169
|
end
|
@@ -218,7 +217,7 @@ module Epuber
|
|
218
217
|
end
|
219
218
|
end
|
220
219
|
|
221
|
-
# @param
|
220
|
+
# @param [Array<Epuber::Book::TocItem>] toc_items
|
222
221
|
#
|
223
222
|
# @return nil
|
224
223
|
#
|
@@ -228,7 +227,7 @@ module Epuber
|
|
228
227
|
end
|
229
228
|
end
|
230
229
|
|
231
|
-
# @param
|
230
|
+
# @param [Epuber::Book::TocItem] toc_item
|
232
231
|
#
|
233
232
|
# @return nil
|
234
233
|
#
|
@@ -252,7 +251,7 @@ module Epuber
|
|
252
251
|
|
253
252
|
# Creates id from file path
|
254
253
|
#
|
255
|
-
# @param
|
254
|
+
# @param [String] path
|
256
255
|
#
|
257
256
|
# @return [String]
|
258
257
|
#
|
@@ -264,7 +263,7 @@ module Epuber
|
|
264
263
|
|
265
264
|
# Creates proper mime-type for file
|
266
265
|
#
|
267
|
-
# @param
|
266
|
+
# @param [Epuber::Compiler::FileTypes::AbstractFile | String] file
|
268
267
|
#
|
269
268
|
# @return [String]
|
270
269
|
#
|
@@ -4,9 +4,7 @@ module Epuber
|
|
4
4
|
class Compiler
|
5
5
|
class Problem
|
6
6
|
class Location
|
7
|
-
attr_reader :line
|
8
|
-
attr_reader :column
|
9
|
-
attr_reader :length
|
7
|
+
attr_reader :line, :column, :length
|
10
8
|
|
11
9
|
def initialize(line, column, length = nil)
|
12
10
|
@line = line
|
@@ -15,20 +13,14 @@ module Epuber
|
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
18
|
-
attr_reader :level
|
19
|
-
attr_reader :message
|
20
|
-
attr_reader :source
|
21
|
-
attr_reader :location
|
22
|
-
attr_reader :file_path
|
16
|
+
attr_reader :level, :message, :source, :location, :file_path
|
23
17
|
|
24
18
|
def initialize(level, message, source, location: nil, line: nil, column: nil, length: nil, file_path: nil)
|
25
19
|
@level = level
|
26
20
|
@message = message
|
27
21
|
@source = source
|
28
22
|
@location = location
|
29
|
-
if @location.nil? && line && column
|
30
|
-
@location = Location.new(line, column, length)
|
31
|
-
end
|
23
|
+
@location = Location.new(line, column, length) if @location.nil? && line && column
|
32
24
|
|
33
25
|
@file_path = file_path
|
34
26
|
end
|
@@ -40,7 +32,7 @@ module Epuber
|
|
40
32
|
# @return [String]
|
41
33
|
#
|
42
34
|
def self.caret_symbol(indent)
|
43
|
-
' ' * indent
|
35
|
+
"#{' ' * indent}^"
|
44
36
|
end
|
45
37
|
|
46
38
|
# Formats caret symbols for indent and length
|
@@ -53,7 +45,7 @@ module Epuber
|
|
53
45
|
def self.caret_symbols(indent, length)
|
54
46
|
start_sign = caret_symbol(indent)
|
55
47
|
end_sign = if length > 1
|
56
|
-
caret_symbol(length-2)
|
48
|
+
caret_symbol(length - 2)
|
57
49
|
else
|
58
50
|
''
|
59
51
|
end
|
@@ -74,10 +66,11 @@ module Epuber
|
|
74
66
|
lines = text.split("\n")
|
75
67
|
|
76
68
|
line = lines[line_index] || ''
|
77
|
-
matched_text = line[column_index
|
69
|
+
matched_text = line[column_index...column_index + location.length] || ''
|
78
70
|
|
79
|
-
pre = (lines[0
|
80
|
-
post = ([line[column_index + location.length
|
71
|
+
pre = (lines[0...line_index] + [line[0...column_index]]).join("\n")
|
72
|
+
post = ([line[column_index + location.length..line.length]] + (lines[location.line..lines.count] || []))
|
73
|
+
.join("\n")
|
81
74
|
|
82
75
|
[pre, matched_text, post]
|
83
76
|
end
|
@@ -89,9 +82,7 @@ module Epuber
|
|
89
82
|
post_line = post.split("\n").first || ''
|
90
83
|
|
91
84
|
pre = match_pre_line = pre_line
|
92
|
-
if remove_tabs(match_pre_line).length > 100
|
93
|
-
pre = "#{match_pre_line.first(20)}...#{match_pre_line.last(30)}"
|
94
|
-
end
|
85
|
+
pre = "#{match_pre_line.first(20)}...#{match_pre_line.last(30)}" if remove_tabs(match_pre_line).length > 100
|
95
86
|
|
96
87
|
pre = remove_tabs(pre)
|
97
88
|
|
@@ -114,8 +105,8 @@ module Epuber
|
|
114
105
|
|
115
106
|
[
|
116
107
|
"#{@file_path}:#{line} column: #{column} --- #{@message}",
|
117
|
-
|
118
|
-
|
108
|
+
" #{pre}#{colored_match_text}#{post}",
|
109
|
+
" #{pointers}",
|
119
110
|
].join("\n")
|
120
111
|
end
|
121
112
|
end
|