Class: Nanoc3::Filters::ColorizeSyntax

Inherits:
Nanoc3::Filter show all
Defined in:
lib/nanoc3/filters/colorize_syntax.rb

Constant Summary

DEFAULT_COLORIZER =

The default colorizer to use for a language if the colorizer for that language is not overridden.

:coderay
KNOWN_COLORIZERS =
[ :coderay, :dummy, :pygmentize ]

Constants inherited from Nanoc3::Filter

TMP_BINARY_ITEMS_DIR

Instance Attribute Summary

Attributes inherited from Nanoc3::Filter

assigns

Instance Method Summary (collapse)

Methods inherited from Nanoc3::Filter

#filename, from_binary?, #initialize, #output_filename, to_binary?, type

Methods included from PluginRegistry::PluginMethods

#identifier, #identifiers, #named, #register

Methods inherited from Context

#get_binding, #initialize

Constructor Details

This class inherits a constructor from Nanoc3::Filter

Instance Method Details

- (String) run(content, params = {})

Syntax-highlights code blocks in the given content. Code blocks should be enclosed in pre elements that contain a code element. The code element should have a class starting with language- and followed by the programming language, as specified by HTML5.

Options for individual colorizers will be taken from the #run options’ value for the given colorizer. For example, if the filter is invoked with a :coderay => coderay_options_hash option, the coderay_options_hash hash will be passed to the CodeRay colorizer.

Currently, only the :coderay and :pygmentize colorizers are implemented. Additional colorizer implementations are welcome!

Examples:

Content that will be highlighted

<pre><code class="language-ruby">
def foo
  "asdf"
end
</code></pre>

Invoking the filter with custom parameters

filter :colorize_syntax,
       :colorizers => { :ruby => :coderay },
       :coderay    => { :line_numbers => :list }

Parameters:

  • content (String)

    The content to filter

  • params (Hash) (defaults to: {})

    a customizable set of options

Options Hash (params):

  • :syntax (Symbol) — default: :html

    The syntax to use, which can be :html, :xml or :xhtml, the latter two being the same.

  • :colorizers (Hash) — default: DEFAULT_COLORIZER

    A hash containing a mapping of programming languages (symbols, not strings) onto colorizers (symbols).

Returns:

  • (String)

    The filtered content



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/nanoc3/filters/colorize_syntax.rb', line 49

def run(content, params={})
  require 'nokogiri'

  # Take colorizers from parameters
  @colorizers = Hash.new(DEFAULT_COLORIZER)
  (params[:colorizers] || {}).each_pair do |language, colorizer|
    @colorizers[language] = colorizer
  end

  # Colorize
  doc = Nokogiri::HTML.fragment(content)
  doc.css('pre > code[class*="language-"]').each do |element|
    # Get language
    match = element['class'].match(/(^| )language-([^ ]+)/)
    next if match.nil?
    language = match[2]

    # Highlight
    highlighted_code = highlight(element.inner_text, language, params)
    element.inner_html = highlighted_code
  end

  doc.to_html(:encoding => 'UTF-8')
end