typo_textfilter_code.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:2k
源码类别:

Ajax

开发平台:

Others

  1. require 'coderay'
  2. require 'htmlentities'
  3. class Typo
  4.   class Textfilter
  5.     class Code < TextFilterPlugin::MacroPre
  6.       plugin_display_name "Code"
  7.       plugin_description "Apply coderay highlighting to a code block"
  8.       DEFAULT_OPTIONS = {:css => :class, 
  9.         :wrap => :span, 
  10.         :line_numbers => nil, 
  11.         :tab_width => 2, 
  12.         :bold_every => 5, 
  13.         :hint => false, 
  14.         :line_number_start => 1}
  15.       def self.help_text
  16.         %{
  17. You can use `<typo:code>` to include syntax-highlighted code blocks.  Example:
  18.     <typo:code lang="ruby">
  19.     class Foo
  20.       def bar
  21.         "abcde"
  22.       end
  23.     end
  24.     </typo:code>
  25. This uses the Ruby [Syntax](http://coderay.rubychan.de) module.  Options:
  26. * **lang**.  Sets the programming language.  Currently supported languages are
  27. `ruby`, `C`, `Delphi`, `HTML`, `RHTML`, `Nitro-XHTML`, `CSS`, `Diff`, `Java`, `Javascript` and `yaml`.  Other languages will format correctly but will not
  28. have syntax highlighting.
  29. * **linenumber**.  Turns on line numbering.  Use `linenumber="true"` to enable.
  30. * **title**.  Adds a title block to the top of the code block.
  31. }
  32.       end
  33.       def self.macrofilter(blog, content, attrib, params, text="")
  34.         lang       = attrib['lang']
  35.         title      = attrib['title']
  36.         if attrib['linenumber'] == "true"
  37.           options = DEFAULT_OPTIONS.merge(:line_numbers => :table,
  38.                                   :wrap => :div)
  39.         else
  40.           options = DEFAULT_OPTIONS
  41.         end
  42.         text = text.to_s.gsub(/r/,'').gsub(/An/,'').chomp
  43.         begin
  44.           text = CodeRay.scan(text, lang.to_sym).span(options)
  45.         rescue
  46.           text = HTMLEntities.new("xhtml1").encode(text)
  47.         end
  48.         text = "<notextile>#{text}</notextile>"
  49.         if(title)
  50.           titlecode="<div class="codetitle">#{title}</div>"
  51.         else
  52.           titlecode=''
  53.         end
  54.         "<div class="CodeRay"><pre>#{titlecode}#{text}</pre></div>"
  55.       end
  56.     end
  57.   end
  58. end