218 Syntax Highlighting

Description

Namo namah Rubyists,

This week’s quiz is to write a syntax highlighter. Your program or method will take as input unadorned Ruby code and return marked-up code. Different syntactical elements of the code should have different styles. As an additional challenge you may wish to indicate syntax errors at the point in which they occur in the code. You may choose any output style that you like. If you are unsure of what to use to colorize output, then check out Term::ANSIColor.

Have Fun!

Summary

This week’s quiz was solved by Caleb Clausen.

Caleb used the RubyLexer gem to parse a Ruby file given as a command line argument. Term::ANSIColor is used to color the tokens.

def coloruby file,fd=open(file)
  lexer=RubyLexer.new(file,fd)
  begin
    token=lexer.get1token
    print token.colorize
  end until RubyLexer::EoiToken===token
ensure
  print Term::ANSIColor.reset
end

The coloruby method uses RubyLexer to generate a stream of tokens. Each token is then colorized and printed out. After all the tokens are printed the color is reset with Term::ANSIColor.reset so that any following text won’t receive collateral colorization.

So how are these tokens colorized anyway? Caleb’s solution opens up the RubyLexer class and adds a colorize method to all tokens. Term::ANSIColor is also included in the Token class so that all the color methods are available as well.

class Token
  include Term::ANSIColor

  def colorize
    color+ident.to_s
  end
end

Each individual token class may define its own different color or colorize method.

class MethNameToken
  alias color green
end

class KeywordToken
  def colorize
    if /[^a-z]/i===ident
      yellow+ident
    else
      red+ident
    end
  end
end

The end result is nice colorful Ruby code.

Colorized Ruby

Thank you Caleb for your solution to this week’s quiz!

Syntax Highlighting (#218) - Solutions


Monday, August 24, 2009