Forum: Ruby Syntax Highlighting (#218)

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
33117162fff8a9cf50544a604f60c045?d=identicon&s=25 Daniel X Moore (yahivin)
on 2009-08-24 02:57
(Received via mailing list)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

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[1].

Have Fun!

[1]: http://flori.github.com/term-ansicolor/
Ab870531383eea6e4d9110317f5401e7?d=identicon&s=25 Caleb Clausen (Guest)
on 2009-08-26 17:50
(Received via mailing list)
Attachment: coloruby.rb (2 KB)
On 8/23/09, Daniel Moore <yahivin@gmail.com> 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[1].

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.
33117162fff8a9cf50544a604f60c045?d=identicon&s=25 Daniel X Moore (yahivin)
on 2009-09-08 00:39
(Received via mailing list)
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.[1]

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

[Syntax Highlighting (#218) - Solutions][2]

[1]: http://rubyquiz.strd6.com/quizzes/218/colorized.png
[2]: http://rubyquiz.strd6.com/quizzes/218.tar.gz
This topic is locked and can not be replied to.