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