class Diecut::TemplateReducer

Public Class Methods

new(tokens) click to toggle source
# File lib/diecut/template-reducer.rb, line 3
def initialize(tokens)
  @tokens = tokens
end

Public Instance Methods

fields() click to toggle source
# File lib/diecut/template-reducer.rb, line 7
def fields
  process([], [@tokens]) if @fields.nil?
  @fields.keys
end
leaf_fields() click to toggle source
# File lib/diecut/template-reducer.rb, line 27
def leaf_fields
  leaves_and_nodes if @leaf_fields.nil?
  return @leaf_fields
end
leaves_and_nodes() click to toggle source
# File lib/diecut/template-reducer.rb, line 37
def leaves_and_nodes
  @node_fields, @leaf_fields = fields.partition.with_index do |field, idx|
    fields.drop(idx + 1).any? do |other|
      field.zip(other).all? {|l,r|
        l==r}
    end
  end
end
node_fields() click to toggle source
# File lib/diecut/template-reducer.rb, line 32
def node_fields
  leaves_and_nodes if @node_fields.nil?
  return @node_fields
end
partials() click to toggle source
# File lib/diecut/template-reducer.rb, line 17
def partials
  process([], [@tokens]) if @partials.nil?
  @partials.keys
end
process(prefix, tokens) click to toggle source
# File lib/diecut/template-reducer.rb, line 56
def process(prefix, tokens)
  @fields ||= {}
  @partials ||= {}
  @unknown ||= []
  @sections ||= {}

  tokens.each do |token|
    case token[0]
    when :multi
      process(prefix, token[1..-1])
    when :static
    when :mustache
      case token[1]
      when :etag, :utag
        process(prefix, [token[2]])
      when :section, :inverted_section
        @sections[prefix + token[2][2]] = true
        process(prefix, [token[2]])
        process(prefix + token[2][2], [token[4]])
      when :partial
        @partials[[token[2], prefix]] = true
      when :fetch
        @fields[prefix + token[2]] = true
      else
        @unknown << token
      end
    else
      @unknown << token
    end
  end
end
sections() click to toggle source
# File lib/diecut/template-reducer.rb, line 12
def sections
  process([], [@tokens]) if @sections.nil?
  @sections.keys
end
unknown() click to toggle source
# File lib/diecut/template-reducer.rb, line 22
def unknown
  process([], [@tokens]) if @unknown.nil?
  @unknown
end
validate() click to toggle source

XXX Used as a section and as a field is different from used as a field and as parent of a field. Tricky tricky

# File lib/diecut/template-reducer.rb, line 48
def validate
  not_sections = node_fields.find_all {|node| !sections.include?(node)}
  unless not_sections.empty?
    warn "These fields are referenced directly, and as the parent of another field:\n" +
      not_sections.map{|sec| sec.join(".")}.join("\n")
  end
end