nanoc3 3.2.4 → 3.3.0

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 (211) hide show
  1. metadata +14 -313
  2. data/.gemtest +0 -0
  3. data/ChangeLog +0 -3
  4. data/Gemfile +0 -29
  5. data/LICENSE +0 -19
  6. data/NEWS.md +0 -449
  7. data/README.md +0 -108
  8. data/Rakefile +0 -14
  9. data/bin/nanoc3 +0 -12
  10. data/doc/yardoc_templates/default/layout/html/footer.erb +0 -10
  11. data/lib/nanoc3.rb +0 -28
  12. data/lib/nanoc3/base.rb +0 -49
  13. data/lib/nanoc3/base/compilation/checksum_store.rb +0 -57
  14. data/lib/nanoc3/base/compilation/compiled_content_cache.rb +0 -62
  15. data/lib/nanoc3/base/compilation/compiler.rb +0 -455
  16. data/lib/nanoc3/base/compilation/compiler_dsl.rb +0 -214
  17. data/lib/nanoc3/base/compilation/dependency_tracker.rb +0 -196
  18. data/lib/nanoc3/base/compilation/filter.rb +0 -165
  19. data/lib/nanoc3/base/compilation/item_rep_proxy.rb +0 -102
  20. data/lib/nanoc3/base/compilation/item_rep_recorder_proxy.rb +0 -88
  21. data/lib/nanoc3/base/compilation/outdatedness_checker.rb +0 -223
  22. data/lib/nanoc3/base/compilation/outdatedness_reasons.rb +0 -46
  23. data/lib/nanoc3/base/compilation/rule.rb +0 -73
  24. data/lib/nanoc3/base/compilation/rule_context.rb +0 -84
  25. data/lib/nanoc3/base/compilation/rule_memory_calculator.rb +0 -40
  26. data/lib/nanoc3/base/compilation/rule_memory_store.rb +0 -53
  27. data/lib/nanoc3/base/compilation/rules_collection.rb +0 -231
  28. data/lib/nanoc3/base/context.rb +0 -47
  29. data/lib/nanoc3/base/core_ext.rb +0 -6
  30. data/lib/nanoc3/base/core_ext/array.rb +0 -62
  31. data/lib/nanoc3/base/core_ext/hash.rb +0 -63
  32. data/lib/nanoc3/base/core_ext/pathname.rb +0 -26
  33. data/lib/nanoc3/base/core_ext/string.rb +0 -46
  34. data/lib/nanoc3/base/directed_graph.rb +0 -275
  35. data/lib/nanoc3/base/errors.rb +0 -174
  36. data/lib/nanoc3/base/memoization.rb +0 -67
  37. data/lib/nanoc3/base/notification_center.rb +0 -84
  38. data/lib/nanoc3/base/ordered_hash.rb +0 -200
  39. data/lib/nanoc3/base/plugin_registry.rb +0 -165
  40. data/lib/nanoc3/base/result_data/item_rep.rb +0 -488
  41. data/lib/nanoc3/base/source_data/code_snippet.rb +0 -58
  42. data/lib/nanoc3/base/source_data/configuration.rb +0 -24
  43. data/lib/nanoc3/base/source_data/data_source.rb +0 -234
  44. data/lib/nanoc3/base/source_data/item.rb +0 -301
  45. data/lib/nanoc3/base/source_data/layout.rb +0 -130
  46. data/lib/nanoc3/base/source_data/site.rb +0 -361
  47. data/lib/nanoc3/base/store.rb +0 -135
  48. data/lib/nanoc3/cli.rb +0 -133
  49. data/lib/nanoc3/cli/command.rb +0 -139
  50. data/lib/nanoc3/cli/commands/autocompile.rb +0 -60
  51. data/lib/nanoc3/cli/commands/compile.rb +0 -280
  52. data/lib/nanoc3/cli/commands/create_item.rb +0 -62
  53. data/lib/nanoc3/cli/commands/create_layout.rb +0 -75
  54. data/lib/nanoc3/cli/commands/create_site.rb +0 -410
  55. data/lib/nanoc3/cli/commands/debug.rb +0 -119
  56. data/lib/nanoc3/cli/commands/info.rb +0 -98
  57. data/lib/nanoc3/cli/commands/nanoc.rb +0 -37
  58. data/lib/nanoc3/cli/commands/update.rb +0 -72
  59. data/lib/nanoc3/cli/commands/view.rb +0 -84
  60. data/lib/nanoc3/cli/commands/watch.rb +0 -125
  61. data/lib/nanoc3/cli/error_handler.rb +0 -193
  62. data/lib/nanoc3/cli/logger.rb +0 -91
  63. data/lib/nanoc3/data_sources.rb +0 -29
  64. data/lib/nanoc3/data_sources/deprecated/delicious.rb +0 -42
  65. data/lib/nanoc3/data_sources/deprecated/last_fm.rb +0 -87
  66. data/lib/nanoc3/data_sources/deprecated/twitter.rb +0 -38
  67. data/lib/nanoc3/data_sources/filesystem.rb +0 -299
  68. data/lib/nanoc3/data_sources/filesystem_unified.rb +0 -116
  69. data/lib/nanoc3/data_sources/filesystem_verbose.rb +0 -86
  70. data/lib/nanoc3/extra.rb +0 -22
  71. data/lib/nanoc3/extra/auto_compiler.rb +0 -103
  72. data/lib/nanoc3/extra/chick.rb +0 -125
  73. data/lib/nanoc3/extra/core_ext.rb +0 -4
  74. data/lib/nanoc3/extra/core_ext/enumerable.rb +0 -33
  75. data/lib/nanoc3/extra/core_ext/time.rb +0 -19
  76. data/lib/nanoc3/extra/deployers.rb +0 -11
  77. data/lib/nanoc3/extra/deployers/rsync.rb +0 -114
  78. data/lib/nanoc3/extra/file_proxy.rb +0 -40
  79. data/lib/nanoc3/extra/validators.rb +0 -12
  80. data/lib/nanoc3/extra/validators/links.rb +0 -264
  81. data/lib/nanoc3/extra/validators/w3c.rb +0 -95
  82. data/lib/nanoc3/extra/vcs.rb +0 -66
  83. data/lib/nanoc3/extra/vcses.rb +0 -17
  84. data/lib/nanoc3/extra/vcses/bazaar.rb +0 -25
  85. data/lib/nanoc3/extra/vcses/dummy.rb +0 -24
  86. data/lib/nanoc3/extra/vcses/git.rb +0 -25
  87. data/lib/nanoc3/extra/vcses/mercurial.rb +0 -25
  88. data/lib/nanoc3/extra/vcses/subversion.rb +0 -25
  89. data/lib/nanoc3/filters.rb +0 -53
  90. data/lib/nanoc3/filters/asciidoc.rb +0 -38
  91. data/lib/nanoc3/filters/bluecloth.rb +0 -19
  92. data/lib/nanoc3/filters/coderay.rb +0 -21
  93. data/lib/nanoc3/filters/colorize_syntax.rb +0 -261
  94. data/lib/nanoc3/filters/erb.rb +0 -35
  95. data/lib/nanoc3/filters/erubis.rb +0 -27
  96. data/lib/nanoc3/filters/haml.rb +0 -27
  97. data/lib/nanoc3/filters/kramdown.rb +0 -20
  98. data/lib/nanoc3/filters/less.rb +0 -53
  99. data/lib/nanoc3/filters/markaby.rb +0 -20
  100. data/lib/nanoc3/filters/maruku.rb +0 -20
  101. data/lib/nanoc3/filters/mustache.rb +0 -24
  102. data/lib/nanoc3/filters/rainpress.rb +0 -19
  103. data/lib/nanoc3/filters/rdiscount.rb +0 -22
  104. data/lib/nanoc3/filters/rdoc.rb +0 -33
  105. data/lib/nanoc3/filters/redcarpet.rb +0 -27
  106. data/lib/nanoc3/filters/redcloth.rb +0 -47
  107. data/lib/nanoc3/filters/relativize_paths.rb +0 -45
  108. data/lib/nanoc3/filters/rubypants.rb +0 -20
  109. data/lib/nanoc3/filters/sass.rb +0 -66
  110. data/lib/nanoc3/filters/slim.rb +0 -25
  111. data/lib/nanoc3/filters/typogruby.rb +0 -23
  112. data/lib/nanoc3/filters/uglify_js.rb +0 -42
  113. data/lib/nanoc3/helpers.rb +0 -16
  114. data/lib/nanoc3/helpers/blogging.rb +0 -319
  115. data/lib/nanoc3/helpers/breadcrumbs.rb +0 -40
  116. data/lib/nanoc3/helpers/capturing.rb +0 -138
  117. data/lib/nanoc3/helpers/filtering.rb +0 -50
  118. data/lib/nanoc3/helpers/html_escape.rb +0 -55
  119. data/lib/nanoc3/helpers/link_to.rb +0 -151
  120. data/lib/nanoc3/helpers/rendering.rb +0 -140
  121. data/lib/nanoc3/helpers/tagging.rb +0 -71
  122. data/lib/nanoc3/helpers/text.rb +0 -44
  123. data/lib/nanoc3/helpers/xml_sitemap.rb +0 -76
  124. data/lib/nanoc3/tasks.rb +0 -10
  125. data/lib/nanoc3/tasks/clean.rake +0 -16
  126. data/lib/nanoc3/tasks/clean.rb +0 -29
  127. data/lib/nanoc3/tasks/deploy/rsync.rake +0 -14
  128. data/lib/nanoc3/tasks/validate.rake +0 -92
  129. data/nanoc3.gemspec +0 -49
  130. data/tasks/doc.rake +0 -16
  131. data/tasks/test.rake +0 -44
  132. data/test/base/core_ext/array_spec.rb +0 -73
  133. data/test/base/core_ext/hash_spec.rb +0 -98
  134. data/test/base/core_ext/pathname_spec.rb +0 -27
  135. data/test/base/core_ext/string_spec.rb +0 -37
  136. data/test/base/test_checksum_store.rb +0 -35
  137. data/test/base/test_code_snippet.rb +0 -31
  138. data/test/base/test_compiler.rb +0 -316
  139. data/test/base/test_compiler_dsl.rb +0 -161
  140. data/test/base/test_context.rb +0 -31
  141. data/test/base/test_data_source.rb +0 -46
  142. data/test/base/test_dependency_tracker.rb +0 -262
  143. data/test/base/test_directed_graph.rb +0 -283
  144. data/test/base/test_filter.rb +0 -83
  145. data/test/base/test_item.rb +0 -179
  146. data/test/base/test_item_rep.rb +0 -553
  147. data/test/base/test_layout.rb +0 -59
  148. data/test/base/test_memoization.rb +0 -90
  149. data/test/base/test_notification_center.rb +0 -34
  150. data/test/base/test_outdatedness_checker.rb +0 -394
  151. data/test/base/test_plugin.rb +0 -30
  152. data/test/base/test_rule.rb +0 -19
  153. data/test/base/test_rule_context.rb +0 -65
  154. data/test/base/test_site.rb +0 -190
  155. data/test/cli/commands/test_compile.rb +0 -33
  156. data/test/cli/commands/test_create_item.rb +0 -14
  157. data/test/cli/commands/test_create_layout.rb +0 -28
  158. data/test/cli/commands/test_create_site.rb +0 -24
  159. data/test/cli/commands/test_help.rb +0 -12
  160. data/test/cli/commands/test_info.rb +0 -11
  161. data/test/cli/commands/test_update.rb +0 -10
  162. data/test/cli/test_cli.rb +0 -102
  163. data/test/cli/test_error_handler.rb +0 -29
  164. data/test/cli/test_logger.rb +0 -10
  165. data/test/data_sources/test_filesystem.rb +0 -433
  166. data/test/data_sources/test_filesystem_unified.rb +0 -536
  167. data/test/data_sources/test_filesystem_verbose.rb +0 -357
  168. data/test/extra/core_ext/test_enumerable.rb +0 -30
  169. data/test/extra/core_ext/test_time.rb +0 -15
  170. data/test/extra/deployers/test_rsync.rb +0 -232
  171. data/test/extra/test_auto_compiler.rb +0 -417
  172. data/test/extra/test_file_proxy.rb +0 -19
  173. data/test/extra/test_vcs.rb +0 -22
  174. data/test/extra/validators/test_links.rb +0 -51
  175. data/test/extra/validators/test_w3c.rb +0 -47
  176. data/test/filters/test_asciidoc.rb +0 -22
  177. data/test/filters/test_bluecloth.rb +0 -18
  178. data/test/filters/test_coderay.rb +0 -44
  179. data/test/filters/test_colorize_syntax.rb +0 -283
  180. data/test/filters/test_erb.rb +0 -99
  181. data/test/filters/test_erubis.rb +0 -70
  182. data/test/filters/test_haml.rb +0 -96
  183. data/test/filters/test_kramdown.rb +0 -18
  184. data/test/filters/test_less.rb +0 -113
  185. data/test/filters/test_markaby.rb +0 -24
  186. data/test/filters/test_maruku.rb +0 -18
  187. data/test/filters/test_mustache.rb +0 -25
  188. data/test/filters/test_rainpress.rb +0 -29
  189. data/test/filters/test_rdiscount.rb +0 -31
  190. data/test/filters/test_rdoc.rb +0 -18
  191. data/test/filters/test_redcarpet.rb +0 -63
  192. data/test/filters/test_redcloth.rb +0 -33
  193. data/test/filters/test_relativize_paths.rb +0 -332
  194. data/test/filters/test_rubypants.rb +0 -18
  195. data/test/filters/test_sass.rb +0 -229
  196. data/test/filters/test_slim.rb +0 -35
  197. data/test/filters/test_typogruby.rb +0 -21
  198. data/test/filters/test_uglify_js.rb +0 -30
  199. data/test/gem_loader.rb +0 -11
  200. data/test/helper.rb +0 -179
  201. data/test/helpers/test_blogging.rb +0 -754
  202. data/test/helpers/test_breadcrumbs.rb +0 -81
  203. data/test/helpers/test_capturing.rb +0 -41
  204. data/test/helpers/test_filtering.rb +0 -106
  205. data/test/helpers/test_html_escape.rb +0 -32
  206. data/test/helpers/test_link_to.rb +0 -249
  207. data/test/helpers/test_rendering.rb +0 -89
  208. data/test/helpers/test_tagging.rb +0 -87
  209. data/test/helpers/test_text.rb +0 -24
  210. data/test/helpers/test_xml_sitemap.rb +0 -103
  211. data/test/tasks/test_clean.rb +0 -67
