Class: Nanoc::RuleDSL::ActionSequenceCalculator Private
- Inherits:
-
Object
- Object
- Nanoc::RuleDSL::ActionSequenceCalculator
- Defined in:
- lib/nanoc/rule_dsl/action_sequence_calculator.rb
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Defined Under Namespace
Classes: NoActionSequenceForItemRepException, NoActionSequenceForLayoutException, PathWithoutInitialSlashError, UnsupportedObjectTypeException
Instance Attribute Summary collapse
- #rules_collection ⇒ Object private
Instance Method Summary collapse
- #[](obj) ⇒ Nanoc::Core::ActionSequence private
-
#basic_path_from_rules_for(rep, snapshot_name) ⇒ Object
private
FIXME: ugly.
- #compact_snapshots(seq) ⇒ Object private
- #copy_paths_from_routing_rules(seq, snapshots_for_which_to_skip_routing_rule, rep:) ⇒ Object private
-
#initialize(site:, rules_collection:) ⇒ ActionSequenceCalculator
constructor
private
A new instance of ActionSequenceCalculator.
- #new_action_sequence_for_layout(layout) ⇒ Nanoc::Core::ActionSequence private
- #new_action_sequence_for_rep(rep) ⇒ Object private
Constructor Details
#initialize(site:, rules_collection:) ⇒ ActionSequenceCalculator
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of ActionSequenceCalculator.
34 35 36 37 |
# File 'lib/nanoc/rule_dsl/action_sequence_calculator.rb', line 34 def initialize(site:, rules_collection:) @site = site @rules_collection = rules_collection end |
Instance Attribute Details
#rules_collection ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
30 31 32 |
# File 'lib/nanoc/rule_dsl/action_sequence_calculator.rb', line 30 def rules_collection @rules_collection end |
Instance Method Details
#[](obj) ⇒ Nanoc::Core::ActionSequence
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
42 43 44 45 46 47 48 49 50 51 |
# File 'lib/nanoc/rule_dsl/action_sequence_calculator.rb', line 42 def [](obj) case obj when Nanoc::Core::ItemRep new_action_sequence_for_rep(obj) when Nanoc::Core::Layout new_action_sequence_for_layout(obj) else raise UnsupportedObjectTypeException.new(obj) end end |
#basic_path_from_rules_for(rep, snapshot_name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
FIXME: ugly
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/nanoc/rule_dsl/action_sequence_calculator.rb', line 127 def basic_path_from_rules_for(rep, snapshot_name) routing_rules = @rules_collection.routing_rules_for(rep) routing_rule = routing_rules[snapshot_name] return nil if routing_rule.nil? view_context = Nanoc::Core::ViewContextForPreCompilation.new(items: @site.items) basic_path = routing_rule.apply_to( rep, site: @site, view_context:, ) if basic_path && !basic_path.start_with?('/') raise PathWithoutInitialSlashError.new(rep, basic_path) end basic_path end |
#compact_snapshots(seq) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/nanoc/rule_dsl/action_sequence_calculator.rb', line 92 def compact_snapshots(seq) actions = [] seq.actions.each do |action| if [actions.last, action].all? { |a| a.is_a?(Nanoc::Core::ProcessingActions::Snapshot) } actions[-1] = actions.last.update(snapshot_names: action.snapshot_names, paths: action.paths) else actions << action end end Nanoc::Core::ActionSequence.new(actions:) end |
#copy_paths_from_routing_rules(seq, snapshots_for_which_to_skip_routing_rule, rep:) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/nanoc/rule_dsl/action_sequence_calculator.rb', line 104 def copy_paths_from_routing_rules(seq, snapshots_for_which_to_skip_routing_rule, rep:) # NOTE: This assumes that `seq` is compacted, i.e. there are no two consecutive snapshot actions. seq.map do |action| # Only potentially modify snapshot actions next action unless action.is_a?(Nanoc::Core::ProcessingActions::Snapshot) # If any of the action’s snapshot are explicitly marked as excluded from # getting a path from a routing rule, then ignore routing rules. next action if snapshots_for_which_to_skip_routing_rule.intersect?(Set.new(action.snapshot_names)) # If this action already has paths that don’t come from routing rules, # then don’t add more to them. next action unless action.paths.empty? # For each snapshot name, find a path from a routing rule. The routing # rule might return nil, so we need #compact. paths = action.snapshot_names.map { |sn| basic_path_from_rules_for(rep, sn) }.compact action.update(snapshot_names: [], paths:) end end |
#new_action_sequence_for_layout(layout) ⇒ Nanoc::Core::ActionSequence
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/nanoc/rule_dsl/action_sequence_calculator.rb', line 80 def new_action_sequence_for_layout(layout) res = @rules_collection.filter_for_layout(layout) unless res raise NoActionSequenceForLayoutException.new(layout) end Nanoc::Core::ActionSequenceBuilder.build do |b| b.add_filter(res[0], res[1]) end end |
#new_action_sequence_for_rep(rep) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/nanoc/rule_dsl/action_sequence_calculator.rb', line 53 def new_action_sequence_for_rep(rep) view_context = Nanoc::Core::ViewContextForPreCompilation.new(items: @site.items) recorder = Nanoc::RuleDSL::ActionRecorder.new(rep) rule = @rules_collection.compilation_rule_for(rep) unless rule raise NoActionSequenceForItemRepException.new(rep) end recorder.snapshot(:raw) rule.apply_to(rep, recorder:, site: @site, view_context:) recorder.snapshot(:post) if recorder.any_layouts? recorder.snapshot(:last) recorder.snapshot(:pre) unless recorder.pre_snapshot? copy_paths_from_routing_rules( compact_snapshots(recorder.action_sequence), recorder.snapshots_for_which_to_skip_routing_rule, rep:, ) end |