rails 4.2.11.3 → 5.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
 - data/README.md +11 -7
 - metadata +38 -237
 - data/guides/CHANGELOG.md +0 -113
 - data/guides/Rakefile +0 -92
 - data/guides/assets/images/akshaysurve.jpg +0 -0
 - data/guides/assets/images/belongs_to.png +0 -0
 - data/guides/assets/images/book_icon.gif +0 -0
 - data/guides/assets/images/bullet.gif +0 -0
 - data/guides/assets/images/chapters_icon.gif +0 -0
 - data/guides/assets/images/check_bullet.gif +0 -0
 - data/guides/assets/images/credits_pic_blank.gif +0 -0
 - data/guides/assets/images/csrf.png +0 -0
 - data/guides/assets/images/edge_badge.png +0 -0
 - data/guides/assets/images/favicon.ico +0 -0
 - data/guides/assets/images/feature_tile.gif +0 -0
 - data/guides/assets/images/footer_tile.gif +0 -0
 - data/guides/assets/images/fxn.png +0 -0
 - data/guides/assets/images/getting_started/article_with_comments.png +0 -0
 - data/guides/assets/images/getting_started/challenge.png +0 -0
 - data/guides/assets/images/getting_started/confirm_dialog.png +0 -0
 - data/guides/assets/images/getting_started/forbidden_attributes_for_new_article.png +0 -0
 - data/guides/assets/images/getting_started/form_with_errors.png +0 -0
 - data/guides/assets/images/getting_started/index_action_with_edit_link.png +0 -0
 - data/guides/assets/images/getting_started/new_article.png +0 -0
 - data/guides/assets/images/getting_started/rails_welcome.png +0 -0
 - data/guides/assets/images/getting_started/routing_error_no_controller.png +0 -0
 - data/guides/assets/images/getting_started/routing_error_no_route_matches.png +0 -0
 - data/guides/assets/images/getting_started/show_action_for_articles.png +0 -0
 - data/guides/assets/images/getting_started/template_is_missing_articles_new.png +0 -0
 - data/guides/assets/images/getting_started/unknown_action_create_for_articles.png +0 -0
 - data/guides/assets/images/getting_started/unknown_action_new_for_articles.png +0 -0
 - data/guides/assets/images/grey_bullet.gif +0 -0
 - data/guides/assets/images/habtm.png +0 -0
 - data/guides/assets/images/has_many.png +0 -0
 - data/guides/assets/images/has_many_through.png +0 -0
 - data/guides/assets/images/has_one.png +0 -0
 - data/guides/assets/images/has_one_through.png +0 -0
 - data/guides/assets/images/header_backdrop.png +0 -0
 - data/guides/assets/images/header_tile.gif +0 -0
 - data/guides/assets/images/i18n/demo_html_safe.png +0 -0
 - data/guides/assets/images/i18n/demo_localized_pirate.png +0 -0
 - data/guides/assets/images/i18n/demo_translated_en.png +0 -0
 - data/guides/assets/images/i18n/demo_translated_pirate.png +0 -0
 - data/guides/assets/images/i18n/demo_translation_missing.png +0 -0
 - data/guides/assets/images/i18n/demo_untranslated.png +0 -0
 - data/guides/assets/images/icons/README +0 -5
 - data/guides/assets/images/icons/callouts/1.png +0 -0
 - data/guides/assets/images/icons/callouts/10.png +0 -0
 - data/guides/assets/images/icons/callouts/11.png +0 -0
 - data/guides/assets/images/icons/callouts/12.png +0 -0
 - data/guides/assets/images/icons/callouts/13.png +0 -0
 - data/guides/assets/images/icons/callouts/14.png +0 -0
 - data/guides/assets/images/icons/callouts/15.png +0 -0
 - data/guides/assets/images/icons/callouts/2.png +0 -0
 - data/guides/assets/images/icons/callouts/3.png +0 -0
 - data/guides/assets/images/icons/callouts/4.png +0 -0
 - data/guides/assets/images/icons/callouts/5.png +0 -0
 - data/guides/assets/images/icons/callouts/6.png +0 -0
 - data/guides/assets/images/icons/callouts/7.png +0 -0
 - data/guides/assets/images/icons/callouts/8.png +0 -0
 - data/guides/assets/images/icons/callouts/9.png +0 -0
 - data/guides/assets/images/icons/caution.png +0 -0
 - data/guides/assets/images/icons/example.png +0 -0
 - data/guides/assets/images/icons/home.png +0 -0
 - data/guides/assets/images/icons/important.png +0 -0
 - data/guides/assets/images/icons/next.png +0 -0
 - data/guides/assets/images/icons/note.png +0 -0
 - data/guides/assets/images/icons/prev.png +0 -0
 - data/guides/assets/images/icons/tip.png +0 -0
 - data/guides/assets/images/icons/up.png +0 -0
 - data/guides/assets/images/icons/warning.png +0 -0
 - data/guides/assets/images/nav_arrow.gif +0 -0
 - data/guides/assets/images/oscardelben.jpg +0 -0
 - data/guides/assets/images/polymorphic.png +0 -0
 - data/guides/assets/images/radar.png +0 -0
 - data/guides/assets/images/rails4_features.png +0 -0
 - data/guides/assets/images/rails_guides_kindle_cover.jpg +0 -0
 - data/guides/assets/images/rails_guides_logo.gif +0 -0
 - data/guides/assets/images/rails_logo_remix.gif +0 -0
 - data/guides/assets/images/session_fixation.png +0 -0
 - data/guides/assets/images/tab_grey.gif +0 -0
 - data/guides/assets/images/tab_info.gif +0 -0
 - data/guides/assets/images/tab_note.gif +0 -0
 - data/guides/assets/images/tab_red.gif +0 -0
 - data/guides/assets/images/tab_yellow.gif +0 -0
 - data/guides/assets/images/tab_yellow.png +0 -0
 - data/guides/assets/images/vijaydev.jpg +0 -0
 - data/guides/assets/javascripts/guides.js +0 -59
 - data/guides/assets/javascripts/jquery.min.js +0 -4
 - data/guides/assets/javascripts/responsive-tables.js +0 -43
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +0 -59
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +0 -75
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +0 -59
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +0 -65
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +0 -100
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +0 -97
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +0 -91
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +0 -55
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +0 -41
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +0 -52
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +0 -67
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +0 -52
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +0 -57
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +0 -58
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +0 -72
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +0 -88
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +0 -33
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +0 -74
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +0 -64
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +0 -55
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +0 -94
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +0 -51
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +0 -66
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +0 -56
 - data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +0 -69
 - data/guides/assets/javascripts/syntaxhighlighter/shCore.js +0 -17
 - data/guides/assets/stylesheets/fixes.css +0 -16
 - data/guides/assets/stylesheets/kindle.css +0 -11
 - data/guides/assets/stylesheets/main.css +0 -713
 - data/guides/assets/stylesheets/print.css +0 -52
 - data/guides/assets/stylesheets/reset.css +0 -43
 - data/guides/assets/stylesheets/responsive-tables.css +0 -50
 - data/guides/assets/stylesheets/style.css +0 -13
 - data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +0 -226
 - data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +0 -328
 - data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +0 -331
 - data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +0 -339
 - data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +0 -324
 - data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +0 -328
 - data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +0 -324
 - data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +0 -324
 - data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +0 -324
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +0 -117
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +0 -120
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +0 -128
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +0 -113
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +0 -117
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +0 -113
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +0 -113
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +0 -113
 - data/guides/assets/stylesheets/syntaxhighlighter/shThemeRailsGuides.css +0 -116
 - data/guides/bug_report_templates/action_controller_gem.rb +0 -47
 - data/guides/bug_report_templates/action_controller_master.rb +0 -54
 - data/guides/bug_report_templates/active_record_gem.rb +0 -40
 - data/guides/bug_report_templates/active_record_master.rb +0 -49
 - data/guides/bug_report_templates/generic_gem.rb +0 -15
 - data/guides/bug_report_templates/generic_master.rb +0 -26
 - data/guides/rails_guides.rb +0 -63
 - data/guides/rails_guides/generator.rb +0 -248
 - data/guides/rails_guides/helpers.rb +0 -53
 - data/guides/rails_guides/indexer.rb +0 -68
 - data/guides/rails_guides/kindle.rb +0 -119
 - data/guides/rails_guides/levenshtein.rb +0 -37
 - data/guides/rails_guides/markdown.rb +0 -167
 - data/guides/rails_guides/markdown/renderer.rb +0 -82
 - data/guides/source/2_2_release_notes.md +0 -435
 - data/guides/source/2_3_release_notes.md +0 -621
 - data/guides/source/3_0_release_notes.md +0 -611
 - data/guides/source/3_1_release_notes.md +0 -559
 - data/guides/source/3_2_release_notes.md +0 -568
 - data/guides/source/4_0_release_notes.md +0 -279
 - data/guides/source/4_1_release_notes.md +0 -730
 - data/guides/source/4_2_release_notes.md +0 -877
 - data/guides/source/_license.html.erb +0 -2
 - data/guides/source/_welcome.html.erb +0 -23
 - data/guides/source/action_controller_overview.md +0 -1192
 - data/guides/source/action_mailer_basics.md +0 -757
 - data/guides/source/action_view_overview.md +0 -1561
 - data/guides/source/active_job_basics.md +0 -339
 - data/guides/source/active_model_basics.md +0 -554
 - data/guides/source/active_record_basics.md +0 -374
 - data/guides/source/active_record_callbacks.md +0 -413
 - data/guides/source/active_record_migrations.md +0 -1018
 - data/guides/source/active_record_postgresql.md +0 -433
 - data/guides/source/active_record_querying.md +0 -1781
 - data/guides/source/active_record_validations.md +0 -1179
 - data/guides/source/active_support_core_extensions.md +0 -3856
 - data/guides/source/active_support_instrumentation.md +0 -488
 - data/guides/source/api_documentation_guidelines.md +0 -361
 - data/guides/source/asset_pipeline.md +0 -1304
 - data/guides/source/association_basics.md +0 -2245
 - data/guides/source/autoloading_and_reloading_constants.md +0 -1311
 - data/guides/source/caching_with_rails.md +0 -379
 - data/guides/source/command_line.md +0 -625
 - data/guides/source/configuring.md +0 -1070
 - data/guides/source/contributing_to_ruby_on_rails.md +0 -628
 - data/guides/source/credits.html.erb +0 -80
 - data/guides/source/debugging_rails_applications.md +0 -861
 - data/guides/source/development_dependencies_install.md +0 -289
 - data/guides/source/documents.yaml +0 -205
 - data/guides/source/engines.md +0 -1412
 - data/guides/source/form_helpers.md +0 -1024
 - data/guides/source/generators.md +0 -676
 - data/guides/source/getting_started.md +0 -2086
 - data/guides/source/i18n.md +0 -1087
 - data/guides/source/index.html.erb +0 -28
 - data/guides/source/initialization.md +0 -704
 - data/guides/source/kindle/copyright.html.erb +0 -1
 - data/guides/source/kindle/layout.html.erb +0 -27
 - data/guides/source/kindle/rails_guides.opf.erb +0 -52
 - data/guides/source/kindle/toc.html.erb +0 -24
 - data/guides/source/kindle/toc.ncx.erb +0 -64
 - data/guides/source/kindle/welcome.html.erb +0 -5
 - data/guides/source/layout.html.erb +0 -140
 - data/guides/source/layouts_and_rendering.md +0 -1226
 - data/guides/source/maintenance_policy.md +0 -78
 - data/guides/source/nested_model_forms.md +0 -228
 - data/guides/source/plugins.md +0 -444
 - data/guides/source/rails_application_templates.md +0 -266
 - data/guides/source/rails_on_rack.md +0 -335
 - data/guides/source/routing.md +0 -1155
 - data/guides/source/ruby_on_rails_guides_guidelines.md +0 -127
 - data/guides/source/security.md +0 -1024
 - data/guides/source/testing.md +0 -1132
 - data/guides/source/upgrading_ruby_on_rails.md +0 -1186
 - data/guides/source/working_with_javascript_in_rails.md +0 -407
 - data/guides/w3c_validator.rb +0 -97
 
