require 'redcarpet.so' require 'redcarpet/compat' module Redcarpet VERSION = '3.5.0' class Markdown attr_reader :renderer end module Render # XHTML Renderer class XHTML < HTML def initialize(extensions = {}) super(extensions.merge(xhtml: true)) end end # HTML + SmartyPants renderer class SmartyHTML < HTML include SmartyPants end # A renderer object you can use to deal with users' input. It # enables +escape_html+ and +safe_links_only+ by default. # # The +block_code+ callback is also overriden not to include # the lang's class as the user can basically specify anything # with the vanilla one. class Safe < HTML def initialize(extensions = {}) super({ escape_html: true, safe_links_only: true }.merge(extensions)) end def block_code(code, lang) "
" \
          "#{html_escape(code)}" \
        "
" end private # TODO: This is far from ideal to have such method as we # are duplicating existing code from Houdini. This method # should be defined at the C level. def html_escape(string) string.gsub(/['&\"<>\/]/, { '&' => '&', '<' => '<', '>' => '>', '"' => '"', "'" => ''', "/" => '/', }) end end # SmartyPants Mixin module # # Implements SmartyPants.postprocess, which # performs smartypants replacements on the HTML file, # once it has been fully rendered. # # To add SmartyPants postprocessing to your custom # renderers, just mixin the module `include SmartyPants` # # You can also use this as a standalone SmartyPants # implementation. # # Example: # # # Mixin # class CoolRenderer < HTML # include SmartyPants # # more code here # end # # # Standalone # Redcarpet::Render::SmartyPants.render("you're") # module SmartyPants extend self def self.render(text) postprocess text end end end end