class Markdowner # opts[:allow_images] allows tags # opts[:disable_profile_links] disables @username -> /u/username links def self.to_html(text, opts = {}) if text.blank? return "" end exts = [:tagfilter, :autolink] root = CommonMarker.render_doc(text.to_s, [:SMART], exts) ng = Nokogiri::HTML(root.to_html([:SAFE], exts)) # change

,

, etc. headings to just bold tags ng.css("h1, h2, h3, h4, h5, h6").each do |h| h.name = "strong" end if !opts[:allow_images] ng.css("img").remove end # make links have rel=nofollow ng.css("a").each do |h| h[:rel] = "nofollow" end # XXX: t.replace(tx) unescapes HTML, so disable for now. this probably # needs to split text into separate nodes and then replace the @username # with a proper 'a' node if false unless opts[:disable_profile_links] # make @username link to that user's profile ng.search("//text()").each do |t| if t.parent && t.parent.name.downcase == "a" # don't replace inside s next end tx = t.text.gsub(/\B\@([\w\-]+)/) do |u| if User.exists?(:username => u[1 .. -1]) "#{u}" else u end end t.replace(tx) end end end ng.at_css("body").inner_html end end