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

Ajax

开发平台:

Others

  1. class TextFilterPlugin
  2.   class << self
  3.     include TypoPlugins
  4.     include ActionView::Helpers::TextHelper
  5.     include ActionView::Helpers::TagHelper
  6.   end
  7.   @@filter_map = {}
  8.   def self.inherited(sub)
  9.     if sub.to_s =~ /^Plugin/ or sub.to_s =~ /^Typo::Textfilter/
  10.       name = sub.short_name
  11.       @@filter_map[name] = sub
  12.     end
  13.   end
  14.   def self.filter_map
  15.     @@filter_map
  16.   end
  17.   plugin_display_name "Unknown Text Filter"
  18.   plugin_description "Unknown Text Filter Description"
  19.   def self.reloadable?
  20.     false
  21.   end
  22.   # The name that needs to be used when refering to the plugin's
  23.   # controller in render statements
  24.   def self.component_name
  25.     if (self.to_s =~ /::([a-zA-Z]+)$/)
  26.       "plugins/textfilters/#{$1}".downcase
  27.     else
  28.       raise "I don't know who I am: #{self.to_s}"
  29.     end
  30.   end
  31.   # The name that's stored in the DB.  This is the final chunk of the
  32.   # controller name, like 'markdown' or 'smartypants'.
  33.   def self.short_name
  34.     component_name.split(%r{/}).last
  35.   end
  36.   def self.default_config
  37.     {}
  38.   end
  39.   def self.help_text
  40.     ""
  41.   end
  42.   def self.sanitize(*args)
  43.     (@sanitizer ||= HTML::WhiteListSanitizer.new).sanitize(*args)
  44.   end
  45.   private
  46.   def self.default_helper_module!
  47.   end
  48.   # Look up a config paramater, falling back to the default as needed.
  49.   def self.config_value(params,name)
  50.     params[:filterparams][name] || default_config[name][:default]
  51.   end
  52.   def self.logger
  53.     @logger ||= RAILS_DEFAULT_LOGGER || Logger.new(STDOUT)
  54.   end
  55. end
  56. class TextFilterPlugin::PostProcess < TextFilterPlugin
  57. end
  58. class TextFilterPlugin::Macro < TextFilterPlugin
  59.   # Utility function -- hand it a XML string like <a href="foo" title="bar">
  60.   # and it'll give you back { "href" => "foo", "title" => "bar" }
  61.   def self.attributes_parse(string)
  62.     attributes = Hash.new
  63.     string.gsub(/([^ =]+="[^"]*")/) do |match|
  64.       key,value = match.split(/=/,2)
  65.       attributes[key] = value.gsub(/"/,'')
  66.     end
  67.     string.gsub(/([^ =]+='[^']*')/) do |match|
  68.       key,value = match.split(/=/,2)
  69.       attributes[key] = value.gsub(/'/,'')
  70.     end
  71.     attributes
  72.   end
  73.   def self.filtertext(blog, content, text, params)
  74.     filterparams = params[:filterparams]
  75.     regex1 = /<typo:#{short_name}(?:[ t][^>]*)?/>/
  76.     regex2 = /<typo:#{short_name}([ t][^>]*)?>(.*?)</typo:#{short_name}>/m
  77.     new_text = text.gsub(regex1) do |match|
  78.       macrofilter(blog,content,attributes_parse(match),params)
  79.     end
  80.     new_text = new_text.gsub(regex2) do |match|
  81.       macrofilter(blog,content,attributes_parse($1.to_s),params,$2.to_s)
  82.     end
  83.     new_text
  84.   end
  85. end
  86. class TextFilterPlugin::MacroPre < TextFilterPlugin::Macro
  87. end
  88. class TextFilterPlugin::MacroPost < TextFilterPlugin::Macro
  89. end
  90. class TextFilterPlugin::Markup < TextFilterPlugin
  91. end
  92. class Typo
  93.   class Textfilter
  94.     class MacroPost < TextFilterPlugin
  95.       plugin_display_name "MacroPost"
  96.       plugin_description "Macro expansion meta-filter (post-markup)"
  97.       def self.filtertext(blog,content,text,params)
  98.         filterparams = params[:filterparams]
  99.         macros = TextFilter.available_filter_types['macropost']
  100.         macros.inject(text) do |text,macro|
  101.           macro.filtertext(blog,content,text,params)
  102.         end
  103.       end
  104.     end
  105.     class MacroPre < TextFilterPlugin
  106.       plugin_display_name "MacroPre"
  107.       plugin_description "Macro expansion meta-filter (pre-markup)"
  108.       def self.filtertext(blog,content,text,params)
  109.         filterparams = params[:filterparams]
  110.         macros = TextFilter.available_filter_types['macropre']
  111.         macros.inject(text) do |text,macro|
  112.           macro.filtertext(blog,content,text,params)
  113.         end
  114.       end
  115.     end
  116.   end
  117. end