class ANTLR3::Template::Group

Constants

Lexer
Parser

Public Class Methods

load( group_file, options = {} ) click to toggle source
# File lib/antlr3/template.rb, line 104
def self.load( group_file, options = {} )
  unless( File.file?( group_file ) )
    dir = $LOAD_PATH.find do | d |
      File.file?( File.join( dir, group_file ) )
    end or raise( LoadError, "no such template group file to load %s" % group_file )
    group_file = File.join( dir, group_file )
  end
  namespace = options.fetch( :namespace, ::Object )
  input = ANTLR3::FileStream.new( group_file, options )
  lexer = Lexer.new( input, options )
  parser = Parser.new( lexer, options )
  return( parser.group( namespace ) )
end
new( &block ) click to toggle source
Calls superclass method
# File lib/antlr3/template.rb, line 118
def self.new( &block )
  super do
    const_set( :TEMPLATES, {} )
    block_given? and module_eval( &block )
  end
end
parse( source, options = {} ) click to toggle source
# File lib/antlr3/template.rb, line 97
def self.parse( source, options = {} )
  namespace = options.fetch( :namespace, ::Object )
  lexer  = Lexer.new( source, options )
  parser = Parser.new( lexer, options )
  return( parser.group( namespace ) )
end

Public Instance Methods

alias_template( new_name, old_name ) click to toggle source
# File lib/antlr3/template.rb, line 157
def alias_template( new_name, old_name )
  new_name, old_name = new_name.to_s.dup.freeze, old_name.to_s
  context = self::TEMPLATES.fetch( old_name.to_s ) do
    raise( NameError,
      "undefined template `%s' for template group %p" % [ old_name, self ]
    )
  end
  context.define_alias( new_name ) do | tclass |
    self::TEMPLATES[ new_name ] = tclass
    define_template_methods( tclass )
  end
  return( self )
end
define_template( name, source, parameters = nil, &block ) click to toggle source
# File lib/antlr3/template.rb, line 146
def define_template( name, source, parameters = nil, &block )
  name = name.to_s.dup.freeze
  Context.define( self, name, parameters ) do | tclass |
    self::TEMPLATES[ name ] = tclass
    ERB.new( source, nil, '%' ).def_method( tclass, 'to_s' )
    
    define_template_methods( tclass )
  end
  return( self )
end
fetch( name, values = {} ) click to toggle source
# File lib/antlr3/template.rb, line 134
def fetch( name, values = {} )
  self::TEMPLATES.fetch( name.to_s ).new( values )
end
new( source, values = {} ) click to toggle source
# File lib/antlr3/template.rb, line 125
def new( source, values = {} )
  erb = ERB.new( source, nil, '%' )
  template = Context.new( values )
  template.extend( self )
  sclass = class << template; self; end
  erb.def_method( sclass, 'to_s' )
  return( template )
end
template_defined?( name ) click to toggle source
# File lib/antlr3/template.rb, line 142
def template_defined?( name )
  self::TEMPLATES.has_key?( name.to_s )
end
templates() click to toggle source
# File lib/antlr3/template.rb, line 138
def templates
  self::TEMPLATES
end

Private Instance Methods

define_template_methods( context ) click to toggle source
# File lib/antlr3/template.rb, line 173
  def define_template_methods( context )
    name = context.name
    if params = context.parameters
      init = params.names.map do | param |
        "___[ #{ param.inspect } ] = #{ param }"
      end.join( "\n" )
      
      module_eval( <<-END )
        module_function
        
        def #{ name }( #{ params } )
          TEMPLATES[ #{ name.inspect } ].new do | ___ |
            #{ init }
          end
        end
        
        def #{ name }!( #{ params } )
          TEMPLATES[ #{ name.inspect } ].new do | ___ |
            #{ init }
          end.to_s
        end
      END
      
    else
      
      module_eval( <<-END )
        module_function
        
        def #{ name }( values = {} )
          TEMPLATES[ #{ name.inspect } ].new( values )
        end
        
        def #{ name }!( values = {} )
          TEMPLATES[ #{ name.inspect } ].new( values ).to_s
        end
      END
      
    end
  end