def compile(root_node, definitions = {})
      # Compiler generated code
      @code = ''
      @generator = ''
      @definitions = definitions

      @template << [:preamble]

      # Write all node definitions as method defs
      @definitions.each do |_, node|
        define node
      end

      # Start building up the code from the root node
      root_node[@children].each do |child|
        root child, 0
      end

      @template << [:postamble]

      templatize
    end
def compile(root_node, definitions = {})
      # Compiler generated code
      @code = ''
      @generator = ''
      @definitions = definitions

      @template << [:preamble]

      # Write all node definitions as method defs
      @definitions.each do |_, node|
        define node
      end

      # Start building up the code from the root node
      root_node[@children].each do |child|
        root child, 0
      end

      @template << [:postamble]

      templatize
    end
All node Objects (Array) must follow the next convention in order
 to make parsing faster

 [:node_type, :value, :attributes, :children, :indent]

 @param path [String] Current file path needed for include nodes

 Compile input nodes, replace them with their definitions and

 @param root_node [Array] Root node containing all document nodes