def run(content, params={})
@colorizers = Hash.new(params[:default_colorizer] || DEFAULT_COLORIZER)
(params[:colorizers] || {}).each_pair do |language, colorizer|
@colorizers[language] = colorizer
end
syntax = params[:syntax] || :html
case syntax
when :html
klass = Nokogiri::HTML
when :xml, :xhtml
klass = Nokogiri::XML
else
raise RuntimeError, "unknown syntax: #{syntax.inspect} (expected :html or :xml)"
end
is_fullpage = params.fetch(:is_fullpage) { false }
doc = is_fullpage ? klass.parse(content, nil, 'UTF-8') : klass.fragment(content)
selector = params[:outside_pre] ? 'code' : 'pre > code'
doc.css(selector).each do |element|
has_class = false
language = nil
if element['class']
match = element['class'].match(/(^| )language-([^ ]+)/)
language = match[2] if match
has_class = true if language
else
match = element.inner_text.strip.split[0].match(/^#!([^\/][^\n]*)$/)
language = match[1] if match
element.content = element.content.sub(/^#!([^\/][^\n]*)$\n/, '') if language
end
next if language.nil?
raw = strip(element.inner_text)
highlighted_code = highlight(raw, language, params)
element.children = Nokogiri::HTML.fragment(strip(highlighted_code), 'utf-8')
unless has_class
klass = element['class'] || ''
klass << ' ' unless [' ', nil].include?(klass[-1,1])
klass << "language-#{language}"
element['class'] = klass
end
self.highlight_postprocess(language, element.parent)
end
method = "to_#{syntax}".to_sym
doc.send(method, :encoding => 'UTF-8')
end