提交 0867fcdb 编写于 作者: P Prem Sichanugrist 提交者: Prem Sichanugrist

Update Markdown renderer to be more flexible

上级 5137d03c
...@@ -8,10 +8,12 @@ def initialize(view, layout) ...@@ -8,10 +8,12 @@ def initialize(view, layout)
@view = view @view = view
@layout = layout @layout = layout
@index_counter = Hash.new(0) @index_counter = Hash.new(0)
@raw_header = ''
end end
def render(body) def render(body)
@raw_header, _, @raw_body = body.partition(/^\-{40,}$/).map(&:strip) @raw_body = body
extract_raw_header_and_body
generate_header generate_header
generate_title generate_title
generate_body generate_body
...@@ -36,6 +38,12 @@ def engine ...@@ -36,6 +38,12 @@ def engine
}) })
end end
def extract_raw_header_and_body
if @raw_body =~ /^\-{40,}$/
@raw_header, _, @raw_body = @raw_body.partition(/^\-{40,}$/).map(&:strip)
end
end
def generate_body def generate_body
@body = engine.render(@raw_body) @body = engine.render(@raw_body)
end end
...@@ -46,49 +54,57 @@ def generate_header ...@@ -46,49 +54,57 @@ def generate_header
def generate_structure def generate_structure
@raw_index = '' @raw_index = ''
@body = Nokogiri::HTML(@body).tap do |doc| if @body.present?
hierarchy = [] @body = Nokogiri::HTML(@body).tap do |doc|
hierarchy = []
doc.at('body').children.each do |node|
if node.name =~ /^h[3-6]$/ doc.at('body').children.each do |node|
case node.name if node.name =~ /^h[3-6]$/
when 'h3' case node.name
hierarchy = [node] when 'h3'
node[:id] = dom_id(hierarchy) hierarchy = [node]
@raw_index += "1. [#{node.text}](##{node[:id]})\n" node[:id] = dom_id(hierarchy)
when 'h4' @raw_index += "1. [#{node.text}](##{node[:id]})\n"
hierarchy = hierarchy[0, 1] + [node] when 'h4'
node[:id] = dom_id(hierarchy) hierarchy = hierarchy[0, 1] + [node]
@raw_index += " * [#{node.text}](##{node[:id]})\n" node[:id] = dom_id(hierarchy)
when 'h5' @raw_index += " * [#{node.text}](##{node[:id]})\n"
hierarchy = hierarchy[0, 2] + [node] when 'h5'
node[:id] = dom_id(hierarchy) hierarchy = hierarchy[0, 2] + [node]
when 'h6' node[:id] = dom_id(hierarchy)
hierarchy = hierarchy[0, 3] + [node] when 'h6'
node[:id] = dom_id(hierarchy) hierarchy = hierarchy[0, 3] + [node]
end node[:id] = dom_id(hierarchy)
end
node.inner_html = "#{node_index(hierarchy)} #{node.text}" node.inner_html = "#{node_index(hierarchy)} #{node.text}"
end
end end
end end.to_html
end.to_html end
end end
def generate_index def generate_index
@index = Nokogiri::HTML(engine.render(@raw_index)).tap do |doc| if @raw_index.present?
doc.at('ol')[:class] = 'chapters' @index = Nokogiri::HTML(engine.render(@raw_index)).tap do |doc|
end.to_html doc.at('ol')[:class] = 'chapters'
end.to_html
@index = <<-INDEX.html_safe
<div id="subCol"> @index = <<-INDEX.html_safe
<h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3> <div id="subCol">
#{@index} <h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
</div> #{@index}
INDEX </div>
INDEX
end
end end
def generate_title def generate_title
@title = "Ruby on Rails Guides: #{Nokogiri::HTML(@header).at(:h2).text}".html_safe if heading = Nokogiri::HTML(@header).at(:h2)
@title = "Ruby on Rails Guides: #{heading.text}".html_safe
else
@title = "Ruby on Rails Guides"
end
end end
def node_index(hierarchy) def node_index(hierarchy)
...@@ -110,7 +126,7 @@ def node_index(hierarchy) ...@@ -110,7 +126,7 @@ def node_index(hierarchy)
def render_page def render_page
@view.content_for(:header_section) { @header } @view.content_for(:header_section) { @header }
@view.content_for(:page_title) { @title } @view.content_for(:page_title) { @title }
@view.content_for(:index_section) { @index.html_safe } @view.content_for(:index_section) { @index }
@view.render(:layout => @layout, :text => @body) @view.render(:layout => @layout, :text => @body)
end end
end end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册