localized_country_select 0.9.7 → 0.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +1 -1
- data/lib/localized_country_select/version.rb +1 -1
- data/lib/tasks/localized_country_select_tasks.rake +119 -29
- metadata +3 -19
data/README.rdoc
CHANGED
@@ -14,6 +14,7 @@ require 'active_support/inflector'
|
|
14
14
|
# LOCALE (required): Sets the locale to use. Output file name will include this.
|
15
15
|
# FORMAT (optional): Output format, either 'rb' or 'yml'. Defaults to 'rb' if not specified.
|
16
16
|
# WEB_LOCALE (optional): Forces a locale code to use when querying the Unicode.org CLDR archive.
|
17
|
+
# PARSER (optional): Forces parser to use. Available are nokogiri, hpricot and libxml.
|
17
18
|
#
|
18
19
|
# == Examples
|
19
20
|
# rake import:country_select LOCALE=de
|
@@ -25,15 +26,8 @@ require 'active_support/inflector'
|
|
25
26
|
|
26
27
|
namespace :import do
|
27
28
|
|
28
|
-
desc "Import country codes and names for various languages from the Unicode.org CLDR archive.
|
29
|
+
desc "Import country codes and names for various languages from the Unicode.org CLDR archive."
|
29
30
|
task :country_select do
|
30
|
-
begin
|
31
|
-
require 'hpricot'
|
32
|
-
rescue LoadError
|
33
|
-
puts "Error: Hpricot library required to use this task (import:country_select)"
|
34
|
-
exit
|
35
|
-
end
|
36
|
-
|
37
31
|
# TODO : Implement locale import chooser from CLDR root via Highline
|
38
32
|
|
39
33
|
# Setup variables
|
@@ -52,33 +46,20 @@ namespace :import do
|
|
52
46
|
# ----- Get the CLDR HTML --------------------------------------------------
|
53
47
|
begin
|
54
48
|
puts "... getting the HTML file for locale '#{web_locale}'"
|
55
|
-
|
49
|
+
url = "http://www.unicode.org/cldr/data/charts/summary/#{web_locale}.html"
|
50
|
+
html = open(url).read
|
56
51
|
rescue => e
|
57
52
|
puts "[!] Invalid locale name '#{web_locale}'! Not found in CLDR (#{e})"
|
58
53
|
exit 0
|
59
54
|
end
|
60
55
|
|
61
56
|
|
62
|
-
|
63
|
-
puts "... parsing the HTML file"
|
64
|
-
countries = []
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
g = row.search("td")
|
69
|
-
if n && n.inner_html =~ /NamesTerritories/ && g.count>=7 && g[4].inner_html =~ /^[A-Z]{2}/
|
70
|
-
code = g[4].inner_text
|
71
|
-
code = code[-code.size, 2].to_sym
|
72
|
-
name = row.search("td[@class='v']").inner_text
|
73
|
-
unless imported_codes.member?(code)
|
74
|
-
imported_codes << code
|
75
|
-
countries << { :code => code, :name => name.to_s }
|
76
|
-
end
|
77
|
-
print " ... #{code}: #{name}"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
puts "\n\n... imported countries: #{countries.count}"
|
81
|
-
puts countries.sort{|a,b| a[:code]<=>b[:code]}.inspect
|
57
|
+
set_parser(ENV['PARSER']) if ENV['PARSER']
|
58
|
+
puts "... parsing the HTML file using #{parser.name.split("::").last}"
|
59
|
+
countries = parser.parse(html).inject([]) { |arr, (code, attrs)| arr << attrs }
|
60
|
+
countries.sort_by! { |c| c[:code] }
|
61
|
+
puts "\n\n... imported #{countries.count} countries:"
|
62
|
+
puts countries.map { |c| "#{c[:code]}: #{c[:name]}" }.join(", ")
|
82
63
|
|
83
64
|
|
84
65
|
# ----- Prepare the output format ------------------------------------------
|
@@ -129,4 +110,113 @@ TAIL
|
|
129
110
|
# ------------------------------------------------------------------------------
|
130
111
|
end
|
131
112
|
|
113
|
+
module LocalizedCountrySelectTasks
|
114
|
+
class Parser
|
115
|
+
attr_reader :html
|
116
|
+
|
117
|
+
def initialize(html)
|
118
|
+
@html = html
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.parse(html)
|
122
|
+
self.new(html).parse
|
123
|
+
end
|
124
|
+
|
125
|
+
def parse
|
126
|
+
raise NotImplementedError, "#parse method need to be implemented in child class!"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
class NokogiriParser < Parser
|
131
|
+
def document
|
132
|
+
@document ||= Nokogiri::HTML(html)
|
133
|
+
end
|
134
|
+
|
135
|
+
def parse
|
136
|
+
document.search("//tr").inject({}) do |hash, row|
|
137
|
+
n = row.search("td[@class='n']")
|
138
|
+
g = row.search("td")
|
139
|
+
if n.inner_html =~ /NamesTerritories/ && g.count >= 7 && g[4].inner_html =~ /^[A-Z]{2}/
|
140
|
+
code = g[4].inner_text
|
141
|
+
code = code[-code.size, 2].to_sym
|
142
|
+
name = row.search("td[@class='v']").inner_text
|
143
|
+
|
144
|
+
hash[code] = {:code => code, :name => name.to_s}
|
145
|
+
end
|
146
|
+
hash
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class HpricotParser < NokogiriParser
|
152
|
+
def document
|
153
|
+
@document ||= Hpricot(html)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
class LibXMLParser < Parser
|
158
|
+
def document
|
159
|
+
@document ||= LibXML::XML::HTMLParser.string(html, options: LibXML::XML::HTMLParser::Options::RECOVER).parse
|
160
|
+
end
|
161
|
+
|
162
|
+
def parse
|
163
|
+
document.find("//tr").inject({}) do |hash, row|
|
164
|
+
n = row.find("td[@class='n']")
|
165
|
+
g = row.find("td")
|
166
|
+
if n.map(&:content).join =~ /NamesTerritories/ && g.count >= 7 && g[4].inner_xml =~ /^[A-Z]{2}/
|
167
|
+
code = g[4].content
|
168
|
+
code = code[-code.size, 2].to_sym
|
169
|
+
name = row.find("td[@class='v']").map(&:content).join
|
170
|
+
|
171
|
+
hash[code] ||= {:code => code, :name => name.to_s}
|
172
|
+
end
|
173
|
+
hash
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
REQUIREMENTS_MAP = [
|
179
|
+
['nokogiri', :Nokogiri],
|
180
|
+
['hpricot', :Hpricot],
|
181
|
+
['libxml', :LibXML]
|
182
|
+
]
|
183
|
+
|
184
|
+
def self.detect_parser
|
185
|
+
REQUIREMENTS_MAP.each do |library, klass|
|
186
|
+
return const_get(:"#{klass}Parser") if const_defined?(klass)
|
187
|
+
end
|
188
|
+
|
189
|
+
REQUIREMENTS_MAP.each do |library, klass|
|
190
|
+
begin
|
191
|
+
require library
|
192
|
+
return const_get(:"#{klass}Parser")
|
193
|
+
rescue LoadError
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
raise StandardError, "One of nokogiri, hpricot or libxml-ruby gem is required! Add \"gem 'nokogiri'\" to your Gemfile to resolve this issue."
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def parser
|
202
|
+
@parser ||= LocalizedCountrySelectTasks.detect_parser
|
203
|
+
end
|
204
|
+
|
205
|
+
def set_parser(arg)
|
206
|
+
@parser = begin
|
207
|
+
parser = nil
|
208
|
+
requirements = LocalizedCountrySelectTasks::REQUIREMENTS_MAP
|
209
|
+
found = requirements.detect { |library, _| library == arg }
|
210
|
+
raise ArgumentError, "Can't find parser for #{arg}! Supported parsers are: #{requirements.map(&:first).join(", ")}." unless found
|
211
|
+
library, klass = found
|
212
|
+
begin
|
213
|
+
require library
|
214
|
+
parser = LocalizedCountrySelectTasks.const_get(:"#{klass}Parser")
|
215
|
+
rescue LoadError
|
216
|
+
gem_name = library == 'libxml' ? 'libxml-ruby' : library
|
217
|
+
raise ArgumentError, "Can't find #{library} library! Add \"gem '#{gem_name}'\" to Gemfile."
|
218
|
+
end
|
219
|
+
parser
|
220
|
+
end
|
221
|
+
end
|
132
222
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: localized_country_select
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date:
|
18
|
+
date: 2014-03-28 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: actionpack
|
@@ -33,22 +33,6 @@ dependencies:
|
|
33
33
|
- - ! '>='
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: '3.0'
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: hpricot
|
38
|
-
requirement: !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ! '>='
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '0'
|
44
|
-
type: :runtime
|
45
|
-
prerelease: false
|
46
|
-
version_requirements: !ruby/object:Gem::Requirement
|
47
|
-
none: false
|
48
|
-
requirements:
|
49
|
-
- - ! '>='
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
version: '0'
|
52
36
|
- !ruby/object:Gem::Dependency
|
53
37
|
name: rspec
|
54
38
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
91
|
version: '0'
|
108
92
|
requirements: []
|
109
93
|
rubyforge_project:
|
110
|
-
rubygems_version: 1.8.23
|
94
|
+
rubygems_version: 1.8.23.2
|
111
95
|
signing_key:
|
112
96
|
specification_version: 3
|
113
97
|
summary: Localized "country_select" helper with Rake task for downloading locales
|