rails 3.2.22.2 → 4.2.0

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.
Files changed (216) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +85 -0
  3. data/guides/CHANGELOG.md +31 -0
  4. data/guides/Rakefile +79 -0
  5. data/guides/assets/images/akshaysurve.jpg +0 -0
  6. data/guides/assets/images/belongs_to.png +0 -0
  7. data/guides/assets/images/book_icon.gif +0 -0
  8. data/guides/assets/images/bullet.gif +0 -0
  9. data/guides/assets/images/chapters_icon.gif +0 -0
  10. data/guides/assets/images/check_bullet.gif +0 -0
  11. data/guides/assets/images/credits_pic_blank.gif +0 -0
  12. data/guides/assets/images/csrf.png +0 -0
  13. data/guides/assets/images/edge_badge.png +0 -0
  14. data/guides/assets/images/favicon.ico +0 -0
  15. data/guides/assets/images/feature_tile.gif +0 -0
  16. data/guides/assets/images/footer_tile.gif +0 -0
  17. data/guides/assets/images/fxn.png +0 -0
  18. data/guides/assets/images/getting_started/article_with_comments.png +0 -0
  19. data/guides/assets/images/getting_started/challenge.png +0 -0
  20. data/guides/assets/images/getting_started/confirm_dialog.png +0 -0
  21. data/guides/assets/images/getting_started/forbidden_attributes_for_new_article.png +0 -0
  22. data/guides/assets/images/getting_started/form_with_errors.png +0 -0
  23. data/guides/assets/images/getting_started/index_action_with_edit_link.png +0 -0
  24. data/guides/assets/images/getting_started/new_article.png +0 -0
  25. data/guides/assets/images/getting_started/rails_welcome.png +0 -0
  26. data/guides/assets/images/getting_started/routing_error_no_controller.png +0 -0
  27. data/guides/assets/images/getting_started/routing_error_no_route_matches.png +0 -0
  28. data/guides/assets/images/getting_started/show_action_for_articles.png +0 -0
  29. data/guides/assets/images/getting_started/template_is_missing_articles_new.png +0 -0
  30. data/guides/assets/images/getting_started/unknown_action_create_for_articles.png +0 -0
  31. data/guides/assets/images/getting_started/unknown_action_new_for_articles.png +0 -0
  32. data/guides/assets/images/grey_bullet.gif +0 -0
  33. data/guides/assets/images/habtm.png +0 -0
  34. data/guides/assets/images/has_many.png +0 -0
  35. data/guides/assets/images/has_many_through.png +0 -0
  36. data/guides/assets/images/has_one.png +0 -0
  37. data/guides/assets/images/has_one_through.png +0 -0
  38. data/guides/assets/images/header_backdrop.png +0 -0
  39. data/guides/assets/images/header_tile.gif +0 -0
  40. data/guides/assets/images/i18n/demo_html_safe.png +0 -0
  41. data/guides/assets/images/i18n/demo_localized_pirate.png +0 -0
  42. data/guides/assets/images/i18n/demo_translated_en.png +0 -0
  43. data/guides/assets/images/i18n/demo_translated_pirate.png +0 -0
  44. data/guides/assets/images/i18n/demo_translation_missing.png +0 -0
  45. data/guides/assets/images/i18n/demo_untranslated.png +0 -0
  46. data/guides/assets/images/icons/README +5 -0
  47. data/guides/assets/images/icons/callouts/1.png +0 -0
  48. data/guides/assets/images/icons/callouts/10.png +0 -0
  49. data/guides/assets/images/icons/callouts/11.png +0 -0
  50. data/guides/assets/images/icons/callouts/12.png +0 -0
  51. data/guides/assets/images/icons/callouts/13.png +0 -0
  52. data/guides/assets/images/icons/callouts/14.png +0 -0
  53. data/guides/assets/images/icons/callouts/15.png +0 -0
  54. data/guides/assets/images/icons/callouts/2.png +0 -0
  55. data/guides/assets/images/icons/callouts/3.png +0 -0
  56. data/guides/assets/images/icons/callouts/4.png +0 -0
  57. data/guides/assets/images/icons/callouts/5.png +0 -0
  58. data/guides/assets/images/icons/callouts/6.png +0 -0
  59. data/guides/assets/images/icons/callouts/7.png +0 -0
  60. data/guides/assets/images/icons/callouts/8.png +0 -0
  61. data/guides/assets/images/icons/callouts/9.png +0 -0
  62. data/guides/assets/images/icons/caution.png +0 -0
  63. data/guides/assets/images/icons/example.png +0 -0
  64. data/guides/assets/images/icons/home.png +0 -0
  65. data/guides/assets/images/icons/important.png +0 -0
  66. data/guides/assets/images/icons/next.png +0 -0
  67. data/guides/assets/images/icons/note.png +0 -0
  68. data/guides/assets/images/icons/prev.png +0 -0
  69. data/guides/assets/images/icons/tip.png +0 -0
  70. data/guides/assets/images/icons/up.png +0 -0
  71. data/guides/assets/images/icons/warning.png +0 -0
  72. data/guides/assets/images/nav_arrow.gif +0 -0
  73. data/guides/assets/images/oscardelben.jpg +0 -0
  74. data/guides/assets/images/polymorphic.png +0 -0
  75. data/guides/assets/images/radar.png +0 -0
  76. data/guides/assets/images/rails4_features.png +0 -0
  77. data/guides/assets/images/rails_guides_kindle_cover.jpg +0 -0
  78. data/guides/assets/images/rails_guides_logo.gif +0 -0
  79. data/guides/assets/images/rails_logo_remix.gif +0 -0
  80. data/guides/assets/images/session_fixation.png +0 -0
  81. data/guides/assets/images/tab_grey.gif +0 -0
  82. data/guides/assets/images/tab_info.gif +0 -0
  83. data/guides/assets/images/tab_note.gif +0 -0
  84. data/guides/assets/images/tab_red.gif +0 -0
  85. data/guides/assets/images/tab_yellow.gif +0 -0
  86. data/guides/assets/images/tab_yellow.png +0 -0
  87. data/guides/assets/images/vijaydev.jpg +0 -0
  88. data/guides/assets/javascripts/guides.js +59 -0
  89. data/guides/assets/javascripts/jquery.min.js +4 -0
  90. data/guides/assets/javascripts/responsive-tables.js +43 -0
  91. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +59 -0
  92. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +75 -0
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +59 -0
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +65 -0
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +100 -0
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +97 -0
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +91 -0
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +55 -0
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +41 -0
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +52 -0
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +67 -0
  102. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +52 -0
  103. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +57 -0
  104. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +58 -0
  105. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +72 -0
  106. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +88 -0
  107. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +33 -0
  108. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +74 -0
  109. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +64 -0
  110. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +55 -0
  111. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +94 -0
  112. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +51 -0
  113. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +66 -0
  114. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +56 -0
  115. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +69 -0
  116. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +17 -0
  117. data/guides/assets/stylesheets/fixes.css +16 -0
  118. data/guides/assets/stylesheets/kindle.css +11 -0
  119. data/guides/assets/stylesheets/main.css +713 -0
  120. data/guides/assets/stylesheets/print.css +52 -0
  121. data/guides/assets/stylesheets/reset.css +43 -0
  122. data/guides/assets/stylesheets/responsive-tables.css +50 -0
  123. data/guides/assets/stylesheets/style.css +13 -0
  124. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +226 -0
  125. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +328 -0
  126. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +331 -0
  127. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +339 -0
  128. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +324 -0
  129. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +328 -0
  130. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +324 -0
  131. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +324 -0
  132. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +324 -0
  133. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +117 -0
  134. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +120 -0
  135. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +128 -0
  136. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +113 -0
  137. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +117 -0
  138. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +113 -0
  139. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +113 -0
  140. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +113 -0
  141. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRailsGuides.css +116 -0
  142. data/guides/bug_report_templates/action_controller_gem.rb +47 -0
  143. data/guides/bug_report_templates/action_controller_master.rb +54 -0
  144. data/guides/bug_report_templates/active_record_gem.rb +40 -0
  145. data/guides/bug_report_templates/active_record_master.rb +49 -0
  146. data/guides/rails_guides/generator.rb +248 -0
  147. data/guides/rails_guides/helpers.rb +53 -0
  148. data/guides/rails_guides/indexer.rb +68 -0
  149. data/guides/rails_guides/kindle.rb +119 -0
  150. data/guides/rails_guides/levenshtein.rb +39 -0
  151. data/guides/rails_guides/markdown/renderer.rb +82 -0
  152. data/guides/rails_guides/markdown.rb +167 -0
  153. data/guides/rails_guides.rb +63 -0
  154. data/guides/source/2_2_release_notes.md +435 -0
  155. data/guides/source/2_3_release_notes.md +621 -0
  156. data/guides/source/3_0_release_notes.md +611 -0
  157. data/guides/source/3_1_release_notes.md +559 -0
  158. data/guides/source/3_2_release_notes.md +568 -0
  159. data/guides/source/4_0_release_notes.md +279 -0
  160. data/guides/source/4_1_release_notes.md +730 -0
  161. data/guides/source/4_2_release_notes.md +850 -0
  162. data/guides/source/_license.html.erb +2 -0
  163. data/guides/source/_welcome.html.erb +19 -0
  164. data/guides/source/action_controller_overview.md +1249 -0
  165. data/guides/source/action_mailer_basics.md +752 -0
  166. data/guides/source/action_view_overview.md +1620 -0
  167. data/guides/source/active_job_basics.md +318 -0
  168. data/guides/source/active_model_basics.md +554 -0
  169. data/guides/source/active_record_basics.md +374 -0
  170. data/guides/source/active_record_callbacks.md +413 -0
  171. data/guides/source/active_record_migrations.md +1018 -0
  172. data/guides/source/active_record_postgresql.md +433 -0
  173. data/guides/source/active_record_querying.md +1783 -0
  174. data/guides/source/active_record_validations.md +1178 -0
  175. data/guides/source/active_support_core_extensions.md +3904 -0
  176. data/guides/source/active_support_instrumentation.md +499 -0
  177. data/guides/source/api_documentation_guidelines.md +361 -0
  178. data/guides/source/asset_pipeline.md +1360 -0
  179. data/guides/source/association_basics.md +2236 -0
  180. data/guides/source/caching_with_rails.md +379 -0
  181. data/guides/source/command_line.md +625 -0
  182. data/guides/source/configuring.md +1045 -0
  183. data/guides/source/constant_autoloading_and_reloading.md +1297 -0
  184. data/guides/source/contributing_to_ruby_on_rails.md +624 -0
  185. data/guides/source/credits.html.erb +80 -0
  186. data/guides/source/debugging_rails_applications.md +861 -0
  187. data/guides/source/development_dependencies_install.md +289 -0
  188. data/guides/source/documents.yaml +205 -0
  189. data/guides/source/engines.md +1412 -0
  190. data/guides/source/form_helpers.md +1024 -0
  191. data/guides/source/generators.md +676 -0
  192. data/guides/source/getting_started.md +2085 -0
  193. data/guides/source/i18n.md +1086 -0
  194. data/guides/source/index.html.erb +28 -0
  195. data/guides/source/initialization.md +704 -0
  196. data/guides/source/kindle/copyright.html.erb +1 -0
  197. data/guides/source/kindle/layout.html.erb +27 -0
  198. data/guides/source/kindle/rails_guides.opf.erb +52 -0
  199. data/guides/source/kindle/toc.html.erb +24 -0
  200. data/guides/source/kindle/toc.ncx.erb +64 -0
  201. data/guides/source/kindle/welcome.html.erb +5 -0
  202. data/guides/source/layout.html.erb +143 -0
  203. data/guides/source/layouts_and_rendering.md +1227 -0
  204. data/guides/source/maintenance_policy.md +78 -0
  205. data/guides/source/nested_model_forms.md +228 -0
  206. data/guides/source/plugins.md +444 -0
  207. data/guides/source/rails_application_templates.md +266 -0
  208. data/guides/source/rails_on_rack.md +336 -0
  209. data/guides/source/routing.md +1141 -0
  210. data/guides/source/ruby_on_rails_guides_guidelines.md +127 -0
  211. data/guides/source/security.md +1024 -0
  212. data/guides/source/testing.md +1123 -0
  213. data/guides/source/upgrading_ruby_on_rails.md +1154 -0
  214. data/guides/source/working_with_javascript_in_rails.md +407 -0
  215. data/guides/w3c_validator.rb +97 -0
  216. metadata +290 -44
