Class: Markly::Renderer::HTML

Inherits:
Generic
  • Object
show all
Defined in:
lib/markly/renderer/html.rb

Instance Attribute Summary

Attributes inherited from Generic

#in_plain, #in_tight

Instance Method Summary collapse

Methods inherited from Generic

#block, #blocksep, #container, #containersep, #cr, #out, #plain, #reference_def, #render

Constructor Details

#initialize(ids: false, tight: false, **options) ⇒ HTML

Returns a new instance of HTML.



17
18
19
20
21
22
23
24
25
# File 'lib/markly/renderer/html.rb', line 17

def initialize(ids: false, tight: false, **options)
  super(**options)
  
  @ids = ids
  @section = nil
  @tight = tight
  
  @footnotes = {}
end

Instance Method Details

#blockquote(node) ⇒ Object



115
116
117
118
119
120
121
# File 'lib/markly/renderer/html.rb', line 115

def blockquote(node)
  block do
    container("<blockquote#{source_position(node)}>\n", '</blockquote>') do
      out(:children)
    end
  end
end

#code(node) ⇒ Object



197
198
199
200
201
# File 'lib/markly/renderer/html.rb', line 197

def code(node)
  out('<code>')
  out(escape_html(node.string_content))
  out('</code>')
end

#code_block(node) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/markly/renderer/html.rb', line 129

def code_block(node)
  block do
    if flag_enabled?(GITHUB_PRE_LANG)
      out("<pre#{source_position(node)}")
      out(' lang="', node.fence_info.split(/\s+/)[0], '"') if node.fence_info && !node.fence_info.empty?
      out('><code>')
    else
      out("<pre#{source_position(node)}><code")
      if node.fence_info && !node.fence_info.empty?
        out(' class="language-', node.fence_info.split(/\s+/)[0], '">')
      else
        out('>')
      end
    end
    out(escape_html(node.string_content))
    out('</code></pre>')
  end
end

#document(_) ⇒ Object



27
28
29
30
31
32
# File 'lib/markly/renderer/html.rb', line 27

def document(_)
  @section = false
  super
  out("</ol>\n</section>\n") if @written_footnote_ix
  out("</section>") if @section
end

#emph(node) ⇒ Object



166
167
168
# File 'lib/markly/renderer/html.rb', line 166

def emph(node)
  out('<em>', :children, '</em>')
end

#footnote_definition(node) ⇒ Object



264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'lib/markly/renderer/html.rb', line 264

def footnote_definition(node)
  unless @footnote_ix
    out("<section class=\"footnotes\" data-footnotes>\n<ol>\n")
    @footnote_ix = 0
  end

  @footnote_ix += 1
  label = node.string_content
  @footnotes[@footnote_ix] = label
  
  out("<li id=\"fn-#{label}\">\n", :children)
  out("\n") if out_footnote_backref
  out("</li>\n")
  # </ol>
  # </section>
end

#footnote_reference(node) ⇒ Object



257
258
259
260
261
262
# File 'lib/markly/renderer/html.rb', line 257

def footnote_reference(node)
  label = node.parent_footnote_def.string_content
  
  out("<sup class=\"footnote-ref\"><a href=\"#fn-#{label}\" id=\"fnref-#{label}\" data-footnote-ref>#{node.string_content}</a></sup>")
  # out(node.to_html)
end

#header(node) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/markly/renderer/html.rb', line 42

def header(node)
  block do
    if @ids
      out('</section>') if @section
      @section = true
      out("<section#{id_for(node)}>")
    end
    
    out('<h', node.header_level, "#{source_position(node)}>", :children,
        '</h', node.header_level, '>')
  end
end

#hrule(node) ⇒ Object



123
124
125
126
127
# File 'lib/markly/renderer/html.rb', line 123

def hrule(node)
  block do
    out("<hr#{source_position(node)} />")
  end
end

#html(node) ⇒ Object



148
149
150
151
152
153
154
155
156
# File 'lib/markly/renderer/html.rb', line 148

def html(node)
  block do
    if flag_enabled?(UNSAFE)
      out(tagfilter(node.string_content))
    else
      out('<!-- raw HTML omitted -->')
    end
  end
end

#id_for(node) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/markly/renderer/html.rb', line 34

def id_for(node)
  if @ids
    id = node.to_plaintext.chomp.downcase.gsub(/\s+/, '-')
    
    return " id=\"#{CGI.escape_html id}\""
  end
end

#image(node) ⇒ Object



184
185
186
187
188
189
190
191
# File 'lib/markly/renderer/html.rb', line 184

def image(node)
  out('<img src="', escape_href(node.url), '"')
  plain do
    out(' alt="', :children, '"')
  end
  out(' title="', escape_html(node.title), '"') if node.title && !node.title.empty?
  out(' />')
end

#inline_html(node) ⇒ Object



158
159
160
161
162
163
164
# File 'lib/markly/renderer/html.rb', line 158

