twitter/twitter-cldr-rb

View on GitHub
lib/twitter_cldr/resources/cldr_locale.rb

Summary

Maintainability
A
25 mins
Test Coverage
# encoding: UTF-8

# Copyright 2012 Twitter, Inc
# http://www.apache.org/licenses/LICENSE-2.0

require 'nokogiri'

module TwitterCldr
  module Resources

    class CldrLocale
      attr_reader :base_locale, :cldr_requirement

      def initialize(base_locale, cldr_requirement)
        @base_locale = base_locale
        @cldr_requirement = cldr_requirement
      end

      def ancestors
        @ancestors ||= [].tap do |ancestry|
          locale = from_fs(base_locale)
          ancestry << locale

          loop do
            cur = from_fs(ancestry.last)

            if parents = parent_locales[cur]
              ancestry << to_fs(parents)
            elsif I18n::Locale::Tag.tag(cur).self_and_parents.count > 1
              ancestry << I18n::Locale::Tag.tag(cur).self_and_parents.last.to_sym
            else
              parents = TwitterCldr::Shared::Locale
                .parse(cur)
                .permutations

              ancestry.concat(parents - [cur])
              break
            end
          end

          ancestry.select! do |locale|
            File.exist?(File.join(cldr_requirement.common_path, 'main', "#{from_fs(locale)}.xml"))
          end

          ancestry << "root"
          ancestry.freeze
        end
      end

      private

      def to_fs(locale)
        locale.to_s.gsub('_', '-').to_sym
      end

      def from_fs(locale)
        locale.to_s.gsub('-', '_')
      end

      def parent_locales
        @parent_locales ||= supplemental_data.xpath('//parentLocales/parentLocale').each_with_object({}) do |node, ret|
          parent = node.attr('parent')
          locales = node.attr('locales').split(' ')

          locales.each do |locale|
            ret[locale] = parent
          end
        end
      end

      def supplemental_data
        @supplemental_data ||= Nokogiri.XML(
          File.read(File.join(cldr_requirement.common_path, 'supplemental', 'supplementalData.xml'))
        )
      end
    end

  end
end