@@ -1,214 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3
4
-
5
- # Contains methods that will be executed by the site’s `Rules` file.
6
- class CompilerDSL
7
-
8
- # Creates a new compiler DSL for the given collection of rules.
9
- #
10
- # @api private
11
- #
12
- # @param [Nanoc3::RulesCollection] rules_collection The collection of
13
- # rules to modify when loading this DSL
14
- #
15
- # @param [Hash] config The site configuration
16
- def initialize(rules_collection, config)
17
- @rules_collection = rules_collection
18
- @config = config
19
- end
20
-
21
- # Creates a preprocessor block that will be executed after all data is
22
- # loaded, but before the site is compiled.
23
- #
24
- # @yield The block that will be executed before site compilation starts
25
- #
26
- # @return [void]
27
- def preprocess(&block)
28
- @rules_collection.preprocessor = block
29
- end
30
-
31
- # Creates a compilation rule for all items whose identifier match the
32
- # given identifier, which may either be a string containing the *
33
- # wildcard, or a regular expression.
34
- #
35
- # This rule will be applicable to reps with a name equal to `:default`;
36
- # this can be changed by giving an explicit `:rep` parameter.
37
- #
38
- # An item rep will be compiled by calling the given block and passing the
39
- # rep as a block argument.
40
- #
41
- # @param [String] identifier A pattern matching identifiers of items that
42
- # should be compiled using this rule
43
- #
44
- # @option params [Symbol] :rep (:default) The name of the representation
45
- # that should be compiled using this rule
46
- #
47
- # @yield The block that will be executed when an item matching this
48
- # compilation rule needs to be compiled
49
- #
50
- # @return [void]
51
- #
52
- # @example Compiling the default rep of the `/foo/` item
53
- #
54
- # compile '/foo/' do
55
- # rep.filter :erb
56
- # end
57
- #
58
- # @example Compiling the `:raw` rep of the `/bar/` item
59
- #
60
- # compile '/bar/', :rep => :raw do
61
- # # do nothing
62
- # end
63
- def compile(identifier, params={}, &block)
64
- # Require block
65
- raise ArgumentError.new("#compile requires a block") unless block_given?
66
-
67
- # Get rep name
68
- rep_name = params[:rep] || :default
69
-
70
- # Create rule
71
- rule = Rule.new(identifier_to_regex(identifier), rep_name, block)
72
- @rules_collection.add_item_compilation_rule(rule)
73
- end
74
-
75
- # Creates a routing rule for all items whose identifier match the
76
- # given identifier, which may either be a string containing the `*`
77
- # wildcard, or a regular expression.
78
- #
79
- # This rule will be applicable to reps with a name equal to `:default`;
80
- # this can be changed by giving an explicit `:rep` parameter.
81
- #
82
- # The path of an item rep will be determined by calling the given block
83
- # and passing the rep as a block argument.
84
- #
85
- # @param [String] identifier A pattern matching identifiers of items that
86
- # should be routed using this rule
87
- #
88
- # @option params [Symbol] :rep (:default) The name of the representation
89
- # that should be routed using this rule
90
- #
91
- # @yield The block that will be executed when an item matching this
92
- # compilation rule needs to be routed
93
- #
94
- # @return [void]
95
- #
96
- # @example Routing the default rep of the `/foo/` item
97
- #
98
- # route '/foo/' do
99
- # item.identifier + 'index.html'
100
- # end
101
- #
102
- # @example Routing the `:raw` rep of the `/bar/` item
103
- #
104
- # route '/bar/', :rep => :raw do
105
- # '/raw' + item.identifier + 'index.txt'
106
- # end
107
- def route(identifier, params={}, &block)
108
- # Require block
109
- raise ArgumentError.new("#route requires a block") unless block_given?
110
-
111
- # Get rep name
112
- rep_name = params[:rep] || :default
113
- snapshot_name = params[:snapshot] || :last
114
-
115
- # Create rule
116
- rule = Rule.new(identifier_to_regex(identifier), rep_name, block, :snapshot_name => snapshot_name)
117
- @rules_collection.add_item_routing_rule(rule)
118
- end
119
-
120
- # Creates a layout rule for all layouts whose identifier match the given
121
- # identifier, which may either be a string containing the * wildcard, or a
122
- # regular expression. The layouts matching the identifier will be filtered
123
- # using the filter specified in the second argument. The params hash
124
- # contains filter arguments that will be passed to the filter.
125
- #
126
- # @param [String] identifier A pattern matching identifiers of layouts
127
- # that should be filtered using this rule
128
- #
129
- # @param [Symbol] filter_name The name of the filter that should be run
130
- # when processing the layout
131
- #
132
- # @param [Hash] params Extra filter arguments that should be passed to the
133
- # filter when processing the layout (see {Nanoc3::Filter#run})
134
- #
135
- # @return [void]
136
- #
137
- # @example Specifying the filter to use for a layout
138
- #
139
- # layout '/default/', :erb
140
- #
141
- # @example Using custom filter arguments for a layout
142
- #
143
- # layout '/custom/', :haml, :format => :html5
144
- def layout(identifier, filter_name, params={})
145
- @rules_collection.layout_filter_mapping[identifier_to_regex(identifier)] = [ filter_name, params ]
146
- end
147
-
148
- # Creates a pair of compilation and routing rules that indicate that the
149
- # specified item(s) should be copied to the output folder as-is. The items
150
- # are selected using an identifier, which may either be a string
151
- # containing the `*` wildcard, or a regular expression.
152
- #
153
- # This meta-rule will be applicable to reps with a name equal to
154
- # `:default`; this can be changed by giving an explicit `:rep` parameter.
155
- #
156
- # @param [String] identifier A pattern matching identifiers of items that
157
- # should be processed using this meta-rule
158
- #
159
- # @option params [Symbol] :rep (:default) The name of the representation
160
- # that should be routed using this rule
161
- #
162
- # @return [void]
163
- #
164
- # @since 3.2.0
165
- #
166
- # @example Copying the `/foo/` item as-is
167
- #
168
- # passthrough '/foo/'
169
- #
170
- # @example Copying the `:raw` rep of the `/bar/` item as-is
171
- #
172
- # passthrough '/bar/', :rep => :raw
173
- def passthrough(identifier, params={})
174
- # Require no block
175
- raise ArgumentError.new("#passthrough does not require a block") if block_given?
176
-
177
- # Get rep name
178
- rep_name = params[:rep] || :default
179
-
180
- # Create compilation rule
181
- compilation_block = proc { }
182
- compilation_rule = Rule.new(identifier_to_regex(identifier), rep_name, compilation_block)
183
- @rules_collection.add_item_compilation_rule(compilation_rule, :before)
184
-
185
- # Create routing rule
186
- routing_block = proc do
187
- item.identifier.chop + '.' + item[:extension]
188
- end
189
- routing_rule = Rule.new(identifier_to_regex(identifier), rep_name, routing_block)
190
- @rules_collection.add_item_routing_rule(routing_rule, :before)
191
- end
192
-
193
- private
194
-
195
- # Converts the given identifier, which can contain the '*' or '+'
196
- # wildcard characters, matching zero or more resp. one or more
197
- # characters, to a regex. For example, 'foo/*/bar' is transformed
198
- # into /^foo\/(.*?)\/bar$/ and 'foo+' is transformed into /^foo(.+?)/.
199
- def identifier_to_regex(identifier)
200
- if identifier.is_a? String
201
- # Add leading/trailing slashes if necessary
202
- new_identifier = identifier.dup
203
- new_identifier[/^/] = '/' if identifier[0,1] != '/'
204
- new_identifier[/$/] = '/' unless [ '*', '/' ].include?(identifier[-1,1])
205
-
206
- /^#{new_identifier.gsub('*', '(.*?)').gsub('+', '(.+?)')}$/
207
- else
208
- identifier
209
- end
210
- end
211
-
212
- end
213
-
214
- end
@@ -1,196 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3
4
-
5
- # Responsible for remembering dependencies between items and layouts. It is
6
- # used to speed up compilation by only letting an item be recompiled when it
7
- # is outdated or any of its dependencies (or dependencies’ dependencies,
8
- # etc) is outdated.
9
- #
10
- # The dependencies tracked by the dependency tracker are not dependencies
11
- # based on an item’s or a layout’s content. When one object uses an
12
- # attribute of another object, then this is also treated as a dependency.
13
- # While dependencies based on an item’s or layout’s content (handled in
14
- # {Nanoc3::Compiler}) cannot be mutually recursive, the more general
15
- # dependencies in Nanoc3::DependencyTracker can (e.g. item A can use an
16
- # attribute of item B and vice versa without problems).
17
- #
18
- # The dependency tracker remembers the dependency information between runs.
19
- # Dependency information is stored in the `tmp/dependencies` file.
20
- #
21
- # @api private
22
- class DependencyTracker < ::Nanoc3::Store
23
-
24
- # @return [Array<Nanoc3::Item, Nanoc3::Layout>] The list of items and
25
- # layouts that are being tracked by the dependency tracker
26
- attr_reader :objects
27
-
28
- # @return [Nanoc3::Compiler] The compiler that corresponds to this
29
- # dependency tracker
30
- attr_accessor :compiler
31
-
32
- # Creates a new dependency tracker for the given items and layouts.
33
- #
34
- # @param [Array<Nanoc3::Item, Nanoc3::Layout>] objects The list of items
35
- # and layouts whose dependencies should be managed
36
- def initialize(objects)
37
- super('tmp/dependencies', 4)
38
-
39
- @objects = objects
40
-
41
- @graph = Nanoc3::DirectedGraph.new([ nil ] + @objects)
42
- end
43
-
44
- # Starts listening for dependency messages (`:visit_started` and
45
- # `:visit_ended`) and start recording dependencies.
46
- #
47
- # @return [void]
48
- def start
49
- # Initialize dependency stack. An object will be pushed onto this stack
50
- # when it is visited. Therefore, an object on the stack always depends
51
- # on all objects pushed above it.
52
- @stack = []
53
-
54
- # Register start of visits
55
- Nanoc3::NotificationCenter.on(:visit_started, self) do |obj|
56
- self.record_dependency(@stack[-1], obj) unless @stack.empty?
57
- @stack.push(obj)
58
- end
59
-
60
- # Register end of visits
61
- Nanoc3::NotificationCenter.on(:visit_ended, self) do |obj|
62
- @stack.pop
63
- end
64
- end
65
-
66
- # Stop listening for dependency messages and stop recording dependencies.
67
- #
68
- # @return [void]
69
- def stop
70
- # Unregister
71
- Nanoc3::NotificationCenter.remove(:visit_started, self)
72
- Nanoc3::NotificationCenter.remove(:visit_ended, self)
73
- end
74
-
75
- # Returns the direct dependencies for the given object.
76
- #
77
- # The direct dependencies of the given object include the items and
78
- # layouts that, when outdated will cause the given object to be marked as
79
- # outdated. Indirect dependencies will not be returned (e.g. if A depends
80
- # on B which depends on C, then the direct dependencies of A do not
81
- # include C).
82
- #
83
- # The direct predecessors can include nil, which indicates an item that is
84
- # no longer present in the site.
85
- #
86
- # @param [Nanoc3::Item, Nanoc3::Layout] object The object for
87
- # which to fetch the direct predecessors
88
- #
89
- # @return [Array<Nanoc3::Item, Nanoc3::Layout, nil>] The direct
90
- # predecessors of
91
- # the given object
92
- def objects_causing_outdatedness_of(object)
93
- @graph.direct_predecessors_of(object)
94
- end
95
-
96
- # Returns the direct inverse dependencies for the given object.
97
- #
98
- # The direct inverse dependencies of the given object include the objects
99
- # that will be marked as outdated when the given object is outdated.
100
- # Indirect dependencies will not be returned (e.g. if A depends on B which
101
- # depends on C, then the direct inverse dependencies of C do not include
102
- # A).
103
- #
104
- # @param [Nanoc3::Item, Nanoc3::Layout] object The object for which to
105
- # fetch the direct successors
106
- #
107
- # @return [Array<Nanoc3::Item, Nanoc3::Layout>] The direct successors of
108
- # the given object
109
- def objects_outdated_due_to(object)
110
- @graph.direct_successors_of(object).compact
111
- end
112
-
113
- # Records a dependency from `src` to `dst` in the dependency graph. When
114
- # `dst` is oudated, `src` will also become outdated.
115
- #
116
- # @param [Nanoc3::Item, Nanoc3::Layout] src The source of the dependency,
117
- # i.e. the object that will become outdated if dst is outdated
118
- #
119
- # @param [Nanoc3::Item, Nanoc3::Layout] dst The destination of the
120
- # dependency, i.e. the object that will cause the source to become
121
- # outdated if the destination is outdated
122
- #
123
- # @return [void]
124
- def record_dependency(src, dst)
125
- # Warning! dst and src are *reversed* here!
126
- @graph.add_edge(dst, src) unless src == dst
127
- end
128
-
129
- # Empties the list of dependencies for the given object. This is necessary
130
- # before recompiling the given object, because otherwise old dependencies
131
- # will stick around and new dependencies will appear twice. This function
132
- # removes all incoming edges for the given vertex.
133
- #
134
- # @api private
135
- #
136
- # @param [Nanoc3::Item, Nanoc3::Layout] object The object for which to
137
- # forget all dependencies
138
- #
139
- # @return [void]
140
- def forget_dependencies_for(object)
141
- @graph.delete_edges_to(object)
142
- end
143
-
144
- # @deprecated Use {#store} instead
145
- def store_graph
146
- self.store
147
- end
148
-
149
- # @deprecated Use {#load} instead
150
- def load_graph
151
- self.load
152
- end
153
-
154
- # @see Nanoc3::Store#unload
155
- def unload
156
- @graph = Nanoc3::DirectedGraph.new([ nil ] + @objects)
157
- end
158
-
159
- protected
160
-
161
- def data
162
- {
163
- :edges => @graph.edges,
164
- :vertices => @graph.vertices.map { |obj| obj && obj.reference }
165
- }
166
- end
167
-
168
- def data=(new_data)
169
- # Create new graph
170
- @graph = Nanoc3::DirectedGraph.new([ nil ] + @objects)
171
-
172
- # Load vertices
173
- previous_objects = new_data[:vertices].map do |reference|
174
- @objects.find { |obj| reference == obj.reference }
175
- end
176
-
177
- # Load edges
178
- new_data[:edges].each do |edge|
179
- from_index, to_index = *edge
180
- from = from_index && previous_objects[from_index]
181
- to = to_index && previous_objects[to_index]
182
- @graph.add_edge(from, to)
183
- end
184
-
185
- # Record dependency from all items on new items
186
- new_objects = (@objects - previous_objects)
187
- new_objects.each do |new_obj|
188
- @objects.each do |obj|
189
- @graph.add_edge(new_obj, obj)
190
- end
191
- end
192
- end
193
-
194
- end
195
-
196
- end
@@ -1,165 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3
4
-
5
- # Nanoc3::Filter is responsible for filtering items. It is the superclass
6
- # for all textual filters.
7
- #
8
- # A filter instance should only be used once. Filters should not be reused
9
- # since they store state.
10
- #
11
- # When creating a filter with a hash containing assigned variables, those
12
- # variables will be made available in the `@assigns` instance variable and
13
- # the {#assigns} method. The assigns itself will also be available as
14
- # instance variables and instance methods.
15
- #
16
- # @example Accessing assigns in different ways
17
- #
18
- # filter = SomeFilter.new({ :foo => 'bar' })
19
- # filter.instance_eval { @assigns[:foo] }
20
- # # => 'bar'
21
- # filter.instance_eval { assigns[:foo] }
22
- # # => 'bar'
23
- # filter.instance_eval { @foo }
24
- # # => 'bar'
25
- # filter.instance_eval { foo }
26
- # # => 'bar'
27
- #
28
- # @abstract Subclass and override {#run} to implement a custom filter.
29
- class Filter < Context
30
-
31
- # The path to the directory where temporary binary items are stored
32
- TMP_BINARY_ITEMS_DIR = 'tmp/binary_items'
33
-
34
- # A hash containing variables that will be made available during
35
- # filtering.
36
- #
37
- # @return [Hash]
38
- attr_reader :assigns
39
-
40
- extend Nanoc3::PluginRegistry::PluginMethods
41
-
42
- class << self
43
-
44
- # Sets the new type for the filter. The type can be `:binary` (default)
45
- # or `:text`. The given argument can either be a symbol indicating both
46
- # “from” and “to” types, or a hash where the only key is the “from” type
47
- # and the only value is the “to” type.
48
- #
49
- # @example Specifying a text-to-text filter
50
- #
51
- # type :text
52
- #
53
- # @example Specifying a text-to-binary filter
54
- #
55
- # type :text => :binary
56
- #
57
- # @param [Symbol, Hash] arg The new type of this filter
58
- #
59
- # @return [void]
60
- def type(arg)
61
- if arg.is_a?(Hash)
62
- @from, @to = arg.keys[0], arg.values[0]
63
- else
64
- @from, @to = arg, arg
65
- end
66
- end
67
-
68
- # @return [Boolean] True if this filter can be applied to binary item
69
- # representations, false otherwise
70
- def from_binary?
71
- (@from || :text) == :binary
72
- end
73
-
74
- # @return [Boolean] True if this filter results in a binary item
75
- # representation, false otherwise
76
- def to_binary?
77
- (@to || :text) == :binary
78
- end
79
-
80
- end
81
-
82
- # Creates a new filter that has access to the given assigns.
83
- #
84
- # @param [Hash] hash A hash containing variables that should be made
85
- # available during filtering.
86
- def initialize(hash={})
87
- @assigns = hash
88
- super
89
- end
90
-
91
- # Runs the filter on the given content or filename.
92
- #
93
- # @abstract
94
- #
95
- # @param [String] content_or_filename The unprocessed content that should
96
- # be filtered (if the item is a textual item) or the path to the file
97
- # that should be filtered (if the item is a binary item)
98
- #
99
- # @param [Hash] params A hash containing parameters. Filter subclasses can
100
- # use these parameters to allow modifying the filter's behaviour.
101
- #
102
- # @return [String, void] If the filter output binary content, the return
103
- # value is undefined; if the filter outputs textual content, the return
104
- # value will be the filtered content.
105
- def run(content_or_filename, params={})
106
- raise NotImplementedError.new("Nanoc3::Filter subclasses must implement #run")
107
- end
108
-
109
- # Returns a filename that is used to write data to. This method is only
110
- # used on binary items. When running a binary filter on a file, the
111
- # resulting file must end up in the location returned by this method.
112
- #
113
- # The returned filename will be absolute, so it is safe to change to
114
- # another directory inside the filter.
115
- #
116
- # @return [String] The output filename
117
- def output_filename
118
- @output_filename ||= begin
119
- FileUtils.mkdir_p(TMP_BINARY_ITEMS_DIR)
120
- tempfile = Tempfile.new(filename.gsub(/[^a-z]/, '-'), TMP_BINARY_ITEMS_DIR)
121
- new_filename = tempfile.path
122
- tempfile.close!
123
-
124
- File.expand_path(new_filename)
125
- end
126
- end
127
-
128
- # Returns the filename associated with the item that is being filtered.
129
- # It is in the format `item <identifier> (rep <name>)`.
130
- #
131
- # @return [String] The filename
132
- def filename
133
- if assigns[:layout]
134
- "layout #{assigns[:layout].identifier}"
135
- elsif assigns[:item]
136
- "item #{assigns[:item].identifier} (rep #{assigns[:item_rep].name})"
137
- else
138
- '?'
139
- end
140
- end
141
-
142
- # Creates a dependency from the item that is currently being filtered onto
143
- # the given collection of items. In other words, require the given items
144
- # to be compiled first before this items is processed.
145
- #
146
- # @param [Array<Nanoc3::Item>] items The items that are depended on.
147
- #
148
- # @return [void]
149
- def depend_on(items)
150
- # Notify
151
- items.each do |item|
152
- Nanoc3::NotificationCenter.post(:visit_started, item)
153
- Nanoc3::NotificationCenter.post(:visit_ended, item)
154
- end
155
-
156
- # Raise unmet dependency error if necessary
157
- items.each do |item|
158
- rep = item.reps.find { |r| !r.compiled? }
159
- raise Nanoc3::Errors::UnmetDependency.new(rep) if rep
160
- end
161
- end
162
-
163
- end
164
-
165
- end