# frozen_string_literal: true module Nanoc module Int class CompilationContext include Nanoc::Core::ContractsSupport attr_reader :site attr_reader :compiled_content_cache attr_reader :compiled_content_store C_COMPILED_CONTENT_CACHE = C::Or[ Nanoc::Core::CompiledContentCache, Nanoc::Core::TextualCompiledContentCache, Nanoc::Core::BinaryCompiledContentCache, ] contract C::KeywordArgs[ action_provider: Nanoc::Core::ActionProvider, reps: Nanoc::Core::ItemRepRepo, site: Nanoc::Core::Site, compiled_content_cache: C_COMPILED_CONTENT_CACHE, compiled_content_store: Nanoc::Core::CompiledContentStore, ] => C::Any def initialize(action_provider:, reps:, site:, compiled_content_cache:, compiled_content_store:) @action_provider = action_provider @reps = reps @site = site @compiled_content_cache = compiled_content_cache @compiled_content_store = compiled_content_store end # FIXME: Expand contract contract Nanoc::Core::Layout => C::Any def filter_name_and_args_for_layout(layout) seq = @action_provider.action_sequence_for(layout) if seq.nil? || seq.size != 1 || !seq[0].is_a?(Nanoc::Core::ProcessingActions::Filter) raise Nanoc::Int::Errors::UndefinedFilterForLayout.new(layout) end [seq[0].filter_name, seq[0].params] end contract Nanoc::Core::DependencyTracker => C::Named['Nanoc::ViewContextForCompilation'] def create_view_context(dependency_tracker) Nanoc::ViewContextForCompilation.new( reps: @reps, items: @site.items, dependency_tracker: dependency_tracker, compilation_context: self, compiled_content_store: @compiled_content_store, ) end contract Nanoc::Core::ItemRep, Nanoc::Core::DependencyTracker => Hash def assigns_for(rep, dependency_tracker) last_content = @compiled_content_store.get_current(rep) content_or_filename_assigns = if last_content.binary? { filename: last_content.filename } else { content: last_content.string } end view_context = create_view_context(dependency_tracker) content_or_filename_assigns.merge( item: Nanoc::CompilationItemView.new(rep.item, view_context), rep: Nanoc::CompilationItemRepView.new(rep, view_context), item_rep: Nanoc::CompilationItemRepView.new(rep, view_context), items: Nanoc::ItemCollectionWithRepsView.new(@site.items, view_context), layouts: Nanoc::LayoutCollectionView.new(@site.layouts, view_context), config: Nanoc::ConfigView.new(@site.config, view_context), ) end end end end