blacklight_range_limit 6.0.0 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
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"