-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- The three rules of Ruby Quiz: 1. Please do not post any solutions or spoiler discussion for this quiz until 48 hours have elapsed from the time this message was sent. 2. Support Ruby Quiz by submitting ideas and responses as often as you can! Visit: http://rubyquiz.strd6.com/suggestions 3. Enjoy! Suggestion: A [QUIZ] in the subject of emails about the problem helps everyone on Ruby Talk follow the discussion. Please reply to the original quiz message, if you can. RSS Feed: http://rubyquiz.strd6.com/quizzes.rss -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ## Syntax Highlighting (# 218) 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! : http://flori.github.com/term-ansicolor/
on 2009-08-24 02:57
on 2009-08-26 17:50
On 8/23/09, Daniel Moore <firstname.lastname@example.org> wrote: > 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. This was a fun little quiz. Of course, I cheated like mad. (I think that was the point, tho.) My entry uses RubyLexer, my own stand-alone lexer for ruby. It'll be interesting to see what other submissions look like.
on 2009-09-08 00:39
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. Thank you Caleb for your solution to this week's quiz! [Syntax Highlighting (#218) - Solutions] : http://rubyquiz.strd6.com/quizzes/218/colorized.png : http://rubyquiz.strd6.com/quizzes/218.tar.gz