class HTMLEntities class Decoder #:nodoc: def initialize(flavor) @flavor = flavor @map = HTMLEntities::MAPPINGS[@flavor] @named_entity_regexp = named_entity_regexp end def decode(source) source.to_s.gsub(@named_entity_regexp) { (codepoint = @map[$1]) ? [codepoint].pack('U') : $& }.gsub(/&#(?:([0-9]{1,7})|x([0-9a-f]{1,6}));/i) { $1 ? [$1.to_i].pack('U') : [$2.to_i(16)].pack('U') } end private def named_entity_regexp key_lengths = @map.keys.map{ |k| k.length } entity_name_pattern = if @flavor == 'expanded' '(?:b\.)?[a-z][a-z0-9]' else '[a-z][a-z0-9]' end /&(#{ entity_name_pattern }{#{ key_lengths.min - 1 },#{ key_lengths.max - 1 }});/i end end end