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