module RailsGuides class Markdown class Renderer < Redcarpet::Render::HTML def initialize(options = {}) super end def block_code(code, language) <<-HTML
#{ERB::Util.h(code)}
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+(.*?)\.?$} %(

Defined in #{$1}.

) 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}) %(

#{linkback} #{$2}

) else text = convert_footnotes(text) "

#{text}

" end end private def convert_footnotes(text) text.gsub(/\[(\d+)\]<\/sup>/i) do %() + %(#{$1}) 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 %(

#{$2.strip}

) 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