require 'redcarpet'
require 'rouge'
require 'rouge/plugins/redcarpet'
require 'action_view'
module Playbook
module RedcarpetHelper
def markdown(text)
options = {
filter_html: false,
hard_wrap: true,
link_attributes: { rel: 'nofollow', target: "_blank" },
space_after_headers: true,
fenced_code_blocks: true,
no_styles: false,
safe_links_only: true
}
extensions = {
autolink: true,
superscript: true,
fenced_code_blocks: true,
tables: true,
disable_indented_code_blocks: false,
strikethrough: true,
underline: true,
highlight: true,
footnotes: true,
with_toc_data: true,
}
renderer = HTMLBlockCode.new(options)
markdown = Redcarpet::Markdown.new(renderer, extensions)
markdown.render(text).html_safe
end
def rouge(text, language)
formatter = Rouge::Formatters::HTML.new(css_class: 'highlight')
lexer = Rouge::Lexer.find(language)
formatter.format(lexer.lex(text))
end
def rouge_markdown(text)
render_options = {
filter_html: true,
hard_wrap: true,
link_attributes: { rel: 'nofollow' }
}
renderer = HTML.new(render_options)
extensions = {
autolink: true,
fenced_code_blocks: true,
lax_spacing: true,
no_intra_emphasis: true,
strikethrough: true,
superscript: true
}
markdown = Redcarpet::Markdown.new(renderer, extensions)
markdown.render(text)
end
end
class HTML < Redcarpet::Render::HTML
include Rouge::Plugins::Redcarpet
end
class HTMLBlockCode < Redcarpet::Render::HTML
include ActionView::Helpers::AssetTagHelper
def header(title, level)
if level == 7
@headers ||= []
permalink = title.gsub(/\W+/, "-")
if @headers.include?(permalink)
permalink += "_1"
loop do
break if !@headers.include?(permalink)
permalink.gsub!(/\_(\d+)$/, "_#{$1.to_i + 1}")
end
end
@headers << permalink
%(\n