module RailsGuides
class Markdown
class Renderer < Redcarpet::Render::HTML
def initialize(options = {})
super
end
def block_code(code, language)
<<-HTML
HTML
end
def link(url, title, content)
if url.start_with?('http://api.rubyonrails.org')
%(#{content})
elsif title
%(#{content})
else
%(#{content})
end
end
def header(text, header_level)
# Always increase the heading level by 1, so we can use h1, h2 heading in the document
header_level += 1
%(#{text})
end
def paragraph(text)
if text =~ %r{^NOTE:\s+Defined\s+in\s+(.*?)
\.?$}
%()
elsif text =~ /^(TIP|IMPORTANT|CAUTION|WARNING|NOTE|INFO|TODO)[.:]/
convert_notes(text)
elsif text.include?("DO NOT READ THIS FILE ON GITHUB")
elsif text =~ /^\[(\d+)\]:<\/sup> (.+)$/
linkback = %(#{$1})
%()
else
text = convert_footnotes(text)
"#{text}
"
end
end
private
def convert_footnotes(text)
text.gsub(/\[(\d+)\]<\/sup>/i) do
%()
end
end
def brush_for(code_type)
case code_type
when "ruby", "sql", "plain"
code_type
when "erb", "html+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.
#
# 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
css_class = \
case $1
when "CAUTION", "IMPORTANT"
"warning"
when "TIP"
"info"
else
$1.downcase
end
%()
end
end
def github_file_url(file_path)
root, rest = file_path.split('/', 2)
case root
when 'abstract_controller', 'action_controller', 'action_dispatch'
path = ['actionpack', 'lib', root, rest].join('/')
when 'active_support', 'active_record', 'active_model', 'action_view',
'action_cable', 'action_mailer', 'action_pack', 'active_job'
path = [root.sub('_', ''), 'lib', root, rest].join('/')
else
path = file_path
end
["https://github.com/rails/rails/tree", version || 'master', path].join('/')
end
def version
ENV['RAILS_VERSION']
end
def api_link(url)
if version && !url.match(/v\d\.\d\.\d/)
url.insert(url.index('.org')+4, "/#{version}")
url.sub('http://edgeapi', 'http://api') if url.include?('edgeapi')
end
url
end
end
end
end