nanoc 4.1.6 → 4.2.0b1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -1
- data/NEWS.md +11 -4
- data/lib/nanoc/base/checksummer.rb +135 -46
- data/lib/nanoc/base/compilation/compiler.rb +18 -28
- data/lib/nanoc/base/compilation/dependency_tracker.rb +22 -32
- data/lib/nanoc/base/compilation/filter.rb +2 -4
- data/lib/nanoc/base/entities.rb +1 -0
- data/lib/nanoc/base/entities/content.rb +14 -3
- data/lib/nanoc/base/entities/document.rb +14 -6
- data/lib/nanoc/base/entities/item.rb +0 -31
- data/lib/nanoc/base/entities/item_rep.rb +1 -1
- data/lib/nanoc/base/entities/lazy_value.rb +36 -0
- data/lib/nanoc/base/entities/pattern.rb +3 -2
- data/lib/nanoc/base/entities/site.rb +2 -0
- data/lib/nanoc/base/memoization.rb +17 -10
- data/lib/nanoc/base/repos/compiled_content_cache.rb +1 -1
- data/lib/nanoc/base/repos/data_source.rb +10 -6
- data/lib/nanoc/base/services/executor.rb +22 -22
- data/lib/nanoc/base/services/item_rep_router.rb +4 -5
- data/lib/nanoc/base/views.rb +0 -1
- data/lib/nanoc/base/views/item_rep_view.rb +3 -9
- data/lib/nanoc/base/views/mixins/document_view_mixin.rb +4 -11
- data/lib/nanoc/base/views/view.rb +1 -0
- data/lib/nanoc/base/views/view_context.rb +5 -1
- data/lib/nanoc/cli/commands/compile.rb +0 -6
- data/lib/nanoc/data_sources.rb +5 -5
- data/lib/nanoc/data_sources/filesystem.rb +219 -90
- data/lib/nanoc/extra/checking/check.rb +1 -2
- data/lib/nanoc/extra/checking/checks.rb +2 -0
- data/lib/nanoc/extra/checking/checks/css.rb +6 -14
- data/lib/nanoc/extra/checking/checks/html.rb +6 -14
- data/lib/nanoc/extra/checking/checks/internal_links.rb +14 -3
- data/lib/nanoc/extra/checking/checks/w3c_validator.rb +28 -0
- data/lib/nanoc/extra/deployers/fog.rb +134 -78
- data/lib/nanoc/extra/link_collector.rb +14 -18
- data/lib/nanoc/filters/sass.rb +3 -3
- data/lib/nanoc/helpers.rb +1 -0
- data/lib/nanoc/helpers/capturing.rb +16 -58
- data/lib/nanoc/helpers/child_parent.rb +51 -0
- data/lib/nanoc/helpers/filtering.rb +0 -1
- data/lib/nanoc/helpers/html_escape.rb +5 -0
- data/lib/nanoc/helpers/link_to.rb +2 -0
- data/lib/nanoc/helpers/rendering.rb +3 -4
- data/lib/nanoc/rule_dsl/action_provider.rb +20 -4
- data/lib/nanoc/rule_dsl/recording_executor.rb +3 -1
- data/lib/nanoc/rule_dsl/rule_context.rb +0 -1
- data/lib/nanoc/rule_dsl/rule_memory_calculator.rb +4 -1
- data/lib/nanoc/spec.rb +217 -0
- data/lib/nanoc/version.rb +1 -1
- data/test/base/test_data_source.rb +4 -2
- data/test/base/test_dependency_tracker.rb +5 -11
- data/test/data_sources/test_filesystem.rb +605 -69
- data/test/extra/checking/checks/test_internal_links.rb +25 -0
- data/test/extra/deployers/test_fog.rb +0 -177
- data/test/filters/test_less.rb +9 -4
- data/test/helpers/test_capturing.rb +38 -212
- data/test/helpers/test_link_to.rb +0 -205
- data/test/helpers/test_xml_sitemap.rb +2 -1
- metadata +7 -12
- data/lib/nanoc/base/views/site_view.rb +0 -14
- data/lib/nanoc/data_sources/filesystem_unified.rb +0 -101
- data/test/data_sources/test_filesystem_unified.rb +0 -559
- data/test/helpers/test_breadcrumbs.rb +0 -60
- data/test/helpers/test_filtering.rb +0 -112
- data/test/helpers/test_html_escape.rb +0 -26
- data/test/helpers/test_rendering.rb +0 -147
- data/test/helpers/test_tagging.rb +0 -92
- data/test/helpers/test_text.rb +0 -18
data/lib/nanoc/helpers.rb
CHANGED
@@ -2,6 +2,7 @@ module Nanoc::Helpers
|
|
2
2
|
autoload 'Blogging', 'nanoc/helpers/blogging'
|
3
3
|
autoload 'Breadcrumbs', 'nanoc/helpers/breadcrumbs'
|
4
4
|
autoload 'Capturing', 'nanoc/helpers/capturing'
|
5
|
+
autoload 'ChildParent', 'nanoc/helpers/child_parent'
|
5
6
|
autoload 'Filtering', 'nanoc/helpers/filtering'
|
6
7
|
autoload 'HTMLEscape', 'nanoc/helpers/html_escape'
|
7
8
|
autoload 'LinkTo', 'nanoc/helpers/link_to'
|
@@ -25,40 +25,6 @@ module Nanoc::Helpers
|
|
25
25
|
# <%= content_for(@item, :summary) || '(no summary)' %>
|
26
26
|
# </div>
|
27
27
|
module Capturing
|
28
|
-
# @api private
|
29
|
-
class CapturesStore
|
30
|
-
def initialize
|
31
|
-
@store = {}
|
32
|
-
end
|
33
|
-
|
34
|
-
def []=(item, name, content)
|
35
|
-
@store[item.identifier] ||= {}
|
36
|
-
@store[item.identifier][name] = content
|
37
|
-
end
|
38
|
-
|
39
|
-
def [](item, name)
|
40
|
-
@store[item.identifier] ||= {}
|
41
|
-
@store[item.identifier][name]
|
42
|
-
end
|
43
|
-
|
44
|
-
def reset_for(item)
|
45
|
-
@store[item.identifier] = {}
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
class ::Nanoc::Int::Site
|
50
|
-
# @api private
|
51
|
-
def captures_store
|
52
|
-
@captures_store ||= CapturesStore.new
|
53
|
-
end
|
54
|
-
|
55
|
-
# @api private
|
56
|
-
def captures_store_compiled_items
|
57
|
-
require 'set'
|
58
|
-
@captures_store_compiled_items ||= Set.new
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
28
|
# @overload content_for(name, params = {}, &block)
|
63
29
|
#
|
64
30
|
# Captures the content inside the block and stores it so that it can be
|
@@ -114,17 +80,19 @@ module Nanoc::Helpers
|
|
114
80
|
content = capture(&block)
|
115
81
|
|
116
82
|
# Prepare for store
|
117
|
-
|
83
|
+
snapshot_contents = @item.reps[:default].unwrap.snapshot_contents
|
84
|
+
capture_name = "__capture_#{name}".to_sym
|
118
85
|
case existing_behavior
|
119
86
|
when :overwrite
|
120
|
-
|
87
|
+
snapshot_contents[capture_name] = ''
|
121
88
|
when :append
|
122
|
-
|
89
|
+
snapshot_contents[capture_name] ||= ''
|
123
90
|
when :error
|
124
|
-
if
|
91
|
+
if snapshot_contents[capture_name] && snapshot_contents[capture_name] != content
|
92
|
+
# FIXME: get proper exception
|
125
93
|
raise "a capture named #{name.inspect} for #{@item.identifier} already exists"
|
126
94
|
else
|
127
|
-
|
95
|
+
snapshot_contents[capture_name] = ''
|
128
96
|
end
|
129
97
|
else
|
130
98
|
raise ArgumentError, 'expected :existing_behavior param to #content_for to be one of ' \
|
@@ -132,38 +100,28 @@ module Nanoc::Helpers
|
|
132
100
|
end
|
133
101
|
|
134
102
|
# Store
|
135
|
-
|
136
|
-
store[@item, name.to_sym] << content
|
103
|
+
snapshot_contents[capture_name] << content
|
137
104
|
else # Get content
|
138
|
-
# Get args
|
139
105
|
if args.size != 2
|
140
106
|
raise ArgumentError, 'expected 2 arguments (the item ' \
|
141
107
|
"and the name of the capture) but got #{args.size} instead"
|
142
108
|
end
|
143
|
-
item = args[0]
|
109
|
+
item = args[0]
|
144
110
|
name = args[1]
|
145
111
|
|
112
|
+
rep = item.reps[:default].unwrap
|
113
|
+
|
146
114
|
# Create dependency
|
147
115
|
if @item.nil? || item != @item.unwrap
|
148
|
-
|
149
|
-
|
116
|
+
dependency_tracker = @config._context.dependency_tracker
|
117
|
+
dependency_tracker.bounce(item.unwrap)
|
150
118
|
|
151
|
-
|
152
|
-
|
153
|
-
# the content attribute to reset it. :(
|
154
|
-
# FIXME: clean this up
|
155
|
-
unless @site.unwrap.captures_store_compiled_items.include?(item)
|
156
|
-
@site.unwrap.captures_store.reset_for(item)
|
157
|
-
item.forced_outdated = true
|
158
|
-
@site.unwrap.compiler.reps[item].each do |r|
|
159
|
-
r.snapshot_contents = { last: item.content }
|
160
|
-
raise Nanoc::Int::Errors::UnmetDependency.new(r)
|
161
|
-
end
|
119
|
+
unless rep.compiled?
|
120
|
+
raise Nanoc::Int::Errors::UnmetDependency.new(rep)
|
162
121
|
end
|
163
122
|
end
|
164
123
|
|
165
|
-
#
|
166
|
-
@site.unwrap.captures_store[item, name.to_sym]
|
124
|
+
rep.snapshot_contents["__capture_#{name}".to_sym]
|
167
125
|
end
|
168
126
|
end
|
169
127
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Nanoc::Helpers
|
2
|
+
# Provides functionality for fetching the children and the parent of a given
|
3
|
+
# item. This works for both full identifiers and legacy identifiers.
|
4
|
+
module ChildParent
|
5
|
+
# Returns the parent of the given item.
|
6
|
+
#
|
7
|
+
# For items with legacy identifiers, the parent is the item where the
|
8
|
+
# identifier contains one less component than the identifier of the given
|
9
|
+
# item. For # example, the parent of the “/projects/nanoc/” item is the
|
10
|
+
# “/projects/” item.
|
11
|
+
#
|
12
|
+
# For items with full identifiers, the parent is the item where the
|
13
|
+
# identifier contains one less component than the identifier of the given
|
14
|
+
# item, and ends with any extension. For example, the parent of the
|
15
|
+
# “/projects/nanoc.md” item could be the “/projects.md” item, or the
|
16
|
+
# “/projects.html” item, etc. Note that the parent is ambiguous for items
|
17
|
+
# that have a full identifier; only the first candidate parent item will be
|
18
|
+
# returned.
|
19
|
+
def parent_of(item)
|
20
|
+
if item.identifier.legacy?
|
21
|
+
item.parent
|
22
|
+
else
|
23
|
+
path_without_last_component = item.identifier.to_s.sub(/[^\/]+$/, '').chop
|
24
|
+
@items[path_without_last_component + '.*']
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns the children of the given item.
|
29
|
+
#
|
30
|
+
# For items with legacy identifiers, the children are the items where the
|
31
|
+
# identifier contains one more component than the identifier of the given
|
32
|
+
# item. For example, the children of the “/projects/” item could be
|
33
|
+
# “/projects/nanoc/” and “/projects/cri/”, but not “/about/” nor
|
34
|
+
# “/projects/nanoc/history/”.
|
35
|
+
#
|
36
|
+
# For items with full identifiers, the children are the item where the
|
37
|
+
# identifier starts with the identifier of the given item, minus the
|
38
|
+
# extension, followed by a slash. For example, the children of the
|
39
|
+
# “/projects.md” item could be the “/projects/nanoc.md” and
|
40
|
+
# “/projects/cri.adoc” items , but not “/about.md” nor
|
41
|
+
# “/projects/nanoc/history.md”.
|
42
|
+
def children_of(item)
|
43
|
+
if item.identifier.legacy?
|
44
|
+
item.children
|
45
|
+
else
|
46
|
+
pattern = item.identifier.without_ext + '/*'
|
47
|
+
@items.find_all(pattern)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -34,6 +34,11 @@ module Nanoc::Helpers
|
|
34
34
|
buffer = eval('_erbout', block.binding)
|
35
35
|
buffer << escaped_data
|
36
36
|
elsif string
|
37
|
+
unless string.is_a? String
|
38
|
+
raise ArgumentError, 'The #html_escape or #h function needs either a ' \
|
39
|
+
"string or a block to HTML-escape, but #{string.class} was given"
|
40
|
+
end
|
41
|
+
|
37
42
|
string
|
38
43
|
.gsub('&', '&')
|
39
44
|
.gsub('<', '<')
|
@@ -122,6 +122,7 @@ module Nanoc::Helpers
|
|
122
122
|
else
|
123
123
|
path = target.path
|
124
124
|
if path.nil?
|
125
|
+
# TODO: get proper error
|
125
126
|
raise "Cannot get the relative path to #{target.inspect} because this target is not outputted (its routing rule returns nil)"
|
126
127
|
end
|
127
128
|
end
|
@@ -134,6 +135,7 @@ module Nanoc::Helpers
|
|
134
135
|
# Get source and destination paths
|
135
136
|
dst_path = Pathname.new(path)
|
136
137
|
if @item_rep.path.nil?
|
138
|
+
# TODO: get proper error
|
137
139
|
raise "Cannot get the relative path to #{path} because the current item representation, #{@item_rep.inspect}, is not outputted (its routing rule returns nil)"
|
138
140
|
end
|
139
141
|
src_path = Pathname.new(@item_rep.path)
|
@@ -80,8 +80,8 @@ module Nanoc::Helpers
|
|
80
80
|
raise Nanoc::Int::Errors::UnknownLayout.new(identifier) if layout.nil?
|
81
81
|
|
82
82
|
# Visit
|
83
|
-
|
84
|
-
|
83
|
+
dependency_tracker = @config._context.dependency_tracker
|
84
|
+
dependency_tracker.bounce(layout)
|
85
85
|
|
86
86
|
# Capture content, if any
|
87
87
|
captured_content = block_given? ? capture(&block) : nil
|
@@ -95,11 +95,10 @@ module Nanoc::Helpers
|
|
95
95
|
layout: layout,
|
96
96
|
layouts: @layouts,
|
97
97
|
config: @config,
|
98
|
-
site: @site,
|
99
98
|
}.merge(other_assigns)
|
100
99
|
|
101
100
|
# Get filter name
|
102
|
-
filter_name, filter_args = *@
|
101
|
+
filter_name, filter_args = *@config._context.compiler.filter_name_and_args_for_layout(layout)
|
103
102
|
raise Nanoc::Int::Errors::CannotDetermineFilter.new(layout.identifier) if filter_name.nil?
|
104
103
|
|
105
104
|
# Get filter class
|
@@ -48,7 +48,14 @@ module Nanoc::RuleDSL
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def postprocess(site, reps)
|
51
|
-
|
51
|
+
dependency_tracker = Nanoc::Int::DependencyTracker::Null.new
|
52
|
+
view_context =
|
53
|
+
Nanoc::ViewContext.new(
|
54
|
+
reps: reps,
|
55
|
+
items: site.items,
|
56
|
+
dependency_tracker: dependency_tracker,
|
57
|
+
compiler: site.compiler,
|
58
|
+
)
|
52
59
|
ctx = new_postprocessor_context(site, view_context)
|
53
60
|
|
54
61
|
@rules_collection.postprocessors.each_value do |postprocessor|
|
@@ -58,10 +65,19 @@ module Nanoc::RuleDSL
|
|
58
65
|
|
59
66
|
# @api private
|
60
67
|
def new_preprocessor_context(site)
|
68
|
+
dependency_tracker = Nanoc::Int::DependencyTracker::Null.new
|
69
|
+
view_context =
|
70
|
+
Nanoc::ViewContext.new(
|
71
|
+
reps: nil,
|
72
|
+
items: nil,
|
73
|
+
dependency_tracker: dependency_tracker,
|
74
|
+
compiler: nil,
|
75
|
+
)
|
76
|
+
|
61
77
|
Nanoc::Int::Context.new(
|
62
|
-
config: Nanoc::MutableConfigView.new(site.config,
|
63
|
-
items: Nanoc::MutableItemCollectionView.new(site.items,
|
64
|
-
layouts: Nanoc::MutableLayoutCollectionView.new(site.layouts,
|
78
|
+
config: Nanoc::MutableConfigView.new(site.config, view_context),
|
79
|
+
items: Nanoc::MutableItemCollectionView.new(site.items, view_context),
|
80
|
+
layouts: Nanoc::MutableLayoutCollectionView.new(site.layouts, view_context),
|
65
81
|
)
|
66
82
|
end
|
67
83
|
|
@@ -39,7 +39,9 @@ module Nanoc
|
|
39
39
|
routing_rule = routing_rules[snapshot_name]
|
40
40
|
return nil if routing_rule.nil?
|
41
41
|
|
42
|
-
|
42
|
+
dependency_tracker = Nanoc::Int::DependencyTracker::Null.new
|
43
|
+
view_context = Nanoc::ViewContext.new(reps: nil, items: nil, dependency_tracker: dependency_tracker, compiler: nil)
|
44
|
+
basic_path = routing_rule.apply_to(rep, executor: nil, site: @site, view_context: view_context)
|
43
45
|
if basic_path && !basic_path.start_with?('/')
|
44
46
|
raise PathWithoutInitialSlashError.new(rep, basic_path)
|
45
47
|
end
|
@@ -19,7 +19,6 @@ module Nanoc::RuleDSL
|
|
19
19
|
items: Nanoc::ItemCollectionWithoutRepsView.new(site.items, view_context),
|
20
20
|
layouts: Nanoc::LayoutCollectionView.new(site.layouts, view_context),
|
21
21
|
config: Nanoc::ConfigView.new(site.config, view_context),
|
22
|
-
site: Nanoc::SiteView.new(site, view_context),
|
23
22
|
})
|
24
23
|
end
|
25
24
|
|
@@ -59,12 +59,15 @@ module Nanoc::RuleDSL
|
|
59
59
|
def new_rule_memory_for_rep(rep)
|
60
60
|
# FIXME: What if #compilation_rule_for returns nil?
|
61
61
|
|
62
|
+
dependency_tracker = Nanoc::Int::DependencyTracker::Null.new
|
63
|
+
view_context = @site.compiler.create_view_context(dependency_tracker)
|
64
|
+
|
62
65
|
executor = Nanoc::RuleDSL::RecordingExecutor.new(rep, @rules_collection, @site)
|
63
66
|
rule = @rules_collection.compilation_rule_for(rep)
|
64
67
|
|
65
68
|
executor.snapshot(rep, :raw)
|
66
69
|
executor.snapshot(rep, :pre, final: false)
|
67
|
-
rule.apply_to(rep, executor: executor, site: @site, view_context:
|
70
|
+
rule.apply_to(rep, executor: executor, site: @site, view_context: view_context)
|
68
71
|
if executor.rule_memory.any_layouts?
|
69
72
|
executor.snapshot(rep, :post)
|
70
73
|
end
|
data/lib/nanoc/spec.rb
ADDED
@@ -0,0 +1,217 @@
|
|
1
|
+
module Nanoc
|
2
|
+
# @api private
|
3
|
+
module Spec
|
4
|
+
class HelperContext
|
5
|
+
# @return [Nanoc::Int::DependencyTracker]
|
6
|
+
attr_reader :dependency_tracker
|
7
|
+
|
8
|
+
attr_reader :erbout
|
9
|
+
|
10
|
+
# @param [Module] mod The helper module to create a context for
|
11
|
+
def initialize(mod)
|
12
|
+
@mod = mod
|
13
|
+
|
14
|
+
@erbout = ''
|
15
|
+
@rule_memory = {}
|
16
|
+
@config = Nanoc::Int::Configuration.new.with_defaults
|
17
|
+
@reps = Nanoc::Int::ItemRepRepo.new
|
18
|
+
@items = Nanoc::Int::IdentifiableCollection.new(@config)
|
19
|
+
@layouts = Nanoc::Int::IdentifiableCollection.new(@config)
|
20
|
+
@dependency_tracker = Nanoc::Int::DependencyTracker.new(Object.new)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Creates a new item and adds it to the site’s collection of items.
|
24
|
+
#
|
25
|
+
# @param [String] content The uncompiled item content
|
26
|
+
#
|
27
|
+
# @param [Hash] attributes A hash containing this item's attributes
|
28
|
+
#
|
29
|
+
# @param [Nanoc::Identifier, String] identifier This item's identifier
|
30
|
+
#
|
31
|
+
# @return [Nanoc::ItemWithRepsView] A view for the newly created item
|
32
|
+
def create_item(content, attributes, identifier)
|
33
|
+
item = Nanoc::Int::Item.new(content, attributes, identifier)
|
34
|
+
@items << item
|
35
|
+
Nanoc::ItemWithRepsView.new(item, view_context)
|
36
|
+
end
|
37
|
+
|
38
|
+
# TODO: document
|
39
|
+
def create_layout(content, attributes, identifier)
|
40
|
+
layout = Nanoc::Int::Layout.new(content, attributes, identifier)
|
41
|
+
@layouts << layout
|
42
|
+
Nanoc::LayoutView.new(layout, view_context)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Creates a new representation for the given item.
|
46
|
+
#
|
47
|
+
# @param [Nanoc::ItemWithRepsView] item The item to create a represetation for
|
48
|
+
#
|
49
|
+
# @param [String] path The path of the `:last` snapshot of this item representation
|
50
|
+
def create_rep(item, path)
|
51
|
+
rep = Nanoc::Int::ItemRep.new(item.unwrap, :default)
|
52
|
+
rep.paths[:last] = path
|
53
|
+
@reps << rep
|
54
|
+
Nanoc::ItemRepView.new(rep, view_context)
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [Object] An object that includes the helper functions
|
58
|
+
def helper
|
59
|
+
mod = @mod
|
60
|
+
klass = Class.new(Nanoc::Int::Context) { include mod }
|
61
|
+
klass.new(assigns)
|
62
|
+
end
|
63
|
+
|
64
|
+
def item=(item)
|
65
|
+
@item = item ? item.unwrap : nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def item_rep=(item_rep)
|
69
|
+
@item_rep = item_rep ? item_rep.unwrap : nil
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [Nanoc::MutableConfigView]
|
73
|
+
def config
|
74
|
+
assigns[:config]
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [Nanoc::ItemWithRepsView, nil]
|
78
|
+
def item
|
79
|
+
assigns[:item]
|
80
|
+
end
|
81
|
+
|
82
|
+
# @return [Nanoc::ItemRepView, nil]
|
83
|
+
def item_rep
|
84
|
+
assigns[:item_rep]
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [Nanoc::ItemCollectionWithRepsView]
|
88
|
+
def items
|
89
|
+
assigns[:items]
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [Nanoc::LayoutCollectionView]
|
93
|
+
def layouts
|
94
|
+
assigns[:layouts]
|
95
|
+
end
|
96
|
+
|
97
|
+
def rule_memory_for(obj)
|
98
|
+
@rule_memory.fetch(obj, [])
|
99
|
+
end
|
100
|
+
|
101
|
+
def update_rule_memory(obj, memory)
|
102
|
+
@rule_memory[obj] = memory
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def view_context
|
108
|
+
Nanoc::ViewContext.new(
|
109
|
+
reps: @reps,
|
110
|
+
items: @items,
|
111
|
+
dependency_tracker: @dependency_tracker,
|
112
|
+
compiler: new_site.compiler,
|
113
|
+
)
|
114
|
+
end
|
115
|
+
|
116
|
+
def new_action_provider
|
117
|
+
Class.new(Nanoc::Int::ActionProvider) do
|
118
|
+
def self.for(_context)
|
119
|
+
raise NotImplementedError
|
120
|
+
end
|
121
|
+
|
122
|
+
def initialize(context)
|
123
|
+
@context = context
|
124
|
+
end
|
125
|
+
|
126
|
+
def rep_names_for(_item)
|
127
|
+
[:default]
|
128
|
+
end
|
129
|
+
|
130
|
+
def memory_for(obj)
|
131
|
+
@context.rule_memory_for(obj)
|
132
|
+
end
|
133
|
+
|
134
|
+
def snapshots_defs_for(_rep)
|
135
|
+
[Nanoc::Int::SnapshotDef.new(:last, false)]
|
136
|
+
end
|
137
|
+
end.new(self)
|
138
|
+
end
|
139
|
+
|
140
|
+
def new_compiler_for(site)
|
141
|
+
rule_memory_store = Nanoc::Int::RuleMemoryStore.new
|
142
|
+
|
143
|
+
dependency_store =
|
144
|
+
Nanoc::Int::DependencyStore.new(site.items.to_a + site.layouts.to_a)
|
145
|
+
|
146
|
+
checksum_store =
|
147
|
+
Nanoc::Int::ChecksumStore.new(site: site)
|
148
|
+
|
149
|
+
item_rep_repo = Nanoc::Int::ItemRepRepo.new
|
150
|
+
|
151
|
+
action_provider = new_action_provider
|
152
|
+
|
153
|
+
outdatedness_checker =
|
154
|
+
Nanoc::Int::OutdatednessChecker.new(
|
155
|
+
site: site,
|
156
|
+
checksum_store: checksum_store,
|
157
|
+
dependency_store: dependency_store,
|
158
|
+
rule_memory_store: rule_memory_store,
|
159
|
+
action_provider: action_provider,
|
160
|
+
reps: item_rep_repo,
|
161
|
+
)
|
162
|
+
|
163
|
+
params = {
|
164
|
+
compiled_content_cache: Nanoc::Int::CompiledContentCache.new,
|
165
|
+
checksum_store: checksum_store,
|
166
|
+
rule_memory_store: rule_memory_store,
|
167
|
+
dependency_store: dependency_store,
|
168
|
+
outdatedness_checker: outdatedness_checker,
|
169
|
+
reps: item_rep_repo,
|
170
|
+
action_provider: action_provider,
|
171
|
+
}
|
172
|
+
|
173
|
+
Nanoc::Int::Compiler.new(site, params)
|
174
|
+
end
|
175
|
+
|
176
|
+
def new_site
|
177
|
+
site = Nanoc::Int::Site.new(
|
178
|
+
config: @config,
|
179
|
+
code_snippets: [],
|
180
|
+
items: @items,
|
181
|
+
layouts: @layouts,
|
182
|
+
)
|
183
|
+
site.compiler = new_compiler_for(site)
|
184
|
+
site
|
185
|
+
end
|
186
|
+
|
187
|
+
def assigns
|
188
|
+
site = Nanoc::Int::Site.new(
|
189
|
+
config: @config,
|
190
|
+
code_snippets: [],
|
191
|
+
items: @items,
|
192
|
+
layouts: @layouts,
|
193
|
+
)
|
194
|
+
site.compiler = new_compiler_for(site)
|
195
|
+
|
196
|
+
{
|
197
|
+
config: Nanoc::MutableConfigView.new(@config, view_context),
|
198
|
+
item_rep: @item_rep ? Nanoc::ItemRepView.new(@item_rep, view_context) : nil,
|
199
|
+
item: @item ? Nanoc::ItemWithRepsView.new(@item, view_context) : nil,
|
200
|
+
items: Nanoc::ItemCollectionWithRepsView.new(@items, view_context),
|
201
|
+
layouts: Nanoc::LayoutCollectionView.new(@layouts, view_context),
|
202
|
+
_erbout: @erbout,
|
203
|
+
}
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
module HelperHelper
|
208
|
+
def ctx
|
209
|
+
@_ctx ||= HelperContext.new(described_class)
|
210
|
+
end
|
211
|
+
|
212
|
+
def helper
|
213
|
+
@_helper ||= ctx.helper
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|