2005-01-24 19:52:04 +01:00
|
|
|
require 'digest/md5'
|
|
|
|
require 'uri/common'
|
|
|
|
|
|
|
|
# A chunk is a pattern of text that can be protected
|
|
|
|
# and interrogated by a renderer. Each Chunk class has a
|
|
|
|
# +pattern+ that states what sort of text it matches.
|
|
|
|
# Chunks are initalized by passing in the result of a
|
|
|
|
# match by its pattern.
|
|
|
|
module Chunk
|
|
|
|
class Abstract
|
|
|
|
attr_reader :text
|
|
|
|
|
|
|
|
def initialize(match_data) @text = match_data[0] end
|
|
|
|
|
|
|
|
# Find all the chunks of the given type in content
|
|
|
|
# Each time the pattern is matched, create a new
|
|
|
|
# chunk for it, and replace the occurance of the chunk
|
|
|
|
# in this content with its mask.
|
|
|
|
def self.apply_to(content)
|
|
|
|
content.gsub!( self.pattern ) do |match|
|
|
|
|
new_chunk = self.new($~)
|
|
|
|
content.chunks << new_chunk
|
|
|
|
new_chunk.mask(content)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def mask(content)
|
|
|
|
"chunk#{self.object_id}#{self.class.to_s.delete(':').downcase}chunk"
|
|
|
|
end
|
|
|
|
|
|
|
|
def revert(content)
|
|
|
|
content.sub!( Regexp.new(mask(content)), text )
|
|
|
|
end
|
|
|
|
|
|
|
|
def unmask(content)
|
|
|
|
self if revert(content)
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|