class Tco::Parser

Public Class Methods

new(default_style=nil) click to toggle source
# File lib/tco/parser.rb, line 57
def initialize(default_style=nil)
  @default_params = {
    :base_style => nil,
    :fg => nil,
    :bg => nil,
    :bright => nil,
    :underline => nil
  }

  if default_style
    @default_params[:fg] = default_style.fg
    @default_params[:bg] = default_style.bg
    @default_params[:bright] = default_style.bright
    @default_params[:underline] = default_style.underline
  end
end

Public Instance Methods

parse(string) click to toggle source
# File lib/tco/parser.rb, line 74
def parse(string)
  lexer string
  parser
  @segments
end

Private Instance Methods

add_segment(t, params) click to toggle source
# File lib/tco/parser.rb, line 147
def add_segment(t, params)
  return if t.to_s == ""

  if @segments.length > 0 && @segments[-1].params == params
    prev = @segments.pop
    @segments.push Segment.new prev.to_s + t.to_s, params
  else
    @segments.push Segment.new t.to_s, params
  end
end
lexer(in_str) click to toggle source
# File lib/tco/parser.rb, line 92
def lexer(in_str)
  state = :default
  @tokens = []
  token = ""

  in_str.split("").each do |c|
    case state
    when :default
      case c
      when "{"
        submit_token :normal, token
        token = c

        state = :o_br
      when "}"
        submit_token :normal, token
        token = c

        state = :c_br
      else
        token << c
      end
    when :o_br
      case c
      when "{"
        state = :definition
      else
        state = :default
      end
      token << c
    when :definition
      case c
      when /[a-zA-Z0-9\:\-#]/
        token << c
      when /\s/
        submit_token :definition, token
        token = ""

        state = :default
      else
        token << c
        state = :default
      end
    when :c_br
      token << c
      if c == "}"
        submit_token :end, token
        token = ""
      end
      state = :default
    end
  end
  submit_token :normal, token unless token == ""
end
parser() click to toggle source
# File lib/tco/parser.rb, line 158
def parser
  @segments = []
  params = @default_params

  stack = []
  @tokens.each do |t|
    case t.type
    when :definition
      prev_params = params
      stack.push params

      params = prev_params.clone

      df = t.to_s[2..-1]
      if df.include? ":"
        c = df.split ":"
        c.push "" if df[-1] == ":"

        params[:fg] = c[0] unless c[0] == "" || c[0] == "-"
        params[:bg] = c[1] unless c[1] == "" || c[1] == "-"
        params[:bright] = true if c.length > 2 && c[2].include?("b")
        params[:underline] = true if c.length > 2 && c[2].include?("u")
      else
        params[:base_style] = df
        params[:fg] = nil
        params[:bg] = nil
        params[:bright] = nil
        params[:underline] = nil
      end
    when :end
      if stack.length > 0
        params = stack.pop
      else
        add_segment t, params
      end
    else
      add_segment t, params
    end
  end
end
submit_token(type, value) click to toggle source
# File lib/tco/parser.rb, line 81
def submit_token(type, value)
  return if value == ""

  if type == :normal && @tokens.length > 0 && @tokens[-1].type == :normal
    prev = @tokens.pop
    @tokens.push Token.new :normal, prev.to_s + value
  else
    @tokens.push Token.new type, value
  end
end