Method: Packr::RegexpGroup::Item#initialize
- Defined in:
- lib/packr/regexp_group.rb
#initialize(expression, replacement = nil) ⇒ Item
Returns a new instance of Item.
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/packr/regexp_group.rb', line 66 def initialize(expression, replacement = nil) @expression = expression if replacement.nil? replacement = IGNORE elsif replacement.respond_to?(:replacement) replacement = replacement.replacement elsif !replacement.is_a?(Proc) replacement = replacement.to_s end # does the pattern use sub-expressions? if replacement.is_a?(String) and replacement =~ LOOKUP # a simple lookup? (e.g. "\2") if replacement.gsub(/\n/, " ") =~ LOOKUP_SIMPLE # store the index (used for fast retrieval of matched strings) replacement = replacement[1..-1].to_i else # a complicated lookup (e.g. "Hello \2 \1") # build a function to do the lookup # Improved version by Alexei Gorkov: q = '"' replacement_string = replacement. gsub(/\\/, "\\\\"). gsub(/"/, "\\x22"). gsub(/\n/, "\\n"). gsub(/\r/, "\\r"). gsub(/\\(\d+)/, q + "+(args[\\1]||" + q+q + ")+" + q). gsub(/(['"])\1\+(.*)\+\1\1$/, '\1') replacement = lambda { |*args| eval(q + replacement_string + q) } # My old crappy version: # q = (replacement.gsub(/\\./, "") =~ /'/) ? '"' : "'" # replacement = replacement.gsub(/\r/, "\\r").gsub(/\\(\d+)/, # q + "+(args[\\1]||" + q+q + ")+" + q) # replacement_string = q + replacement.gsub(/(['"])\1\+(.*)\+\1\1$/, '\1') + q # replacement = lambda { |*args| eval(replacement_string) } end end @length = RegexpGroup.count(@expression) @replacement = replacement end |