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.
- metadata +14 -313
- data/.gemtest +0 -0
- data/ChangeLog +0 -3
- data/Gemfile +0 -29
- data/LICENSE +0 -19
- data/NEWS.md +0 -449
- data/README.md +0 -108
- data/Rakefile +0 -14
- data/bin/nanoc3 +0 -12
- data/doc/yardoc_templates/default/layout/html/footer.erb +0 -10
- data/lib/nanoc3.rb +0 -28
- data/lib/nanoc3/base.rb +0 -49
- data/lib/nanoc3/base/compilation/checksum_store.rb +0 -57
- data/lib/nanoc3/base/compilation/compiled_content_cache.rb +0 -62
- data/lib/nanoc3/base/compilation/compiler.rb +0 -455
- data/lib/nanoc3/base/compilation/compiler_dsl.rb +0 -214
- data/lib/nanoc3/base/compilation/dependency_tracker.rb +0 -196
- data/lib/nanoc3/base/compilation/filter.rb +0 -165
- data/lib/nanoc3/base/compilation/item_rep_proxy.rb +0 -102
- data/lib/nanoc3/base/compilation/item_rep_recorder_proxy.rb +0 -88
- data/lib/nanoc3/base/compilation/outdatedness_checker.rb +0 -223
- data/lib/nanoc3/base/compilation/outdatedness_reasons.rb +0 -46
- data/lib/nanoc3/base/compilation/rule.rb +0 -73
- data/lib/nanoc3/base/compilation/rule_context.rb +0 -84
- data/lib/nanoc3/base/compilation/rule_memory_calculator.rb +0 -40
- data/lib/nanoc3/base/compilation/rule_memory_store.rb +0 -53
- data/lib/nanoc3/base/compilation/rules_collection.rb +0 -231
- data/lib/nanoc3/base/context.rb +0 -47
- data/lib/nanoc3/base/core_ext.rb +0 -6
- data/lib/nanoc3/base/core_ext/array.rb +0 -62
- data/lib/nanoc3/base/core_ext/hash.rb +0 -63
- data/lib/nanoc3/base/core_ext/pathname.rb +0 -26
- data/lib/nanoc3/base/core_ext/string.rb +0 -46
- data/lib/nanoc3/base/directed_graph.rb +0 -275
- data/lib/nanoc3/base/errors.rb +0 -174
- data/lib/nanoc3/base/memoization.rb +0 -67
- data/lib/nanoc3/base/notification_center.rb +0 -84
- data/lib/nanoc3/base/ordered_hash.rb +0 -200
- data/lib/nanoc3/base/plugin_registry.rb +0 -165
- data/lib/nanoc3/base/result_data/item_rep.rb +0 -488
- data/lib/nanoc3/base/source_data/code_snippet.rb +0 -58
- data/lib/nanoc3/base/source_data/configuration.rb +0 -24
- data/lib/nanoc3/base/source_data/data_source.rb +0 -234
- data/lib/nanoc3/base/source_data/item.rb +0 -301
- data/lib/nanoc3/base/source_data/layout.rb +0 -130
- data/lib/nanoc3/base/source_data/site.rb +0 -361
- data/lib/nanoc3/base/store.rb +0 -135
- data/lib/nanoc3/cli.rb +0 -133
- data/lib/nanoc3/cli/command.rb +0 -139
- data/lib/nanoc3/cli/commands/autocompile.rb +0 -60
- data/lib/nanoc3/cli/commands/compile.rb +0 -280
- data/lib/nanoc3/cli/commands/create_item.rb +0 -62
- data/lib/nanoc3/cli/commands/create_layout.rb +0 -75
- data/lib/nanoc3/cli/commands/create_site.rb +0 -410
- data/lib/nanoc3/cli/commands/debug.rb +0 -119
- data/lib/nanoc3/cli/commands/info.rb +0 -98
- data/lib/nanoc3/cli/commands/nanoc.rb +0 -37
- data/lib/nanoc3/cli/commands/update.rb +0 -72
- data/lib/nanoc3/cli/commands/view.rb +0 -84
- data/lib/nanoc3/cli/commands/watch.rb +0 -125
- data/lib/nanoc3/cli/error_handler.rb +0 -193
- data/lib/nanoc3/cli/logger.rb +0 -91
- data/lib/nanoc3/data_sources.rb +0 -29
- data/lib/nanoc3/data_sources/deprecated/delicious.rb +0 -42
- data/lib/nanoc3/data_sources/deprecated/last_fm.rb +0 -87
- data/lib/nanoc3/data_sources/deprecated/twitter.rb +0 -38
- data/lib/nanoc3/data_sources/filesystem.rb +0 -299
- data/lib/nanoc3/data_sources/filesystem_unified.rb +0 -116
- data/lib/nanoc3/data_sources/filesystem_verbose.rb +0 -86
- data/lib/nanoc3/extra.rb +0 -22
- data/lib/nanoc3/extra/auto_compiler.rb +0 -103
- data/lib/nanoc3/extra/chick.rb +0 -125
- data/lib/nanoc3/extra/core_ext.rb +0 -4
- data/lib/nanoc3/extra/core_ext/enumerable.rb +0 -33
- data/lib/nanoc3/extra/core_ext/time.rb +0 -19
- data/lib/nanoc3/extra/deployers.rb +0 -11
- data/lib/nanoc3/extra/deployers/rsync.rb +0 -114
- data/lib/nanoc3/extra/file_proxy.rb +0 -40
- data/lib/nanoc3/extra/validators.rb +0 -12
- data/lib/nanoc3/extra/validators/links.rb +0 -264
- data/lib/nanoc3/extra/validators/w3c.rb +0 -95
- data/lib/nanoc3/extra/vcs.rb +0 -66
- data/lib/nanoc3/extra/vcses.rb +0 -17
- data/lib/nanoc3/extra/vcses/bazaar.rb +0 -25
- data/lib/nanoc3/extra/vcses/dummy.rb +0 -24
- data/lib/nanoc3/extra/vcses/git.rb +0 -25
- data/lib/nanoc3/extra/vcses/mercurial.rb +0 -25
- data/lib/nanoc3/extra/vcses/subversion.rb +0 -25
- data/lib/nanoc3/filters.rb +0 -53
- data/lib/nanoc3/filters/asciidoc.rb +0 -38
- data/lib/nanoc3/filters/bluecloth.rb +0 -19
- data/lib/nanoc3/filters/coderay.rb +0 -21
- data/lib/nanoc3/filters/colorize_syntax.rb +0 -261
- data/lib/nanoc3/filters/erb.rb +0 -35
- data/lib/nanoc3/filters/erubis.rb +0 -27
- data/lib/nanoc3/filters/haml.rb +0 -27
- data/lib/nanoc3/filters/kramdown.rb +0 -20
- data/lib/nanoc3/filters/less.rb +0 -53
- data/lib/nanoc3/filters/markaby.rb +0 -20
- data/lib/nanoc3/filters/maruku.rb +0 -20
- data/lib/nanoc3/filters/mustache.rb +0 -24
- data/lib/nanoc3/filters/rainpress.rb +0 -19
- data/lib/nanoc3/filters/rdiscount.rb +0 -22
- data/lib/nanoc3/filters/rdoc.rb +0 -33
- data/lib/nanoc3/filters/redcarpet.rb +0 -27
- data/lib/nanoc3/filters/redcloth.rb +0 -47
- data/lib/nanoc3/filters/relativize_paths.rb +0 -45
- data/lib/nanoc3/filters/rubypants.rb +0 -20
- data/lib/nanoc3/filters/sass.rb +0 -66
- data/lib/nanoc3/filters/slim.rb +0 -25
- data/lib/nanoc3/filters/typogruby.rb +0 -23
- data/lib/nanoc3/filters/uglify_js.rb +0 -42
- data/lib/nanoc3/helpers.rb +0 -16
- data/lib/nanoc3/helpers/blogging.rb +0 -319
- data/lib/nanoc3/helpers/breadcrumbs.rb +0 -40
- data/lib/nanoc3/helpers/capturing.rb +0 -138
- data/lib/nanoc3/helpers/filtering.rb +0 -50
- data/lib/nanoc3/helpers/html_escape.rb +0 -55
- data/lib/nanoc3/helpers/link_to.rb +0 -151
- data/lib/nanoc3/helpers/rendering.rb +0 -140
- data/lib/nanoc3/helpers/tagging.rb +0 -71
- data/lib/nanoc3/helpers/text.rb +0 -44
- data/lib/nanoc3/helpers/xml_sitemap.rb +0 -76
- data/lib/nanoc3/tasks.rb +0 -10
- data/lib/nanoc3/tasks/clean.rake +0 -16
- data/lib/nanoc3/tasks/clean.rb +0 -29
- data/lib/nanoc3/tasks/deploy/rsync.rake +0 -14
- data/lib/nanoc3/tasks/validate.rake +0 -92
- data/nanoc3.gemspec +0 -49
- data/tasks/doc.rake +0 -16
- data/tasks/test.rake +0 -44
- data/test/base/core_ext/array_spec.rb +0 -73
- data/test/base/core_ext/hash_spec.rb +0 -98
- data/test/base/core_ext/pathname_spec.rb +0 -27
- data/test/base/core_ext/string_spec.rb +0 -37
- data/test/base/test_checksum_store.rb +0 -35
- data/test/base/test_code_snippet.rb +0 -31
- data/test/base/test_compiler.rb +0 -316
- data/test/base/test_compiler_dsl.rb +0 -161
- data/test/base/test_context.rb +0 -31
- data/test/base/test_data_source.rb +0 -46
- data/test/base/test_dependency_tracker.rb +0 -262
- data/test/base/test_directed_graph.rb +0 -283
- data/test/base/test_filter.rb +0 -83
- data/test/base/test_item.rb +0 -179
- data/test/base/test_item_rep.rb +0 -553
- data/test/base/test_layout.rb +0 -59
- data/test/base/test_memoization.rb +0 -90
- data/test/base/test_notification_center.rb +0 -34
- data/test/base/test_outdatedness_checker.rb +0 -394
- data/test/base/test_plugin.rb +0 -30
- data/test/base/test_rule.rb +0 -19
- data/test/base/test_rule_context.rb +0 -65
- data/test/base/test_site.rb +0 -190
- data/test/cli/commands/test_compile.rb +0 -33
- data/test/cli/commands/test_create_item.rb +0 -14
- data/test/cli/commands/test_create_layout.rb +0 -28
- data/test/cli/commands/test_create_site.rb +0 -24
- data/test/cli/commands/test_help.rb +0 -12
- data/test/cli/commands/test_info.rb +0 -11
- data/test/cli/commands/test_update.rb +0 -10
- data/test/cli/test_cli.rb +0 -102
- data/test/cli/test_error_handler.rb +0 -29
- data/test/cli/test_logger.rb +0 -10
- data/test/data_sources/test_filesystem.rb +0 -433
- data/test/data_sources/test_filesystem_unified.rb +0 -536
- data/test/data_sources/test_filesystem_verbose.rb +0 -357
- data/test/extra/core_ext/test_enumerable.rb +0 -30
- data/test/extra/core_ext/test_time.rb +0 -15
- data/test/extra/deployers/test_rsync.rb +0 -232
- data/test/extra/test_auto_compiler.rb +0 -417
- data/test/extra/test_file_proxy.rb +0 -19
- data/test/extra/test_vcs.rb +0 -22
- data/test/extra/validators/test_links.rb +0 -51
- data/test/extra/validators/test_w3c.rb +0 -47
- data/test/filters/test_asciidoc.rb +0 -22
- data/test/filters/test_bluecloth.rb +0 -18
- data/test/filters/test_coderay.rb +0 -44
- data/test/filters/test_colorize_syntax.rb +0 -283
- data/test/filters/test_erb.rb +0 -99
- data/test/filters/test_erubis.rb +0 -70
- data/test/filters/test_haml.rb +0 -96
- data/test/filters/test_kramdown.rb +0 -18
- data/test/filters/test_less.rb +0 -113
- data/test/filters/test_markaby.rb +0 -24
- data/test/filters/test_maruku.rb +0 -18
- data/test/filters/test_mustache.rb +0 -25
- data/test/filters/test_rainpress.rb +0 -29
- data/test/filters/test_rdiscount.rb +0 -31
- data/test/filters/test_rdoc.rb +0 -18
- data/test/filters/test_redcarpet.rb +0 -63
- data/test/filters/test_redcloth.rb +0 -33
- data/test/filters/test_relativize_paths.rb +0 -332
- data/test/filters/test_rubypants.rb +0 -18
- data/test/filters/test_sass.rb +0 -229
- data/test/filters/test_slim.rb +0 -35
- data/test/filters/test_typogruby.rb +0 -21
- data/test/filters/test_uglify_js.rb +0 -30
- data/test/gem_loader.rb +0 -11
- data/test/helper.rb +0 -179
- data/test/helpers/test_blogging.rb +0 -754
- data/test/helpers/test_breadcrumbs.rb +0 -81
- data/test/helpers/test_capturing.rb +0 -41
- data/test/helpers/test_filtering.rb +0 -106
- data/test/helpers/test_html_escape.rb +0 -32
- data/test/helpers/test_link_to.rb +0 -249
- data/test/helpers/test_rendering.rb +0 -89
- data/test/helpers/test_tagging.rb +0 -87
- data/test/helpers/test_text.rb +0 -24
- data/test/helpers/test_xml_sitemap.rb +0 -103
- data/test/tasks/test_clean.rb +0 -67
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Nanoc3
|
|
4
|
-
|
|
5
|
-
# The class responsible for keeping track of all loaded plugins, such as
|
|
6
|
-
# filters ({Nanoc3::Filter}), data sources ({Nanoc3::DataSource}) and VCSes
|
|
7
|
-
# ({Nanoc3::Extra::VCS}).
|
|
8
|
-
class PluginRegistry
|
|
9
|
-
|
|
10
|
-
# A module that contains class methods for plugins. It provides functions
|
|
11
|
-
# for setting identifiers, registering plugins and finding plugins. Plugin
|
|
12
|
-
# classes should extend this module.
|
|
13
|
-
module PluginMethods
|
|
14
|
-
|
|
15
|
-
# Sets the identifiers for this plugin.
|
|
16
|
-
#
|
|
17
|
-
# @param [Array<Symbol>] identifier A list of identifiers to assign to
|
|
18
|
-
# this plugin.
|
|
19
|
-
#
|
|
20
|
-
# @return [void]
|
|
21
|
-
def identifiers(*identifiers)
|
|
22
|
-
register(self, *identifiers)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Sets the identifier for this plugin.
|
|
26
|
-
#
|
|
27
|
-
# @param [Symbol] identifier An identifier to assign to this plugin.
|
|
28
|
-
#
|
|
29
|
-
# @return [void]
|
|
30
|
-
def identifier(identifier)
|
|
31
|
-
register(self, identifier)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Registers the given class as a plugin with the given identifier.
|
|
35
|
-
#
|
|
36
|
-
# @param [Class, String] class_or_name The class to register, or a
|
|
37
|
-
# string containing the class name to register.
|
|
38
|
-
#
|
|
39
|
-
# @param [Array<Symbol>] identifiers A list of identifiers to assign to
|
|
40
|
-
# this plugin.
|
|
41
|
-
#
|
|
42
|
-
# @return [void]
|
|
43
|
-
def register(class_or_name, *identifiers)
|
|
44
|
-
# Find plugin class
|
|
45
|
-
klass = self
|
|
46
|
-
klass = klass.superclass while klass.superclass.respond_to?(:register)
|
|
47
|
-
|
|
48
|
-
# Register
|
|
49
|
-
registry = Nanoc3::PluginRegistry.instance
|
|
50
|
-
registry.register(klass, class_or_name, *identifiers)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Returns the plugin with the given name (identifier)
|
|
54
|
-
#
|
|
55
|
-
# @param [String] name The name of the plugin class to find
|
|
56
|
-
#
|
|
57
|
-
# @return [Class] The plugin class with the given name
|
|
58
|
-
def named(name)
|
|
59
|
-
Nanoc3::Plugin.find(self, name)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Returns the shared {PluginRegistry} instance, creating it if none exists
|
|
65
|
-
# yet.
|
|
66
|
-
#
|
|
67
|
-
# @return [Nanoc3::PluginRegistry] The shared plugin registry
|
|
68
|
-
def self.instance
|
|
69
|
-
@instance ||= self.new
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# Creates a new plugin registry. This should usually not be necessary; it
|
|
73
|
-
# is recommended to use the shared instance (obtained from
|
|
74
|
-
# {Nanoc3::PluginRegistry.instance}).
|
|
75
|
-
def initialize
|
|
76
|
-
@map = {}
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Registers the given class as a plugin.
|
|
80
|
-
#
|
|
81
|
-
# @param [Class] superclass The superclass of the plugin. For example:
|
|
82
|
-
# {Nanoc3::Filter}, {Nanoc3::Extra::VCS}.
|
|
83
|
-
#
|
|
84
|
-
# @param [Class, String] class_or_name The class to register. This can be
|
|
85
|
-
# a string, in which case it will be automatically converted to a proper
|
|
86
|
-
# class at lookup. For example: `Nanoc3::Filters::ERB`,
|
|
87
|
-
# `"Nanoc3::Filters::Haml"`.
|
|
88
|
-
#
|
|
89
|
-
# @param [Symbol] identifiers One or more symbols identifying the class.
|
|
90
|
-
# For example: `:haml`, :`erb`.
|
|
91
|
-
#
|
|
92
|
-
# @return [void]
|
|
93
|
-
def register(superclass, class_or_name, *identifiers)
|
|
94
|
-
@map[superclass] ||= {}
|
|
95
|
-
|
|
96
|
-
identifiers.each do |identifier|
|
|
97
|
-
@map[superclass][identifier.to_sym] = class_or_name
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Finds the plugin that is a subclass of the given class and has the given
|
|
102
|
-
# name.
|
|
103
|
-
#
|
|
104
|
-
# @param [Symbol] name The name of the plugin to return
|
|
105
|
-
#
|
|
106
|
-
# @return [Class, nil] The plugin with the given name
|
|
107
|
-
def find(klass, name)
|
|
108
|
-
# Initialize
|
|
109
|
-
@map[klass] ||= {}
|
|
110
|
-
|
|
111
|
-
# Lookup
|
|
112
|
-
class_or_name = @map[klass][name.to_sym]
|
|
113
|
-
|
|
114
|
-
# Get class
|
|
115
|
-
if class_or_name.is_a?(String)
|
|
116
|
-
class_or_name.scan(/\w+/).inject(klass) { |memo, part| memo.const_get(part) }
|
|
117
|
-
else
|
|
118
|
-
class_or_name
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# Returns a list of all plugins. The returned list of plugins is an array
|
|
123
|
-
# with array elements in the following format:
|
|
124
|
-
#
|
|
125
|
-
# { :class => ..., :superclass => ..., :identifiers => ... }
|
|
126
|
-
#
|
|
127
|
-
# @return [Array<Hash>] A list of all plugins in the format described
|
|
128
|
-
def all
|
|
129
|
-
plugins = []
|
|
130
|
-
@map.each_pair do |superclass, submap|
|
|
131
|
-
submap.each_pair do |identifier, klass|
|
|
132
|
-
# Find existing plugin
|
|
133
|
-
existing_plugin = plugins.find do |p|
|
|
134
|
-
p[:class] == klass && p[:superclass] == superclass
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
if existing_plugin
|
|
138
|
-
# Add identifier to existing plugin
|
|
139
|
-
existing_plugin[:identifiers] << identifier
|
|
140
|
-
existing_plugin[:identifiers] = existing_plugin[:identifiers].sort_by { |s| s.to_s }
|
|
141
|
-
else
|
|
142
|
-
# Create new plugin
|
|
143
|
-
plugins << {
|
|
144
|
-
:class => klass,
|
|
145
|
-
:superclass => superclass,
|
|
146
|
-
:identifiers => [ identifier ]
|
|
147
|
-
}
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
plugins
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
# @deprecated Use {Nanoc3::PluginRegistry#find} instead
|
|
156
|
-
def named(name)
|
|
157
|
-
find(self, name)
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
# @deprecated Use {Nanoc3::PluginRegistry.instance} instead
|
|
163
|
-
Plugin = PluginRegistry.instance
|
|
164
|
-
|
|
165
|
-
end
|
|
@@ -1,488 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Nanoc3
|
|
4
|
-
|
|
5
|
-
# A single representation (rep) of an item ({Nanoc3::Item}). An item can
|
|
6
|
-
# have multiple representations. A representation has its own output file.
|
|
7
|
-
# A single item can therefore have multiple output files, each run through
|
|
8
|
-
# a different set of filters with a different layout.
|
|
9
|
-
class ItemRep
|
|
10
|
-
|
|
11
|
-
# Contains all deprecated methods. Mixed into {Nanoc3::ItemRep}.
|
|
12
|
-
module Deprecated
|
|
13
|
-
|
|
14
|
-
# @deprecated Modify the {#raw_paths} attribute instead
|
|
15
|
-
def raw_path=(raw_path)
|
|
16
|
-
raw_paths[:last] = raw_path
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# @deprecated Modify the {#paths} attribute instead
|
|
20
|
-
def path=(path)
|
|
21
|
-
paths[:last] = path
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# @deprecated Use {Nanoc3::ItemRep#compiled_content} instead.
|
|
25
|
-
def content_at_snapshot(snapshot=:pre)
|
|
26
|
-
compiled_content(:snapshot => snapshot)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# @deprecated
|
|
30
|
-
def created
|
|
31
|
-
raise NotImplementedError, "Nanoc3::ItemRep#created is no longer implemented"
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# @deprecated
|
|
35
|
-
def created?
|
|
36
|
-
raise NotImplementedError, "Nanoc3::ItemRep#created? is no longer implemented"
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# @deprecated
|
|
40
|
-
def modified
|
|
41
|
-
raise NotImplementedError, "Nanoc3::ItemRep#modified is no longer implemented"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# @deprecated
|
|
45
|
-
def modified?
|
|
46
|
-
raise NotImplementedError, "Nanoc3::ItemRep#modified? is no longer implemented"
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# @deprecated
|
|
50
|
-
def written
|
|
51
|
-
raise NotImplementedError, "Nanoc3::ItemRep#written is no longer implemented"
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# @deprecated
|
|
55
|
-
def written?
|
|
56
|
-
raise NotImplementedError, "Nanoc3::ItemRep#written? is no longer implemented"
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Contains all private methods. Mixed into {Nanoc3::ItemRep}.
|
|
62
|
-
module Private
|
|
63
|
-
|
|
64
|
-
# @return [Hash] A hash containing the assigns that will be used in the
|
|
65
|
-
# next filter or layout operation. The keys (symbols) will be made
|
|
66
|
-
# available during the next operation.
|
|
67
|
-
attr_accessor :assigns
|
|
68
|
-
|
|
69
|
-
# @return [Boolean] true if this representation has already been
|
|
70
|
-
# compiled during the current or last compilation session; false
|
|
71
|
-
# otherwise
|
|
72
|
-
#
|
|
73
|
-
# @api private
|
|
74
|
-
attr_accessor :compiled
|
|
75
|
-
alias_method :compiled?, :compiled
|
|
76
|
-
|
|
77
|
-
# @return [Hash<Symbol,String>] A hash containing the raw paths (paths
|
|
78
|
-
# including the path to the output directory and the filename) for all
|
|
79
|
-
# snapshots. The keys correspond with the snapshot names, and the
|
|
80
|
-
# values with the path.
|
|
81
|
-
#
|
|
82
|
-
# @api private
|
|
83
|
-
attr_accessor :raw_paths
|
|
84
|
-
|
|
85
|
-
# @return [Hash<Symbol,String>] A hash containing the paths for all
|
|
86
|
-
# snapshots. The keys correspond with the snapshot names, and the
|
|
87
|
-
# values with the path.
|
|
88
|
-
#
|
|
89
|
-
# @api private
|
|
90
|
-
attr_accessor :paths
|
|
91
|
-
|
|
92
|
-
# @return [Hash<Symbol,String>] A hash containing the paths to the
|
|
93
|
-
# temporary _files_ that filters write binary content to. This is only
|
|
94
|
-
# used when the item representation is binary. The keys correspond
|
|
95
|
-
# with the snapshot names, and the values with the filename. When
|
|
96
|
-
# writing the item representation, the file corresponding with the
|
|
97
|
-
# requested snapshot (usually `:last`) will be copied from
|
|
98
|
-
# `filenames[snapshot]` to `raw_paths[snapshot]`.
|
|
99
|
-
#
|
|
100
|
-
# @api private
|
|
101
|
-
attr_reader :temporary_filenames
|
|
102
|
-
|
|
103
|
-
# @return [Hash<Symbol,String>] A hash containing the content at all
|
|
104
|
-
# snapshots. The keys correspond with the snapshot names, and the
|
|
105
|
-
# values with the content.
|
|
106
|
-
#
|
|
107
|
-
# @api private
|
|
108
|
-
attr_accessor :content
|
|
109
|
-
|
|
110
|
-
# Writes the item rep's compiled content to the rep's output file.
|
|
111
|
-
#
|
|
112
|
-
# This method will send two notifications: one before writing the item
|
|
113
|
-
# representation, and one after. These notifications can be used for
|
|
114
|
-
# generating diffs, for example.
|
|
115
|
-
#
|
|
116
|
-
# @api private
|
|
117
|
-
#
|
|
118
|
-
# @param [String, nil] raw_path The raw path to write the compiled rep
|
|
119
|
-
# to. If nil, the default raw path will be used.
|
|
120
|
-
#
|
|
121
|
-
# @return [void]
|
|
122
|
-
def write(snapshot=:last)
|
|
123
|
-
# Get raw path
|
|
124
|
-
raw_path = self.raw_path(:snapshot => snapshot)
|
|
125
|
-
return if raw_path.nil?
|
|
126
|
-
|
|
127
|
-
# Create parent directory
|
|
128
|
-
FileUtils.mkdir_p(File.dirname(raw_path))
|
|
129
|
-
|
|
130
|
-
# Check if file will be created
|
|
131
|
-
is_created = !File.file?(raw_path)
|
|
132
|
-
|
|
133
|
-
# Calculate characteristics of old content
|
|
134
|
-
if File.file?(raw_path)
|
|
135
|
-
hash_old = Pathname.new(raw_path).checksum
|
|
136
|
-
size_old = File.size(raw_path)
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# Notify
|
|
140
|
-
Nanoc3::NotificationCenter.post(:will_write_rep, self, snapshot)
|
|
141
|
-
|
|
142
|
-
if self.binary?
|
|
143
|
-
# Calculate characteristics of new content
|
|
144
|
-
size_new = File.size(temporary_filenames[:last])
|
|
145
|
-
hash_new = Pathname.new(temporary_filenames[:last]).checksum if size_old == size_new
|
|
146
|
-
|
|
147
|
-
# Check whether content was modified
|
|
148
|
-
is_modified = (size_old != size_new || hash_old != hash_new)
|
|
149
|
-
|
|
150
|
-
# Copy
|
|
151
|
-
if is_modified
|
|
152
|
-
FileUtils.cp(temporary_filenames[:last], raw_path)
|
|
153
|
-
end
|
|
154
|
-
else
|
|
155
|
-
# Check whether content was modified
|
|
156
|
-
is_modified = (!File.file?(raw_path) || File.read(raw_path) != @content[:last])
|
|
157
|
-
|
|
158
|
-
# Write
|
|
159
|
-
if is_modified
|
|
160
|
-
File.open(raw_path, 'w') { |io| io.write(@content[:last]) }
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
# Notify
|
|
165
|
-
Nanoc3::NotificationCenter.post(:rep_written, self, raw_path, is_created, is_modified)
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
# Resets the compilation progress for this item representation. This is
|
|
169
|
-
# necessary when an unmet dependency is detected during compilation.
|
|
170
|
-
#
|
|
171
|
-
# @api private
|
|
172
|
-
#
|
|
173
|
-
# @return [void]
|
|
174
|
-
def forget_progress
|
|
175
|
-
initialize_content
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
# Returns the type of this object. Will always return `:item_rep`,
|
|
179
|
-
# because this is an item rep. For layouts, this method returns
|
|
180
|
-
# `:layout`.
|
|
181
|
-
#
|
|
182
|
-
# @api private
|
|
183
|
-
#
|
|
184
|
-
# @return [Symbol] :item_rep
|
|
185
|
-
def type
|
|
186
|
-
:item_rep
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
include Deprecated
|
|
192
|
-
include Private
|
|
193
|
-
|
|
194
|
-
# @return [Nanoc3::Item] The item to which this rep belongs
|
|
195
|
-
attr_reader :item
|
|
196
|
-
|
|
197
|
-
# @return [Symbol] The representation's unique name
|
|
198
|
-
attr_reader :name
|
|
199
|
-
|
|
200
|
-
# @return [Boolean] true if this rep is currently binary; false otherwise
|
|
201
|
-
attr_reader :binary
|
|
202
|
-
alias_method :binary?, :binary
|
|
203
|
-
|
|
204
|
-
# Creates a new item representation for the given item.
|
|
205
|
-
#
|
|
206
|
-
# @param [Nanoc3::Item] item The item to which the new representation will
|
|
207
|
-
# belong.
|
|
208
|
-
#
|
|
209
|
-
# @param [Symbol] name The unique name for the new item representation.
|
|
210
|
-
def initialize(item, name)
|
|
211
|
-
# Set primary attributes
|
|
212
|
-
@item = item
|
|
213
|
-
@name = name
|
|
214
|
-
|
|
215
|
-
# Set binary
|
|
216
|
-
@binary = @item.binary?
|
|
217
|
-
|
|
218
|
-
# Set default attributes
|
|
219
|
-
@raw_paths = {}
|
|
220
|
-
@paths = {}
|
|
221
|
-
@assigns = {}
|
|
222
|
-
initialize_content
|
|
223
|
-
|
|
224
|
-
# Reset flags
|
|
225
|
-
@compiled = false
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
# Returns the compiled content from a given snapshot.
|
|
229
|
-
#
|
|
230
|
-
# @option params [String] :snapshot The name of the snapshot from which to
|
|
231
|
-
# fetch the compiled content. By default, the returned compiled content
|
|
232
|
-
# will be the content compiled right before the first layout call (if
|
|
233
|
-
# any).
|
|
234
|
-
#
|
|
235
|
-
# @return [String] The compiled content at the given snapshot (or the
|
|
236
|
-
# default snapshot if no snapshot is specified)
|
|
237
|
-
def compiled_content(params={})
|
|
238
|
-
# Notify
|
|
239
|
-
Nanoc3::NotificationCenter.post(:visit_started, self.item)
|
|
240
|
-
Nanoc3::NotificationCenter.post(:visit_ended, self.item)
|
|
241
|
-
|
|
242
|
-
# Require compilation
|
|
243
|
-
raise Nanoc3::Errors::UnmetDependency.new(self) if !compiled? && !params[:force]
|
|
244
|
-
|
|
245
|
-
# Get name of last pre-layout snapshot
|
|
246
|
-
snapshot_name = params[:snapshot]
|
|
247
|
-
if @content[:pre]
|
|
248
|
-
snapshot_name ||= :pre
|
|
249
|
-
else
|
|
250
|
-
snapshot_name ||= :last
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
# Check presence of snapshot
|
|
254
|
-
if @content[snapshot_name].nil?
|
|
255
|
-
warn(('-' * 78 + "\nWARNING: The “#{self.item.identifier}” item (rep “#{self.name}”) does not have the requested snapshot named #{snapshot_name.inspect}.\n\n* Make sure that you are requesting the correct snapshot.\n* It is not possible to request the compiled content of a binary item representation; if this item is marked as binary even though you believe it should be textual, you may need to add the extension of this item to the site configuration’s `text_extensions` array.\n" + '-' * 78).make_compatible_with_env)
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
# Get content
|
|
259
|
-
@content[snapshot_name]
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
# Checks whether content exists at a given snapshot.
|
|
263
|
-
#
|
|
264
|
-
# @return [Boolean] True if content exists for the snapshot with the
|
|
265
|
-
# given name, false otherwise
|
|
266
|
-
#
|
|
267
|
-
# @since 3.2.0
|
|
268
|
-
def has_snapshot?(snapshot_name)
|
|
269
|
-
!@content[snapshot_name].nil?
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
# Returns the item rep’s raw path. It includes the path to the output
|
|
273
|
-
# directory and the full filename.
|
|
274
|
-
#
|
|
275
|
-
# @option params [Symbol] :snapshot (:last) The snapshot for which the
|
|
276
|
-
# path should be returned
|
|
277
|
-
#
|
|
278
|
-
# @return [String] The item rep’s path
|
|
279
|
-
def raw_path(params={})
|
|
280
|
-
snapshot_name = params[:snapshot] || :last
|
|
281
|
-
@raw_paths[snapshot_name]
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
# Returns the item rep’s path, as used when being linked to. It starts
|
|
285
|
-
# with a slash and it is relative to the output directory. It does not
|
|
286
|
-
# include the path to the output directory. It will not include the
|
|
287
|
-
# filename if the filename is an index filename.
|
|
288
|
-
#
|
|
289
|
-
# @option params [Symbol] :snapshot (:last) The snapshot for which the
|
|
290
|
-
# path should be returned
|
|
291
|
-
#
|
|
292
|
-
# @return [String] The item rep’s path
|
|
293
|
-
def path(params={})
|
|
294
|
-
snapshot_name = params[:snapshot] || :last
|
|
295
|
-
@paths[snapshot_name]
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
# Runs the item content through the given filter with the given arguments.
|
|
299
|
-
# This method will replace the content of the `:last` snapshot with the
|
|
300
|
-
# filtered content of the last snapshot.
|
|
301
|
-
#
|
|
302
|
-
# This method is supposed to be called only in a compilation rule block
|
|
303
|
-
# (see {Nanoc3::CompilerDSL#compile}).
|
|
304
|
-
#
|
|
305
|
-
# @see Nanoc3::ItemRepProxy#filter
|
|
306
|
-
#
|
|
307
|
-
# @param [Symbol] filter_name The name of the filter to run the item
|
|
308
|
-
# representations' content through
|
|
309
|
-
#
|
|
310
|
-
# @param [Hash] filter_args The filter arguments that should be passed to
|
|
311
|
-
# the filter's #run method
|
|
312
|
-
#
|
|
313
|
-
# @return [void]
|
|
314
|
-
def filter(filter_name, filter_args={})
|
|
315
|
-
# Get filter class
|
|
316
|
-
klass = filter_named(filter_name)
|
|
317
|
-
raise Nanoc3::Errors::UnknownFilter.new(filter_name) if klass.nil?
|
|
318
|
-
|
|
319
|
-
# Check whether filter can be applied
|
|
320
|
-
if klass.from_binary? && !self.binary?
|
|
321
|
-
raise Nanoc3::Errors::CannotUseBinaryFilter.new(self, klass)
|
|
322
|
-
elsif !klass.from_binary? && self.binary?
|
|
323
|
-
raise Nanoc3::Errors::CannotUseTextualFilter.new(self, klass)
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
begin
|
|
327
|
-
# Notify start
|
|
328
|
-
Nanoc3::NotificationCenter.post(:filtering_started, self, filter_name)
|
|
329
|
-
|
|
330
|
-
# Create filter
|
|
331
|
-
filter = klass.new(assigns)
|
|
332
|
-
|
|
333
|
-
# Run filter
|
|
334
|
-
source = self.binary? ? temporary_filenames[:last] : @content[:last]
|
|
335
|
-
result = filter.run(source, filter_args)
|
|
336
|
-
if klass.to_binary?
|
|
337
|
-
temporary_filenames[:last] = filter.output_filename
|
|
338
|
-
else
|
|
339
|
-
@content[:last] = result
|
|
340
|
-
@content[:last].freeze
|
|
341
|
-
end
|
|
342
|
-
@binary = klass.to_binary?
|
|
343
|
-
|
|
344
|
-
# Check whether file was written
|
|
345
|
-
if self.binary? && !File.file?(filter.output_filename)
|
|
346
|
-
raise RuntimeError,
|
|
347
|
-
"The #{filter_name.inspect} filter did not write anything to the required output file, #{filter.output_filename}."
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
# Create snapshot
|
|
351
|
-
snapshot(@content[:post] ? :post : :pre, :final => false) unless self.binary?
|
|
352
|
-
ensure
|
|
353
|
-
# Notify end
|
|
354
|
-
Nanoc3::NotificationCenter.post(:filtering_ended, self, filter_name)
|
|
355
|
-
end
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
# Lays out the item using the given layout. This method will replace the
|
|
359
|
-
# content of the `:last` snapshot with the laid out content of the last
|
|
360
|
-
# snapshot.
|
|
361
|
-
#
|
|
362
|
-
# This method is supposed to be called only in a compilation rule block
|
|
363
|
-
# (see {Nanoc3::CompilerDSL#compile}).
|
|
364
|
-
#
|
|
365
|
-
# @see Nanoc3::ItemRepProxy#layout
|
|
366
|
-
#
|
|
367
|
-
# @param [Nanoc3::Layout] layout The layout to use
|
|
368
|
-
#
|
|
369
|
-
# @param [Symbol] filter_name The name of the filter to layout the item
|
|
370
|
-
# representations' content with
|
|
371
|
-
#
|
|
372
|
-
# @param [Hash] filter_args The filter arguments that should be passed to
|
|
373
|
-
# the filter's #run method
|
|
374
|
-
#
|
|
375
|
-
# @return [void]
|
|
376
|
-
def layout(layout, filter_name, filter_args)
|
|
377
|
-
# Check whether item can be laid out
|
|
378
|
-
raise Nanoc3::Errors::CannotLayoutBinaryItem.new(self) if self.binary?
|
|
379
|
-
|
|
380
|
-
# Create "pre" snapshot
|
|
381
|
-
if @content[:post].nil?
|
|
382
|
-
snapshot(:pre, :final => true)
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
# Create filter
|
|
386
|
-
klass = filter_named(filter_name)
|
|
387
|
-
raise Nanoc3::Errors::UnknownFilter.new(filter_name) if klass.nil?
|
|
388
|
-
filter = klass.new(assigns.merge({ :layout => layout }))
|
|
389
|
-
|
|
390
|
-
# Visit
|
|
391
|
-
Nanoc3::NotificationCenter.post(:visit_started, layout)
|
|
392
|
-
Nanoc3::NotificationCenter.post(:visit_ended, layout)
|
|
393
|
-
|
|
394
|
-
begin
|
|
395
|
-
# Notify start
|
|
396
|
-
Nanoc3::NotificationCenter.post(:processing_started, layout)
|
|
397
|
-
Nanoc3::NotificationCenter.post(:filtering_started, self, filter_name)
|
|
398
|
-
|
|
399
|
-
# Layout
|
|
400
|
-
@content[:last] = filter.run(layout.raw_content, filter_args)
|
|
401
|
-
|
|
402
|
-
# Create "post" snapshot
|
|
403
|
-
snapshot(:post, :final => false)
|
|
404
|
-
ensure
|
|
405
|
-
# Notify end
|
|
406
|
-
Nanoc3::NotificationCenter.post(:filtering_ended, self, filter_name)
|
|
407
|
-
Nanoc3::NotificationCenter.post(:processing_ended, layout)
|
|
408
|
-
end
|
|
409
|
-
end
|
|
410
|
-
|
|
411
|
-
# Creates a snapshot of the current compiled item content.
|
|
412
|
-
#
|
|
413
|
-
# @param [Symbol] snapshot_name The name of the snapshot to create
|
|
414
|
-
#
|
|
415
|
-
# @option params [Boolean] :final (true) True if this is the final time
|
|
416
|
-
# the snapshot will be updated; false if it is a non-final moving
|
|
417
|
-
# snapshot (such as `:pre`, `:post` or `:last`)
|
|
418
|
-
#
|
|
419
|
-
# @return [void]
|
|
420
|
-
def snapshot(snapshot_name, params={})
|
|
421
|
-
# Parse params
|
|
422
|
-
params[:final] = true if !params.has_key?(:final)
|
|
423
|
-
|
|
424
|
-
# Create snapshot
|
|
425
|
-
@content[snapshot_name] = @content[:last] unless self.binary?
|
|
426
|
-
|
|
427
|
-
# Write
|
|
428
|
-
write(snapshot_name) if params[:final]
|
|
429
|
-
end
|
|
430
|
-
|
|
431
|
-
# Returns a recording proxy that is used for determining whether the
|
|
432
|
-
# compilation has changed, and thus whether the item rep needs to be
|
|
433
|
-
# recompiled.
|
|
434
|
-
#
|
|
435
|
-
# @api private
|
|
436
|
-
#
|
|
437
|
-
# @return [Nanoc3::ItemRepRecorderProxy] The recording proxy
|
|
438
|
-
def to_recording_proxy
|
|
439
|
-
Nanoc3::ItemRepRecorderProxy.new(self)
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
# Returns false because this item is not yet a proxy, and therefore does
|
|
443
|
-
# need to be wrapped in a proxy during compilation.
|
|
444
|
-
#
|
|
445
|
-
# @api private
|
|
446
|
-
#
|
|
447
|
-
# @return [false]
|
|
448
|
-
#
|
|
449
|
-
# @see Nanoc3::ItemRepRecorderProxy#is_proxy?
|
|
450
|
-
# @see Nanoc3::ItemRepProxy#is_proxy?
|
|
451
|
-
def is_proxy?
|
|
452
|
-
false
|
|
453
|
-
end
|
|
454
|
-
|
|
455
|
-
# Returns an object that can be used for uniquely identifying objects.
|
|
456
|
-
#
|
|
457
|
-
# @api private
|
|
458
|
-
#
|
|
459
|
-
# @return [Object] An unique reference to this object
|
|
460
|
-
def reference
|
|
461
|
-
[ type, self.item.identifier, self.name ]
|
|
462
|
-
end
|
|
463
|
-
|
|
464
|
-
def inspect
|
|
465
|
-
"<#{self.class}:0x#{self.object_id.to_s(16)} name=#{self.name} binary=#{self.binary?} raw_path=#{self.raw_path} item.identifier=#{self.item.identifier}>"
|
|
466
|
-
end
|
|
467
|
-
|
|
468
|
-
private
|
|
469
|
-
|
|
470
|
-
def initialize_content
|
|
471
|
-
# Initialize content and filenames
|
|
472
|
-
if self.binary?
|
|
473
|
-
@temporary_filenames = { :last => @item.raw_filename }
|
|
474
|
-
@content = {}
|
|
475
|
-
else
|
|
476
|
-
@content = { :last => @item.raw_content }
|
|
477
|
-
@content[:last].freeze
|
|
478
|
-
@temporary_filenames = {}
|
|
479
|
-
end
|
|
480
|
-
end
|
|
481
|
-
|
|
482
|
-
def filter_named(name)
|
|
483
|
-
Nanoc3::Filter.named(name)
|
|
484
|
-
end
|
|
485
|
-
|
|
486
|
-
end
|
|
487
|
-
|
|
488
|
-
end
|