diff options
author | Prem Sichanugrist <s@sikachu.com> | 2012-08-31 17:49:17 -0400 |
---|---|---|
committer | Prem Sichanugrist <s@sikac.hu> | 2012-09-17 15:54:21 -0400 |
commit | efa7717b7ab71f026df4e464046519e973c31f9a (patch) | |
tree | 6787799cb4e615ccc75069443202153b45010570 /guides/rails_guides | |
parent | 544f6bcb9095cfc826f892e6bfafee6a9bafa494 (diff) | |
download | rails-efa7717b7ab71f026df4e464046519e973c31f9a.tar.gz rails-efa7717b7ab71f026df4e464046519e973c31f9a.tar.bz2 rails-efa7717b7ab71f026df4e464046519e973c31f9a.zip |
4.0 release note now renders correctly with index
Diffstat (limited to 'guides/rails_guides')
-rw-r--r-- | guides/rails_guides/markdown.rb | 95 | ||||
-rw-r--r-- | guides/rails_guides/markdown/renderer.rb | 31 |
2 files changed, 111 insertions, 15 deletions
diff --git a/guides/rails_guides/markdown.rb b/guides/rails_guides/markdown.rb index a56d0d2d85..12eabcbcc8 100644 --- a/guides/rails_guides/markdown.rb +++ b/guides/rails_guides/markdown.rb @@ -7,15 +7,25 @@ module RailsGuides def initialize(view, layout) @view = view @layout = layout + @index_counter = Hash.new(0) end def render(body) - @header, _, @body = body.partition(/^\-{40,}$/) - render_header - render_body + @raw_header, _, @raw_body = body.partition(/^\-{40,}$/).map(&:strip) + generate_header + generate_title + generate_body + generate_structure + generate_index + render_page end private + + def dom_id(nodes) + nodes.map{ |node| node.text.downcase.gsub(/[^a-z0-9]+/, '-') }.join('-') + end + def engine @engine ||= Redcarpet::Markdown.new(Renderer, { no_intra_emphasis: true, @@ -26,17 +36,82 @@ module RailsGuides }) end - def render_header - header_content = engine.render(@header) - @view.content_for(:header_section) { header_content.html_safe } + def generate_body + @body = engine.render(@raw_body) + end + + def generate_header + @header = engine.render(@raw_header).html_safe + end + + def generate_structure + @raw_index = '' + @body = Nokogiri::HTML(@body).tap do |doc| + hierarchy = [] + + doc.at('body').children.each do |node| + if node.name =~ /^h[3-6]$/ + case node.name + when 'h3' + hierarchy = [node] + node[:id] = dom_id(hierarchy) + @raw_index += "1. [#{node.text}](##{node[:id]})\n" + when 'h4' + hierarchy = hierarchy[0, 1] + [node] + node[:id] = dom_id(hierarchy) + @raw_index += " * [#{node.text}](##{node[:id]})\n" + when 'h5' + hierarchy = hierarchy[0, 2] + [node] + node[:id] = dom_id(hierarchy) + when 'h6' + hierarchy = hierarchy[0, 3] + [node] + node[:id] = dom_id(hierarchy) + end + + node.inner_html = "#{node_index(hierarchy)} #{node.text}" + end + end + end.to_html + end + + def generate_index + @index = Nokogiri::HTML(engine.render(@raw_index)).tap do |doc| + doc.at('ol')[:class] = 'chapters' + end.to_html + + @index = <<-INDEX.html_safe + <div id="subCol"> + <h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3> + #{@index} + </div> + INDEX + end + + def generate_title + @title = "Ruby on Rails Guides: #{Nokogiri::HTML(@header).at(:h2).text}".html_safe + end - @view.content_for(:page_title) do - "Ruby on Rails Guides: #{Nokogiri::HTML(header_content).at(:h2).text}".html_safe + def node_index(hierarchy) + case hierarchy.size + when 1 + @index_counter[2] = @index_counter[3] = @index_counter[4] = 0 + "#{@index_counter[1] += 1}" + when 2 + @index_counter[3] = @index_counter[4] = 0 + "#{@index_counter[1]}.#{@index_counter[2] += 1}" + when 3 + @index_counter[4] = 0 + "#{@index_counter[1]}.#{@index_counter[2]}.#{@index_counter[3] += 1}" + when 4 + "#{@index_counter[1]}.#{@index_counter[2]}.#{@index_counter[3]}.#{@index_counter[4] += 1}" end end - def render_body - @view.render(:layout => @layout, :text => engine.render(@body)) + def render_page + @view.content_for(:header_section) { @header } + @view.content_for(:page_title) { @title } + @view.content_for(:index_section) { @index.html_safe } + @view.render(:layout => @layout, :text => @body) end end end diff --git a/guides/rails_guides/markdown/renderer.rb b/guides/rails_guides/markdown/renderer.rb index ea3b7fc044..ec0688f937 100644 --- a/guides/rails_guides/markdown/renderer.rb +++ b/guides/rails_guides/markdown/renderer.rb @@ -5,11 +5,23 @@ module RailsGuides super end + def block_code(code, language) + <<-HTML +<notextile> +<div class="code_container"> +<pre class="brush: #{brush_for(language)}; gutter: false; toolbar: false"> +#{ERB::Util.h(code).strip} +</pre> +</div> +</notextile> +HTML + end + def header(text, header_level) # Always increase the heading level by, so we can use h1, h2 heading in the document header_level += 1 - %(<h#{header_level} id="#{dom_id(text)}">#{text}</h#{header_level}>) + %(<h#{header_level}>#{text}</h#{header_level}>) end def preprocess(full_document) @@ -18,6 +30,19 @@ module RailsGuides private + def brush_for(code_type) + case code_type + when 'ruby', 'sql', 'plain' + code_type + when 'erb' + 'ruby; html-script: true' + when 'html' + 'xml' # html is understood, but there are .xml rules in the CSS + else + 'plain' + end + end + def convert_notes(body) # The following regexp detects special labels followed by a # paragraph, perhaps at the end of the document. @@ -39,10 +64,6 @@ module RailsGuides %Q(<div class="#{css_class}"><p>#{$2.strip}</p></div>\n) end end - - def dom_id(text) - text.downcase.gsub(/[^a-z0-9]+/, '-').strip - end end end end |