The code behind the Ultraviolet textfilter

Posted by Alpha Sun, 02 Dec 2007 05:55:00 GMT

To start, we need to install Ultraviolet. Since the library uses Oniguruma, we’ll have to install that as well.

$ sudo apt-get install libonig-dev
$ sudo gem install ultraviolet

Use irb to copy the CSS syntax files into Typo’s stylesheet directory. From the base directory of the Typo installation:

$ mkdir public/stylesheets/ultraviolet
$ irb -ruv
irb(main):001:0> Uv.copy_files 'xhtml', 'public/stylesheets/ultraviolet'

Copy one of the existing textfilters to use as a base.

$ cd vendor/plugins
$ cp -r typo_textfilter_code typo_textfilter_ultraviolet
$ cd typo_textfilter_ultraviolet
$ mv lib/typo_textfilter_code.rb lib/typo_textfilter_ultraviolet.rb

Modify init.rb to require the Ultraviolet textfilter instead of the code textfilter.

init.rb

# Include hook code here

require 'typo_textfilter_ultraviolet'

And last, edit lib/typo_textfilter_ultraviolet.rb to use Ultraviolet instead of the Syntax library.

lib/typo_textfilter_ultraviolet.rb

require 'uv'

class Typo
  class Textfilter
    class Ultraviolet < TextFilterPlugin::MacroPre
      plugin_display_name "Ultraviolet"
      plugin_description "Apply syntax highlighting to a code block using Ultraviolet"

      def self.help_text
        syntaxes, themes = [Uv.syntaxes, Uv.themes].map do |ary|
          ary.sort.map {|i| "* #{i.gsub('_', '\_')}" }.join("\n")
        end

        %{
This uses the [Ultraviolet](http://ultraviolet.rubyforge.org/) syntax highlighting engine. Options:

* **lang**. Sets the programming language. The default language is Ruby.
* **linenumber**. Turns on line numbering. Use `linenumber="true"` to enable.
* **theme**. Sets the theme. The default theme is Idle.

### Supported themes:
#{themes}

### Supported languages:
#{syntaxes}
}
      end

      def self.macrofilter(blog,content,attrib,params,text="")
        lang       = attrib['lang'] || 'ruby'
        theme      = attrib['theme'] || 'idle'
        linenumber = attrib['linenumber']

        text = text.to_s.gsub(/\r/,'').gsub(/\A\n/,'').chomp

        result = Uv.parse(text, 'xhtml', lang, linenumber, theme)

        set_whiteboard(blog, content, theme)

        "<notextile>#{result}</notextile>"
      end

      def self.set_whiteboard(blog, content, theme)
        content.whiteboard["page_header_ultraviolet_#{theme}"] = <<-HTML
          <link href="#{blog.base_url}/stylesheets/ultraviolet/#{theme}.css" media="all" rel="Stylesheet" type="text/css" />
        HTML
      end 
    end
  end
end

Posted in , ,  | no comments | no trackbacks

Comments

Trackbacks

Use the following link to trackback from your own site:
http://blog.kejadlen.net/trackbacks?article_id=the-code-behind-the-ultraviolet-textfilter&day=01&month=12&year=2007

(leave url/email »)

   Comment Markup Help Preview comment