rails 4.2.11.3 → 5.2.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rails might be problematic. Click here for more details.

Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -12
  3. metadata +52 -244
  4. data/guides/CHANGELOG.md +0 -113
  5. data/guides/Rakefile +0 -92
  6. data/guides/assets/images/akshaysurve.jpg +0 -0
  7. data/guides/assets/images/belongs_to.png +0 -0
  8. data/guides/assets/images/book_icon.gif +0 -0
  9. data/guides/assets/images/bullet.gif +0 -0
  10. data/guides/assets/images/chapters_icon.gif +0 -0
  11. data/guides/assets/images/check_bullet.gif +0 -0
  12. data/guides/assets/images/credits_pic_blank.gif +0 -0
  13. data/guides/assets/images/csrf.png +0 -0
  14. data/guides/assets/images/edge_badge.png +0 -0
  15. data/guides/assets/images/favicon.ico +0 -0
  16. data/guides/assets/images/feature_tile.gif +0 -0
  17. data/guides/assets/images/footer_tile.gif +0 -0
  18. data/guides/assets/images/fxn.png +0 -0
  19. data/guides/assets/images/getting_started/article_with_comments.png +0 -0
  20. data/guides/assets/images/getting_started/challenge.png +0 -0
  21. data/guides/assets/images/getting_started/confirm_dialog.png +0 -0
  22. data/guides/assets/images/getting_started/forbidden_attributes_for_new_article.png +0 -0
  23. data/guides/assets/images/getting_started/form_with_errors.png +0 -0
  24. data/guides/assets/images/getting_started/index_action_with_edit_link.png +0 -0
  25. data/guides/assets/images/getting_started/new_article.png +0 -0
  26. data/guides/assets/images/getting_started/rails_welcome.png +0 -0
  27. data/guides/assets/images/getting_started/routing_error_no_controller.png +0 -0
  28. data/guides/assets/images/getting_started/routing_error_no_route_matches.png +0 -0
  29. data/guides/assets/images/getting_started/show_action_for_articles.png +0 -0
  30. data/guides/assets/images/getting_started/template_is_missing_articles_new.png +0 -0
  31. data/guides/assets/images/getting_started/unknown_action_create_for_articles.png +0 -0
  32. data/guides/assets/images/getting_started/unknown_action_new_for_articles.png +0 -0
  33. data/guides/assets/images/grey_bullet.gif +0 -0
  34. data/guides/assets/images/habtm.png +0 -0
  35. data/guides/assets/images/has_many.png +0 -0
  36. data/guides/assets/images/has_many_through.png +0 -0
  37. data/guides/assets/images/has_one.png +0 -0
  38. data/guides/assets/images/has_one_through.png +0 -0
  39. data/guides/assets/images/header_backdrop.png +0 -0
  40. data/guides/assets/images/header_tile.gif +0 -0
  41. data/guides/assets/images/i18n/demo_html_safe.png +0 -0
  42. data/guides/assets/images/i18n/demo_localized_pirate.png +0 -0
  43. data/guides/assets/images/i18n/demo_translated_en.png +0 -0
  44. data/guides/assets/images/i18n/demo_translated_pirate.png +0 -0
  45. data/guides/assets/images/i18n/demo_translation_missing.png +0 -0
  46. data/guides/assets/images/i18n/demo_untranslated.png +0 -0
  47. data/guides/assets/images/icons/README +0 -5
  48. data/guides/assets/images/icons/callouts/1.png +0 -0
  49. data/guides/assets/images/icons/callouts/10.png +0 -0
  50. data/guides/assets/images/icons/callouts/11.png +0 -0
  51. data/guides/assets/images/icons/callouts/12.png +0 -0
  52. data/guides/assets/images/icons/callouts/13.png +0 -0
  53. data/guides/assets/images/icons/callouts/14.png +0 -0
  54. data/guides/assets/images/icons/callouts/15.png +0 -0
  55. data/guides/assets/images/icons/callouts/2.png +0 -0
  56. data/guides/assets/images/icons/callouts/3.png +0 -0
  57. data/guides/assets/images/icons/callouts/4.png +0 -0
  58. data/guides/assets/images/icons/callouts/5.png +0 -0
  59. data/guides/assets/images/icons/callouts/6.png +0 -0
  60. data/guides/assets/images/icons/callouts/7.png +0 -0
  61. data/guides/assets/images/icons/callouts/8.png +0 -0
  62. data/guides/assets/images/icons/callouts/9.png +0 -0
  63. data/guides/assets/images/icons/caution.png +0 -0
  64. data/guides/assets/images/icons/example.png +0 -0
  65. data/guides/assets/images/icons/home.png +0 -0
  66. data/guides/assets/images/icons/important.png +0 -0
  67. data/guides/assets/images/icons/next.png +0 -0
  68. data/guides/assets/images/icons/note.png +0 -0
  69. data/guides/assets/images/icons/prev.png +0 -0
  70. data/guides/assets/images/icons/tip.png +0 -0
  71. data/guides/assets/images/icons/up.png +0 -0
  72. data/guides/assets/images/icons/warning.png +0 -0
  73. data/guides/assets/images/nav_arrow.gif +0 -0
  74. data/guides/assets/images/oscardelben.jpg +0 -0
  75. data/guides/assets/images/polymorphic.png +0 -0
  76. data/guides/assets/images/radar.png +0 -0
  77. data/guides/assets/images/rails4_features.png +0 -0
  78. data/guides/assets/images/rails_guides_kindle_cover.jpg +0 -0
  79. data/guides/assets/images/rails_guides_logo.gif +0 -0
  80. data/guides/assets/images/rails_logo_remix.gif +0 -0
  81. data/guides/assets/images/session_fixation.png +0 -0
  82. data/guides/assets/images/tab_grey.gif +0 -0
  83. data/guides/assets/images/tab_info.gif +0 -0
  84. data/guides/assets/images/tab_note.gif +0 -0
  85. data/guides/assets/images/tab_red.gif +0 -0
  86. data/guides/assets/images/tab_yellow.gif +0 -0
  87. data/guides/assets/images/tab_yellow.png +0 -0
  88. data/guides/assets/images/vijaydev.jpg +0 -0
  89. data/guides/assets/javascripts/guides.js +0 -59
  90. data/guides/assets/javascripts/jquery.min.js +0 -4
  91. data/guides/assets/javascripts/responsive-tables.js +0 -43
  92. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +0 -59
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +0 -75
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +0 -59
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +0 -65
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +0 -100
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +0 -97
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +0 -91
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +0 -55
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +0 -41
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +0 -52
  102. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +0 -67
  103. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +0 -52
  104. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +0 -57
  105. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +0 -58
  106. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +0 -72
  107. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +0 -88
  108. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +0 -33
  109. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +0 -74
  110. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +0 -64
  111. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +0 -55
  112. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +0 -94
  113. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +0 -51
  114. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +0 -66
  115. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +0 -56
  116. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +0 -69
  117. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +0 -17
  118. data/guides/assets/stylesheets/fixes.css +0 -16
  119. data/guides/assets/stylesheets/kindle.css +0 -11
  120. data/guides/assets/stylesheets/main.css +0 -713
  121. data/guides/assets/stylesheets/print.css +0 -52
  122. data/guides/assets/stylesheets/reset.css +0 -43
  123. data/guides/assets/stylesheets/responsive-tables.css +0 -50
  124. data/guides/assets/stylesheets/style.css +0 -13
  125. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +0 -226
  126. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +0 -328
  127. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +0 -331
  128. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +0 -339
  129. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +0 -324
  130. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +0 -328
  131. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +0 -324
  132. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +0 -324
  133. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +0 -324
  134. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +0 -117
  135. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +0 -120
  136. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +0 -128
  137. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +0 -113
  138. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +0 -117
  139. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +0 -113
  140. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +0 -113
  141. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +0 -113
  142. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRailsGuides.css +0 -116
  143. data/guides/bug_report_templates/action_controller_gem.rb +0 -47
  144. data/guides/bug_report_templates/action_controller_master.rb +0 -54
  145. data/guides/bug_report_templates/active_record_gem.rb +0 -40
  146. data/guides/bug_report_templates/active_record_master.rb +0 -49
  147. data/guides/bug_report_templates/generic_gem.rb +0 -15
  148. data/guides/bug_report_templates/generic_master.rb +0 -26
  149. data/guides/rails_guides/generator.rb +0 -248
  150. data/guides/rails_guides/helpers.rb +0 -53
  151. data/guides/rails_guides/indexer.rb +0 -68
  152. data/guides/rails_guides/kindle.rb +0 -119
  153. data/guides/rails_guides/levenshtein.rb +0 -37
  154. data/guides/rails_guides/markdown/renderer.rb +0 -82
  155. data/guides/rails_guides/markdown.rb +0 -167
  156. data/guides/rails_guides.rb +0 -63
  157. data/guides/source/2_2_release_notes.md +0 -435
  158. data/guides/source/2_3_release_notes.md +0 -621
  159. data/guides/source/3_0_release_notes.md +0 -611
  160. data/guides/source/3_1_release_notes.md +0 -559
  161. data/guides/source/3_2_release_notes.md +0 -568
  162. data/guides/source/4_0_release_notes.md +0 -279
  163. data/guides/source/4_1_release_notes.md +0 -730
  164. data/guides/source/4_2_release_notes.md +0 -877
  165. data/guides/source/_license.html.erb +0 -2
  166. data/guides/source/_welcome.html.erb +0 -23
  167. data/guides/source/action_controller_overview.md +0 -1192
  168. data/guides/source/action_mailer_basics.md +0 -757
  169. data/guides/source/action_view_overview.md +0 -1561
  170. data/guides/source/active_job_basics.md +0 -339
  171. data/guides/source/active_model_basics.md +0 -554
  172. data/guides/source/active_record_basics.md +0 -374
  173. data/guides/source/active_record_callbacks.md +0 -413
  174. data/guides/source/active_record_migrations.md +0 -1018
  175. data/guides/source/active_record_postgresql.md +0 -433
  176. data/guides/source/active_record_querying.md +0 -1781
  177. data/guides/source/active_record_validations.md +0 -1179
  178. data/guides/source/active_support_core_extensions.md +0 -3856
  179. data/guides/source/active_support_instrumentation.md +0 -488
  180. data/guides/source/api_documentation_guidelines.md +0 -361
  181. data/guides/source/asset_pipeline.md +0 -1304
  182. data/guides/source/association_basics.md +0 -2245
  183. data/guides/source/autoloading_and_reloading_constants.md +0 -1311
  184. data/guides/source/caching_with_rails.md +0 -379
  185. data/guides/source/command_line.md +0 -625
  186. data/guides/source/configuring.md +0 -1070
  187. data/guides/source/contributing_to_ruby_on_rails.md +0 -628
  188. data/guides/source/credits.html.erb +0 -80
  189. data/guides/source/debugging_rails_applications.md +0 -861
  190. data/guides/source/development_dependencies_install.md +0 -289
  191. data/guides/source/documents.yaml +0 -205
  192. data/guides/source/engines.md +0 -1412
  193. data/guides/source/form_helpers.md +0 -1024
  194. data/guides/source/generators.md +0 -676
  195. data/guides/source/getting_started.md +0 -2086
  196. data/guides/source/i18n.md +0 -1087
  197. data/guides/source/index.html.erb +0 -28
  198. data/guides/source/initialization.md +0 -704
  199. data/guides/source/kindle/copyright.html.erb +0 -1
  200. data/guides/source/kindle/layout.html.erb +0 -27
  201. data/guides/source/kindle/rails_guides.opf.erb +0 -52
  202. data/guides/source/kindle/toc.html.erb +0 -24
  203. data/guides/source/kindle/toc.ncx.erb +0 -64
  204. data/guides/source/kindle/welcome.html.erb +0 -5
  205. data/guides/source/layout.html.erb +0 -140
  206. data/guides/source/layouts_and_rendering.md +0 -1226
  207. data/guides/source/maintenance_policy.md +0 -78
  208. data/guides/source/nested_model_forms.md +0 -228
  209. data/guides/source/plugins.md +0 -444
  210. data/guides/source/rails_application_templates.md +0 -266
  211. data/guides/source/rails_on_rack.md +0 -335
  212. data/guides/source/routing.md +0 -1155
  213. data/guides/source/ruby_on_rails_guides_guidelines.md +0 -127
  214. data/guides/source/security.md +0 -1024
  215. data/guides/source/testing.md +0 -1132
  216. data/guides/source/upgrading_ruby_on_rails.md +0 -1186
  217. data/guides/source/working_with_javascript_in_rails.md +0 -407
  218. data/guides/w3c_validator.rb +0 -97
@@ -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,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
@@ -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,63 +0,0 @@
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