blob: 42e773d9eaf7675ac8439654d4e0d91eeefbfec8 [file] [log] [blame]
# -*- coding: utf-8 -*-
#
#--
# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
#
# This file is part of kramdown which is licensed under the MIT.
#++
#
module Kramdown
module Utils
if RUBY_VERSION < '1.9'
# A partial hash implementation which preserves the insertion order of the keys.
#
# *Note* that this class is only used on Ruby 1.8 since the built-in Hash on Ruby 1.9
# automatically preserves the insertion order. However, to remain compatibility only the
# methods defined in this class may be used when working with OrderedHash on Ruby 1.9.
class OrderedHash
include Enumerable
# Initialize the OrderedHash object.
def initialize
@data = {}
@order = []
end
# Iterate over the stored keys in insertion order.
def each
@order.each {|k| yield(k, @data[k])}
end
# Return the value for the +key+.
def [](key)
@data[key]
end
# Return +true+ if the hash contains the key.
def has_key?(key)
@data.has_key?(key)
end
# Return +true+ if the hash contains no keys.
def empty?
@data.empty?
end
# Set the value for the +key+ to +val+.
def []=(key, val)
@order << key if !@data.has_key?(key)
@data[key] = val
end
# Delete the +key+.
def delete(key)
@order.delete(key)
@data.delete(key)
end
def merge!(other)
other.each {|k,v| self[k] = v}
self
end
def dup #:nodoc:
new_object = super
new_object.instance_variable_set(:@data, @data.dup)
new_object.instance_variable_set(:@order, @order.dup)
new_object
end
def ==(other) #:nodoc:
return false unless other.kind_of?(self.class)
@data == other.instance_variable_get(:@data) && @order == other.instance_variable_get(:@order)
end
def inspect #:nodoc:
"{" + map {|k,v| "#{k.inspect}=>#{v.inspect}"}.join(" ") + "}"
end
end
else
OrderedHash = Hash
end
end
end