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/markdown.rb | |
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/markdown.rb')
-rw-r--r-- | guides/rails_guides/markdown.rb | 95 |
1 files changed, 85 insertions, 10 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 |