rails 4.2.11.3 → 5.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +11 -7
  3. metadata +38 -237
  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.rb +0 -63
  150. data/guides/rails_guides/generator.rb +0 -248
  151. data/guides/rails_guides/helpers.rb +0 -53
  152. data/guides/rails_guides/indexer.rb +0 -68
  153. data/guides/rails_guides/kindle.rb +0 -119
  154. data/guides/rails_guides/levenshtein.rb +0 -37
  155. data/guides/rails_guides/markdown.rb +0 -167
  156. data/guides/rails_guides/markdown/renderer.rb +0 -82
  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,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