Class: Khaleesi::Generator::HTML

Inherits:
Redcarpet::Render::HTML
  • Object
show all
Defined in:
lib/khaleesi/generator.rb

Overview

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

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ HTML

Returns a new instance of HTML.



541
542
543
544
545
546
# 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

Instance Method Details

#block_code(code, language) ⇒ Object



465
466
467
468
469
470
# 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) ⇒ Object

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



514
515
516
517
518
519
520
521
522
# 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) ⇒ Object

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



525
526
527
528
529
530
531
532
533
534
535
# 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) ⇒ Object



472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
# 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) ⇒ Object



492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
# 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_idObject



537
538
539
# File 'lib/khaleesi/generator.rb', line 537

def unique_id
  "header-#{$toc_index = $toc_index + 1}"
end