geoblacklight 1.0.3 → 1.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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.solr_wrapper +6 -0
  4. data/.travis.yml +18 -4
  5. data/README.md +2 -4
  6. data/Rakefile +58 -35
  7. data/app/assets/javascripts/geoblacklight/geoblacklight.js +1 -1
  8. data/app/assets/stylesheets/geoblacklight/modules/icon-customization.scss +5 -1
  9. data/app/assets/stylesheets/geoblacklight/modules/toolbar.scss +6 -0
  10. data/app/helpers/carto_helper.rb +36 -0
  11. data/app/helpers/geoblacklight_helper.rb +10 -9
  12. data/app/models/concerns/geoblacklight/solr_document.rb +1 -1
  13. data/app/models/concerns/geoblacklight/solr_document/carto.rb +28 -0
  14. data/app/views/catalog/_exports.html.erb +3 -3
  15. data/config/initializers/rails_config.rb +1 -1
  16. data/config/locales/geoblacklight.en.yml +1 -0
  17. data/geoblacklight.gemspec +9 -8
  18. data/lib/generators/geoblacklight/install_generator.rb +8 -14
  19. data/lib/generators/geoblacklight/templates/settings.yml +2 -2
  20. data/lib/geoblacklight/engine.rb +2 -1
  21. data/lib/geoblacklight/version.rb +1 -1
  22. data/lib/geoblacklight/view_helper_override.rb +1 -0
  23. data/lib/geoblacklight/wms_layer.rb +1 -1
  24. data/lib/tasks/geoblacklight.rake +19 -1
  25. data/schema/geoblacklight-schema.json +21 -23
  26. data/schema/geoblacklight-schema.md +10 -8
  27. data/solr/conf/_rest_managed.json +3 -0
  28. data/solr/conf/admin-extra.html +31 -0
  29. data/solr/conf/elevate.xml +36 -0
  30. data/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  31. data/{schema/solr → solr}/conf/protwords.txt +0 -0
  32. data/{schema/solr → solr}/conf/schema.xml +2 -4
  33. data/solr/conf/scripts.conf +24 -0
  34. data/{schema/solr → solr}/conf/solrconfig.xml +17 -6
  35. data/solr/conf/spellings.txt +2 -0
  36. data/solr/conf/stopwords.txt +58 -0
  37. data/solr/conf/stopwords_en.txt +58 -0
  38. data/{schema/solr → solr}/conf/synonyms.txt +31 -29
  39. data/solr/conf/xslt/example.xsl +132 -0
  40. data/solr/conf/xslt/example_atom.xsl +67 -0
  41. data/solr/conf/xslt/example_rss.xsl +66 -0
  42. data/solr/conf/xslt/luke.xsl +337 -0
  43. data/spec/controllers/catalog_controller_spec.rb +1 -1
  44. data/spec/controllers/download_controller_spec.rb +14 -8
  45. data/spec/features/configurable_basemap_spec.rb +0 -1
  46. data/spec/features/exports_spec.rb +4 -4
  47. data/spec/fixtures/solr_documents/esri-image-map-layer.json +2 -2
  48. data/spec/helpers/carto_helper_spec.rb +11 -0
  49. data/spec/helpers/geoblacklight_helpers_spec.rb +0 -8
  50. data/spec/models/concerns/geoblacklight/solr_document/{carto_db_spec.rb → carto_spec.rb} +6 -6
  51. data/spec/spec_helper.rb +8 -1
  52. data/spec/support/backport_test_helpers.rb +45 -0
  53. data/spec/test_app_templates/solr_documents +1 -0
  54. data/template.rb +1 -1
  55. metadata +88 -52
  56. data/app/models/concerns/geoblacklight/solr_document/carto_db.rb +0 -15
  57. data/config/jetty.yml +0 -6
  58. data/lib/generators/geoblacklight/templates/config/jetty.yml +0 -10
  59. data/lib/tasks/configure_solr.rake +0 -14
  60. data/schema/solr/conf/stopwords_en.txt +0 -34
@@ -1,8 +1,8 @@
1
1
  # Configurable Logo Used for CartoDB export
