blacklight_range_limit 6.0.0 → 6.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 88ce4d1a9977401229bc5968d114d72ffcb78300
4
- data.tar.gz: d74d58e4259a6308a77738fc612c6b25e8e33747
3
+ metadata.gz: 9a7e3c9e6d2481f927f6708d27337418e2edfcca
4
+ data.tar.gz: 60c2fb4b80413efc33004628c5917cd988f24878
5
5
  SHA512:
6
- metadata.gz: 90d24009d5a9c91e3dd11c49f730367e923d8ab175fa5948d4f4f232af0ec8a99827a1b708b78793ab2ab357539220e760719f87c8104aed9567e900b7ee95e5
7
- data.tar.gz: d329af1791c03d119e8b22855c03783edbdd643fbd688d00babb9b4b4d0819c15e6d33e3310e2807476329a5fe37d65442691fd1e082dbed3580a74e5eb50a06
6
+ metadata.gz: a26003bd6a7dae668e7fbaeaa4624d4f14cc1827ed5de1c0e8496d41fab1b54e2fe9308f33cd292757db2051039040fbde879cabfe7e3b495fee684fece3fb3d
7
+ data.tar.gz: 62a295ad0d129b5a43224455656fad137ec2c38e7da9b63e1ac2cae36ffeaace78bf6f355ffb1316595e91d6f93bbece84b7125819d59a0b1e4759d5efb303c0
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.solr_wrapper.yml ADDED
@@ -0,0 +1,6 @@
1
+ # Place any default configuration for solr_wrapper here
2
+ port: 8983
3
+ verbose: true
4
+ collection:
5
+ dir: solr/conf/
6
+ name: blacklight-core
data/.travis.yml CHANGED
@@ -4,7 +4,7 @@ notifications:
4
4
  language: ruby
5
5
  sudo: false
6
6
  rvm:
7
- - 2.2.2
7
+ - 2.3.1
8
8
 
9
9
  before_install:
10
10
  - gem install bundler
@@ -15,4 +15,6 @@ notifications:
15
15
  - blacklight-commits@googlegroups.com
16
16
 
17
17
  global_env:
18
- - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
18
+ - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
19
+
20
+ jdk: oraclejdk8
data/Gemfile CHANGED
@@ -3,10 +3,10 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  # BEGIN ENGINE_CART BLOCK
6
- # engine_cart: 0.8.0
7
- # engine_cart stanza: 0.8.0
6
+ # engine_cart: 0.10.0
7
+ # engine_cart stanza: 0.10.0
8
8
  # the below comes from engine_cart, a gem used to test this Rails engine gem in the context of a Rails app.
