Sha256: e9e2462a584b96eb7fa09355d39ed1b3a76011eeca1804ffa1a0b4411ce9a67b

Contents?: true

Size: 1.55 KB

Versions: 2

Compression:

Stored size: 1.55 KB

Contents

require 'iowa/caches/LRUCache'
require 'iowa/Constants'

module Iowa
	class AcceptLanguage

		attr_accessor :default

		QFRXP = /\s*;\s*/

		def initialize(default = Cen)
			@slf = {default => {}}
			@default = default
			@al_cache = Iowa::Caches::LRUCache.new({:maxsize => 100})
		end

		def []=(k,v)
			language,dialect = k.split(C_dash,2)
			if @slf.has_key?(language)
				@slf[language][dialect] = v
			else
				@slf[language] = {dialect => v}
			end
		end

		def [](v)
			language,dialect = v.split(C_dash,2)
			@slf.has_key?(language) ? @slf[language][dialect] : nil
		end

		def generate_language_sequence(alstring)
			seq = []
			alstring.split(C_comma).each do |spec|
				language,qf = spec.split(QFRXP)
				qf.sub!(/q=/,C_empty) if qf
				qf = C_1_0 unless qf.to_s != C_empty
				seq << [language,qf.to_f]
			end
			seq.sort_by {|a| a[1]}.reverse
		end

		def match(alstring)
			return @al_cache[alstring] if @al_cache.include?(alstring)
			r = nil
			seq = generate_language_sequence(alstring)
			seq.each do |litem|
				language,dialect = litem.first.split(C_dash)
				break if @slf[language] and r = @slf[language][dialect]
			end
			r ||= @slf[Cen][nil]
			@al_cache[alstring] = r
			r
		end

		def languages
			r = []
			@slf.each do |language,dlcts|
				dlcts.each_key do |dialect|
					r << (dialect ? "#{language}-#{dialect}" : language)
				end
			end
			r
		end
			
		def dialects(language)
			r = []
			if @slf.has_key?(language)
				@slf[language].each_key do |dialect|
					r << dialect ? "#{language}-#{dialect}" : language
				end
			end
			r
		end

	end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
IOWA-1.0.2 src/iowa/AcceptLanguage.rb
IOWA-1.0.0 src/iowa/AcceptLanguage.rb