2
2
  APPLICATION_LOGO_URL: 'http://geoblacklight.org/images/geoblacklight-logo.png'
3
3
 
4
- # CartoDB OneClick Service https://cartodb.com/open-in-cartodb/
5
- CARTODB_ONECLICK_LINK: 'http://oneclick.cartodb.com/'
4
+ # Carto OneClick Service https://carto.com/engine/open-in-carto/
5
+ CARTO_ONECLICK_LINK: 'http://oneclick.cartodb.com/'
6
6
 
7
7
  # Download path can be configured using this setting
8
8
  #DOWNLOAD_PATH: "./tmp/cache/downloads"
@@ -1,7 +1,7 @@
1
1
  require 'blacklight'
2
2
  require 'leaflet-rails'
3
3
  require 'font-awesome-rails'
4
- require 'rails_config'
4
+ require 'config'
5
5
  require 'faraday'
6
6
  require 'nokogiri'
7
7
  require 'coderay'
@@ -15,6 +15,7 @@ module Geoblacklight
15
15
  # into action view base here.
16
16
  initializer 'geoblacklight.helpers' do
17
17
  ActionView::Base.send :include, GeoblacklightHelper
18
+ ActionView::Base.send :include, CartoHelper
18
19
  end
19
20
 
20
21
  config.to_prepare do
@@ -1,3 +1,3 @@
1
1
  module Geoblacklight
2
- VERSION = '1.0.3'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -26,6 +26,7 @@ module Geoblacklight
26
26
 
27
27
  def render_constraints_filters(localized_params = params)
28
28
  content = super(localized_params)
29
+ localized_params = localized_params.to_unsafe_h unless localized_params.is_a?(Hash)
29
30
 
30
31
  if localized_params[:bbox]
31
32
  path = search_action_path(remove_spatial_filter_group(:bbox, localized_params))
@@ -1,7 +1,7 @@
1
1
  module Geoblacklight
2
2
  class WmsLayer
3
3
  def initialize(params)
4
- @params = params.merge(Settings.WMS_PARAMS)
4
+ @params = params.to_h.merge(Settings.WMS_PARAMS)
5
5
  @response = Geoblacklight::FeatureInfoResponse.new(request_response)
6
6
  end
7
7
 
@@ -1,8 +1,18 @@
1
+ require 'solr_wrapper'
1
2
  require 'rails/generators'
2
3
  require 'generators/geoblacklight/install_generator'
3
4
 
4
5
  namespace :geoblacklight do
5
- namespace :solr do
6
+ desc 'Run Solr and GeoBlacklight for interactive development'
7
+ task :server, [:rails_server_args] do |_t, args|
8
+ SolrWrapper.wrap(port: '8983') do |solr|
9
+ solr.with_collection(name: 'blacklight-core', dir: File.join(File.expand_path('../../', File.dirname(__FILE__)), 'solr', 'conf')) do
10
+ system "bundle exec rails s #{args[:rails_server_args]}"
11
+ end
12
+ end
13
+ end
14
+
15
+ namespace :index do
6
16
  desc "Put sample data into solr"
7
17
  task :seed => :environment do
8
18
  docs = Dir['spec/fixtures/solr_documents/*.json'].map { |f| JSON.parse File.read(f) }.flatten
@@ -34,6 +44,7 @@ namespace :geoblacklight do
34
44
  Blacklight.default_index.connection.commit
35
45
  end
36
46
  end
47
+
37
48
  namespace :downloads do
38
49
  desc 'Delete all cached downloads'
39
50
  task delete: :environment do
@@ -61,4 +72,11 @@ namespace :geoblacklight do
61
72
  end
62
73
  end
63
74
  end
75
+
76
+ namespace :solr do
77
+ desc "Put sample data into solr"
78
+ task :seed => :environment do
79
+ Rake::Task['geoblacklight:index:seed'].invoke
80
+ end
81
+ end
64
82
  end
@@ -3,23 +3,20 @@
3
3
  "description": "Schema for GeoBlacklight. See https://github.com/geoblacklight/geoblacklight/wiki/Schema for more details.",
4
4
  "id": "http://geoblacklight.org/v1.0/schema",
