lang 0.1.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +46 -0
- data/bin/lang +150 -0
- data/lib/lang/subtags.rb +147 -0
- data/lib/lang/subtags/entry.rb +40 -0
- data/lib/lang/subtags/extlang.rb +19 -0
- data/lib/lang/subtags/grandfathered.rb +9 -0
- data/lib/lang/subtags/language.rb +18 -0
- data/lib/lang/subtags/redundant.rb +9 -0
- data/lib/lang/subtags/region.rb +9 -0
- data/lib/lang/subtags/script.rb +9 -0
- data/lib/lang/subtags/variant.rb +17 -0
- data/lib/lang/tag.rb +141 -0
- data/lib/lang/tag/canonicalization.rb +376 -0
- data/lib/lang/tag/composition.rb +141 -0
- data/lib/lang/tag/filtering.rb +143 -0
- data/lib/lang/tag/grandfathered.rb +36 -0
- data/lib/lang/tag/langtag.rb +437 -0
- data/lib/lang/tag/lookup.rb +77 -0
- data/lib/lang/tag/pattern.rb +31 -0
- data/lib/lang/tag/privateuse.rb +34 -0
- data/lib/lang/version.rb +5 -0
- metadata +108 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'lang/tag'
|
2
|
+
|
3
|
+
module Lang #:nodoc:
|
4
|
+
module Tag
|
5
|
+
|
6
|
+
# Lookup.
|
7
|
+
# RFC 4647, Section 3.4.
|
8
|
+
#
|
9
|
+
module Lookup
|
10
|
+
|
11
|
+
#--
|
12
|
+
# RFC 4647, Section 3.4
|
13
|
+
#
|
14
|
+
# In the lookup scheme, the language range is progressively truncated
|
15
|
+
# from the end until a matching language tag is located. Single letter
|
16
|
+
# or digit subtags (including both the letter 'x', which introduces
|
17
|
+
# private-use sequences, and the subtags that introduce extensions) are
|
18
|
+
# removed at the same time as their closest trailing subtag. For
|
19
|
+
# example, starting with the range "zh-Hant-CN-x-private1-private2"
|
20
|
+
# (Chinese, Traditional script, China, two private-use tags) the lookup
|
21
|
+
# progressively searches for content as shown below:
|
22
|
+
#
|
23
|
+
# Example of a Lookup Fallback Pattern
|
24
|
+
#
|
25
|
+
# Range to match: zh-Hant-CN-x-private1-private2
|
26
|
+
# 1. zh-Hant-CN-x-private1-private2
|
27
|
+
# 2. zh-Hant-CN-x-private1
|
28
|
+
# 3. zh-Hant-CN
|
29
|
+
# 4. zh-Hant
|
30
|
+
# 5. zh
|
31
|
+
# 6. (default)
|
32
|
+
#++
|
33
|
+
|
34
|
+
def lookup_candidates(min_subtags_count = 1)
|
35
|
+
subtags = to_a
|
36
|
+
return nil if min_subtags_count < 1 || subtags.size < min_subtags_count
|
37
|
+
|
38
|
+
candidates = []
|
39
|
+
for i in (min_subtags_count - 1)..(subtags.size - 1) do
|
40
|
+
next if subtags[i].size == 1
|
41
|
+
candidates.unshift subtags[0..i].join(HYPHEN)
|
42
|
+
end
|
43
|
+
candidates
|
44
|
+
end
|
45
|
+
|
46
|
+
def in?(range)
|
47
|
+
range = Composition === range ? range.composition : range.to_str.downcase
|
48
|
+
return true if composition == range
|
49
|
+
range.index(composition) == 0
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
#--
|
55
|
+
# Lookup is defined for the language tags only.
|
56
|
+
#
|
57
|
+
# RFC 4647, Section 3.4
|
58
|
+
# Lookup is used to select the single language tag that best matches
|
59
|
+
# the language priority list for a given request.
|
60
|
+
#++
|
61
|
+
|
62
|
+
class Langtag
|
63
|
+
include Lookup
|
64
|
+
end
|
65
|
+
|
66
|
+
class Grandfathered
|
67
|
+
include Lookup
|
68
|
+
end
|
69
|
+
|
70
|
+
class Privateuse
|
71
|
+
include Lookup
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# EOF
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Lang #:nodoc:
|
2
|
+
module Tag
|
3
|
+
|
4
|
+
module PATTERN
|
5
|
+
|
6
|
+
#--
|
7
|
+
# RFC 5646, sec. 2.2.2:
|
8
|
+
# Although the ABNF production 'extlang' permits up to three
|
9
|
+
# extended language tags in the language tag, extended language
|
10
|
+
# subtags MUST NOT include another extended language subtag in
|
11
|
+
# their 'Prefix'. That is, the second and third extended language
|
12
|
+
# subtag positions in a language tag are permanently reserved and
|
13
|
+
# tags that include those subtags in that position are, and will
|
14
|
+
# always remain, invalid.
|
15
|
+
#++
|
16
|
+
|
17
|
+
LANGUAGE = "[a-z]{2,3}(?:-[a-z]{3})?|[a-z]{4,8}"
|
18
|
+
LOOSE_LANGUAGE = "[a-z]{2,3}(?:-[a-z]{3}){0,3}|[a-z]{4,8}"
|
19
|
+
SCRIPT = "[a-z]{4}"
|
20
|
+
REGION = "[a-z]{2}|\\d{3}"
|
21
|
+
VARIANT = "[a-z\\d]{5,8}|\\d[a-z\\d]{3}"
|
22
|
+
VARIANT_SEQUENCE = "(?:-[a-z\\d]{5,8}|-\\d[a-z\\d]{3})"
|
23
|
+
SINGLETON = "[a-wy-z\\d]"
|
24
|
+
EXTENSION_SEQUENCE = "(?:-#{SINGLETON}(?:-[a-z\\d]{2,8})+)"
|
25
|
+
PRIVATEUSE = "x(?:-[a-z\\d]{1,8})+"
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# EOF
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'lang/tag'
|
2
|
+
|
3
|
+
module Lang #:nodoc:
|
4
|
+
module Tag
|
5
|
+
|
6
|
+
def self.Privateuse(thing)
|
7
|
+
return thing if Privateuse === thing
|
8
|
+
Privateuse.new(thing)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Handles 'privateuse' registrations.
|
12
|
+
#
|
13
|
+
class Privateuse < Composition
|
14
|
+
|
15
|
+
def initialize(thing)
|
16
|
+
raise TypeError, "Can't convert #{thing.class} into String" unless thing.respond_to?(:to_str)
|
17
|
+
sequence = thing.to_str
|
18
|
+
unless Lang::Tag.privateuse?(sequence)
|
19
|
+
raise ArgumentError, "#{sequence.inspect} is not a privateuse language tag"
|
20
|
+
end
|
21
|
+
@sequence = sequence
|
22
|
+
end
|
23
|
+
|
24
|
+
def nicecase!
|
25
|
+
@sequence.downcase!
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# EOF
|
data/lib/lang/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lang
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 961915980
|
5
|
+
prerelease: true
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
- pre
|
11
|
+
version: 0.1.0.pre
|
12
|
+
platform: ruby
|
13
|
+
authors:
|
14
|
+
- SSDany
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-09-06 00:00:00 +04:00
|
20
|
+
default_executable: lang
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: rspec
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 31
|
31
|
+
segments:
|
32
|
+
- 1
|
33
|
+
- 2
|
34
|
+
- 0
|
35
|
+
version: 1.2.0
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id001
|
38
|
+
description: |
|
39
|
+
Language tags implementation.
|
40
|
+
Features: basic and extended filtering (RFC 4647), canonicalization (using IANA language subtag registry).
|
41
|
+
|
42
|
+
email: inadsence@gmail.com
|
43
|
+
executables:
|
44
|
+
- lang
|
45
|
+
extensions: []
|
46
|
+
|
47
|
+
extra_rdoc_files:
|
48
|
+
- README.rdoc
|
49
|
+
files:
|
50
|
+
- README.rdoc
|
51
|
+
- lib/lang/subtags/entry.rb
|
52
|
+
- lib/lang/subtags/extlang.rb
|
53
|
+
- lib/lang/subtags/grandfathered.rb
|
54
|
+
- lib/lang/subtags/language.rb
|
55
|
+
- lib/lang/subtags/redundant.rb
|
56
|
+
- lib/lang/subtags/region.rb
|
57
|
+
- lib/lang/subtags/script.rb
|
58
|
+
- lib/lang/subtags/variant.rb
|
59
|
+
- lib/lang/subtags.rb
|
60
|
+
- lib/lang/tag/canonicalization.rb
|
61
|
+
- lib/lang/tag/composition.rb
|
62
|
+
- lib/lang/tag/filtering.rb
|
63
|
+
- lib/lang/tag/grandfathered.rb
|
64
|
+
- lib/lang/tag/langtag.rb
|
65
|
+
- lib/lang/tag/lookup.rb
|
66
|
+
- lib/lang/tag/pattern.rb
|
67
|
+
- lib/lang/tag/privateuse.rb
|
68
|
+
- lib/lang/tag.rb
|
69
|
+
- lib/lang/version.rb
|
70
|
+
- bin/lang
|
71
|
+
has_rdoc: true
|
72
|
+
homepage: http://github.com/SSDany/lang
|
73
|
+
licenses: []
|
74
|
+
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
hash: 25
|
95
|
+
segments:
|
96
|
+
- 1
|
97
|
+
- 3
|
98
|
+
- 1
|
99
|
+
version: 1.3.1
|
100
|
+
requirements: []
|
101
|
+
|
102
|
+
rubyforge_project: lang
|
103
|
+
rubygems_version: 1.3.7
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: Language tags implementation.
|
107
|
+
test_files: []
|
108
|
+
|