class Mustermann::Visualizer::Highlighter::AdHoc

Used to generate highlighting rules on the fly. @see {Mustermann::Shell#highlighter} @see {Mustermann::Simple#highlighter} @!visibility private

Attributes

output[R]

@!visibility private

pattern[R]

@!visibility private

renderer[R]

@!visibility private

rules[R]

@!visibility private

scanner[R]

@!visibility private

Public Class Methods

highlight(pattern, renderer) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 13
def self.highlight(pattern, renderer)
  new(pattern, renderer).highlight
end
new(pattern, renderer) click to toggle source
# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 33
def initialize(pattern, renderer)
  @pattern  = pattern
  @renderer = renderer
  @output   = ""
  @rules    = self.class.rules
  @scanner  = StringScanner.new(pattern.to_s)
end
on(regexp, type = nil, &callback) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 23
def self.on(regexp, type = nil, &callback)
  return regexp.map  { |key, value| on(key, value, &callback) } if regexp.is_a? Hash
  raise ArgumentError, 'needs type or callback' unless type or callback
  callback    ||= proc { |matched| element(type, matched) }
  regexp        = Regexp.new(Regexp.escape(regexp)) unless regexp.is_a? Regexp
  rules[regexp] = callback
end
rules() click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 18
def self.rules
  @rules ||= {}
end

Public Instance Methods

apply(scanner) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 53
def apply(scanner)
  rules.each do |regexp, callback|
    next unless result = scanner.scan(regexp)
    instance_exec(result, &callback)
  end
end
element(type, content = nil) { || ... } click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 85
def element(type, content = nil)
  output << renderer.pre(type)
  output << renderer.escape(content) if content
  yield if block_given?
  output << renderer.post(type)
end
escaped(content = ?\\, char) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 68
def escaped(content = ?\\, char)
  element(:escaped, content) { element(:escaped_char, char) }
end
highlight(stop = /\Z/) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 42
def highlight(stop = /\Z/)
  output << renderer.pre(:root)
  until scanner.eos? or scanner.check(stop)
    position = scanner.pos
    apply(scanner)
    read_char(scanner) if position == scanner.pos and not scanner.check(stop)
  end
  output << renderer.post(:root)
end
nested(type, opening, closing, *separators) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 73
def nested(type, opening, closing, *separators)
  element(type, opening) do
    char = nil
    until char == closing or scanner.eos?
      highlight(Regexp.union(closing, *separators))
      char = scanner.getch
      output << char if char
    end
  end
end
read_char(scanner) click to toggle source

@!visibility private

# File lib/mustermann/visualizer/highlighter/ad_hoc.rb, line 61
def read_char(scanner)
  return unless char = scanner.getch
  type = char == ?/ ? :separator : :char
  element(type, char)
end