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