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,130 @@
1
+ # encoding: utf-8
2
+
3
+
4
+ module Epuber
5
+ module DSL
6
+ module AttributeSupport
7
+ # Method to create attribute for DSL object
8
+ #
9
+ # @example
10
+ # attribute :name
11
+ # attribute :title, required: true, inherited: true
12
+ #
13
+ # @param name [Symbol] attribute name
14
+ # @param options [Hash]
15
+ #
16
+ # @see Attribute
17
+ #
18
+ # @return nil
19
+ #
20
+ def attribute(name, options = {})
21
+ attr = Attribute.new(name, options)
22
+
23
+ dsl_attributes[name] = attr
24
+
25
+ define_method_attr(name, attr)
26
+ end
27
+
28
+ # All DSL attributes
29
+ #
30
+ # @return [Hash<Symbol, Attribute>]
31
+ #
32
+ def dsl_attributes
33
+ @dsl_attributes ||= {}
34
+ end
35
+
36
+ # @return [Object]
37
+ #
38
+ def find_root(instance)
39
+ return unless instance.respond_to?(:parent)
40
+
41
+ if instance.parent.nil?
42
+ instance
43
+ else
44
+ find_root(instance.parent)
45
+ end
46
+ end
47
+
48
+ # @param name [Symbol]
49
+ # @param attr [Epuber::DSL::Attribute]
50
+ #
51
+ # @return nil
52
+ #
53
+ def define_method_attr(name, attr)
54
+ key = name
55
+
56
+ # define normal getter
57
+ define_method(key) do
58
+ value = @attributes_values[key]
59
+
60
+ if !value.nil?
61
+ # has value -> return it
62
+ value
63
+
64
+ elsif attr.inherited? && respond_to?(:parent) && !parent.nil?
65
+ # hasn't value –> try to find it in parent
66
+ parent.send(key)
67
+
68
+ elsif !attr.default_value.nil?
69
+ # write default value on first access to root object
70
+ root_obj = self.class.find_root(self) || self
71
+ root_obj.send(attr.writer_name, attr.default_value)
72
+
73
+ # and return the default value
74
+ attr.default_value
75
+ end
76
+ end
77
+
78
+ # define normal setter
79
+ define_method(attr.writer_name) do |value|
80
+ if attr.singularize?
81
+ array_value = if value.is_a? Array
82
+ value
83
+ else
84
+ [value]
85
+ end
86
+
87
+ mapped = array_value.map { |one_value| attr.converted_value(one_value) }
88
+
89
+ @attributes_values[key] = mapped
90
+ else
91
+ begin
92
+ @attributes_values[key] = attr.converted_value(value)
93
+ rescue Exception => e
94
+ UI.warning("Invalid value `#{value}` for attribute `#{name}`, original error `#{e}`", location: caller_locations[1])
95
+ end
96
+ end
97
+ end
98
+
99
+ return unless attr.singularize?
100
+
101
+ # define singular methods
102
+ singular_key = key.to_s.singularize.to_sym
103
+
104
+ define_method(singular_key) do
105
+ value = @attributes_values[key]
106
+
107
+ if attr.singularize? && value.is_a?(Array)
108
+ value.first
109
+ else
110
+ value
111
+ end
112
+ end
113
+
114
+ define_method(attr.writer_singular_form) do |value|
115
+ if attr.singularize?
116
+ array_value = if value.is_a?(Array)
117
+ value
118
+ else
119
+ [value]
120
+ end
121
+
122
+ @attributes_values[key] = array_value.map { |one_value| attr.converted_value(one_value) }
123
+ else
124
+ @attributes_values[key] = attr.converted_value(value)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,145 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'attribute'
4
+ require_relative 'attribute_support'
5
+
6
+ require 'active_support/core_ext/string/inflections'
7
+
8
+
9
+ module Epuber
10
+ module DSL
11
+ class Object
12
+ class ValidationError < StandardError; end
13
+
14
+ # @return [String, nil]
15
+ #
16
+ attr_reader :file_path
17
+
18
+ def initialize
19
+ super
20
+ @attributes_values = {}
21
+ @file_path = nil
22
+
23
+ # iterate over all attributes to write default values
24
+ self.class.dsl_attributes.each do |key, _attr|
25
+ self.send(key)
26
+ end
27
+ end
28
+
29
+ # @return [String]
30
+ #
31
+ def to_s
32
+ "<#{self.class} #{@attributes_values}>"
33
+ end
34
+
35
+ # @return nil
36
+ #
37
+ def freeze
38
+ super
39
+ @attributes_values.freeze
40
+ end
41
+
42
+ # Validates all values of attributes, if there is some error, StandardError will be raised
43
+ #
44
+ # @note it only check for required values for now
45
+ #
46
+ # @return nil
47
+ #
48
+ def validate
49
+ self.class.dsl_attributes.each do |key, attr|
50
+ value = @attributes_values[key] || attr.converted_value(attr.default_value)
51
+
52
+ attr.validate_type(value)
53
+
54
+ next unless attr.required? && value.nil?
55
+
56
+ if attr.singularize?
57
+ raise ValidationError, "missing required attribute `#{key.to_s.singularize}|#{key}`"
58
+ else
59
+ raise ValidationError, "missing required attribute `#{key}`"
60
+ end
61
+ end
62
+ end
63
+
64
+ # Creates new instance by parsing ruby code from file
65
+ #
66
+ # @param file_path [String]
67
+ #
68
+ # @return [Self]
69
+ #
70
+ def self.from_file(file_path)
71
+ from_string(::File.new(file_path).read, file_path)
72
+ end
73
+
74
+ # Creates new instance by parsing ruby code from string
75
+ #
76
+ # @param string [String]
77
+ #
78
+ # @return [Self]
79
+ #
80
+ def self.from_string(string, file_path = nil)
81
+ # rubocop:disable Lint/Eval
82
+ obj = if file_path
83
+ eval(string, nil, file_path)
84
+ else
85
+ eval(string)
86
+ end
87
+ # rubocop:enable Lint/Eval
88
+
89
+ unless obj.is_a?(self)
90
+ msg = "Invalid object #{obj.class}, expected object of class #{self}"
91
+
92
+ if file_path
93
+ msg += ", loaded from file #{file_path}"
94
+
95
+ end
96
+
97
+ raise StandardError, msg
98
+ end
99
+
100
+ obj.instance_eval { @file_path = file_path }
101
+ obj
102
+ end
103
+
104
+ # @return [Bool] is created from file
105
+ #
106
+ def from_file?
107
+ !file_path.nil?
108
+ end
109
+
110
+ # --------------------------------------------------- #
111
+
112
+ # @group Attributes
113
+
114
+ protected
115
+
116
+ extend AttributeSupport
117
+
118
+ class << self
119
+ # @return [Hash<Symbol, Attribute>] The attributes of the class.
120
+ #
121
+ attr_accessor :attributes
122
+ end
123
+
124
+ # @return [Hash<Symbol, Any>]
125
+ #
126
+ attr_accessor :attributes_values
127
+
128
+ # Raise exception when there is used some unknown method or attribute
129
+ #
130
+ # This is just for creating better message in raised exception
131
+ #
132
+ # @return nil
133
+ #
134
+ def method_missing(name, *args)
135
+ if /([^=]+)=?/ =~ name
136
+ attr_name = $1
137
+ location = caller_locations.first
138
+ raise NameError, "Unknown attribute or method `#{attr_name}` for class `#{self.class}` in file `#{location.path}:#{location.lineno}`"
139
+ else
140
+ super
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,101 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'object'
4
+
5
+ module Epuber
6
+ module DSL
7
+ class TreeObject < Object
8
+ # @param [TreeObject] parent
9
+ #
10
+ def initialize(parent = nil)
11
+ super()
12
+
13
+ @parent = parent
14
+ @sub_items = []
15
+
16
+ parent.sub_items << self unless parent.nil?
17
+ end
18
+
19
+ # @return nil
20
+ #
21
+ def freeze
22
+ super
23
+ @sub_items.freeze
24
+ end
25
+
26
+ # @return [self] reference to parent
27
+ #
28
+ attr_reader :parent
29
+
30
+ # @return [Array<self>] child items
31
+ #
32
+ attr_reader :sub_items
33
+
34
+ # @return [Array<self>] child items
35
+ #
36
+ def flat_sub_items
37
+ all = []
38
+
39
+ sub_items.each do |item|
40
+ all << item
41
+ all.concat(item.flat_sub_items)
42
+ end
43
+
44
+ all
45
+ end
46
+
47
+ # @return [Bool] receiver is root
48
+ #
49
+ def root?
50
+ @parent.nil?
51
+ end
52
+
53
+ # @return nil
54
+ #
55
+ def validate
56
+ super
57
+ sub_items.each(&:validate)
58
+ end
59
+
60
+ class << self
61
+ # @return [Self]
62
+ #
63
+ attr_accessor :current_parent_object
64
+ end
65
+
66
+ # @yield [child_item]
67
+ # @yieldparam child_item [self] created child item
68
+ #
69
+ # @return [self]
70
+ #
71
+ def create_child_item(*args)
72
+ child = self.class.new(*args)
73
+
74
+ parent_object_before = self.class.current_parent_object
75
+
76
+ child.parent = parent_object_before || self
77
+ child.parent.sub_items << child
78
+
79
+ self.class.current_parent_object = child
80
+ yield child if block_given?
81
+
82
+
83
+ self.class.current_parent_object = parent_object_before
84
+
85
+ child
86
+ end
87
+
88
+ # @return nil
89
+ #
90
+ def create_child_items
91
+ yield self if block_given?
92
+ end
93
+
94
+
95
+ protected
96
+
97
+ attr_writer :parent
98
+ attr_writer :sub_items
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ module Epuber
4
+ module Helper
5
+
6
+ # @param [Book::TocItem] toc_item
7
+ # @param [Compiler::FileResolver] file_resolver
8
+ # @param [String] context_path
9
+ #
10
+ # @return [String]
11
+ #
12
+ def self.destination_path_for_toc_item(toc_item, file_resolver, context_path)
13
+ file = file_resolver.file_from_request(toc_item.file_request)
14
+ path = [file.final_destination_path, toc_item.file_fragment].compact.join('#')
15
+
16
+ Pathname.new(path).relative_path_from(Pathname.new(context_path)).to_s
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+
3
+ require 'yaml'
4
+
5
+
6
+ module Epuber
7
+ class Lockfile
8
+ attr_accessor :defined_from_file
9
+
10
+ # @param [Hash] data
11
+ #
12
+ def initialize(data = {})
13
+ @internal_data = data
14
+ end
15
+
16
+ # @return [self]
17
+ #
18
+ def self.from_file(file_path)
19
+ if File.exists?(file_path)
20
+ hash = YAML.load(File.read(file_path))
21
+ else
22
+ hash = {}
23
+ end
24
+
25
+ inst = self.new(hash)
26
+ inst.defined_from_file = file_path
27
+ inst
28
+ end
29
+
30
+ # @return nil
31
+ #
32
+ def write_to_file
33
+ return if defined_from_file.nil?
34
+
35
+ File.open(defined_from_file, 'w') do |f|
36
+ f.write(YAML.dump(@internal_data))
37
+ end
38
+ end
39
+
40
+
41
+ # @return [Epuber::Version]
42
+ #
43
+ def version
44
+ @internal_data['version']
45
+ end
46
+
47
+ # @param [Epuber::Version] new_version
48
+ #
49
+ # @return [Epuber::Version]
50
+ #
51
+ def version=(new_version)
52
+ @internal_data['version'] = new_version
53
+ end
54
+ end
55
+ end