2012-08-31 12:01:06 -04:00
|
|
|
module RailsGuides
|
|
|
|
class Markdown
|
|
|
|
class Renderer < Redcarpet::Render::HTML
|
|
|
|
def initialize(options={})
|
|
|
|
super
|
|
|
|
end
|
|
|
|
|
2012-08-31 17:49:17 -04:00
|
|
|
def block_code(code, language)
|
|
|
|
<<-HTML
|
|
|
|
<div class="code_container">
|
|
|
|
<pre class="brush: #{brush_for(language)}; gutter: false; toolbar: false">
|
2012-11-05 17:24:22 -05:00
|
|
|
#{ERB::Util.h(code)}
|
2012-08-31 17:49:17 -04:00
|
|
|
</pre>
|
|
|
|
</div>
|
|
|
|
HTML
|
|
|
|
end
|
|
|
|
|
2012-08-31 12:01:06 -04:00
|
|
|
def header(text, header_level)
|
|
|
|
# Always increase the heading level by, so we can use h1, h2 heading in the document
|
|
|
|
header_level += 1
|
|
|
|
|
2012-08-31 17:49:17 -04:00
|
|
|
%(<h#{header_level}>#{text}</h#{header_level}>)
|
2012-08-31 12:01:06 -04:00
|
|
|
end
|
|
|
|
|
2012-09-02 14:53:01 -04:00
|
|
|
def paragraph(text)
|
|
|
|
if text =~ /^(TIP|IMPORTANT|CAUTION|WARNING|NOTE|INFO|TODO)[.:](.*?)/
|
|
|
|
convert_notes(text)
|
2012-09-17 00:46:26 -04:00
|
|
|
elsif text =~ /^\[<sup>(\d+)\]:<\/sup> (.+)$/
|
|
|
|
linkback = %(<a href="#footnote-#{$1}-ref"><sup>#{$1}</sup></a>)
|
|
|
|
%(<p class="footnote" id="footnote-#{$1}">#{linkback} #{$2}</p>)
|
2012-09-02 14:53:01 -04:00
|
|
|
else
|
2012-09-17 00:46:26 -04:00
|
|
|
text = convert_footnotes(text)
|
2012-09-02 14:53:01 -04:00
|
|
|
"<p>#{text}</p>"
|
|
|
|
end
|
2012-08-31 12:01:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2012-09-17 00:46:26 -04:00
|
|
|
def convert_footnotes(text)
|
|
|
|
text.gsub(/\[<sup>(\d+)\]<\/sup>/i) do
|
|
|
|
%(<sup class="footnote" id="footnote-#{$1}-ref">) +
|
|
|
|
%(<a href="#footnote-#{$1}">#{$1}</a></sup>)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-08-31 17:49:17 -04:00
|
|
|
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
|
|
|
|
|
2012-08-31 12:01:06 -04:00
|
|
|
def convert_notes(body)
|
|
|
|
# The following regexp detects special labels followed by a
|
|
|
|
# paragraph, perhaps at the end of the document.
|
|
|
|
#
|
|
|
|
# It is important that we do not eat more than one newline
|
|
|
|
# because formatting may be wrong otherwise. For example,
|
|
|
|
# if a bulleted list follows the first item is not rendered
|
|
|
|
# as a list item, but as a paragraph starting with a plain
|
|
|
|
# asterisk.
|
|
|
|
body.gsub(/^(TIP|IMPORTANT|CAUTION|WARNING|NOTE|INFO|TODO)[.:](.*?)(\n(?=\n)|\Z)/m) do |m|
|
|
|
|
css_class = case $1
|
|
|
|
when 'CAUTION', 'IMPORTANT'
|
|
|
|
'warning'
|
|
|
|
when 'TIP'
|
|
|
|
'info'
|
|
|
|
else
|
|
|
|
$1.downcase
|
|
|
|
end
|
2012-09-02 14:53:01 -04:00
|
|
|
%(<div class="#{css_class}"><p>#{$2.strip}</p></div>)
|
2012-08-31 12:01:06 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|