class Mustermann::Visualizer::Highlighter::AST

Provides highlighting for AST based patterns @!visibility private

Constants

Index
Indexer

Public Class Methods

highlight(pattern, renderer) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ast.rb, line 59
def self.highlight(pattern, renderer)
  new(pattern, renderer).highlight
end
highlight?(pattern) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ast.rb, line 54
def self.highlight?(pattern)
  pattern.respond_to? :to_ast
end
new(pattern, renderer) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ast.rb, line 64
def initialize(pattern, renderer)
  @ast      = pattern.to_ast
  @string   = pattern.to_s
  @renderer = renderer
end

Public Instance Methods

highlight() click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ast.rb, line 71
def highlight
  index = Indexer.translate(@ast, @string)
  inject_literals(index)
  render(index)
end
inject_literals(index) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ast.rb, line 85
def inject_literals(index)
  start, old_payload, index.payload = index.start, index.payload, []
  old_payload.each do |element|
    index.payload << literal(start, element.start) if start < element.start
    index.payload << element
    inject_literals(element)
    start = element.stop
  end
  index.payload << literal(start, index.stop) if start < index.stop
end
literal(start, stop) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ast.rb, line 97
def literal(start, stop)
  Index.new(:literal, start, stop, [])
end
render(index) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ast.rb, line 78
def render(index)
  return @renderer.escape(@string[index.start..index.stop-1]) if index.type == :literal
  payload = index.payload.map { |i| render(i) }.join
  "#{ @renderer.pre(index.type) }#{ payload }#{ @renderer.post(index.type) }"
end