Class: Inversion::Template::CodeTag

Inherits:
Tag
  • Object
show all
Includes:
AbstractClass
Defined in:
lib/inversion/template/codetag.rb

Overview

The base class for Inversion tags that parse the body section of the tag using a Ruby parser.

It provides a tag_pattern declarative method that is used to specify a pattern of tokens to match, and a block for handling tag instances that match the pattern.

class Inversion::Template::MyTag < Inversion::Template::CodeTag

    # Match a tag that looks like: <?my "string of stuff" ?>
    tag_pattern 'tstring_beg $(tstring_content) tstring_end' do |tag, match|
        tag.string = match.string( 1 )
    end

end

The tokens in the tag_pattern are Ruby token names used by the parser. If you’re creating your own tag, you can dump the tokens for a particular snippet using the ‘inversion’ command-line tool that comes with the gem:

$ inversion tagtokens 'attr.dump! {|thing| thing.length }'
ident<"attr"> period<"."> ident<"dump!"> sp<" "> lbrace<"{"> op<"|"> \
  ident<"thing"> op<"|"> sp<" "> ident<"thing"> period<".">          \
  ident<"length"> sp<" "> rbrace<"}">

:TODO: Finish the tag_pattern docs: placeholders, regex limitations, etc.

Direct Known Subclasses

AttrTag, DefaultTag, ForTag

Defined Under Namespace

Classes: TokenPattern

Constant Summary

Constants inherited from Tag

Tag::TAG_PLUGIN_PATTERN

Instance Attribute Summary collapse

Attributes inherited from Node

#colnum, #linenum

Class Method Summary collapse

Instance Method Summary collapse

Methods included from AbstractClass

included

Methods included from AbstractClass::ClassMethods

#inherited, #pure_virtual

Methods inherited from Tag

#as_comment_body, create, #derivatives, inherited, load, load_all, #tagname, types, #types

Methods included from MethodUtilities

#singleton_attr_accessor, #singleton_attr_reader, #singleton_attr_writer

Methods inherited from Node

#after_appending, #after_rendering, #as_comment_body, #before_appending, #before_rendering, #is_container?, #location, #render

Constructor Details

#initialize(body, linenum = nil, colnum = nil) ⇒ CodeTag

Initialize a new tag that expects Ruby code in its body. Calls the tag’s #parse_pi_body method with the specified body.



128
129
130
131
132
133
134
# File 'lib/inversion/template/codetag.rb', line 128

def initialize( body, linenum=nil, colnum=nil ) # :notnew:
	super

	@body = body.strip
	@identifiers = []
	@matched_pattern = self.match_tag_pattern( body )
end

Instance Attribute Details

#bodyObject (readonly)

the body of the tag



142
143
144
# File 'lib/inversion/template/codetag.rb', line 142

def body
  @body
end

#identifiersObject (readonly)

the identifiers in the code contained in the tag



145
146
147
# File 'lib/inversion/template/codetag.rb', line 145

def identifiers
  @identifiers
end

Class Method Details

.inherit_tag_patternsObject

Declarative that forces a tag to inherit existing patterns from its parent, rather than replacing them. Afterwards, you can use tag_pattern regularly, appending to the list.

Raises:

  • (ScriptError)


116
117
118
119
# File 'lib/inversion/template/codetag.rb', line 116

def self::inherit_tag_patterns
	raise ScriptError, "Patterns already exist for this tag." if defined?( @tag_patterns )
	@tag_patterns = self.superclass.tag_patterns
end

.tag_pattern(token_pattern, &callback) ⇒ Object

Declare a token_pattern for tag bodies along with a callback that will be called when a tag matching the pattern is instantiated. The callback will be called with the tag instance, and the MatchData object that resulted from matching the input, and should set up the yielded tag object appropriately.



106
107
108
109
110
# File 'lib/inversion/template/codetag.rb', line 106

def self::tag_pattern( token_pattern, &callback ) #:yield: tag, match_data
	pattern = TokenPattern.compile( token_pattern )
	@tag_patterns = [] unless defined?( @tag_patterns )
	@tag_patterns << [ pattern, callback ]
end

.tag_patternsObject

Return the tag patterns for this class, or those of its superclass if it doesn’t override them.



96
97
98
99
# File 'lib/inversion/template/codetag.rb', line 96

def self::tag_patterns
	return @tag_patterns if defined?( @tag_patterns )
	return self.superclass.tag_patterns
end