Sha256: 5e4b950d31aa5cab9238866c9c2eda68054b365d85589bc443fb61c20ec19516

Contents?: true

Size: 1.73 KB

Versions: 225

Compression:

Stored size: 1.73 KB

Contents

require 'active_support/core_ext/object/blank'
require 'active_support/ordered_hash'
require 'active_support/core_ext/string/inflections'

module RailsGuides
  class Indexer
    attr_reader :body, :result, :warnings, :level_hash

    def initialize(body, warnings)
      @body     = body
      @result   = @body.dup
      @warnings = warnings
    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?
        re = %r{^h(\d)(?:\((#.*?)\))?\s*\.\s*(.*)$}
        s.match?(re)
        if matched = s.matched
          matched =~ re
          level, idx, title = $1.to_i, $2, $3.strip

          if level < current_level
            # This is needed. Go figure.
            return level_hash
          elsif level == current_level
            index = counters.join(".")
            idx ||= '#' + title_to_idx(title)

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

            key = {
              :title => title,
              :id => idx
            }
            # 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

    def title_to_idx(title)
      idx = title.strip.parameterize.sub(/^\d+/, '')
      if warnings && idx.blank?
        puts "BLANK ID: please put an explicit ID for section #{title}, as in h5(#my-id)"
      end
      idx
    end
  end
end

Version data entries

225 entries across 186 versions & 19 rubygems

Version Path
railties-3.2.22.5 guides/rails_guides/indexer.rb
railties-3.2.22.4 guides/rails_guides/indexer.rb
railties-3.2.22.3 guides/rails_guides/indexer.rb
railties-3.2.22.2 guides/rails_guides/indexer.rb
railties-3.2.22.1 guides/rails_guides/indexer.rb
active_mailer-0.0.10 test/fixtures/dummyapp_rails_3.2/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/guides/rails_guides/indexer.rb
railties-3.2.22 guides/rails_guides/indexer.rb
judge-2.0.5 vendor/bundle/ruby/2.1.0/gems/railties-3.2.12/guides/rails_guides/indexer.rb
railties-3.2.21 guides/rails_guides/indexer.rb
railties-3.2.20 guides/rails_guides/indexer.rb
railties-3.2.19 guides/rails_guides/indexer.rb
railties-3.2.18 guides/rails_guides/indexer.rb
railties-3.2.17 guides/rails_guides/indexer.rb
railties-3.2.16 guides/rails_guides/indexer.rb
railties-3.2.15 guides/rails_guides/indexer.rb
railties-3.2.15.rc3 guides/rails_guides/indexer.rb
railties-3.2.15.rc2 guides/rails_guides/indexer.rb
railties-3.2.15.rc1 guides/rails_guides/indexer.rb
railties-3.2.14 guides/rails_guides/indexer.rb
railties-3.2.14.rc2 guides/rails_guides/indexer.rb