One of the fun thigs about updating the PickAxe is getting to come up
with examples to show the various APIs in action. Here’s a very silly
example of using Ripper’s event-based API to extract comments that are
associated with basic class definitions. It clearly has holes (it
doesn’t handle class A::B::C
, for instance) but it’s fairly easy to
see how to add a proper state machine and produce something that might
be interesting to play with…
require 'ripper'
# This class handles parser events, extracting
# comments and attaching them to class definitions
class BabyRDoc < Ripper::Filter
def initialize(*)
super
reset_state
end
def on_default(event, token, output)
reset_state
output
end
def on_sp(token, output) output end
alias on_nil on_sp
def on_comment(comment, output)
@comment << comment.sub(/^\s*#\s*/, " ")
output
end
def on_kw(name, output)
@expecting_class_name = (name == 'class')
output
end
def on_const(name, output)
if @expecting_class_name
output << "#{name}:\n"
output << @comment
end
reset_state
output
end
private
def reset_state
@comment = ""
@expecting_class_name = false
end
end
BabyRDoc.new(File.read(__FILE__)).parse(STDOUT)
Run this with Ruby 1.9 (or, I guess, 1.8 with Ripper installed), and you’ll see
BabyRDoc:
This class handles parser events, extracting
comments and attaching them to class definitions
Please keep it clean, respectful, and relevant.
I reserve the right to remove comments I don't feel belong.
- NickName, E-Mail, and Website are optional. If you supply an e-mail, we'll notify you of activity on this thread.
- You can use Markdown in your comment (and preview it using the magnifying glass icon in the bottom toolbar).