@@ -0,0 +1,39 @@
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
+ max = n/2
11
+
12
+ return m if (0 == n)
13
+ return n if (0 == m)
14
+ return n if (n - m).abs > max
15
+
16
+ d = (0..m).to_a
17
+ x = nil
18
+
19
+ str1.each_char.each_with_index do |char1,i|
20
+ e = i+1
21
+
22
+ str2.each_char.each_with_index do |char2,j|
23
+ cost = (char1 == char2) ? 0 : 1
24
+ x = [
25
+ d[j+1] + 1, # insertion
26
+ e + 1, # deletion
27
+ d[j] + cost # substitution
28
+ ].min
29
+ d[j] = e
30
+ e = x
31
+ end
32
+
33
+ d[m] = x
34
+ end
35
+
36
+ return x
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,82 @@
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
@@ -0,0 +1,167 @@
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
@@ -0,0 +1,63 @@
1
+ pwd = File.dirname(__FILE__)
2
+ $:.unshift pwd
3
+
4
+ # This is a predicate useful for the doc:guides task of applications.
5
+ def bundler?
6
+ # Note that rake sets the cwd to the one that contains the Rakefile
7
+ # being executed.
8
+ File.exist?('Gemfile')
9
+ end
10
+
11
+ begin
12
+ # Guides generation in the Rails repo.
13
+ as_lib = File.join(pwd, "../activesupport/lib")
14
+ ap_lib = File.join(pwd, "../actionpack/lib")
15
+
16
+ $:.unshift as_lib if File.directory?(as_lib)
17
+ $:.unshift ap_lib if File.directory?(ap_lib)
18
+ rescue LoadError
19
+ # Guides generation from gems.
20
+ gem "actionpack", '>= 3.0'
21
+ end
22
+
23
+ begin
24
+ require 'redcarpet'
25
+ rescue LoadError
26
+ # This can happen if doc:guides is executed in an application.
27
+ $stderr.puts('Generating guides requires Redcarpet 3.1.2+.')
28
+ $stderr.puts(<<ERROR) if bundler?
29
+ Please add
30
+
31
+ gem 'redcarpet', '~> 3.1.2'
32
+
33
+ to the Gemfile, run
34
+
35
+ bundle install
36
+
37
+ and try again.
38
+ ERROR
39
+ exit 1
40
+ end
41
+
42
+ begin
43
+ require 'nokogiri'
44
+ rescue LoadError
45
+ # This can happen if doc:guides is executed in an application.
46
+ $stderr.puts('Generating guides requires Nokogiri.')
47
+ $stderr.puts(<<ERROR) if bundler?
48
+ Please add
49
+
50
+ gem 'nokogiri'
51
+
52
+ to the Gemfile, run
53
+
54
+ bundle install
55
+
56
+ and try again.
57
+ ERROR
58
+ exit 1
59
+ end
60
+
61
+ require 'rails_guides/markdown'
62
+ require "rails_guides/generator"
63
+ RailsGuides::Generator.new.generate