9
- file = File.expand_path("Gemfile", ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_ROOT'] || File.expand_path(".internal_test_app", File.dirname(__FILE__)))
9
+ file = File.expand_path('Gemfile', ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_ROOT'] || File.expand_path('.internal_test_app', File.dirname(__FILE__)))
10
10
  if File.exist?(file)
11
11
  begin
12
12
  eval_gemfile file
@@ -17,15 +17,22 @@ if File.exist?(file)
17
17
  else
18
18
  Bundler.ui.warn "[EngineCart] Unable to find test application dependencies in #{file}, using placeholder dependencies"
19
19
 
20
- gem 'rails', ENV['RAILS_VERSION'] if ENV['RAILS_VERSION']
20
+ if ENV['RAILS_VERSION']
21
+ if ENV['RAILS_VERSION'] == 'edge'
22
+ gem 'rails', github: 'rails/rails'
23
+ ENV['ENGINE_CART_RAILS_OPTIONS'] = '--edge --skip-turbolinks'
24
+ else
25
+ gem 'rails', ENV['RAILS_VERSION']
26
+ end
27
+ end
21
28
 
22
- if ENV['RAILS_VERSION'].nil? || ENV['RAILS_VERSION'] =~ /^4.2/
23
- gem 'bootstrap-sass', '>= 3.3.5.1'
24
- gem 'responders', "~> 2.0"
25
- gem 'sass-rails', ">= 5.0"
26
- else
27
- gem 'bootstrap-sass', '< 3.3.5' # 3.3.5 requires sass 3.3, incompatible with sass-rails 4.x
28
- gem 'sass-rails', "< 5.0"
29
+ case ENV['RAILS_VERSION']
30
+ when /^4.2/
31
+ gem 'responders', '~> 2.0'
32
+ gem 'sass-rails', '>= 5.0'
33
+ gem 'coffee-rails', '~> 4.1.0'
34
+ when /^4.[01]/
35
+ gem 'sass-rails', '< 5.0'
29
36
  end
30
37
  end
31
38
  # END ENGINE_CART BLOCK
data/README.md CHANGED
@@ -86,7 +86,8 @@ config.add_facet_field 'pub_date', label: 'Publication Year',
86
86
  range: {
87
87
  num_segments: 6,
88
88
  assumed_boundaries: [1100, Time.now.year + 2],
89
- segments: false
89
+ segments: false,
90
+ maxlength: 4
90
91
  }
91
92
  ```
92
93
 
@@ -96,6 +97,8 @@ config.add_facet_field 'pub_date', label: 'Publication Year',
96
97
  * Default null. For a result set that has not yet been limited, instead of taking boundaries from results and making a second AJAX request to fetch segments, just assume these given boundaries. If you'd like to avoid this second AJAX Solr call, you can set :assumed_boundaries to a two-element array of integers instead, and the assumed boundaries will always be used. Note this is live ruby code, you can put calculations in there like Time.now.year + 2.
97
98
  * **:segments** :
98
99
  * Default true. If set to false, then distribution segment facets will not be loaded at all.
100
+ * **:maxlength** :
101
+ * Default 4. Changes the value of the `maxlength` attribute of the text boxes, which determines how many digits can be entered.
99
102
 
100
103
  ## Javascript dependencies
101
104
 
@@ -134,10 +137,10 @@ is probably the best touch UI anyway, if it can be made to work well.
134
137
 
135
138
  # Tests
136
139
 
137
- Test coverage is not great, but there are some tests, using rspec. Run `rake ci` or just `rake` to seed and
140
+ Test coverage is not great, but there are some tests, using rspec. Run `bundle exec rake ci` or just `bundle exec rake` to seed and
138
141
  start a demo jetty server, build a clean test app, and run tests.
139
142
 
140
- Just `rake spec` to just run tests against an existing test app and jetty server.
143
+ Just `bundle exec rake spec` to just run tests against an existing test app and jetty server.
141
144
 
142
145
  # Possible future To Do
143
146
 
data/Rakefile CHANGED
@@ -1,45 +1,34 @@
1
1
  require 'rake'
2
-
3
-
4
2
  require 'bundler'
5
3
  Bundler::GemHelper.install_tasks
6
4
 
7
5
  require 'rspec/core/rake_task'
8
-
9
6
  require 'engine_cart/rake_task'
7
+ require 'solr_wrapper'
10
8
 
11
9
  EngineCart.fingerprint_proc = EngineCart.rails_fingerprint_proc
12
10
 
13
- ZIP_URL = "https://github.com/projectblacklight/blacklight-jetty/archive/v4.10.4.zip"
14
-
15
- require 'jettywrapper'
16
-
17
11
  task :default => :ci
18
12
 
19
13
  desc "Run specs"
20
- RSpec::Core::RakeTask.new do |t|
14
+ RSpec::Core::RakeTask.new
21
15
 
22
- end
23
-
24
- task :ci => ['jetty:clean', 'engine_cart:generate'] do
25
- jetty_params = Jettywrapper.load_config('test')
26
- jetty_params[:startup_wait]= 60
27
- error = Jettywrapper.wrap(jetty_params) do
28
- Rake::Task["test:seed"].invoke
29
- Rake::Task['spec'].invoke
16
+ task ci: ['engine_cart:generate'] do
17
+ SolrWrapper.wrap do |solr|
18
+ solr.with_collection(name: 'blacklight-core', dir: File.join(File.expand_path(File.dirname(__FILE__)), "solr", "conf")) do
19
+ Rake::Task["test:seed"].invoke
20
+ Rake::Task['spec'].invoke
21
+ end
30
22
  end
31
- raise "test failures: #{error}" if error
32
23
  end
33
24
 
34
25
  namespace :test do
35
-
36
26
  desc "Put sample data into solr"
37
- task :seed => ['engine_cart:generate'] do
27
+ task seed: ['engine_cart:generate'] do
38
28
  within_test_app do
39
29
  ENV['RAILS_ENV'] ||= 'test'
40
30
  system "rake blacklight:index:seed"
41
31
  system "rake blacklight_range_limit:seed"
42
32
  end
43
33
  end
44
-
45
34
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 6.0.0
1
+ 6.1.0
@@ -2,14 +2,14 @@
2
2
  module RangeLimitHelper
3
3
 
4
4
  # type is 'begin' or 'end'
5
- def render_range_input(solr_field, type, input_label = nil)
5
+ def render_range_input(solr_field, type, input_label = nil, maxlength=4)
6
6
  type = type.to_s
7
7
 
8
8
  default = params["range"][solr_field][type] if params["range"] && params["range"][solr_field] && params["range"][solr_field][type]
9
9
 
10
10
  html = label_tag("range[#{solr_field}][#{type}]", input_label, class: 'sr-only') if input_label.present?
11
11
  html ||= ''.html_safe
12
- html += text_field_tag("range[#{solr_field}][#{type}]", default, :maxlength=>4, :class => "form-control range_#{type}")
12
+ html += text_field_tag("range[#{solr_field}][#{type}]", default, :maxlength=>maxlength, :class => "form-control range_#{type}")
13
13
  end
14
14
 
15
15
  # type is 'min' or 'max'
@@ -63,7 +63,7 @@ module RangeLimitHelper
63
63
  end
64
64
 
65
65
  def add_range_missing(solr_field, my_params = params)
66
- my_params = Marshal.load(Marshal.dump(my_params))
66
+ my_params = Blacklight::SearchState.new(my_params, blacklight_config).to_h
67
67
  my_params["range"] ||= {}
68
68
  my_params["range"][solr_field] ||= {}
69
69
  my_params["range"][solr_field]["missing"] = "true"
@@ -77,7 +77,7 @@ module RangeLimitHelper
77
77
  end
78
78
 
79
79
  def add_range(solr_field, from, to, my_params = params)
80
- my_params = Marshal.load(Marshal.dump(my_params))
80
+ my_params = Blacklight::SearchState.new(my_params, blacklight_config).to_h
81
81
  my_params["range"] ||= {}
82
82
  my_params["range"][solr_field] ||= {}
83
83
 
@@ -1,10 +1,10 @@
1
1
  <%- # requires solr_config local passed in
2
-
3
2
  field_config = range_config(solr_field)
4
3
  label = facet_field_label(solr_field)
5
4
 
6
5
  input_label_range_begin = field_config[:input_label_range_begin] || t("blacklight.range_limit.range_begin", field_label: label)
7
6
  input_label_range_end = field_config[:input_label_range_end] || t("blacklight.range_limit.range_end", field_label: label)
7
+ maxlength = field_config[:maxlength]
8
8
  -%>
9
9
 
10
10
  <div class="limit_content range_limit">
@@ -39,7 +39,7 @@
39
39
  <%= hidden_field_tag("search_field", "dummy_range") %>
40
40
  <% end %>
41
41
 
42
- <%= render_range_input(solr_field, :begin, input_label_range_begin) %> – <%= render_range_input(solr_field, :end, input_label_range_end) %>
42
+ <%= render_range_input(solr_field, :begin, input_label_range_begin, maxlength) %> – <%= render_range_input(solr_field, :end, input_label_range_end, maxlength) %>
43
43
  <%= submit_tag t('blacklight.range_limit.submit_limit'), :class=>'submit btn btn-default' %>
44
44
 
45
45
  <% end %>
@@ -67,7 +67,7 @@
67
67
  <%= render(:partial => "blacklight_range_limit/range_segments", :locals => {:solr_field => solr_field}) %>
68
68
 
69
69
  <% else %>
70
- <%= link_to('View distribution', params.merge(:action => 'range_limit', :range_field => solr_field, :range_start => min, :range_end => max), :class => "load_distribution") %>
70
+ <%= link_to('View distribution', search_state.to_h.merge(action: 'range_limit', range_field: solr_field, range_start: min, range_end: max), :class => "load_distribution") %>
71
71
  <% end %>
72
72
  </div>
73
73
  <% end %>
@@ -1,31 +1,31 @@
1
1
  # -*- coding: utf-8 -*-
2
- require File.join(File.dirname(__FILE__), "lib/blacklight_range_limit/version")
2
+ require File.join(File.dirname(__FILE__), 'lib/blacklight_range_limit/version')
3
3
 
4
4
  Gem::Specification.new do |s|
5
- s.name = "blacklight_range_limit"
6
- s.version = BlacklightRangeLimit::VERSION
5
+ s.name = 'blacklight_range_limit'
6
+ s.version = BlacklightRangeLimit::VERSION
7
7
  s.platform = Gem::Platform::RUBY
8
- s.authors = ["Jonathan Rochkind", "Chris Beer"]
9
- s.email = ["blacklight-development@googlegroups.com"]
10
- s.homepage = "https://github.com/projectblacklight/blacklight_range_limit"
11
- s.summary = "Blacklight Range Limit plugin"
8
+ s.authors = ['Jonathan Rochkind', 'Chris Beer']
9
+ s.email = ['blacklight-development@googlegroups.com']
10
+ s.homepage = 'https://github.com/projectblacklight/blacklight_range_limit'
11
+ s.summary = 'Blacklight Range Limit plugin'
12
12
 
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
- s.require_paths = ["lib"]
16
+ s.require_paths = ['lib']
17
17
 
18
- s.license = "Apache 2.0"
18
+ s.license = 'Apache 2.0'
19
19
 
20
- s.add_dependency "rails", ">= 3.0", "< 5.0"
21
- s.add_dependency "jquery-rails" # our JS needs jquery_rails
22
- s.add_dependency "blacklight", ">= 6.0.0.pre2", "< 7"
23
-
24
- s.add_development_dependency "rspec", "~> 3.0"
25
- s.add_development_dependency "rspec-rails"
26
- s.add_development_dependency "capybara"
27
- s.add_development_dependency "sqlite3"
20
+ s.add_dependency 'rails', '>= 3.0'
21
+ s.add_dependency 'jquery-rails' # our JS needs jquery_rails
22
+ s.add_dependency 'blacklight', '~> 6.0'
23
+
24
+ s.add_development_dependency 'rspec', '~> 3.0'
25
+ s.add_development_dependency 'rspec-rails'
26
+ s.add_development_dependency 'capybara'
27
+ s.add_development_dependency 'sqlite3'
28
28
  s.add_development_dependency 'launchy'
29
- s.add_development_dependency "jettywrapper", "~> 1.5", ">= 1.5.2"
30
- s.add_development_dependency "engine_cart", "~> 0.8"
29
+ s.add_development_dependency 'solr_wrapper', '~> 0.14'
30
+ s.add_development_dependency 'engine_cart', '~> 1.0'
31
31
  end
@@ -77,6 +77,7 @@
77
77
  end
78
78
 
79
79
  def remove_range_param(solr_field, my_params = params)
80
+ my_params = Blacklight::SearchState.new(my_params, blacklight_config).to_h
80
81
  if ( my_params["range"] )
81
82
  my_params = my_params.dup
82
83
  my_params["range"] = my_params["range"].dup
@@ -0,0 +1,3 @@
1
+ {
2
+ "initArgs":{},
3
+ "managedList":[]}
@@ -0,0 +1,31 @@
1
+ <!--
2
+ Licensed to the Apache Software Foundation (ASF) under one or more
3
+ contributor license agreements. See the NOTICE file distributed with
4
+ this work for additional information regarding copyright ownership.
5
+ The ASF licenses this file to You under the Apache License, Version 2.0
6
+ (the "License"); you may not use this file except in compliance with
7
+ the License. You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ -->
17
+
18
+ <!-- The content of this page will be statically included into the top
19
+ of the admin page. Uncomment this as an example to see there the content
20
+ will show up.
21
+
22
+ <hr>
23
+ <i>This line will appear before the first table</i>
24
+ <tr>
25
+ <td colspan="2">
26
+ This row will be appended to the end of the first table
27
+ </td>
28
+ </tr>
29
+ <hr>
30
+
31
+ -->
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <!--
3
+ Licensed to the Apache Software Foundation (ASF) under one or more
4
+ contributor license agreements. See the NOTICE file distributed with
5
+ this work for additional information regarding copyright ownership.
6
+ The ASF licenses this file to You under the Apache License, Version 2.0
7
+ (the "License"); you may not use this file except in compliance with
8
+ the License. You may obtain a copy of the License at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ Unless required by applicable law or agreed to in writing, software
13
+ distributed under the License is distributed on an "AS IS" BASIS,
14
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ See the License for the specific language governing permissions and
16
+ limitations under the License.
17
+ -->
18
+
19
+ <!-- If this file is found in the config directory, it will only be
20
+ loaded once at startup. If it is found in Solr's data
21
+ directory, it will be re-loaded every commit.
22
+ -->
23
+
24
+ <elevate>
25
+ <query text="foo bar">
26
+ <doc id="1" />
27
+ <doc id="2" />
28
+ <doc id="3" />
29
+ </query>
30
+
31
+ <query text="ipod">
32
+ <doc id="MA147LL/A" /> <!-- put the actual ipod at the top -->
33
+ <doc id="IW-02" exclude="true" /> <!-- exclude this cable -->
34
+ </query>
35
+
36
+ </elevate>
@@ -0,0 +1,246 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ # Syntax:
14
+ # "source" => "target"
15
+ # "source".length() > 0 (source cannot be empty.)
16
+ # "target".length() >= 0 (target can be empty.)
17
+
18
+ # example:
19
+ # "??" => "A"
20
+ # "\u00C0" => "A"
21
+ # "\u00C0" => "\u0041"
22
+ # "??" => "ss"
23
+ # "\t" => " "
24
+ # "\n" => ""
25
+
26
+ # ?? => A
27
+ "\u00C0" => "A"
28
+
29
+ # ?? => A
30
+ "\u00C1" => "A"
31
+
32
+ # ?? => A
33
+ "\u00C2" => "A"
34
+
35
+ # ?? => A
36
+ "\u00C3" => "A"
37
+
38
+ # ?? => A
39
+ "\u00C4" => "A"
40
+
41
+ # ?? => A
42
+ "\u00C5" => "A"
43
+
44
+ # ?? => AE
45
+ "\u00C6" => "AE"
46
+
47
+ # ?? => C
48
+ "\u00C7" => "C"
49
+
50
+ # ?? => E
51
+ "\u00C8" => "E"
52
+
53
+ # ?? => E
54
+ "\u00C9" => "E"
55
+
56
+ # ?? => E
57
+ "\u00CA" => "E"
58
+
59
+ # ?? => E
60
+ "\u00CB" => "E"
61
+
62
+ # ?? => I
63
+ "\u00CC" => "I"
64
+
65
+ # ?? => I
66
+ "\u00CD" => "I"
67
+
68
+ # ?? => I
69
+ "\u00CE" => "I"
70
+
71
+ # ?? => I
72
+ "\u00CF" => "I"
73
+
74
+ # ?? => IJ
75
+ "\u0132" => "IJ"
76
+
77
+ # ?? => D
78
+ "\u00D0" => "D"
79
+
80
+ # ?? => N
81
+ "\u00D1" => "N"
82
+
83
+ # ?? => O
84
+ "\u00D2" => "O"
85
+
86
+ # ?? => O
87
+ "\u00D3" => "O"
88
+
89
+ # ?? => O
90
+ "\u00D4" => "O"
91
+
92
+ # ?? => O
93
+ "\u00D5" => "O"
94
+
95
+ # ?? => O
96
+ "\u00D6" => "O"
97
+
98
+ # ?? => O
99
+ "\u00D8" => "O"
100
+
101
+ # ?? => OE
102
+ "\u0152" => "OE"
103
+
104
+ # ??
105
+ "\u00DE" => "TH"
106
+
107
+ # ?? => U
108
+ "\u00D9" => "U"
109
+
110
+ # ?? => U
111
+ "\u00DA" => "U"
112
+
113
+ # ?? => U
114
+ "\u00DB" => "U"
115
+
116
+ # ?? => U
117
+ "\u00DC" => "U"
118
+
119
+ # ?? => Y
120
+ "\u00DD" => "Y"
121
+
122
+ # ?? => Y
123
+ "\u0178" => "Y"
124
+
125
+ # ?? => a
126
+ "\u00E0" => "a"
127
+
128
+ # ?? => a
129
+ "\u00E1" => "a"
130
+
131
+ # ?? => a
132
+ "\u00E2" => "a"
133
+
134
+ # ?? => a
135
+ "\u00E3" => "a"
136
+
137
+ # ?? => a
138
+ "\u00E4" => "a"
139
+
140
+ # ?? => a
141
+ "\u00E5" => "a"
142
+
143
+ # ?? => ae
144
+ "\u00E6" => "ae"
145
+
146
+ # ?? => c
147
+ "\u00E7" => "c"
148
+
149
+ # ?? => e
150
+ "\u00E8" => "e"
151
+
152
+ # ?? => e
153
+ "\u00E9" => "e"
154
+
155
+ # ?? => e
156
+ "\u00EA" => "e"
157
+
158
+ # ?? => e
159
+ "\u00EB" => "e"
160
+
161
+ # ?? => i
162
+ "\u00EC" => "i"
163
+
164
+ # ?? => i
165
+ "\u00ED" => "i"
166
+
167
+ # ?? => i
168
+ "\u00EE" => "i"
169
+
170
+ # ?? => i
171
+ "\u00EF" => "i"
172
+
173
+ # ?? => ij
174
+ "\u0133" => "ij"
175
+
176
+ # ?? => d
177
+ "\u00F0" => "d"
178
+
179
+ # ?? => n
180
+ "\u00F1" => "n"
181
+
182
+ # ?? => o
183
+ "\u00F2" => "o"
184
+
185
+ # ?? => o
186
+ "\u00F3" => "o"
187
+
188
+ # ?? => o
189
+ "\u00F4" => "o"
190
+
191
+ # ?? => o
192
+ "\u00F5" => "o"
193
+
194
+ # ?? => o
195
+ "\u00F6" => "o"
196
+
197
+ # ?? => o
198
+ "\u00F8" => "o"
199
+
200
+ # ?? => oe
201
+ "\u0153" => "oe"
202
+
203
+ # ?? => ss
204
+ "\u00DF" => "ss"
205
+
206
+ # ?? => th
207
+ "\u00FE" => "th"
208
+
209
+ # ?? => u
210
+ "\u00F9" => "u"
211
+
212
+ # ?? => u
213
+ "\u00FA" => "u"
214
+
215
+ # ?? => u
216
+ "\u00FB" => "u"
217
+
218
+ # ?? => u
219
+ "\u00FC" => "u"
220
+
221
+ # ?? => y
222
+ "\u00FD" => "y"
223
+
224
+ # ?? => y
225
+ "\u00FF" => "y"
226
+
227
+ # ??? => ff
228
+ "\uFB00" => "ff"
229
+
230
+ # ??? => fi
231
+ "\uFB01" => "fi"
232
+
233
+ # ??? => fl
234
+ "\uFB02" => "fl"
235
+
236
+ # ??? => ffi
237
+ "\uFB03" => "ffi"
238
+
239
+ # ??? => ffl
240
+ "\uFB04" => "ffl"
241
+
242
+ # ??? => ft
243
+ "\uFB05" => "ft"
244
+
245
+ # ??? => st
246
+ "\uFB06" => "st"