class Khaleesi::Generator::HTML

intercept the Redcarpet processing, do the syntax highlighter with Rouge or Pygments.

Public Class Methods

new(opts={}) click to toggle source
Calls superclass method
# File lib/khaleesi/generator.rb, line 541
def initialize(opts={})
  opts.store(:with_toc_data, true)
  # opts.store(:prettify, true)
  opts.store(:xhtml, true)
  super
end

Public Instance Methods

block_code(code, language) click to toggle source
# File lib/khaleesi/generator.rb, line 465
def block_code(code, language)
  language = 'text' if language.to_s.strip.empty?
  css_class = $css_class + ' ' + language
  return pygments_colorize(css_class, code, language) if $use_pygments
  rouge_colorize(css_class, code, language)
end
header(title, level) click to toggle source

intercept header generation, decide which need to output id by settings.

# File lib/khaleesi/generator.rb, line 514
def header(title, level)
  is_unique = $toc_selection.include?('unique')
  "\n<h%s%s>%s</h%s>\n" % [
      level, if $toc_selection.include?(level.to_s)
               " id=\"#{is_unique ? unique_id : header_anchor(title)}\""
             else
               ''
             end, title, level]
end
header_anchor(text) click to toggle source

This method origin from redcarpet-3.1.2/ext/redcarpet/html.c:268.

# File lib/khaleesi/generator.rb, line 525
def header_anchor(text)
  # We must unescape HTML entities because
  # Redcarpet escape them before.
  text = CGI.unescapeHTML(text)

  # delete markup entities.
  text = text.gsub(/<\/?[^>]*>/, '')

  Generator.format_as_legal_link(text)
  text.length < 3 ? unique_id : text
end
pygments_colorize(css_class, code, language) click to toggle source
# File lib/khaleesi/generator.rb, line 472
def pygments_colorize(css_class, code, language)
  opts = {:cssclass => css_class, :linenos => $line_numbers}
  begin
    colored_html = Pygments.highlight(code, :lexer => language, :options => opts)
  rescue MentosError
    colored_html = Pygments.highlight(code, :lexer => 'text', :options => opts)
  end
  return colored_html unless $line_numbers

  # we'll have the html structure consistent whatever line numbers present or not.
  colored_html.sub!(" class=\"#{css_class}table\"", '')
  colored_html.sub!('<div class="linenodiv">', '')
  colored_html.gsub!('</div>', '')
  colored_html.sub!(' class="code"', '')
  root_elements = "<div class=\"#{css_class}\">"
  colored_html.sub!(root_elements, '')
  colored_html.prepend(root_elements).concat('</div>')
  colored_html
end
rouge_colorize(css_class, code, language) click to toggle source
# File lib/khaleesi/generator.rb, line 492
def rouge_colorize(css_class, code, language)
  formatter = Rouge::Formatters::HTML.new(:css_class => css_class, :line_numbers => $line_numbers)
  lexer = Rouge::Lexer.find_fancy(language, code) || Rouge::Lexers::PlainText
  colored_html = formatter.format(lexer.lex(code))

  if $line_numbers
    colored_html.sub!('class="gutter gl" style="text-align: right"', 'class="linenos"')
    colored_html.sub!(' style="border-spacing: 0"', '')
    colored_html.sub!(' class="lineno"', '')
    colored_html.sub!(' class="code"', '')
    colored_html.sub!('<tbody>', '')
    colored_html.sub!('</tbody>', '')
  else
    colored_html.sub!("<code class=\"#{css_class}\">", '')
    colored_html.sub!('</code>', '')
    colored_html.prepend("<div class=\"#{css_class}\">").concat('</div>')
  end

  colored_html
end
unique_id() click to toggle source
# File lib/khaleesi/generator.rb, line 537
def unique_id
  "header-#{$toc_index = $toc_index + 1}"
end