Guest User

Untitled

a guest
Apr 23rd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. require "qerub/singleton_class"
  2.  
  3. module TextFilter
  4. class Error < StandardError
  5. end
  6.  
  7. class << self
  8. def process(filename, data, variables = {})
  9. find_filter_chain(filename).inject(data) { |data, filter| filter.process(data, variables) }
  10. end
  11.  
  12. def find_filter_chain(filename)
  13. basename, *extensions = filename.split(".")
  14.  
  15. require("enumerator")
  16. steps = extensions.reverse.enum_cons(2).to_a
  17.  
  18. plugins = TextFilter::Plugin.subclasses
  19.  
  20. steps.map do |from, to|
  21. plugin = plugins.find do |plugin|
  22. plugin.handles[from] == to
  23. end
  24.  
  25. plugin ||= plugins.find do |plugin|
  26. plugin.handles[from] == "*"
  27. end
  28.  
  29. if plugin
  30. next plugin
  31. else
  32. raise Error, "Could not find a TextFilter plugin for converting from #{from} to #{to}"
  33. end
  34. end
  35. end
  36. end
  37.  
  38. class Plugin
  39. class << self
  40. def subclasses
  41. @subclasses ||= []
  42. end
  43.  
  44. def inherited(klass)
  45. subclasses << klass
  46. end
  47.  
  48. def process(*args)
  49. new.filter(*args)
  50. end
  51.  
  52. def handles
  53. @handles ||= {}
  54. end
  55.  
  56. def handles=(value)
  57. @handles = value
  58. end
  59. end
  60. end
  61.  
  62. class Context
  63. def initialize(env)
  64. env.each do |key, value|
  65. singleton_class.instance_eval do
  66. define_method(key) { value }
  67. end
  68. end
  69. end
  70.  
  71. def context_binding
  72. binding
  73. end
  74. end
  75.  
  76. module Plugins
  77. class TextileFilter < Plugin
  78. self.handles = { "textile" => "html" }
  79.  
  80. def filter(text, env)
  81. require("redcloth")
  82. RedCloth.new(text).to_html
  83. end
  84. end
  85.  
  86. class HTMLStripper < Plugin
  87. self.handles = { "html" => "txt" }
  88.  
  89. def filter(text, env)
  90. text.gsub(/<.*?>/, "")
  91. end
  92. end
  93.  
  94. class ERBFilter < Plugin
  95. self.handles = { "erb" => "*" }
  96.  
  97. def filter(text, env)
  98. require("erb")
  99.  
  100. context = Context.new(env)
  101. context.extend(ERB::Util)
  102.  
  103. ERB.new(text, nil, "-").result(context.context_binding)
  104. end
  105. end
  106. end
  107. end
Add Comment
Please, Sign In to add comment