-
Notifications
You must be signed in to change notification settings - Fork 524
/
redcarpet.rb
124 lines (108 loc) · 2.94 KB
/
redcarpet.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
require 'redcarpet.so'
module Redcarpet
VERSION = '2.1.1'
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
# 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
# Compatibility class;
# Creates an instance of Redcarpet with the RedCloth API.
class RedcarpetCompat
attr_accessor :text
def initialize(text, *exts)
exts_hash, render_hash = *parse_extensions_and_renderer_options(exts)
@text = text
renderer = Redcarpet::Render::HTML.new(render_hash)
@markdown = Redcarpet::Markdown.new(renderer, exts_hash)
end
def to_html(*_dummy)
@markdown.render(@text)
end
private
EXTENSION_MAP = {
# old name => new name
:autolink => :autolink,
:fenced_code => :fenced_code_blocks,
:filter_html => :filter_html,
:hard_wrap => :hard_wrap,
:lax_htmlblock => :lax_html_blocks,
:no_image => :no_images,
:no_intraemphasis => :no_intra_emphasis,
:no_links => :no_links,
:filter_styles => :no_styles,
:safelink => :safe_links_only,
:space_header => :space_after_headers,
:strikethrough => :strikethrough,
:tables => :tables,
:generate_toc => :with_toc_data,
:xhtml => :xhtml,
# old names with no new mapping
:gh_blockcode => nil,
:no_tables => nil,
:smart => nil,
:strict => nil
}
RENDERER_OPTIONS = [:filter_html, :no_images, :no_links, :no_styles,
:safe_links_only, :with_toc_data, :hard_wrap, :xhtml]
def rename_extensions(exts)
exts.map do |old_name|
if new_name = EXTENSION_MAP[old_name]
new_name
else
old_name
end
end.compact
end
# Returns two hashes, the extensions and renderer options
# given the extension list
def parse_extensions_and_renderer_options(exts)
exts = rename_extensions(exts)
exts.partition {|ext| !RENDERER_OPTIONS.include?(ext) }.
map {|list| list_to_truthy_hash(list) }
end
# Turns a list of symbols into a hash of <tt>symbol => true</tt>.
def list_to_truthy_hash(list)
list.inject({}) {|h, k| h[k] = true; h }
end
end