forked from tent/tent.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmarkdown_html.rb
87 lines (75 loc) · 1.89 KB
/
markdown_html.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
require 'pygments.rb'
require 'cgi'
require 'middleman-core/renderers/redcarpet'
REDCARPET_EXTENTIONS = {
fenced_code_blocks: true,
no_intra_emphasis: true,
autolink: true,
tables: true,
strikethrough: true,
lax_html_blocks: true,
space_after_headers: true,
superscript: true
}.freeze
module MarkdownHelpers
def anchor(text)
text.downcase.strip.gsub(/[^a-z0-9 ]/, '').gsub(/\s+/, '-')
end
def el(el, content, attributes = {})
if content
attrs = attributes ? ' ' + attributes.map { |k,v| "#{k}=\"#{v}\"" }.join(' ') : ''
"<#{el}#{attrs}>\n#{content}</#{el}>\n"
else
''
end
end
end
class Middleman::Renderers::MiddlemanRedcarpetHTML
include Redcarpet::Render::SmartyPants
include MarkdownHelpers
def block_code(code, language)
language == "text" ? el('pre', CGI::escapeHTML(code)) : Pygments.highlight(code, lexer: language)
end
def table(header, body)
el('table', el('thead', header) + el('tbody', body), class: 'table table-striped table-bordered')
end
def header(text, level)
el("h#{level}", text, id: anchor(text))
end
end
class MarkdownHTMLTOC < Redcarpet::Render::Base
include MarkdownHelpers
def header(text, level)
return "" if text =~ /\Alayout:/
html = []
@current_level ||= 2
if level > @current_level
@current_level.upto(level-1) { |d|
html << "<ul class='nav-list'>"
html << '<li>'
}
elsif level < @current_level
html << '</li>'
level.upto(@current_level-1) {
html << '</ul>'
html << '</li>'
}
html << '<li>'
else
html << '</li>'
html << '<li>'
end
@current_level = level
html << el('a', text, href: "#"+anchor(text))
html.join("\n")
end
def doc_footer
html = []
@current_level ||= 2
(@current_level-1).times {
html << "</li>"
html << "</ul>"
}
html.join("\n")
end
end