2
locale/tag/rfc.rb - Locale::Tag::Rfc
4
Copyright (C) 2008,2009 Masao Mutoh
6
You may redistribute it and/or modify it under the same
10
require 'locale/tag/common'
15
# Language tag class for RFC4646(BCP47).
17
SINGLETON = '[a-wyz0-9]'
18
VARIANT = "(#{ALPHANUM}{5,8}|#{DIGIT}#{ALPHANUM}{3})"
19
EXTENSION = "(#{SINGLETON}(?:-#{ALPHANUM}{2,8})+)"
20
PRIVATEUSE = "(x(?:-#{ALPHANUM}{1,8})+)"
21
GRANDFATHERED = "#{ALPHA}{1,3}(?:-#{ALPHANUM}{2,8}){1,2}"
23
TAG_RE = /\A#{LANGUAGE}(?:-#{SCRIPT})?
24
(?:-#{REGION})?((?:-#{VARIANT})*
25
(?:-#{EXTENSION})*(?:-#{PRIVATEUSE})?)\Z/ix
27
attr_reader :extensions, :privateuse
30
include Util::Memoizable
31
# Parse the language tag and return the new Locale::Tag::Rfc.
33
if tag =~ /\APOSIX\Z/ # This is the special case of POSIX locale but match this regexp.
36
lang, script, region, subtag = $1, $2, $3, $4
39
if subtag =~ /#{PRIVATEUSE}/
40
subtag, privateuse = $`, $1
41
# Private use for CLDR.
42
if /x-ldml(.*)/ =~ privateuse
44
extensions = p_subtag.scan(/(^|-)#{EXTENSION}/i).collect{|v| p_subtag.sub!(v[1], ""); v[1]}
45
variants = p_subtag.scan(/(^|-)#{VARIANT}(?=(-|$))/i).collect{|v| v[1]}
48
extensions += subtag.scan(/(^|-)#{EXTENSION}/i).collect{|v| subtag.sub!(v[1], ""); v[1]}
49
variants += subtag.scan(/(^|-)#{VARIANT}(?=(-|$))/i).collect{|v| v[1]}
51
ret = self.new(lang, script, region, variants, extensions, privateuse)
61
def initialize(language, script = nil, region = nil, variants = [],
62
extensions = [], privateuse = nil)
63
@extensions, @privateuse = extensions, privateuse
64
super(language, script, region, variants)
67
# Sets the extensions as an Array.
73
# Sets the privateuse as a String
82
klass.new(language, script, region, variants, extensions, privateuse)
85
extensions.sort.each do |v|
86
if v =~ /^k-(#{ALPHANUM}{2,})-(.*)$/i
90
klass.new(language, script, region, variants, exts)
96
# Returns the language tag
97
# <language>-<Script>-<REGION>-<variants>-<extensions>-<PRIVATEUSE>
98
# (e.g.) "ja-Hira-JP-variant"
100
# This is used in internal only. Use to_s instead.
102
s = super.gsub(/_/, "-")
103
@extensions.sort.each do |v|
106
s << "-#{@privateuse}" if @privateuse