Sha256: 2d23e98cf8db22b3a031d5ab1aaa9bfefbd295fe18463c16ab3fe04ac6142ac5

Contents?: true

Size: 800 Bytes

Versions: 3

Compression:

Stored size: 800 Bytes

Contents

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

Version data entries

3 entries across 3 versions & 2 rubygems

Version Path
htmlentities-4.2.3 lib/htmlentities/decoder.rb
htmlentities-4.2.2 lib/htmlentities/decoder.rb
htmlentitties-4.2.1 lib/htmlentities/decoder.rb