Class: Cutaneous::Compiler

Inherits:
Object
  • Object
show all
Defined in:
lib/cutaneous/compiler.rb,
lib/cutaneous/compiler/expression.rb

Defined Under Namespace

Classes: Block, BlockBuilder, BlockEnd, BlockSet, BlockStart, BlockSuper, Comment, EscapedExpression, Expression, ExtendedBlockSet, Extends, Statement, Text

Constant Summary collapse

EXTENDS =
/\A\s*extends\s+["']([^"']+)["']\s*\z/o
BLOCK_START =
/\A\s*block\s+:?([a-zA-Z_][a-zA-Z0-9_]*)\s*\z/o
BLOCK_END =
/\A\s*endblock(?:\s+:?[a-zA-Z_][a-zA-Z0-9_]*)?\s*\z/o
BLOCK_SUPER =
/\A\s*block_?super\s*\z/o

Instance Method Summary collapse

Constructor Details

#initialize(lexer, loader) ⇒ Compiler

Returns a new instance of Compiler.



154
155
156
# File 'lib/cutaneous/compiler.rb', line 154

def initialize(lexer, loader)
  @lexer, @loader = lexer, loader
end

Instance Method Details

#block(name) ⇒ Object



217
218
219
# File 'lib/cutaneous/compiler.rb', line 217

def block(name)
  blocks.block(name)
end

#block_orderObject



213
214
215
# File 'lib/cutaneous/compiler.rb', line 213

def block_order
  blocks.block_order
end

#blocksObject



159
160
161
# File 'lib/cutaneous/compiler.rb', line 159

def blocks
  @blocks ||= build_hierarchy
end

#build_hierarchyObject



163
164
165
166
# File 'lib/cutaneous/compiler.rb', line 163

def build_hierarchy
  builder = BlockBuilder.new(@loader)
  builder.build(expressions)
end

#expressionsObject



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/cutaneous/compiler.rb', line 168

def expressions
  expressions = []
  strip       = nil
  @lexer.tokens.each do |type, expression, strip_whitespace|
    case type
    when :text
      expressions << Text.new(expression, strip)
    when :expression
      expressions << Expression.new(expression)
    when :escaped_expression
      expressions << EscapedExpression.new(expression)
    when :statement
      expressions << parse_statement(expression)
    when :comment
      expressions << Comment.new(expression)
    end
    strip = strip_whitespace
  end
  expressions
end

#parse_statement(statement) ⇒ Object



194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/cutaneous/compiler.rb', line 194

def parse_statement(statement)
  case statement
  when EXTENDS
    Extends.new($1)
  when BLOCK_START
    BlockStart.new($1)
  when BLOCK_END
    BlockEnd.new
  when BLOCK_SUPER
    BlockSuper.new
  else
    Statement.new(statement)
  end
end

#scriptObject



209
210
211
# File 'lib/cutaneous/compiler.rb', line 209

def script
  blocks.to_script
end