rails 4.2.11 → 5.2.8.1
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 +4 -4
- data/README.md +24 -12
- metadata +54 -248
- data/guides/CHANGELOG.md +0 -98
- 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/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/renderer.rb +0 -82
- data/guides/rails_guides/markdown.rb +0 -167
- data/guides/rails_guides.rb +0 -63
- 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,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
|
data/guides/rails_guides.rb
DELETED
@@ -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
|