| 
         @@ -1,68 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'active_support/core_ext/object/blank'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'active_support/core_ext/string/inflections'
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            module RailsGuides
         
     | 
| 
       5 
     | 
    
         
            -
              class Indexer
         
     | 
| 
       6 
     | 
    
         
            -
                attr_reader :body, :result, :warnings, :level_hash
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                def initialize(body, warnings)
         
     | 
| 
       9 
     | 
    
         
            -
                  @body     = body
         
     | 
| 
       10 
     | 
    
         
            -
                  @result   = @body.dup
         
     | 
| 
       11 
     | 
    
         
            -
                  @warnings = warnings
         
     | 
| 
       12 
     | 
    
         
            -
                end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                def index
         
     | 
| 
       15 
     | 
    
         
            -
                  @level_hash = process(body)
         
     | 
| 
       16 
     | 
    
         
            -
                end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                private
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                def process(string, current_level=3, counters=[1])
         
     | 
| 
       21 
     | 
    
         
            -
                  s = StringScanner.new(string)
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                  level_hash = {}
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                  while !s.eos?
         
     | 
| 
       26 
     | 
    
         
            -
                    re = %r{^h(\d)(?:\((#.*?)\))?\s*\.\s*(.*)$}
         
     | 
| 
       27 
     | 
    
         
            -
                    s.match?(re)
         
     | 
| 
       28 
     | 
    
         
            -
                    if matched = s.matched
         
     | 
| 
       29 
     | 
    
         
            -
                      matched =~ re
         
     | 
| 
       30 
     | 
    
         
            -
                      level, idx, title = $1.to_i, $2, $3.strip
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                      if level < current_level
         
     | 
| 
       33 
     | 
    
         
            -
                        # This is needed. Go figure.
         
     | 
| 
       34 
     | 
    
         
            -
                        return level_hash
         
     | 
| 
       35 
     | 
    
         
            -
                      elsif level == current_level
         
     | 
| 
       36 
     | 
    
         
            -
                        index = counters.join(".")
         
     | 
| 
       37 
     | 
    
         
            -
                        idx ||= '#' + title_to_idx(title)
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                        raise "Parsing Fail" unless @result.sub!(matched, "h#{level}(#{idx}). #{index} #{title}")
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                        key = {
         
     | 
| 
       42 
     | 
    
         
            -
                          :title => title,
         
     | 
| 
       43 
     | 
    
         
            -
                          :id => idx
         
     | 
| 
       44 
     | 
    
         
            -
                        }
         
     | 
| 
       45 
     | 
    
         
            -
                        # Recurse
         
     | 
| 
       46 
     | 
    
         
            -
                        counters << 1
         
     | 
| 
       47 
     | 
    
         
            -
                        level_hash[key] = process(s.post_match, current_level + 1, counters)
         
     | 
| 
       48 
     | 
    
         
            -
                        counters.pop
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                        # Increment the current level
         
     | 
| 
       51 
     | 
    
         
            -
                        last = counters.pop
         
     | 
| 
       52 
     | 
    
         
            -
                        counters << last + 1
         
     | 
| 
       53 
     | 
    
         
            -
                      end
         
     | 
| 
       54 
     | 
    
         
            -
                    end
         
     | 
| 
       55 
     | 
    
         
            -
                    s.getch
         
     | 
| 
       56 
     | 
    
         
            -
                  end
         
     | 
| 
       57 
     | 
    
         
            -
                  level_hash
         
     | 
| 
       58 
     | 
    
         
            -
                end
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                def title_to_idx(title)
         
     | 
| 
       61 
     | 
    
         
            -
                  idx = title.strip.parameterize.sub(/^\d+/, '')
         
     | 
| 
       62 
     | 
    
         
            -
                  if warnings && idx.blank?
         
     | 
| 
       63 
     | 
    
         
            -
                    puts "BLANK ID: please put an explicit ID for section #{title}, as in h5(#my-id)"
         
     | 
| 
       64 
     | 
    
         
            -
                  end
         
     | 
| 
       65 
     | 
    
         
            -
                  idx
         
     | 
| 
       66 
     | 
    
         
            -
                end
         
     | 
| 
       67 
     | 
    
         
            -
              end
         
     | 
| 
       68 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,119 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            unless `which kindlerb` 
         
     | 
| 
       4 
     | 
    
         
            -
              abort "Please gem install kindlerb"
         
     | 
| 
       5 
     | 
    
         
            -
            end
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            require 'nokogiri'
         
     | 
| 
       8 
     | 
    
         
            -
            require 'fileutils'
         
     | 
| 
       9 
     | 
    
         
            -
            require 'yaml'
         
     | 
| 
       10 
     | 
    
         
            -
            require 'date'
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            module Kindle
         
     | 
| 
       13 
     | 
    
         
            -
              extend self
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
              def generate(output_dir, mobi_outfile, logfile)
         
     | 
| 
       16 
     | 
    
         
            -
                output_dir = File.absolute_path(output_dir)
         
     | 
| 
       17 
     | 
    
         
            -
                Dir.chdir output_dir do 
         
     | 
| 
       18 
     | 
    
         
            -
                  puts "=> Using output dir: #{output_dir}"
         
     | 
| 
       19 
     | 
    
         
            -
                  puts "=> Arranging html pages in document order"
         
     | 
| 
       20 
     | 
    
         
            -
                  toc = File.read("toc.ncx")
         
     | 
| 
       21 
     | 
    
         
            -
                  doc = Nokogiri::XML(toc).xpath("//ncx:content", 'ncx' => "http://www.daisy.org/z3986/2005/ncx/")
         
     | 
| 
       22 
     | 
    
         
            -
                  html_pages = doc.select {|c| c[:src]}.map {|c| c[:src]}.uniq
         
     | 
| 
       23 
     | 
    
         
            -
                 
         
     | 
| 
       24 
     | 
    
         
            -
                  generate_front_matter(html_pages)
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                  generate_sections(html_pages)
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                  generate_document_metadata(mobi_outfile)
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                  puts "Creating MOBI document with kindlegen. This make take a while."
         
     | 
| 
       31 
     | 
    
         
            -
                  cmd = "kindlerb . > #{File.absolute_path logfile} 2>&1"
         
     | 
| 
       32 
     | 
    
         
            -
                  puts cmd
         
     | 
| 
       33 
     | 
    
         
            -
                  system(cmd)
         
     | 
| 
       34 
     | 
    
         
            -
                  puts "MOBI document generated at #{File.expand_path(mobi_outfile, output_dir)}"
         
     | 
| 
       35 
     | 
    
         
            -
                end
         
     | 
| 
       36 
     | 
    
         
            -
              end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
              def generate_front_matter(html_pages)
         
     | 
| 
       39 
     | 
    
         
            -
                frontmatter = []
         
     | 
| 
       40 
     | 
    
         
            -
                html_pages.delete_if {|x| 
         
     | 
| 
       41 
     | 
    
         
            -
                  if x =~ /(toc|welcome|credits|copyright).html/
         
     | 
| 
       42 
     | 
    
         
            -
                    frontmatter << x unless x =~ /toc/
         
     | 
| 
       43 
     | 
    
         
            -
                    true
         
     | 
| 
       44 
     | 
    
         
            -
                  end
         
     | 
| 
       45 
     | 
    
         
            -
                }
         
     | 
| 
       46 
     | 
    
         
            -
                html = frontmatter.map {|x|
         
     | 
| 
       47 
     | 
    
         
            -
                  Nokogiri::HTML(File.open(x)).at("body").inner_html
         
     | 
| 
       48 
     | 
    
         
            -
                }.join("\n")
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                fdoc = Nokogiri::HTML(html)
         
     | 
| 
       51 
     | 
    
         
            -
                fdoc.search("h3").each do |h3|
         
     | 
| 
       52 
     | 
    
         
            -
                  h3.name = 'h4'
         
     | 
| 
       53 
     | 
    
         
            -
                end
         
     | 
| 
       54 
     | 
    
         
            -
                fdoc.search("h2").each do |h2| 
         
     | 
| 
       55 
     | 
    
         
            -
                  h2.name = 'h3'
         
     | 
| 
       56 
     | 
    
         
            -
                  h2['id'] = h2.inner_text.gsub(/\s/, '-')
         
     | 
| 
       57 
     | 
    
         
            -
                end
         
     | 
| 
       58 
     | 
    
         
            -
                add_head_section fdoc, "Front Matter"
         
     | 
| 
       59 
     | 
    
         
            -
                File.open("frontmatter.html",'w') {|f| f.puts fdoc.to_html}
         
     | 
| 
       60 
     | 
    
         
            -
                html_pages.unshift "frontmatter.html"
         
     | 
| 
       61 
     | 
    
         
            -
              end
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
              def generate_sections(html_pages)
         
     | 
| 
       64 
     | 
    
         
            -
                FileUtils::rm_rf("sections/")
         
     | 
| 
       65 
     | 
    
         
            -
                html_pages.each_with_index do |page, section_idx|
         
     | 
| 
       66 
     | 
    
         
            -
                  FileUtils::mkdir_p("sections/%03d" % section_idx)
         
     | 
| 
       67 
     | 
    
         
            -
                  doc = Nokogiri::HTML(File.open(page))
         
     | 
| 
       68 
     | 
    
         
            -
                  title = doc.at("title").inner_text.gsub("Ruby on Rails Guides: ", '')
         
     | 
| 
       69 
     | 
    
         
            -
                  title = page.capitalize.gsub('.html', '') if title.strip == ''
         
     | 
| 
       70 
     | 
    
         
            -
                  File.open("sections/%03d/_section.txt" % section_idx, 'w') {|f| f.puts title}
         
     | 
| 
       71 
     | 
    
         
            -
                  doc.xpath("//h3[@id]").each_with_index do |h3,item_idx|
         
     | 
| 
       72 
     | 
    
         
            -
                    subsection = h3.inner_text
         
     | 
| 
       73 
     | 
    
         
            -
                    content = h3.xpath("./following-sibling::*").take_while {|x| x.name != "h3"}.map {|x| x.to_html}
         
     | 
| 
       74 
     | 
    
         
            -
                    item = Nokogiri::HTML(h3.to_html + content.join("\n"))
         
     | 
| 
       75 
     | 
    
         
            -
                    item_path = "sections/%03d/%03d.html" % [section_idx, item_idx] 
         
     | 
| 
       76 
     | 
    
         
            -
                    add_head_section(item, subsection)
         
     | 
| 
       77 
     | 
    
         
            -
                    item.search("img").each do |img|
         
     | 
| 
       78 
     | 
    
         
            -
                      img['src'] = "#{Dir.pwd}/#{img['src']}"
         
     | 
| 
       79 
     | 
    
         
            -
                    end
         
     | 
| 
       80 
     | 
    
         
            -
                    item.xpath("//li/p").each {|p| p.swap(p.children); p.remove}
         
     | 
| 
       81 
     | 
    
         
            -
                    File.open(item_path, 'w') {|f| f.puts item.to_html}
         
     | 
| 
       82 
     | 
    
         
            -
                  end
         
     | 
| 
       83 
     | 
    
         
            -
                end
         
     | 
| 
       84 
     | 
    
         
            -
              end
         
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
              def generate_document_metadata(mobi_outfile)
         
     | 
| 
       87 
     | 
    
         
            -
                puts "=> Generating _document.yml"
         
     | 
| 
       88 
     | 
    
         
            -
                x = Nokogiri::XML(File.open("rails_guides.opf")).remove_namespaces!
         
     | 
| 
       89 
     | 
    
         
            -
                cover_jpg = "#{Dir.pwd}/images/rails_guides_kindle_cover.jpg"
         
     | 
| 
       90 
     | 
    
         
            -
                cover_gif = cover_jpg.sub(/jpg$/, 'gif')
         
     | 
| 
       91 
     | 
    
         
            -
                puts `convert #{cover_jpg} #{cover_gif}`
         
     | 
| 
       92 
     | 
    
         
            -
                document = {
         
     | 
| 
       93 
     | 
    
         
            -
                  'doc_uuid' => x.at("package")['unique-identifier'],
         
     | 
| 
       94 
     | 
    
         
            -
                  'title' => x.at("title").inner_text.gsub(/\(.*$/, " v2"),
         
     | 
| 
       95 
     | 
    
         
            -
                  'publisher' => x.at("publisher").inner_text,
         
     | 
| 
       96 
     | 
    
         
            -
                  'author' => x.at("creator").inner_text,
         
     | 
| 
       97 
     | 
    
         
            -
                  'subject' => x.at("subject").inner_text,
         
     | 
| 
       98 
     | 
    
         
            -
                  'date' => x.at("date").inner_text,
         
     | 
| 
       99 
     | 
    
         
            -
                  'cover' => cover_gif,
         
     | 
| 
       100 
     | 
    
         
            -
                  'masthead' => nil,
         
     | 
| 
       101 
     | 
    
         
            -
                  'mobi_outfile' => mobi_outfile
         
     | 
| 
       102 
     | 
    
         
            -
                }
         
     | 
| 
       103 
     | 
    
         
            -
                puts document.to_yaml
         
     | 
| 
       104 
     | 
    
         
            -
                File.open("_document.yml", 'w'){|f| f.puts document.to_yaml}
         
     | 
| 
       105 
     | 
    
         
            -
              end
         
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
              def add_head_section(doc, title)
         
     | 
| 
       108 
     | 
    
         
            -
                head = Nokogiri::XML::Node.new "head", doc
         
     | 
| 
       109 
     | 
    
         
            -
                title_node = Nokogiri::XML::Node.new "title", doc
         
     | 
| 
       110 
     | 
    
         
            -
                title_node.content = title
         
     | 
| 
       111 
     | 
    
         
            -
                title_node.parent = head
         
     | 
| 
       112 
     | 
    
         
            -
                css = Nokogiri::XML::Node.new "link", doc
         
     | 
| 
       113 
     | 
    
         
            -
                css['rel'] = 'stylesheet'
         
     | 
| 
       114 
     | 
    
         
            -
                css['type'] = 'text/css'
         
     | 
| 
       115 
     | 
    
         
            -
                css['href'] = "#{Dir.pwd}/stylesheets/kindle.css"
         
     | 
| 
       116 
     | 
    
         
            -
                css.parent = head
         
     | 
| 
       117 
     | 
    
         
            -
                doc.at("body").before head
         
     | 
| 
       118 
     | 
    
         
            -
              end
         
     | 
| 
       119 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,37 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module RailsGuides
         
     | 
| 
       2 
     | 
    
         
            -
              module Levenshtein
         
     | 
| 
       3 
     | 
    
         
            -
                # This code is based directly on the Text gem implementation
         
     | 
| 
       4 
     | 
    
         
            -
                # Returns a value representing the "cost" of transforming str1 into str2
         
     | 
| 
       5 
     | 
    
         
            -
                def self.distance str1, str2
         
     | 
| 
       6 
     | 
    
         
            -
                  s = str1
         
     | 
| 
       7 
     | 
    
         
            -
                  t = str2
         
     | 
| 
       8 
     | 
    
         
            -
                  n = s.length
         
     | 
| 
       9 
     | 
    
         
            -
                  m = t.length
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                  return m if (0 == n)
         
     | 
| 
       12 
     | 
    
         
            -
                  return n if (0 == m)
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                  d = (0..m).to_a
         
     | 
| 
       15 
     | 
    
         
            -
                  x = nil
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                  str1.each_char.each_with_index do |char1,i|
         
     | 
| 
       18 
     | 
    
         
            -
                    e = i+1
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                    str2.each_char.each_with_index do |char2,j|
         
     | 
| 
       21 
     | 
    
         
            -
                      cost = (char1 == char2) ? 0 : 1
         
     | 
| 
       22 
     | 
    
         
            -
                      x = [
         
     | 
| 
       23 
     | 
    
         
            -
                           d[j+1] + 1, # insertion
         
     | 
| 
       24 
     | 
    
         
            -
                           e + 1,      # deletion
         
     | 
| 
       25 
     | 
    
         
            -
                           d[j] + cost # substitution
         
     | 
| 
       26 
     | 
    
         
            -
                          ].min
         
     | 
| 
       27 
     | 
    
         
            -
                      d[j] = e
         
     | 
| 
       28 
     | 
    
         
            -
                      e = x
         
     | 
| 
       29 
     | 
    
         
            -
                    end
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                    d[m] = x
         
     | 
| 
       32 
     | 
    
         
            -
                  end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                  return x
         
     | 
| 
       35 
     | 
    
         
            -
                end
         
     | 
| 
       36 
     | 
    
         
            -
              end
         
     | 
| 
       37 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,167 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # encoding: utf-8
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'redcarpet'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'nokogiri'
         
     | 
| 
       5 
     | 
    
         
            -
            require 'rails_guides/markdown/renderer'
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            module RailsGuides
         
     | 
| 
       8 
     | 
    
         
            -
              class Markdown
         
     | 
| 
       9 
     | 
    
         
            -
                def initialize(view, layout)
         
     | 
| 
       10 
     | 
    
         
            -
                  @view = view
         
     | 
| 
       11 
     | 
    
         
            -
                  @layout = layout
         
     | 
| 
       12 
     | 
    
         
            -
                  @index_counter = Hash.new(0)
         
     | 
| 
       13 
     | 
    
         
            -
                  @raw_header = ''
         
     | 
| 
       14 
     | 
    
         
            -
                  @node_ids = {}
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                def render(body)
         
     | 
| 
       18 
     | 
    
         
            -
                  @raw_body = body
         
     | 
| 
       19 
     | 
    
         
            -
                  extract_raw_header_and_body
         
     | 
| 
       20 
     | 
    
         
            -
                  generate_header
         
     | 
| 
       21 
     | 
    
         
            -
                  generate_title
         
     | 
| 
       22 
     | 
    
         
            -
                  generate_body
         
     | 
| 
       23 
     | 
    
         
            -
                  generate_structure
         
     | 
| 
       24 
     | 
    
         
            -
                  generate_index
         
     | 
| 
       25 
     | 
    
         
            -
                  render_page
         
     | 
| 
       26 
     | 
    
         
            -
                end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                private
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                  def dom_id(nodes)
         
     | 
| 
       31 
     | 
    
         
            -
                    dom_id = dom_id_text(nodes.last.text)
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                    # Fix duplicate node by prefix with its parent node
         
     | 
| 
       34 
     | 
    
         
            -
                    if @node_ids[dom_id]
         
     | 
| 
       35 
     | 
    
         
            -
                      if @node_ids[dom_id].size > 1
         
     | 
| 
       36 
     | 
    
         
            -
                        duplicate_nodes = @node_ids.delete(dom_id)
         
     | 
| 
       37 
     | 
    
         
            -
                        new_node_id = "#{duplicate_nodes[-2][:id]}-#{duplicate_nodes.last[:id]}"
         
     | 
| 
       38 
     | 
    
         
            -
                        duplicate_nodes.last[:id] = new_node_id
         
     | 
| 
       39 
     | 
    
         
            -
                        @node_ids[new_node_id] = duplicate_nodes
         
     | 
| 
       40 
     | 
    
         
            -
                      end
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                      dom_id = "#{nodes[-2][:id]}-#{dom_id}"
         
     | 
| 
       43 
     | 
    
         
            -
                    end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                    @node_ids[dom_id] = nodes
         
     | 
| 
       46 
     | 
    
         
            -
                    dom_id
         
     | 
| 
       47 
     | 
    
         
            -
                  end
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                  def dom_id_text(text)
         
     | 
| 
       50 
     | 
    
         
            -
                    escaped_chars = Regexp.escape('\\/`*_{}[]()#+-.!:,;|&<>^~=\'"')
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                    text.downcase.gsub(/\?/, '-questionmark')
         
     | 
| 
       53 
     | 
    
         
            -
                                 .gsub(/!/, '-bang')
         
     | 
| 
       54 
     | 
    
         
            -
                                 .gsub(/[#{escaped_chars}]+/, ' ').strip
         
     | 
| 
       55 
     | 
    
         
            -
                                 .gsub(/\s+/, '-')
         
     | 
| 
       56 
     | 
    
         
            -
                  end
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
                  def engine
         
     | 
| 
       59 
     | 
    
         
            -
                    @engine ||= Redcarpet::Markdown.new(Renderer, {
         
     | 
| 
       60 
     | 
    
         
            -
                      no_intra_emphasis: true,
         
     | 
| 
       61 
     | 
    
         
            -
                      fenced_code_blocks: true,
         
     | 
| 
       62 
     | 
    
         
            -
                      autolink: true,
         
     | 
| 
       63 
     | 
    
         
            -
                      strikethrough: true,
         
     | 
| 
       64 
     | 
    
         
            -
                      superscript: true,
         
     | 
| 
       65 
     | 
    
         
            -
                      tables: true
         
     | 
| 
       66 
     | 
    
         
            -
                    })
         
     | 
| 
       67 
     | 
    
         
            -
                  end
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                  def extract_raw_header_and_body
         
     | 
| 
       70 
     | 
    
         
            -
                    if @raw_body =~ /^\-{40,}$/
         
     | 
| 
       71 
     | 
    
         
            -
                      @raw_header, _, @raw_body = @raw_body.partition(/^\-{40,}$/).map(&:strip)
         
     | 
| 
       72 
     | 
    
         
            -
                    end
         
     | 
| 
       73 
     | 
    
         
            -
                  end
         
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
                  def generate_body
         
     | 
| 
       76 
     | 
    
         
            -
                    @body = engine.render(@raw_body)
         
     | 
| 
       77 
     | 
    
         
            -
                  end
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                  def generate_header
         
     | 
| 
       80 
     | 
    
         
            -
                    @header = engine.render(@raw_header).html_safe
         
     | 
| 
       81 
     | 
    
         
            -
                  end
         
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
                  def generate_structure
         
     | 
| 
       84 
     | 
    
         
            -
                    @headings_for_index = []
         
     | 
| 
       85 
     | 
    
         
            -
                    if @body.present?
         
     | 
| 
       86 
     | 
    
         
            -
                      @body = Nokogiri::HTML.fragment(@body).tap do |doc|
         
     | 
| 
       87 
     | 
    
         
            -
                        hierarchy = []
         
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                        doc.children.each do |node|
         
     | 
| 
       90 
     | 
    
         
            -
                          if node.name =~ /^h[3-6]$/
         
     | 
| 
       91 
     | 
    
         
            -
                            case node.name
         
     | 
| 
       92 
     | 
    
         
            -
                            when 'h3'
         
     | 
| 
       93 
     | 
    
         
            -
                              hierarchy = [node]
         
     | 
| 
       94 
     | 
    
         
            -
                              @headings_for_index << [1, node, node.inner_html]
         
     | 
| 
       95 
     | 
    
         
            -
                            when 'h4'
         
     | 
| 
       96 
     | 
    
         
            -
                              hierarchy = hierarchy[0, 1] + [node]
         
     | 
| 
       97 
     | 
    
         
            -
                              @headings_for_index << [2, node, node.inner_html]
         
     | 
| 
       98 
     | 
    
         
            -
                            when 'h5'
         
     | 
| 
       99 
     | 
    
         
            -
                              hierarchy = hierarchy[0, 2] + [node]
         
     | 
| 
       100 
     | 
    
         
            -
                            when 'h6'
         
     | 
| 
       101 
     | 
    
         
            -
                              hierarchy = hierarchy[0, 3] + [node]
         
     | 
| 
       102 
     | 
    
         
            -
                            end
         
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
       104 
     | 
    
         
            -
                            node[:id] = dom_id(hierarchy)
         
     | 
| 
       105 
     | 
    
         
            -
                            node.inner_html = "#{node_index(hierarchy)} #{node.inner_html}"
         
     | 
| 
       106 
     | 
    
         
            -
                          end
         
     | 
| 
       107 
     | 
    
         
            -
                        end
         
     | 
| 
       108 
     | 
    
         
            -
                      end.to_html
         
     | 
| 
       109 
     | 
    
         
            -
                    end
         
     | 
| 
       110 
     | 
    
         
            -
                  end
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
                  def generate_index
         
     | 
| 
       113 
     | 
    
         
            -
                    if @headings_for_index.present?
         
     | 
| 
       114 
     | 
    
         
            -
                      raw_index = ''
         
     | 
| 
       115 
     | 
    
         
            -
                      @headings_for_index.each do |level, node, label|
         
     | 
| 
       116 
     | 
    
         
            -
                        if level == 1
         
     | 
| 
       117 
     | 
    
         
            -
                          raw_index += "1. [#{label}](##{node[:id]})\n"
         
     | 
| 
       118 
     | 
    
         
            -
                        elsif level == 2
         
     | 
| 
       119 
     | 
    
         
            -
                          raw_index += "    * [#{label}](##{node[:id]})\n"
         
     | 
| 
       120 
     | 
    
         
            -
                        end
         
     | 
| 
       121 
     | 
    
         
            -
                      end
         
     | 
| 
       122 
     | 
    
         
            -
             
     | 
| 
       123 
     | 
    
         
            -
                      @index = Nokogiri::HTML.fragment(engine.render(raw_index)).tap do |doc|
         
     | 
| 
       124 
     | 
    
         
            -
                        doc.at('ol')[:class] = 'chapters'
         
     | 
| 
       125 
     | 
    
         
            -
                      end.to_html
         
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
                      @index = <<-INDEX.html_safe
         
     | 
| 
       128 
     | 
    
         
            -
                      <div id="subCol">
         
     | 
| 
       129 
     | 
    
         
            -
                        <h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
         
     | 
| 
       130 
     | 
    
         
            -
                        #{@index}
         
     | 
| 
       131 
     | 
    
         
            -
                      </div>
         
     | 
| 
       132 
     | 
    
         
            -
                      INDEX
         
     | 
| 
       133 
     | 
    
         
            -
                    end
         
     | 
| 
       134 
     | 
    
         
            -
                  end
         
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
                  def generate_title
         
     | 
| 
       137 
     | 
    
         
            -
                    if heading = Nokogiri::HTML.fragment(@header).at(:h2)
         
     | 
| 
       138 
     | 
    
         
            -
                      @title = "#{heading.text} — Ruby on Rails Guides"
         
     | 
| 
       139 
     | 
    
         
            -
                    else
         
     | 
| 
       140 
     | 
    
         
            -
                      @title = "Ruby on Rails Guides"
         
     | 
| 
       141 
     | 
    
         
            -
                    end
         
     | 
| 
       142 
     | 
    
         
            -
                  end
         
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
                  def node_index(hierarchy)
         
     | 
| 
       145 
     | 
    
         
            -
                    case hierarchy.size
         
     | 
| 
       146 
     | 
    
         
            -
                    when 1
         
     | 
| 
       147 
     | 
    
         
            -
                      @index_counter[2] = @index_counter[3] = @index_counter[4] = 0
         
     | 
| 
       148 
     | 
    
         
            -
                      "#{@index_counter[1] += 1}"
         
     | 
| 
       149 
     | 
    
         
            -
                    when 2
         
     | 
| 
       150 
     | 
    
         
            -
                      @index_counter[3] = @index_counter[4] = 0
         
     | 
| 
       151 
     | 
    
         
            -
                      "#{@index_counter[1]}.#{@index_counter[2] += 1}"
         
     | 
| 
       152 
     | 
    
         
            -
                    when 3
         
     | 
| 
       153 
     | 
    
         
            -
                      @index_counter[4] = 0
         
     | 
| 
       154 
     | 
    
         
            -
                      "#{@index_counter[1]}.#{@index_counter[2]}.#{@index_counter[3] += 1}"
         
     | 
| 
       155 
     | 
    
         
            -
                    when 4
         
     | 
| 
       156 
     | 
    
         
            -
                      "#{@index_counter[1]}.#{@index_counter[2]}.#{@index_counter[3]}.#{@index_counter[4] += 1}"
         
     | 
| 
       157 
     | 
    
         
            -
                    end
         
     | 
| 
       158 
     | 
    
         
            -
                  end
         
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
       160 
     | 
    
         
            -
                  def render_page
         
     | 
| 
       161 
     | 
    
         
            -
                    @view.content_for(:header_section) { @header }
         
     | 
| 
       162 
     | 
    
         
            -
                    @view.content_for(:page_title) { @title }
         
     | 
| 
       163 
     | 
    
         
            -
                    @view.content_for(:index_section) { @index }
         
     | 
| 
       164 
     | 
    
         
            -
                    @view.render(:layout => @layout, :text => @body)
         
     | 
| 
       165 
     | 
    
         
            -
                  end
         
     | 
| 
       166 
     | 
    
         
            -
              end
         
     | 
| 
       167 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,82 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module RailsGuides
         
     | 
| 
       2 
     | 
    
         
            -
              class Markdown
         
     | 
| 
       3 
     | 
    
         
            -
                class Renderer < Redcarpet::Render::HTML
         
     | 
| 
       4 
     | 
    
         
            -
                  def initialize(options={})
         
     | 
| 
       5 
     | 
    
         
            -
                    super
         
     | 
| 
       6 
     | 
    
         
            -
                  end
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                  def block_code(code, language)
         
     | 
| 
       9 
     | 
    
         
            -
                    <<-HTML
         
     | 
| 
       10 
     | 
    
         
            -
            <div class="code_container">
         
     | 
| 
       11 
     | 
    
         
            -
            <pre class="brush: #{brush_for(language)}; gutter: false; toolbar: false">
         
     | 
| 
       12 
     | 
    
         
            -
            #{ERB::Util.h(code)}
         
     | 
| 
       13 
     | 
    
         
            -
            </pre>
         
     | 
| 
       14 
     | 
    
         
            -
            </div>
         
     | 
| 
       15 
     | 
    
         
            -
            HTML
         
     | 
| 
       16 
     | 
    
         
            -
                  end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                  def header(text, header_level)
         
     | 
| 
       19 
     | 
    
         
            -
                    # Always increase the heading level by, so we can use h1, h2 heading in the document
         
     | 
| 
       20 
     | 
    
         
            -
                    header_level += 1
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                    %(<h#{header_level}>#{text}</h#{header_level}>)
         
     | 
| 
       23 
     | 
    
         
            -
                  end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                  def paragraph(text)
         
     | 
| 
       26 
     | 
    
         
            -
                    if text =~ /^(TIP|IMPORTANT|CAUTION|WARNING|NOTE|INFO|TODO)[.:](.*?)/
         
     | 
| 
       27 
     | 
    
         
            -
                      convert_notes(text)
         
     | 
| 
       28 
     | 
    
         
            -
                    elsif text =~ /^\[<sup>(\d+)\]:<\/sup> (.+)$/
         
     | 
| 
       29 
     | 
    
         
            -
                      linkback = %(<a href="#footnote-#{$1}-ref"><sup>#{$1}</sup></a>)
         
     | 
| 
       30 
     | 
    
         
            -
                      %(<p class="footnote" id="footnote-#{$1}">#{linkback} #{$2}</p>)
         
     | 
| 
       31 
     | 
    
         
            -
                    else
         
     | 
| 
       32 
     | 
    
         
            -
                      text = convert_footnotes(text)
         
     | 
| 
       33 
     | 
    
         
            -
                      "<p>#{text}</p>"
         
     | 
| 
       34 
     | 
    
         
            -
                    end
         
     | 
| 
       35 
     | 
    
         
            -
                  end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                  private
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                    def convert_footnotes(text)
         
     | 
| 
       40 
     | 
    
         
            -
                      text.gsub(/\[<sup>(\d+)\]<\/sup>/i) do
         
     | 
| 
       41 
     | 
    
         
            -
                        %(<sup class="footnote" id="footnote-#{$1}-ref">) +
         
     | 
| 
       42 
     | 
    
         
            -
                          %(<a href="#footnote-#{$1}">#{$1}</a></sup>)
         
     | 
| 
       43 
     | 
    
         
            -
                      end
         
     | 
| 
       44 
     | 
    
         
            -
                    end
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                    def brush_for(code_type)
         
     | 
| 
       47 
     | 
    
         
            -
                      case code_type
         
     | 
| 
       48 
     | 
    
         
            -
                        when 'ruby', 'sql', 'plain'
         
     | 
| 
       49 
     | 
    
         
            -
                          code_type
         
     | 
| 
       50 
     | 
    
         
            -
                        when 'erb'
         
     | 
| 
       51 
     | 
    
         
            -
                          'ruby; html-script: true'
         
     | 
| 
       52 
     | 
    
         
            -
                        when 'html'
         
     | 
| 
       53 
     | 
    
         
            -
                          'xml' # HTML is understood, but there are .xml rules in the CSS
         
     | 
| 
       54 
     | 
    
         
            -
                        else
         
     | 
| 
       55 
     | 
    
         
            -
                          'plain'
         
     | 
| 
       56 
     | 
    
         
            -
                      end
         
     | 
| 
       57 
     | 
    
         
            -
                    end
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
                    def convert_notes(body)
         
     | 
| 
       60 
     | 
    
         
            -
                      # The following regexp detects special labels followed by a
         
     | 
| 
       61 
     | 
    
         
            -
                      # paragraph, perhaps at the end of the document.
         
     | 
| 
       62 
     | 
    
         
            -
                      #
         
     | 
| 
       63 
     | 
    
         
            -
                      # It is important that we do not eat more than one newline
         
     | 
| 
       64 
     | 
    
         
            -
                      # because formatting may be wrong otherwise. For example,
         
     | 
| 
       65 
     | 
    
         
            -
                      # if a bulleted list follows the first item is not rendered
         
     | 
| 
       66 
     | 
    
         
            -
                      # as a list item, but as a paragraph starting with a plain
         
     | 
| 
       67 
     | 
    
         
            -
                      # asterisk.
         
     | 
| 
       68 
     | 
    
         
            -
                      body.gsub(/^(TIP|IMPORTANT|CAUTION|WARNING|NOTE|INFO|TODO)[.:](.*?)(\n(?=\n)|\Z)/m) do
         
     | 
| 
       69 
     | 
    
         
            -
                        css_class = case $1
         
     | 
| 
       70 
     | 
    
         
            -
                                    when 'CAUTION', 'IMPORTANT'
         
     | 
| 
       71 
     | 
    
         
            -
                                      'warning'
         
     | 
| 
       72 
     | 
    
         
            -
                                    when 'TIP'
         
     | 
| 
       73 
     | 
    
         
            -
                                      'info'
         
     | 
| 
       74 
     | 
    
         
            -
                                    else
         
     | 
| 
       75 
     | 
    
         
            -
                                      $1.downcase
         
     | 
| 
       76 
     | 
    
         
            -
                                    end
         
     | 
| 
       77 
     | 
    
         
            -
                        %(<div class="#{css_class}"><p>#{$2.strip}</p></div>)
         
     | 
| 
       78 
     | 
    
         
            -
                      end
         
     | 
| 
       79 
     | 
    
         
            -
                    end
         
     | 
| 
       80 
     | 
    
         
            -
                end
         
     | 
| 
       81 
     | 
    
         
            -
              end
         
     | 
| 
       82 
     | 
    
         
            -
            end
         
     |