Class: Eggshell::Bundles::Basic::CoreMacros

Inherits:
Object
  • Object
show all
Includes:
Eggshell::BlockHandler::BlockParams, MacroHandler
Defined in:
lib/eggshell/bundles/basics.rb

Overview

These macros are highly recommended to always be part of an instance of the processor.

dl.

{!}

sets default parameter values (block parameters) so that they don’t have to be

specified for every block instance.

{raw}

passes all block lines up into output chain. Macros are assembled before being

outputted.

{pipe}

allows blocks to pipe into the adjacent block

{process} always dynamic processing of content. This allows previous macros to build up a document dynamically.

Constant Summary collapse

CAP_OUT =
'capture_output'

Constants included from Eggshell::BlockHandler::BlockParams

Eggshell::BlockHandler::BlockParams::ATTRIBUTES, Eggshell::BlockHandler::BlockParams::CLASS, Eggshell::BlockHandler::BlockParams::ID, Eggshell::BlockHandler::BlockParams::KEYS, Eggshell::BlockHandler::BlockParams::STYLE

Constants included from MacroHandler

MacroHandler::CHAIN_CONTINUE, MacroHandler::CHAIN_END, MacroHandler::CHAIN_NONE, MacroHandler::CHAIN_START, MacroHandler::COLLECT_NORMAL, MacroHandler::COLLECT_RAW, MacroHandler::COLLECT_RAW_MACRO

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Eggshell::BlockHandler::BlockParams

#get_block_params, #set_block_params

Methods included from MacroHandler

#chain_type

Class Method Details

.make_include_paths(inc, opts) ⇒ Object



756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
# File 'lib/eggshell/bundles/basics.rb', line 756

def self.make_include_paths(inc, opts)
	checks = []
	if inc[0] != '/'
		if opts[:include_paths]
			opts[:include_paths].each do |root|
				checks << "#{root}/#{inc}"
			end
			# @todo if :include_root, expand path and check that it's under the root, otherwise, sandbox
		end
	else
		# sandboxed root include
		if opts[:include_root]
			checks << "#{opts[:include_root]}#{inc}"
		else
			checks << inc
		end
	end
	checks
end

Instance Method Details

#collection_type(macro) ⇒ Object



671
672
673
# File 'lib/eggshell/bundles/basics.rb', line 671

def collection_type(macro)
	macro == 'raw' ? MH::COLLECT_RAW_MACRO : MH::COLLECT_NORMAL
end

#do_include(paths, buff, call_depth, opts = {}) ⇒ Object



729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
# File 'lib/eggshell/bundles/basics.rb', line 729

def do_include(paths, buff, call_depth, opts = {})
	paths = [paths] if !paths.is_a?(Array)
	# @todo check all include paths?
	paths.each do |inc|
		inc = inc.line if inc.is_a?(Eggshell::Line)
		inc = @eggshell.expand_expr(inc.strip)

		CoreMacros.make_include_paths(inc, @vars).each do |inc|
			if File.exists?(inc)
				lines = IO.readlines(inc, $/, opts)
				@vars[:include_stack] << inc
				begin
					buff << @eggshell.process(lines, 0, call_depth + 1)
					@eggshell._debug("include: 200 #{inc}")
				rescue => ex
					@eggshell._error("include: 500 #{inc}: #{ex.message}#{ex.backtrace.join("\n\t")}")
				end
				
				@vars[:include_stack].pop
				break
			else
				@eggshell._warn("include: 404 #{inc}")
			end
		end
	end
end

#process(name, args, lines, out, call_depth = 0) ⇒ Object



675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
# File 'lib/eggshell/bundles/basics.rb', line 675

def process(name, args, lines, out, call_depth = 0)
	if name == '=' || name == 'var'
		# @todo expand args[0]?
		if args[0]
			val = nil
			if args[1].is_a?(Array) && args[1][0].is_a?(Symbol)
				val = @eggshell.expr_eval(args[1])
			else
				val = args[1]
			end
			@eggshell.vars[args[0]] = val
		end
	elsif name == '!'
		block_name = args[0]
		block_params = args[1]
		set_block_params(block_name, block_params) if block_name
	elsif name == 'process'
		
	elsif name == 'capture'
		var = args[0] || CAP_OUT
		captured = @eggshell.assemble(lines, call_depth + 1)
		captured = @eggshell.expand_expr(captured)
		@eggshell.vars[var] = captured
	elsif name == 'include'
		paths = args[0]
		opts = args[1] || {}
		if opts['encoding']
			opts[:encoding] = opts['encoding']
		else
			opts[:encoding] = 'utf-8'
		end
		if lines && lines.length > 0
			paths = lines
		end
		do_include(paths, out, call_depth, opts)
	elsif name == 'raw'
		lines.each do |unit|
			if unit.is_a?(Array)
				if unit[0] == :block
					unit[Eggshell::ParseTree::IDX_LINES].each do |line|
						out << line.to_s
					end
				else
					out << @eggshell.assemble(unit, call_depth + 1)
				end
			else
				out << unit
			end
		end
	elsif name == 'pipe'
		out << @eggshell.assemble(lines, call_depth + 1)
	end
end

#set_processor(proc, opts = nil) ⇒ Object



651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
# File 'lib/eggshell/bundles/basics.rb', line 651

def set_processor(proc, opts = nil)
	opts = {} if !opts
	@opts = opts
	@eggshell = proc
	@eggshell.add_macro_handler(self, '=', 'var', '!', 'process', 'capture', 'raw', 'pipe')
	@eggshell.add_macro_handler(self, 'include') if !@opts['macro.include.off']
	@vars = @eggshell.vars

	@vars[:include_stack] = []
	if opts['include.options']
		opts['include.options'].each do |k,v|
			@vars[k.to_sym] = v
		end
	end
	
	if @vars[:include_paths].length == 0
		@vars[:include_paths] = [Dir.getwd]
	end
end