Sha256: 10b156a479e02ded62526499abe3e26c72accf3543fc95f2cfd12cb267657686

Contents?: true

Size: 1.33 KB

Versions: 44

Compression:

Stored size: 1.33 KB

Contents

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.strip.downcase.gsub(/\s+|_/, '-').delete('^a-z0-9-')

            raise "Parsing Fail" unless @result.sub!(matched, "h#{level}(#{bookmark}). #{index}#{title}")

            key = {
              :title => title,
              :id => bookmark
            }
            # Recurse
            counters << 1
            level_hash[key] = 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

Version data entries

44 entries across 44 versions & 9 rubygems

Version Path
rails_csi-2.3.5.p8 guides/rails_guides/indexer.rb
rails_csi-2.3.5.p7 guides/rails_guides/indexer.rb
rails_csi-2.3.5.p6 guides/rails_guides/indexer.rb
webroar-0.5.0 src/admin_panel/vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.2.4 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.2.2 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.2.1 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.2 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.9 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.8 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.7 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.6 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.5 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.4 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.3 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.2 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1.1 vendor/rails/railties/guides/rails_guides/indexer.rb
radiantcms-couchrest_model-0.1 vendor/rails/railties/guides/rails_guides/indexer.rb
webroar-0.4.0 src/admin_panel/vendor/rails/railties/guides/rails_guides/indexer.rb
radiant-0.9.1 vendor/rails/railties/guides/rails_guides/indexer.rb