epuber 0.3.5

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.
Files changed (206) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +6 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +46 -0
  5. data/bin/epuber +10 -0
  6. data/epuber.gemspec +51 -0
  7. data/lib/epuber.rb +14 -0
  8. data/lib/epuber/book.rb +267 -0
  9. data/lib/epuber/book/contributor.rb +90 -0
  10. data/lib/epuber/book/file_request.rb +68 -0
  11. data/lib/epuber/book/target.rb +284 -0
  12. data/lib/epuber/book/toc_item.rb +130 -0
  13. data/lib/epuber/checker.rb +19 -0
  14. data/lib/epuber/checker/text_checker.rb +129 -0
  15. data/lib/epuber/checker_transformer_base.rb +71 -0
  16. data/lib/epuber/command.rb +65 -0
  17. data/lib/epuber/command/compile.rb +142 -0
  18. data/lib/epuber/command/init.rb +145 -0
  19. data/lib/epuber/command/server.rb +59 -0
  20. data/lib/epuber/compiler.rb +255 -0
  21. data/lib/epuber/compiler/compilation_context.rb +86 -0
  22. data/lib/epuber/compiler/file_finders/abstract.rb +270 -0
  23. data/lib/epuber/compiler/file_finders/imaginary.rb +167 -0
  24. data/lib/epuber/compiler/file_finders/normal.rb +22 -0
  25. data/lib/epuber/compiler/file_resolver.rb +316 -0
  26. data/lib/epuber/compiler/file_types/abstract_file.rb +119 -0
  27. data/lib/epuber/compiler/file_types/bade_file.rb +39 -0
  28. data/lib/epuber/compiler/file_types/container_xml_file.rb +26 -0
  29. data/lib/epuber/compiler/file_types/generated_file.rb +29 -0
  30. data/lib/epuber/compiler/file_types/ibooks_display_options_file.rb +31 -0
  31. data/lib/epuber/compiler/file_types/image_file.rb +42 -0
  32. data/lib/epuber/compiler/file_types/mime_type_file.rb +20 -0
  33. data/lib/epuber/compiler/file_types/nav_file.rb +42 -0
  34. data/lib/epuber/compiler/file_types/opf_file.rb +27 -0
  35. data/lib/epuber/compiler/file_types/source_file.rb +52 -0
  36. data/lib/epuber/compiler/file_types/static_file.rb +18 -0
  37. data/lib/epuber/compiler/file_types/stylus_file.rb +20 -0
  38. data/lib/epuber/compiler/file_types/xhtml_file.rb +102 -0
  39. data/lib/epuber/compiler/generator.rb +67 -0
  40. data/lib/epuber/compiler/meta_inf_generator.rb +41 -0
  41. data/lib/epuber/compiler/nav_generator.rb +201 -0
  42. data/lib/epuber/compiler/opf_generator.rb +284 -0
  43. data/lib/epuber/compiler/xhtml_processor.rb +254 -0
  44. data/lib/epuber/config.rb +133 -0
  45. data/lib/epuber/dsl/attribute.rb +248 -0
  46. data/lib/epuber/dsl/attribute_support.rb +130 -0
  47. data/lib/epuber/dsl/object.rb +145 -0
  48. data/lib/epuber/dsl/tree_object.rb +101 -0
  49. data/lib/epuber/helper.rb +19 -0
  50. data/lib/epuber/lockfile.rb +55 -0
  51. data/lib/epuber/plugin.rb +108 -0
  52. data/lib/epuber/ruby_extensions/match_data.rb +40 -0
  53. data/lib/epuber/ruby_extensions/thread.rb +13 -0
  54. data/lib/epuber/server.rb +614 -0
  55. data/lib/epuber/server/auto_refresh/auto_refresh.coffee +97 -0
  56. data/lib/epuber/server/auto_refresh/connector.coffee +125 -0
  57. data/lib/epuber/server/auto_refresh/protocol.coffee +41 -0
  58. data/lib/epuber/server/auto_refresh/reloader.coffee +261 -0
  59. data/lib/epuber/server/base.styl +3 -0
  60. data/lib/epuber/server/basic.styl +211 -0
  61. data/lib/epuber/server/book_content.styl +39 -0
  62. data/lib/epuber/server/default_cover.png +0 -0
  63. data/lib/epuber/server/fonts/AvenirNext/AvenirNext-Bold.ttf +0 -0
  64. data/lib/epuber/server/fonts/AvenirNext/AvenirNext-BoldItalic.ttf +0 -0
  65. data/lib/epuber/server/fonts/AvenirNext/AvenirNext-Italic.ttf +0 -0
  66. data/lib/epuber/server/fonts/AvenirNext/AvenirNext-Regular.ttf +0 -0
  67. data/lib/epuber/server/handlers.rb +67 -0
  68. data/lib/epuber/server/keyboard_control.coffee +6 -0
  69. data/lib/epuber/server/pages/book.bade +75 -0
  70. data/lib/epuber/server/pages/common.bade +59 -0
  71. data/lib/epuber/server/pages/files.bade +17 -0
  72. data/lib/epuber/server/pages/toc.bade +29 -0
  73. data/lib/epuber/server/support.coffee +10 -0
  74. data/lib/epuber/templates/template.bookspec +143 -0
  75. data/lib/epuber/third_party/bower.rb +22 -0
  76. data/lib/epuber/third_party/bower/bower.json +10 -0
  77. data/lib/epuber/third_party/bower/bower_components/cookies-js/bower.json +10 -0
  78. data/lib/epuber/third_party/bower/bower_components/cookies-js/dist/cookies.d.ts +33 -0
  79. data/lib/epuber/third_party/bower/bower_components/cookies-js/dist/cookies.js +173 -0
  80. data/lib/epuber/third_party/bower/bower_components/cookies-js/dist/cookies.min.js +6 -0
  81. data/lib/epuber/third_party/bower/bower_components/jquery/MIT-LICENSE.txt +21 -0
  82. data/lib/epuber/third_party/bower/bower_components/jquery/bower.json +28 -0
  83. data/lib/epuber/third_party/bower/bower_components/jquery/dist/jquery.js +9210 -0
  84. data/lib/epuber/third_party/bower/bower_components/jquery/dist/jquery.min.js +5 -0
  85. data/lib/epuber/third_party/bower/bower_components/jquery/dist/jquery.min.map +1 -0
  86. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax.js +786 -0
  87. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax/jsonp.js +89 -0
  88. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax/load.js +75 -0
  89. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax/parseJSON.js +13 -0
  90. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax/parseXML.js +28 -0
  91. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax/script.js +64 -0
  92. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax/var/nonce.js +5 -0
  93. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax/var/rquery.js +3 -0
  94. data/lib/epuber/third_party/bower/bower_components/jquery/src/ajax/xhr.js +136 -0
  95. data/lib/epuber/third_party/bower/bower_components/jquery/src/attributes.js +11 -0
  96. data/lib/epuber/third_party/bower/bower_components/jquery/src/attributes/attr.js +141 -0
  97. data/lib/epuber/third_party/bower/bower_components/jquery/src/attributes/classes.js +158 -0
  98. data/lib/epuber/third_party/bower/bower_components/jquery/src/attributes/prop.js +94 -0
  99. data/lib/epuber/third_party/bower/bower_components/jquery/src/attributes/support.js +35 -0
  100. data/lib/epuber/third_party/bower/bower_components/jquery/src/attributes/val.js +161 -0
  101. data/lib/epuber/third_party/bower/bower_components/jquery/src/callbacks.js +205 -0
  102. data/lib/epuber/third_party/bower/bower_components/jquery/src/core.js +502 -0
  103. data/lib/epuber/third_party/bower/bower_components/jquery/src/core/access.js +60 -0
  104. data/lib/epuber/third_party/bower/bower_components/jquery/src/core/init.js +123 -0
  105. data/lib/epuber/third_party/bower/bower_components/jquery/src/core/parseHTML.js +39 -0
  106. data/lib/epuber/third_party/bower/bower_components/jquery/src/core/ready.js +97 -0
  107. data/lib/epuber/third_party/bower/bower_components/jquery/src/core/var/rsingleTag.js +4 -0
  108. data/lib/epuber/third_party/bower/bower_components/jquery/src/css.js +450 -0
  109. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/addGetHookIf.js +22 -0
  110. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/curCSS.js +57 -0
  111. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/defaultDisplay.js +70 -0
  112. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  113. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/support.js +96 -0
  114. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/swap.js +28 -0
  115. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/var/cssExpand.js +3 -0
  116. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/var/getStyles.js +12 -0
  117. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/var/isHidden.js +13 -0
  118. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/var/rmargin.js +3 -0
  119. data/lib/epuber/third_party/bower/bower_components/jquery/src/css/var/rnumnonpx.js +5 -0
  120. data/lib/epuber/third_party/bower/bower_components/jquery/src/data.js +178 -0
  121. data/lib/epuber/third_party/bower/bower_components/jquery/src/data/Data.js +181 -0
  122. data/lib/epuber/third_party/bower/bower_components/jquery/src/data/accepts.js +20 -0
  123. data/lib/epuber/third_party/bower/bower_components/jquery/src/data/var/data_priv.js +5 -0
  124. data/lib/epuber/third_party/bower/bower_components/jquery/src/data/var/data_user.js +5 -0
  125. data/lib/epuber/third_party/bower/bower_components/jquery/src/deferred.js +149 -0
  126. data/lib/epuber/third_party/bower/bower_components/jquery/src/deprecated.js +13 -0
  127. data/lib/epuber/third_party/bower/bower_components/jquery/src/dimensions.js +50 -0
  128. data/lib/epuber/third_party/bower/bower_components/jquery/src/effects.js +648 -0
  129. data/lib/epuber/third_party/bower/bower_components/jquery/src/effects/Tween.js +114 -0
  130. data/lib/epuber/third_party/bower/bower_components/jquery/src/effects/animatedSelector.js +13 -0
  131. data/lib/epuber/third_party/bower/bower_components/jquery/src/event.js +868 -0
  132. data/lib/epuber/third_party/bower/bower_components/jquery/src/event/ajax.js +13 -0
  133. data/lib/epuber/third_party/bower/bower_components/jquery/src/event/alias.js +39 -0
  134. data/lib/epuber/third_party/bower/bower_components/jquery/src/event/support.js +9 -0
  135. data/lib/epuber/third_party/bower/bower_components/jquery/src/exports/amd.js +24 -0
  136. data/lib/epuber/third_party/bower/bower_components/jquery/src/exports/global.js +32 -0
  137. data/lib/epuber/third_party/bower/bower_components/jquery/src/intro.js +44 -0
  138. data/lib/epuber/third_party/bower/bower_components/jquery/src/jquery.js +37 -0
  139. data/lib/epuber/third_party/bower/bower_components/jquery/src/manipulation.js +580 -0
  140. data/lib/epuber/third_party/bower/bower_components/jquery/src/manipulation/_evalUrl.js +18 -0
  141. data/lib/epuber/third_party/bower/bower_components/jquery/src/manipulation/support.js +32 -0
  142. data/lib/epuber/third_party/bower/bower_components/jquery/src/manipulation/var/rcheckableType.js +3 -0
  143. data/lib/epuber/third_party/bower/bower_components/jquery/src/offset.js +207 -0
  144. data/lib/epuber/third_party/bower/bower_components/jquery/src/outro.js +1 -0
  145. data/lib/epuber/third_party/bower/bower_components/jquery/src/queue.js +142 -0
  146. data/lib/epuber/third_party/bower/bower_components/jquery/src/queue/delay.js +22 -0
  147. data/lib/epuber/third_party/bower/bower_components/jquery/src/selector-native.js +172 -0
  148. data/lib/epuber/third_party/bower/bower_components/jquery/src/selector-sizzle.js +14 -0
  149. data/lib/epuber/third_party/bower/bower_components/jquery/src/selector.js +1 -0
  150. data/lib/epuber/third_party/bower/bower_components/jquery/src/serialize.js +111 -0
  151. data/lib/epuber/third_party/bower/bower_components/jquery/src/sizzle/dist/sizzle.js +2067 -0
  152. data/lib/epuber/third_party/bower/bower_components/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  153. data/lib/epuber/third_party/bower/bower_components/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  154. data/lib/epuber/third_party/bower/bower_components/jquery/src/traversing.js +199 -0
  155. data/lib/epuber/third_party/bower/bower_components/jquery/src/traversing/findFilter.js +100 -0
  156. data/lib/epuber/third_party/bower/bower_components/jquery/src/traversing/var/rneedsContext.js +6 -0
  157. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/arr.js +3 -0
  158. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/class2type.js +4 -0
  159. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/concat.js +5 -0
  160. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/hasOwn.js +5 -0
  161. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/indexOf.js +5 -0
  162. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/pnum.js +3 -0
  163. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/push.js +5 -0
  164. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/rnotwhite.js +3 -0
  165. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/slice.js +5 -0
  166. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/strundefined.js +3 -0
  167. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/support.js +4 -0
  168. data/lib/epuber/third_party/bower/bower_components/jquery/src/var/toString.js +5 -0
  169. data/lib/epuber/third_party/bower/bower_components/jquery/src/wrap.js +79 -0
  170. data/lib/epuber/third_party/bower/bower_components/keymaster/MIT-LICENSE +20 -0
  171. data/lib/epuber/third_party/bower/bower_components/keymaster/Makefile +4 -0
  172. data/lib/epuber/third_party/bower/bower_components/keymaster/README.markdown +212 -0
  173. data/lib/epuber/third_party/bower/bower_components/keymaster/bower.json +27 -0
  174. data/lib/epuber/third_party/bower/bower_components/keymaster/keymaster.js +296 -0
  175. data/lib/epuber/third_party/bower/bower_components/keymaster/package.json +11 -0
  176. data/lib/epuber/third_party/bower/bower_components/keymaster/test.html +93 -0
  177. data/lib/epuber/third_party/bower/bower_components/spin.js/LICENSE.txt +21 -0
  178. data/lib/epuber/third_party/bower/bower_components/spin.js/README.md +21 -0
  179. data/lib/epuber/third_party/bower/bower_components/spin.js/bower.json +18 -0
  180. data/lib/epuber/third_party/bower/bower_components/spin.js/jquery.spin.js +80 -0
  181. data/lib/epuber/third_party/bower/bower_components/spin.js/spin.js +337 -0
  182. data/lib/epuber/third_party/bower/bower_components/uri.js/LICENSE.txt +21 -0
  183. data/lib/epuber/third_party/bower/bower_components/uri.js/README.md +534 -0
  184. data/lib/epuber/third_party/bower/bower_components/uri.js/bower.json +16 -0
  185. data/lib/epuber/third_party/bower/bower_components/uri.js/contributing.md +19 -0
  186. data/lib/epuber/third_party/bower/bower_components/uri.js/src/IPv6.js +188 -0
  187. data/lib/epuber/third_party/bower/bower_components/uri.js/src/SecondLevelDomains.js +241 -0
  188. data/lib/epuber/third_party/bower/bower_components/uri.js/src/URI.fragmentQuery.js +104 -0
  189. data/lib/epuber/third_party/bower/bower_components/uri.js/src/URI.fragmentURI.js +97 -0
  190. data/lib/epuber/third_party/bower/bower_components/uri.js/src/URI.js +2115 -0
  191. data/lib/epuber/third_party/bower/bower_components/uri.js/src/URI.min.js +86 -0
  192. data/lib/epuber/third_party/bower/bower_components/uri.js/src/URITemplate.js +499 -0
  193. data/lib/epuber/third_party/bower/bower_components/uri.js/src/jquery.URI.js +235 -0
  194. data/lib/epuber/third_party/bower/bower_components/uri.js/src/jquery.URI.min.js +7 -0
  195. data/lib/epuber/third_party/bower/bower_components/uri.js/src/punycode.js +508 -0
  196. data/lib/epuber/transformer.rb +19 -0
  197. data/lib/epuber/transformer/text_transformer.rb +60 -0
  198. data/lib/epuber/user_interface.rb +186 -0
  199. data/lib/epuber/vendor/globals_context.rb +26 -0
  200. data/lib/epuber/vendor/hash_binding.rb +26 -0
  201. data/lib/epuber/vendor/nokogiri_extensions.rb +30 -0
  202. data/lib/epuber/vendor/ruby_templater.rb +71 -0
  203. data/lib/epuber/vendor/size.rb +20 -0
  204. data/lib/epuber/vendor/version.rb +83 -0
  205. data/lib/epuber/version.rb +4 -0
  206. metadata +556 -0
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'checker_transformer_base'
4
+
5
+
6
+ module Epuber
7
+ class Transformer < CheckerTransformerBase
8
+ require_relative 'transformer/text_transformer'
9
+
10
+ # @return [Hash<Symbol, Class>]
11
+ #
12
+ def self.map_source_type__class
13
+ {
14
+ :result_text_xhtml_string => TextTransformer,
15
+ :source_text_file => TextTransformer,
16
+ }.merge(super)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../transformer'
4
+
5
+
6
+ module Epuber
7
+ class Transformer
8
+ class TextTransformer < Transformer
9
+
10
+ # @return [String]
11
+ #
12
+ attr_accessor :text
13
+
14
+ # @return [String]
15
+ #
16
+ attr_accessor :file_path
17
+
18
+
19
+ # @param [String] file_path path to transforming file
20
+ # @param [String] text text file content
21
+ # @param [CompilationContext] compilation_context
22
+ #
23
+ # @return [String] new transformed text
24
+ #
25
+ def call(file_path, text, compilation_context)
26
+ @file_path = file_path
27
+ @text = text.dup
28
+
29
+ @block.call(self, @text, compilation_context)
30
+
31
+ new_text = @text
32
+
33
+ @text = nil
34
+ @file_path = nil
35
+
36
+ new_text
37
+ end
38
+
39
+ # Shortcut for performing substitutions in text
40
+ #
41
+ # @param [Regexp, String] pattern
42
+ # @param [String, nil] replacement
43
+ # @param [Bool] multiple_times run the replacement multiple times, while there is something to replace
44
+ # @param [Proc] block optional block for creating replacements, see String#gsub!
45
+ #
46
+ # @return [String, nil] see String#gsub!
47
+ #
48
+ def replace_all(pattern, replacement = nil, multiple_times: false, &block)
49
+ result = if replacement.nil?
50
+ @text.gsub!(pattern, &block)
51
+ else
52
+ @text.gsub!(pattern, replacement, &block)
53
+ end
54
+
55
+ result = replace_all(pattern, replacement, multiple_times: multiple_times, &block) if multiple_times && !result.nil?
56
+ result
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,186 @@
1
+
2
+ require 'active_support/core_ext/object/try'
3
+ require 'nokogiri'
4
+
5
+ require_relative 'ruby_extensions/thread'
6
+ require_relative 'command'
7
+
8
+
9
+ module Epuber
10
+ class UserInterface
11
+ Location = Struct.new(:path, :lineno)
12
+
13
+ class << self
14
+ # @return [Epuber::Command]
15
+ #
16
+ attr_accessor :current_command
17
+ end
18
+
19
+ # Fatal error, prints message and exit with return code 1
20
+ #
21
+ # @param [Exception, String] message message of the error
22
+ # @param [Thread::Backtrace::Location] location location of the error
23
+ #
24
+ def self.error!(message, location: nil)
25
+ error(message, location: location)
26
+ exit(1)
27
+ end
28
+
29
+ # Fatal error, prints message and exit with return code 1
30
+ #
31
+ # @param [String] message message of the error
32
+ # @param [Thread::Backtrace::Location] location location of the error
33
+ # @param [Bool] backtrace output backtrace locations, nil == automatic, true == always and false == never
34
+ #
35
+ def self.error(message, location: nil)
36
+ $stdout.puts unless @last_processing_file_line.nil?
37
+
38
+ $stdout.puts(_format_message(:error, message, location: location))
39
+ _print_backtrace(location.try(:backtrace_locations) || message.try(:backtrace_locations) || caller_locations, location: location) if current_command.verbose?
40
+ end
41
+
42
+ # @param [String] message message of the error
43
+ # @param [Thread::Backtrace::Location] location location of the error
44
+ #
45
+ def self.warning(message, location: nil)
46
+ _clear_processing_line_for_new_output do
47
+ $stdout.puts(_format_message(:warning, message, location: location))
48
+ end
49
+ end
50
+
51
+
52
+
53
+
54
+
55
+ # @param [#to_s] problem some problem, object just have to know to convert self into string with method #to_s
56
+ #
57
+ def self.print_processing_problem(problem)
58
+ _clear_processing_line_for_new_output do
59
+ $stdout.puts(problem.to_s.ansi.send(_color_from_level(:warning)))
60
+ end
61
+ end
62
+
63
+ # @param [String] info_text
64
+ #
65
+ def self.print_processing_debug_info(info_text)
66
+ if current_command && current_command.verbose?
67
+ _clear_processing_line_for_new_output do
68
+ message = if @current_file.nil?
69
+ "▸ #{info_text}"
70
+ else
71
+ "▸ #{@current_file.source_path}: #{info_text}"
72
+ end
73
+
74
+ $stdout.puts(message.ansi.send(_color_from_level(:debug)))
75
+ end
76
+ end
77
+ end
78
+
79
+ # @param [Compiler::FileTypes::AbstractFile] file
80
+ #
81
+ # @return nil
82
+ #
83
+ def self.print_processing_file(file, index, count)
84
+ remove_processing_file_line
85
+
86
+ @current_file = file
87
+
88
+ @last_processing_file_line = "▸ Processing #{file.source_path} (#{index + 1} of #{count})"
89
+ $stdout.print(@last_processing_file_line)
90
+ end
91
+
92
+ def self.remove_processing_file_line
93
+ last_line = @last_processing_file_line
94
+
95
+ unless @last_processing_file_line.nil?
96
+ $stdout.print("\033[2K") # remove line, but without moving cursor
97
+ $stdout.print("\r") # go to beginning of line
98
+ @last_processing_file_line = nil
99
+ end
100
+
101
+ last_line
102
+ end
103
+
104
+ def self.processing_files_done
105
+ remove_processing_file_line
106
+
107
+ @current_file = nil
108
+ end
109
+
110
+ private
111
+
112
+ def self._clear_processing_line_for_new_output
113
+ last_line = remove_processing_file_line
114
+
115
+ yield
116
+
117
+ @last_processing_file_line = last_line
118
+ $stdout.print(last_line)
119
+ end
120
+
121
+ # @param [Symbol] level color of the output
122
+ #
123
+ # @return [Symbol] color
124
+ #
125
+ def self._color_from_level(level)
126
+ case level
127
+ when :error; :red
128
+ when :warning; :yellow
129
+ when :normal; :white
130
+ when :debug; :blue
131
+ else
132
+ raise "Unknown output level #{level}"
133
+ end
134
+ end
135
+
136
+ # @param [Thread::Backtrace::Location, Nokogiri::XML::Node] obj
137
+ #
138
+ # @return [Location]
139
+ #
140
+ def self._location_from_obj(obj)
141
+ case obj
142
+ when ::Thread::Backtrace::Location
143
+ Location.new(obj.path, obj.lineno)
144
+ when ::Nokogiri::XML::Node
145
+ Location.new(obj.document.file_path, obj.line)
146
+ when Location
147
+ obj
148
+ end
149
+ end
150
+
151
+ # @param [Symbol] level color of the output
152
+ # @param [String] message message of the error
153
+ # @param [Thread::Backtrace::Location] location location of the error
154
+ #
155
+ # @return [String] formatted message
156
+ #
157
+ def self._format_message(level, message, location: nil)
158
+ location = _location_from_obj(location)
159
+
160
+ comps = []
161
+ comps << message.to_s
162
+ comps << " (in file #{location.path} line #{location.lineno}" unless location.nil?
163
+
164
+ comps.join("\n").ansi.send(_color_from_level(level))
165
+ end
166
+
167
+ # @param [Array<Thread::Backtrace::Location>] locations locations of the error (only for verbose output)
168
+ # @param [Thread::Backtrace::Location] location location of the error
169
+ #
170
+ # @return [String] formatted message
171
+ #
172
+ def self._format_backtrace(locations, location: nil)
173
+ index = locations.index(location) || 0
174
+ locations[index, locations.size].map { |loc| loc.to_s }
175
+ end
176
+
177
+ # @param [Thread::Backtrace::Location] location location of the error
178
+ #
179
+ def self._print_backtrace(locations, location: nil)
180
+ puts(_format_backtrace(locations, location: location)) if current_command.verbose?
181
+ end
182
+ end
183
+
184
+ # shortcut
185
+ UI = UserInterface
186
+ end
@@ -0,0 +1,26 @@
1
+
2
+ module Epuber
3
+ class GlobalsContext
4
+ attr_accessor :catch_variables
5
+
6
+ def initialize
7
+ @catch_variables = []
8
+ end
9
+
10
+ def catch
11
+ before = global_variables
12
+
13
+ begin
14
+ yield
15
+ ensure
16
+ @catch_variables += (global_variables - before)
17
+ end
18
+ end
19
+
20
+ def clear_all
21
+ @catch_variables.each do |name|
22
+ eval("#{name} = nil")
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ module Epuber
4
+ class HashBinding
5
+ # @param [Hash] vars
6
+ #
7
+ def initialize(vars = {})
8
+ @vars = vars
9
+ end
10
+
11
+ # @param [String] name
12
+ #
13
+ def method_missing(name)
14
+ raise NameError, "Not found value for key #{name}" unless @vars.key?(name)
15
+ @vars[name]
16
+ end
17
+
18
+ # rubocop:disable Style/AccessorMethodName
19
+
20
+ def get_binding
21
+ binding
22
+ end
23
+
24
+ # rubocop:enable Style/AccessorMethodName
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ require 'nokogiri'
4
+
5
+
6
+ class Nokogiri::XML::Node
7
+ # @param [String] name
8
+ # @param [Hash, String] args
9
+ #
10
+ # @return [Nokogiri::XML::Node] new parent node
11
+ #
12
+ def surround_with_element(name, *args, &block)
13
+ new_parent = document.create_element(name, *args, &block)
14
+ old_parent = parent
15
+
16
+ self.parent = new_parent
17
+
18
+ if old_parent.is_a?(Nokogiri::XML::Document)
19
+ old_parent.root = new_parent
20
+ else
21
+ old_parent.children = new_parent
22
+ end
23
+
24
+ new_parent
25
+ end
26
+
27
+ # @return [String] path to original file
28
+ #
29
+ attr_accessor :file_path
30
+ end
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+
3
+ # rubocop:disable Lint/Eval
4
+
5
+ require_relative 'hash_binding'
6
+
7
+
8
+ module Epuber
9
+ class RubyTemplater
10
+ # @return [String]
11
+ #
12
+ attr_accessor :source_text
13
+
14
+ # @return [String]
15
+ #
16
+ attr_accessor :file_path
17
+
18
+ # @return [Hash]
19
+ #
20
+ attr_accessor :locals
21
+
22
+ # @param source [String]
23
+ #
24
+ # @return [self]
25
+ #
26
+ def self.from_source(source, file_path = nil)
27
+ inst = new
28
+ inst.source_text = source
29
+ inst.file_path = file_path
30
+ inst
31
+ end
32
+
33
+ # @param file [String, File]
34
+ #
35
+ # @return [self]
36
+ #
37
+ def self.from_file(file)
38
+ file_obj = if file.is_a?(String)
39
+ File.new(file, 'r')
40
+ else
41
+ file
42
+ end
43
+
44
+ from_source(file_obj.read, file_obj.path)
45
+ end
46
+
47
+
48
+ # ----------------------------------------------------------------------------- #
49
+ # DSL methods
50
+
51
+
52
+ # @param locals [Hash]
53
+ #
54
+ # @return [self]
55
+ #
56
+ def with_locals(locals = {})
57
+ self.locals = locals
58
+ self
59
+ end
60
+
61
+ # @return [String]
62
+ #
63
+ def render
64
+ hash_binding = HashBinding.new(locals)
65
+ eval_string = %(%(#{source_text}))
66
+ eval(eval_string, hash_binding.get_binding)
67
+ end
68
+ end
69
+ end
70
+
71
+ # rubocop:enable Lint/Eval
@@ -0,0 +1,20 @@
1
+
2
+ module Epuber
3
+ class Size
4
+ # @return [Numeric]
5
+ #
6
+ attr_reader :width
7
+
8
+ # @return [Numeric]
9
+ #
10
+ attr_reader :height
11
+
12
+ # @param [Numeric] width
13
+ # @param [Numeric] height
14
+ #
15
+ def initialize(width, height)
16
+ @width = width
17
+ @height = height
18
+ end
19
+ end
20
+ end