diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2009-02-05 23:05:41 -0800 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2009-02-05 23:05:41 -0800 |
commit | 34f34e300980dfef0b8a8d4515ef84ce1f168417 (patch) | |
tree | deb3d4895488366d66811c4c2b6b9bc0359b5bcb /railties/guides/rails_guides/indexer.rb | |
parent | 6f8ed1cd3fa595a59d7a19d8d383836b456ac803 (diff) | |
parent | be098f840614bbb71fe26f0e2b4c064b6866c076 (diff) | |
download | rails-34f34e300980dfef0b8a8d4515ef84ce1f168417.tar.gz rails-34f34e300980dfef0b8a8d4515ef84ce1f168417.tar.bz2 rails-34f34e300980dfef0b8a8d4515ef84ce1f168417.zip |
Merge branch 'master' of git@github.com:rails/rails
Diffstat (limited to 'railties/guides/rails_guides/indexer.rb')
-rw-r--r-- | railties/guides/rails_guides/indexer.rb | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/railties/guides/rails_guides/indexer.rb b/railties/guides/rails_guides/indexer.rb new file mode 100644 index 0000000000..52809829e2 --- /dev/null +++ b/railties/guides/rails_guides/indexer.rb @@ -0,0 +1,51 @@ +module RailsGuides + class Indexer + attr_reader :body, :result, :level_hash + + def initialize(body) + @body = body + @result = @body.dup + end + + def index + @level_hash = process(body) + end + + private + + def process(string, current_level= 3, counters = [1]) + s = StringScanner.new(string) + + level_hash = ActiveSupport::OrderedHash.new + + while !s.eos? + s.match?(/\h[0-9]\..*$/) + if matched = s.matched + matched =~ /\h([0-9])\.(.*)$/ + level, title = $1.to_i, $2 + + if level < current_level + # This is needed. Go figure. + return level_hash + elsif level == current_level + index = counters.join(".") + bookmark = '#' + title.gsub(/[^a-z0-9\-_\+]+/i, '').underscore.dasherize + + raise "Parsing Fail" unless @result.sub!(matched, "h#{level}(#{bookmark}). #{index}#{title}") + + # Recurse + counters << 1 + level_hash[title.strip] = process(s.post_match, current_level + 1, counters) + counters.pop + + # Increment the current level + last = counters.pop + counters << last + 1 + end + end + s.getch + end + level_hash + end + end +end |