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,68 @@
1
+ # encoding: utf-8
2
+
3
+ module Epuber
4
+ class Book
5
+ class FileRequest
6
+ # @return [String]
7
+ #
8
+ attr_accessor :source_pattern
9
+
10
+ # @return [Symbol]
11
+ #
12
+ attr_accessor :group
13
+
14
+ # When looking for file, the resulted list should contain only one file
15
+ #
16
+ # Default: true
17
+ #
18
+ # @return [Bool]
19
+ #
20
+ attr_accessor :only_one
21
+
22
+ # @return [Set<String>]
23
+ #
24
+ attr_accessor :properties
25
+
26
+
27
+ # @param [String] source_pattern pattern describing path to file
28
+ # @param [Bool] only_one find only one file, otherwise look for all files matching pattern in project
29
+ # @param [Symbol] group group of file, see Epuber::Compiler::FileFinder::GROUP_EXTENSIONS
30
+ # @param [Array<Symbol>, Set<Symbol>] properties list of properties
31
+ #
32
+ def initialize(source_pattern, only_one = true, group: nil, properties: [])
33
+ @source_pattern = source_pattern
34
+ @only_one = only_one
35
+ @group = group
36
+ @properties = properties.to_set
37
+ end
38
+
39
+ # @return [Bool]
40
+ #
41
+ def eql?(other)
42
+ self == other
43
+ end
44
+
45
+ # @return [Numeric]
46
+ #
47
+ def hash
48
+ @source_pattern.hash ^ @group.hash ^ @only_one.hash
49
+ end
50
+
51
+ # @param other [String, self]
52
+ #
53
+ def ==(other)
54
+ if other.is_a?(String)
55
+ @source_pattern == other
56
+ else
57
+ @source_pattern == other.source_pattern && @group == other.group && @only_one == other.only_one
58
+ end
59
+ end
60
+
61
+ # @return [String]
62
+ #
63
+ def to_s
64
+ "#<#{self.class} pattern:`#{@source_pattern}` group:`#{@group}` only_one:`#{@only_one}`>"
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,284 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../vendor/version'
4
+ require_relative '../vendor/size'
5
+ require_relative '../dsl/tree_object'
6
+
7
+
8
+ module Epuber
9
+ class Book
10
+ require_relative 'file_request'
11
+
12
+ class Target < DSL::TreeObject
13
+ # @param [Target] parent reference to parent target
14
+ # @param [String] name name of this target
15
+ #
16
+ def initialize(parent = nil, name)
17
+ super(parent)
18
+
19
+ @name = name
20
+ @is_ibooks = nil
21
+ @book = nil
22
+ @files = []
23
+ @constants = {}
24
+ @root_toc = TocItem.new
25
+
26
+ @default_styles = []
27
+ @plugins = []
28
+ end
29
+
30
+ def freeze
31
+ super
32
+ @files.freeze
33
+ @files.each(&:freeze)
34
+
35
+ @default_styles.freeze
36
+ @default_styles.each(&:freeze)
37
+
38
+ @plugins.freeze
39
+ @plugins.each(&:freeze)
40
+
41
+ @root_toc.freeze
42
+ @constants.freeze
43
+ end
44
+
45
+ # @return [String, Symbol] target name
46
+ #
47
+ attr_reader :name
48
+
49
+ # @return [Array<self>] list of sub targets
50
+ #
51
+ alias_method :sub_targets, :sub_items
52
+
53
+ # @return [Epuber::Book::TocItem]
54
+ #
55
+ attr_reader :root_toc
56
+
57
+ # @return [Epuber::Book] reference to book
58
+ #
59
+ attr_accessor :book
60
+
61
+ # @return [Epuber::Book] reference to book
62
+ #
63
+ def book
64
+ @book || (parent && parent.book)
65
+ end
66
+
67
+
68
+ # Create new sub_target with name
69
+ #
70
+ # @param [String] name
71
+ #
72
+ # @return [Target] new created sub target
73
+ #
74
+ def sub_target(name)
75
+ child = create_child_item(name)
76
+
77
+ yield child if block_given?
78
+
79
+ child
80
+ end
81
+
82
+ #------------- other methods ---------------------------------
83
+
84
+ # @return [Bool]
85
+ #
86
+ def ibooks?
87
+ if is_ibooks.nil?
88
+ name.to_s.include?('ibooks')
89
+ else
90
+ is_ibooks
91
+ end
92
+ end
93
+
94
+ # Returns all files
95
+ # @return [Array<Epuber::Book::FileRequest>]
96
+ #
97
+ def files
98
+ # parent files plus our files
99
+ all_files = ((parent && parent.files) || []) + @files + @default_styles
100
+
101
+ unless @attributes_values[:cover_image].nil?
102
+ all_files << @attributes_values[:cover_image]
103
+ end
104
+
105
+ all_files
106
+ end
107
+
108
+ # Returns all constants
109
+ # @return [Hash<String, Object>]
110
+ #
111
+ def constants
112
+ ((parent && parent.constants) || {}).merge(@constants)
113
+ end
114
+
115
+ # @return [Array<Epuber::Book::FileRequest>]
116
+ #
117
+ def default_styles
118
+ ((parent && parent.default_styles) || []) + @default_styles
119
+ end
120
+
121
+ # @return [Array<String>]
122
+ #
123
+ def plugins
124
+ ((parent && parent.plugins) || []) + @plugins
125
+ end
126
+
127
+ #----------------------- DSL items ---------------------------
128
+
129
+
130
+
131
+ # @return [String] version of result epub
132
+ #
133
+ attribute :epub_version,
134
+ required: true,
135
+ inherited: true,
136
+ types: [Version],
137
+ auto_convert: { [String, Fixnum, Float] => Version },
138
+ default_value: 3.0
139
+
140
+ # @return [String] isbn of epub
141
+ #
142
+ attribute :isbn,
143
+ inherited: true
144
+
145
+ # @return [String] book identifier used in OPF file
146
+ #
147
+ attribute :identifier,
148
+ inherited: true
149
+
150
+ # @return [String] target will use custom font (for iBooks only)
151
+ #
152
+ attribute :custom_fonts,
153
+ types: [TrueClass, FalseClass],
154
+ inherited: true
155
+
156
+ # @return [Bool] hint for compiler to add some iBooks related stuff
157
+ #
158
+ attribute :is_ibooks,
159
+ types: [TrueClass, FalseClass],
160
+ inherited: true
161
+
162
+ # @return [Bool] whether the target uses fixed layout
163
+ #
164
+ attribute :fixed_layout,
165
+ types: [TrueClass, FalseClass],
166
+ inherited: true
167
+
168
+ # @return [FileRequest] file request to cover image
169
+ #
170
+ attribute :cover_image,
171
+ types: [FileRequest],
172
+ inherited: true,
173
+ auto_convert: { [String] => ->(value) { FileRequest.new(value, group: :image, properties: [:cover_image]) } }
174
+
175
+ # @return [Size] size of view port, mainly this is used for fixed layout
176
+ #
177
+ attribute :default_viewport,
178
+ types: [Size],
179
+ inherited: true
180
+
181
+ # @return [Bool] whether the target should create mobi
182
+ #
183
+ attribute :create_mobi,
184
+ types: [TrueClass, FalseClass],
185
+ inherited: true
186
+
187
+
188
+ # @param file_path [String | Epuber::Book::File]
189
+ # @param group [Symbol]
190
+ #
191
+ # @return [Epuber::Book::File] created file
192
+ #
193
+ def add_file(file_path, group: nil)
194
+ file = if file_path.is_a?(FileRequest)
195
+ file_path
196
+ else
197
+ FileRequest.new(file_path, group: group)
198
+ end
199
+
200
+
201
+ old_file = @files.find { |f| f == file }
202
+
203
+ if old_file.nil?
204
+ @files << file
205
+ file
206
+ else
207
+ old_file
208
+ end
209
+ end
210
+
211
+ # @param file_paths [Array<String>]
212
+ #
213
+ # @return [void]
214
+ #
215
+ def add_files(*file_paths)
216
+ file_paths.each do |file_path|
217
+ file_obj = add_file(file_path)
218
+ file_obj.only_one = false
219
+ end
220
+ end
221
+
222
+ # @param key [String]
223
+ # @param value [String]
224
+ #
225
+ # @return [void]
226
+ #
227
+ def add_const(key, value = nil)
228
+ if key.is_a?(Hash) && value.nil?
229
+ @constants.merge!(key)
230
+ else
231
+ @constants[key] = value
232
+ end
233
+ end
234
+
235
+
236
+ # @param file_paths [Array<String>]
237
+ #
238
+ # @return [void]
239
+ #
240
+ def add_default_style(*file_paths)
241
+ file_paths.map do |file_path|
242
+ file_obj = add_file(file_path, group: :style)
243
+ file_obj.only_one = true
244
+
245
+ @default_styles << file_obj unless @default_styles.include?(file_obj)
246
+ end
247
+ end
248
+
249
+ # Add default styles to default target, default styles will be automatically added to xhtml document
250
+ #
251
+ # Only difference with #add_default_style is it adds multiple files with one pattern
252
+ # @param file_paths [Array<String>]
253
+ #
254
+ # @return [void]
255
+ #
256
+ def add_default_styles(*file_paths)
257
+ file_paths.map do |file_path|
258
+ file_obj = add_file(file_path, group: :style)
259
+ file_obj.only_one = false
260
+
261
+ @default_styles << file_obj unless @default_styles.include?(file_obj)
262
+ end
263
+ end
264
+
265
+ # @yield [toc_item, target]
266
+ # @yieldparam toc_item [TocItem] root toc item
267
+ # @yieldparam target [self] current target
268
+ #
269
+ # @return nil
270
+ #
271
+ def toc
272
+ yield(@root_toc, self) if block_given?
273
+ end
274
+
275
+ # @param path [String] use some file/module/package
276
+ #
277
+ # @return [nil]
278
+ #
279
+ def use(path)
280
+ @plugins << path
281
+ end
282
+ end
283
+ end
284
+ end
@@ -0,0 +1,130 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../dsl/tree_object'
4
+
5
+
6
+ module Epuber
7
+ class Book
8
+ require_relative 'file_request'
9
+
10
+ class TocItem < DSL::TreeObject
11
+ # @return [Epuber::Book::FileRequest]
12
+ #
13
+ attribute :file_request,
14
+ types: [FileRequest],
15
+ auto_convert: { String => FileRequest },
16
+ inherited: true
17
+
18
+ # @return [String]
19
+ #
20
+ attribute :title
21
+
22
+ # @return [Array<Symbol | Hash<Symbol, Object>>]
23
+ #
24
+ attribute :options,
25
+ default_value: []
26
+
27
+ # @return [String]
28
+ #
29
+ attr_accessor :file_fragment
30
+
31
+
32
+ # --------------
33
+
34
+ # @return [Array<Symbol>]
35
+ #
36
+ def landmarks
37
+ options.select do |item|
38
+ item.is_a?(Symbol) && item.to_s.start_with?('landmark')
39
+ end
40
+ end
41
+
42
+ # @return [Bool]
43
+ #
44
+ def linear?
45
+ first = options.select do |item|
46
+ item.is_a?(Hash) && (item.include?(:linear) || item.include?('linear'))
47
+ end.first
48
+
49
+ if first.nil?
50
+ true
51
+ else
52
+ first.values.first
53
+ end
54
+ end
55
+
56
+ # @return [String]
57
+ #
58
+ def full_source_pattern
59
+ [file_request.source_pattern, file_fragment].compact.join('#')
60
+ end
61
+
62
+ # @return [String]
63
+ #
64
+ def local_source_pattern
65
+ file_request = attributes_values[:file_request]
66
+
67
+ return "##{file_fragment}" if file_request.nil?
68
+
69
+ [file_request.source_pattern, file_fragment].compact.join('#')
70
+ end
71
+
72
+
73
+ # -------------- creating sub items -----------------
74
+
75
+ # Creating sub item from file
76
+ #
77
+ # @example
78
+ # toc.file 'ch01', 'Chapter 1', :landmark_start_page
79
+ # toc.file 'ch02', :landmark_copyright
80
+ # toc.file 'ch03', :linear => false
81
+ # toc.file 'ch04', linear: false
82
+ #
83
+ # @param [String] file_path pattern describing path to file
84
+ # @param [String] title title of this item
85
+ #
86
+ def file(file_path, title = nil, *opts)
87
+ create_child_item do |item|
88
+ unless file_path.nil?
89
+ file_pattern, file_fragment = file_path.split('#')
90
+
91
+ unless file_pattern.nil? || file_pattern.empty?
92
+ file_obj = FileRequest.new(file_pattern, group: :text)
93
+ item.file_request = file_obj
94
+ end
95
+
96
+ unless file_fragment.nil? || file_fragment.empty?
97
+ item.file_fragment = file_fragment
98
+ end
99
+ end
100
+
101
+ if title.is_a?(String)
102
+ item.title = title
103
+ else
104
+ opts.unshift(title)
105
+ end
106
+
107
+ item.options = opts.map do |i|
108
+ if i.is_a?(Hash)
109
+ i.map do |j_key, j_value|
110
+ { j_key => j_value }
111
+ end
112
+ else
113
+ i
114
+ end
115
+ end.flatten
116
+
117
+ yield item if block_given?
118
+ end
119
+ end
120
+
121
+ # Creating sub item without reference to file
122
+ #
123
+ # @param [String] title
124
+ #
125
+ def item(title, *opts)
126
+ file(nil, title, *opts)
127
+ end
128
+ end
129
+ end
130
+ end