5
5
  "title": "GeoBlacklight Schema",
6
- "required": [
7
- "dc_title_s",
8
- "dc_description_s",
9
- "dc_rights_s",
10
- "dct_provenance_s",
11
- "layer_id_s",
12
- "layer_geom_type_s",
13
- "layer_modified_dt",
14
- "layer_slug_s",
15
- "solr_geom"
16
- ],
17
6
  "type": "array",
18
7
  "properties": {
19
8
  "layer": {
20
9
  "title": "layer",
21
10
  "description": "A GIS data layer. See [this example](https://github.com/OpenGeoMetadata/edu.stanford.purl/blob/master/bb/099/zb/1450/geoblacklight.json) metadata layer.",
22
11
  "type": "object",
12
+ "required": [
13
+ "dc_title_s",
14
+ "dc_identifier_s",
15
+ "dc_rights_s",
16
+ "dct_provenance_s",
17
+ "layer_slug_s",
18
+ "solr_geom"
19
+ ],
23
20
  "properties": {
24
21
  "uuid": {
25
22
  "type": "string",
@@ -38,7 +35,7 @@
38
35
  },
39
36
  "dc_description_s": {
40
37
  "type": "string",
41
- "description": "Description for the layer.",
38
+ "description": "Description for the layer. *Optional*",
42
39
  "example": "My Description"
43
40
  },
44
41
  "dc_rights_s": {
@@ -56,7 +53,8 @@
56
53
  },
57
54
  "dct_references_s": {
58
55
  "type": "string",
59
- "description": "External resources that are available for the layer. The value is a JSON hash where each key is a URI for the protocol or format, and the value is the URL to the external resource. See `dct_references_s` [detailed documentation](http://geoblacklight.org/tutorial/2015/02/09/geoblacklight-overview.html)",
56
+ "description": "External resources that are available for the layer. The value is a JSON hash where each key is a URI for the protocol or format, and the value is the URL to the external resource. See `dct_references_s` [detailed documentation](http://geoblacklight.org/tutorial/2015/02/09/geoblacklight-overview.html). *Optional*",
57
+ "pattern": "\\{.*\\}",
60
58
  "example": "{ ... }"
61
59
  },
62
60
  "georss_box_s": {
@@ -66,7 +64,7 @@
66
64
  },
67
65
  "layer_id_s": {
68
66
  "type": "string",
69
- "description": "The complete identifier for the layer via WMS/WFS/WCS protocol.",
67
+ "description": "The complete identifier for the layer via WMS/WFS/WCS protocol. *Optional*",
70
68
  "example": "druid:vr593vj7147"
71
69
  },
72
70
  "layer_geom_type_s": {
@@ -77,18 +75,20 @@
77
75
  "Polygon",
78
76
  "Raster",
79
77
  "Scanned Map",
78
+ "Image",
80
79
  "Mixed"
81
80
  ],
82
- "description": "Geometry type for layer data, using controlled vocabulary."
81
+ "description": "Geometry type for layer data, using controlled vocabulary. *Optional*"
83
82
  },
84
83
  "layer_modified_dt": {
85
84
  "type": "string",
86
85
  "format": "date-time",
87
- "description": "Last modification date for the metadata record, using XML Schema dateTime format (YYYY-MM-DDThh:mm:ssZ)."
86
+ "description": "Last modification date for the metadata record, using XML Schema dateTime format (YYYY-MM-DDThh:mm:ssZ). *Optional*"
88
87
  },
89
88
  "layer_slug_s": {
90
89
  "type": "string",
91
90
  "description": "Identifies a layer in human-readable keywords. Note this value is visible to the user, and used for Permalinks. The value should be alpha-numeric characters separated by dashes, and is typically of the form `institution-keyword1-keyword2`. It should also be globally unique across all institutions in *your* GeoBlacklight index. See https://github.com/geoblacklight/geoblacklight/wiki/Schema for more detailed documentation.",
91
+ "pattern": "^[-a-zA-Z0-9]+$",
92
92
  "example": "stanford-andhra-pradesh-village-boundaries"
93
93
  },
94
94
  "solr_geom": {
@@ -112,12 +112,8 @@
112
112
  },
113
113
  "dc_format_s": {
114
114
  "type": "string",
115
- "enum": [
116
- "Shapefile",
117
- "GeoTIFF",
118
- "ArcGRID"
119
- ],
120
- "description": "File format for the layer, using a controlled vocabulary. *Optional*"
115
+ "description": "File format for the layer, ideally using a controlled vocabulary. *Optional*",
116
+ "example": "Shapefile, GeoTIFF, ArcGRID"
121
117
  },
122
118
  "dc_language_s": {
123
119
  "type": "string",
@@ -199,7 +195,9 @@
199
195
  "geoblacklight_version": {
200
196
  "type": "string",
201
197
  "description": "The version of the GeoBlacklight Schema to which this metadata record conforms.",
202
- "example": "1.0"
198
+ "enum": [
199
+ "1.0"
200
+ ]
203
201
  }
204
202
  }
205
203
  }
@@ -8,8 +8,8 @@ A GIS data layer. See [this example](https://github.com/OpenGeoMetadata/edu.stan
8
8
  | Name | Type | Description | Example |
9
9
  | ------- | ------- | ------- | ------- |
10
10
  | **dc_creator_sm** | *array* | Author(s) of the layer. *Optional* | `"George Washington, Thomas Jefferson"` |
11
- | **dc_description_s** | *string* | Description for the layer. | `"My Description"` |
12
- | **dc_format_s** | *string* | File format for the layer, using a controlled vocabulary. *Optional*<br/> **one of:**`"Shapefile"` or `"GeoTIFF"` or `"ArcGRID"` | `"Shapefile"` |
11
+ | **dc_description_s** | *string* | Description for the layer. *Optional* | `"My Description"` |
12
+ | **dc_format_s** | *string* | File format for the layer, ideally using a controlled vocabulary. *Optional* | `"Shapefile, GeoTIFF, ArcGRID"` |
13
13
  | **dc_identifier_s** | *string* | Unique identifier for layer as a URI. It should be globally unique across all institutions, assumed not to be end-user visible, and is usually of the form `http://institution/id`. See https://github.com/geoblacklight/geoblacklight/wiki/Schema for more detailed documentation. | `"http://purl.stanford.edu/vr593vj7147"` |
14
14
  | **dc_language_s** | *string* | Language for the layer. *Optional*. Note that future versions of the schema may make this a multi-valued field. | `"English"` |
15
15
  | **dc_publisher_s** | *string* | Publisher of the layer. *Optional* | `"ML InfoMap"` |
@@ -22,16 +22,18 @@ A GIS data layer. See [this example](https://github.com/OpenGeoMetadata/edu.stan
22
22
  | **dct_isPartOf_sm** | *array* | Holding entity for the layer, such as the title of a collection. *Optional* | `"Village Maps of India"` |
23
23
  | **dct_issued_dt** | *date-time* | Issued date for the layer, using XML Schema dateTime format (YYYY-MM-DDThh:mm:ssZ). *Optional* | `"2015-01-01T12:00:00Z"` |
24
24
  | **dct_provenance_s** | *string* | Institution who holds the layer. | `"Stanford"` |
25
- | **dct_references_s** | *string* | External resources that are available for the layer. The value is a JSON hash where each key is a URI for the protocol or format, and the value is the URL to the external resource. See `dct_references_s` [detailed documentation](http://geoblacklight.org/tutorial/2015/02/09/geoblacklight-overview.html) | `"{ ... }"` |
25
+ | **dct_references_s** | *string* | External resources that are available for the layer. The value is a JSON hash where each key is a URI for the protocol or format, and the value is the URL to the external resource. See `dct_references_s` [detailed documentation](http://geoblacklight.org/tutorial/2015/02/09/geoblacklight-overview.html). *Optional*<br/> **pattern:** `\{.*\}` | `"{ ... }"` |
26
26
  | **dct_spatial_sm** | *array* | Spatial coverage and place names for the layer, preferrably in a controlled vocabulary. *Optional* | `"Paris, San Francisco"` |
27
27
  | **dct_temporal_sm** | *array* | Temporal coverage for the layer, typically years or dates. Note that this field is not in a specific date format. *Optional* | `"1989, circa 2010, 2007-2009"` |
28
- | **geoblacklight_version** | *string* | The version of the GeoBlacklight Schema to which this metadata record conforms. | `"1.0"` |
28
+ | **geoblacklight_version** | *string* | The version of the GeoBlacklight Schema to which this metadata record conforms.<br/> **one of:**`"1.0"` | `"1.0"` |
29
29
  | **georss_box_s** | *string* | *DEPRECATED* (use `solr_geom`): Bounding box for the layer, as maximum values for S W N E. | `"12.6 -119.4 19.9 84.8"` |
30
30
  | **georss_point_s** | *string* | *DEPRECATED* (use `georss_box_s`): Point representation for layer as y, x - i.e., centroid | `"12.6 -119.4"` |
31
- | **layer_geom_type_s** | *string* | Geometry type for layer data, using controlled vocabulary.<br/> **one of:**`"Point"` or `"Line"` or `"Polygon"` or `"Raster"` or `"Scanned Map"` or `"Mixed"` | `"Point"` |
32
- | **layer_id_s** | *string* | The complete identifier for the layer via WMS/WFS/WCS protocol. | `"druid:vr593vj7147"` |
33
- | **layer_modified_dt** | *date-time* | Last modification date for the metadata record, using XML Schema dateTime format (YYYY-MM-DDThh:mm:ssZ). | `"2015-01-01T12:00:00Z"` |
34
- | **layer_slug_s** | *string* | Identifies a layer in human-readable keywords. Note this value is visible to the user, and used for Permalinks. The value should be alpha-numeric characters separated by dashes, and is typically of the form `institution-keyword1-keyword2`. It should also be globally unique across all institutions in *your* GeoBlacklight index. See https://github.com/geoblacklight/geoblacklight/wiki/Schema for more detailed documentation. | `"stanford-andhra-pradesh-village-boundaries"` |
31
+ | **layer_geom_type_s** | *string* | Geometry type for layer data, using controlled vocabulary.<br/> **one of:**`"Point"` or `"Line"` or `"Polygon"` or `"Raster"` or `"Scanned Map"` or `"Image"` or `"Mixed"` | `"Point"` |
32
+ | **layer_id_s** | *string* | The complete identifier for the layer via WMS/WFS/WCS protocol. *Optional* | `"druid:vr593vj7147"` |
33
+ | **layer_modified_dt** | *date-time* | Last modification date for the metadata record, using XML Schema dateTime format (YYYY-MM-DDThh:mm:ssZ). *Optional* | `"2015-01-01T12:00:00Z"` |
34
+ | **layer_slug_s** | *string* | Identifies a layer in human-readable keywords. Note this value is visible to the user, and used for Permalinks. The value should be alpha-numeric characters separated by dashes, and is typically of the form `institution-keyword1-keyword2`. It should also be globally unique across all institutions in *your* GeoBlacklight index. See https://github.com/geoblacklight/geoblacklight/wiki/Schema for more detailed documentation.<br/> **pattern:** `^[-a-zA-Z0-9]+$` | `"stanford-andhra-pradesh-village-boundaries"` |
35
35
  | **solr_geom** | *string* | Bounding box of the layer as a ENVELOPE WKT (from the CQL standard) using coordinates in (West, East, North, South) order. Note that this field is indexed as a Solr spatial (RPT) field.<br/> **pattern:** `ENVELOPE(.*,.*,.*,.*)` | `"ENVELOPE(76.76, 84.76, 19.91, 12.62)"` |
36
36
  | **solr_year_i** | *integer* | *DEPRECATED* (only used by the Blacklight range plugin, not core GeoBlacklight, and generally you want a multi-valued field here): *Derived from* `dct_temporal_sm`. Year for which layer is valid and only a single value. Note that this field is indexed as a Solr numeric field. | `"1989"` |
37
37
  | **uuid** | *string* | *DEPRECATED* (use `dc_identifier_s`): Unique identifier for layer that is globally unique. | `"http://purl.stanford.edu/vr593vj7147"` |
38
+
39
+
@@ -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"