class Bob::Compiler::Template

Public Class Methods

new(name, template_string) click to toggle source
Calls superclass method Bob::Compiler::Base::new
# File lib/bob/compiler/template.rb, line 10
def initialize(name, template_string)
  super()
  @name = name
  @template_string = template_string
end

Private Instance Methods

compile() click to toggle source
# File lib/bob/compiler/template.rb, line 17
def compile
  doc = Nokogiri::HTML(@template_string)
  key = sanitize_identifier(@name)

  doc.errors.each do |error|
    warn(error.message, error.line)
  end

  unless doc.root
    error("Parse error", 0)
    return
  end

  @buffer << 'Bob.registerTemplate(' << quote(key) << ', {'

  @buffer.indented do
    if @template_string =~ /<!DOCTYPE/i
      @buffer.blankline!
      @buffer << "doctype: " << quote(doc.internal_subset.to_xhtml) << ","
    end

    @buffer.blankline!

    @buffer << "name: " << quote(@name) << ","

    @buffer.blankline!

    @buffer << "layout: "

    compiled_layout = Layout.new(doc.root)

    @warnings += compiled_layout.warnings
    @errors   += compiled_layout.errors

    @buffer.merge(compiled_layout.buffer) << ","

    @buffer.blankline!

    @buffer << "blocks: {"

    if compiled_layout.container
      @buffer.indented do

        compiled_layout.container.children.each do |block_element|
          next unless block_element.element?

          compiled_block = Block.new(block_element)

          @warnings += compiled_block.warnings
          @errors   += compiled_block.errors

          next unless compiled_block.name

          @buffer.blankline!

          @buffer << quote(compiled_block.name) << ": "

          @buffer.merge(compiled_block.buffer) << ","
        end

        @buffer.blankline!
      end
    end

    @buffer << "}"
  end

  @buffer.blankline!

  @buffer << "});"
end