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