def inline_html(node)
  if flag_enabled?(UNSAFE)
    out(tagfilter(node.string_content))
  else
    out('<!-- raw HTML omitted -->')
  end
end

#linebreak(_node) ⇒ Object



203
204
205
# File 'lib/markly/renderer/html.rb', line 203

def linebreak(_node)
  out("<br />\n")
end


178
179
180
181
182
# File 'lib/markly/renderer/html.rb', line 178

def link(node)
  out('<a href="', node.url.nil? ? '' : escape_href(node.url), '"')
  out(' title="', escape_html(node.title), '"') if node.title && !node.title.empty?
  out('>', :children, '</a>')
end

#list(node) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/markly/renderer/html.rb', line 71

def list(node)
  old_tight = @tight
  @tight = node.list_tight

  block do
    if node.list_type == :bullet_list
      container("<ul#{source_position(node)}>\n", '</ul>') do
        out(:children)
      end
    else
      start = if node.list_start == 1
                "<ol#{source_position(node)}>\n"
              else
                "<ol start=\"#{node.list_start}\"#{source_position(node)}>\n"
              end
      container(start, '</ol>') do
        out(:children)
      end
    end
  end

  @tight = old_tight
end

#list_item(node) ⇒ Object



95
96
97
98
99
100
101
102
# File 'lib/markly/renderer/html.rb', line 95

def list_item(node)
  block do
    tasklist_data = tasklist(node)
    container("<li#{source_position(node)}#{tasklist_data}>#{' ' if tasklist?(node)}", '</li>') do
      out(:children)
    end
  end
end

#paragraph(node) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/markly/renderer/html.rb', line 55

def paragraph(node)
  if @tight && node.parent.type != :blockquote
    out(:children)
  else
    block do
      container("<p#{source_position(node)}>", '</p>') do
        out(:children)
        if node.parent.type == :footnote_definition && node.next.nil?
          out(' ')
          out_footnote_backref
        end
      end
    end
  end
end

#softbreak(_) ⇒ Object



207
208
209
210
211
212
213
214
215
# File 'lib/markly/renderer/html.rb', line 207

def softbreak(_)
  if flag_enabled?(HARD_BREAKS)
    out("<br />\n")
  elsif flag_enabled?(NO_BREAKS)
    out(' ')
  else
    out("\n")
  end
end

#strikethrough(_) ⇒ Object



253
254
255
# File 'lib/markly/renderer/html.rb', line 253

def strikethrough(_)
  out('<del>', :children, '</del>')
end

#strong(node) ⇒ Object



170
171
172
173
174
175
176
# File 'lib/markly/renderer/html.rb', line 170

def strong(node)
  if node.parent.nil? || node.parent.type == node.type
    out(:children)
  else
    out('<strong>', :children, '</strong>')
  end
end

#table(node) ⇒ Object



217
218
219
220
221
222
223
# File 'lib/markly/renderer/html.rb', line 217

def table(node)
  @alignments = node.table_alignments
  @needs_close_tbody = false
  out("<table#{source_position(node)}>\n", :children)
  out("</tbody>\n") if @needs_close_tbody
  out("</table>\n")
end

#table_cell(node) ⇒ Object



242
243
244
245
246
247
248
249
250
251
# File 'lib/markly/renderer/html.rb', line 242

def table_cell(node)
  align = case @alignments[@column_index]
          when :left then ' align="left"'
          when :right then ' align="right"'
          when :center then ' align="center"'
          else; ''
          end
  out(@in_header ? "<th#{align}#{source_position(node)}>" : "<td#{align}#{source_position(node)}>", :children, @in_header ? "</th>\n" : "</td>\n")
  @column_index += 1
end

#table_header(node) ⇒ Object



225
226
227
228
229
230
231
# File 'lib/markly/renderer/html.rb', line 225

def table_header(node)
  @column_index = 0

  @in_header = true
  out("<thead>\n<tr#{source_position(node)}>\n", :children, "</tr>\n</thead>\n")
  @in_header = false
end

#table_row(node) ⇒ Object



233
234
235
236
237
238
239
240
# File 'lib/markly/renderer/html.rb', line 233

def table_row(node)
  @column_index = 0
  if !@in_header && !@needs_close_tbody
    @needs_close_tbody = true
    out("<tbody>\n")
  end
  out("<tr#{source_position(node)}>\n", :children, "</tr>\n")
end

#tasklist(node) ⇒ Object



104
105
106
107
108
109
110
111
112
113
# File 'lib/markly/renderer/html.rb', line 104

def tasklist(node)
  return '' unless tasklist?(node)

  state = if checked?(node)
            'checked="" disabled=""'
          else
            'disabled=""'
  end
  "><input type=\"checkbox\" #{state} /"
end

#text(node) ⇒ Object



193
194
195
# File 'lib/markly/renderer/html.rb', line 193

def text(node)
  out(escape_html(node.string_content))
end