geoblacklight 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +5 -13
  2. data/.coveralls.yml +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -0
  5. data/Gemfile +18 -0
  6. data/README.md +36 -38
  7. data/Rakefile +9 -9
  8. data/app/assets/fonts/geoblacklight.eot +0 -0
  9. data/app/assets/fonts/geoblacklight.svg +117 -0
  10. data/app/assets/fonts/geoblacklight.ttf +0 -0
  11. data/app/assets/fonts/geoblacklight.woff +0 -0
  12. data/app/assets/images/blacklight/logo.png +0 -0
  13. data/app/assets/javascripts/geoblacklight/application.js +1 -0
  14. data/app/assets/javascripts/geoblacklight/geoblacklight.js +86 -2
  15. data/app/assets/javascripts/geoblacklight/modules/collapse.js +6 -0
  16. data/app/assets/javascripts/geoblacklight/modules/download.js +45 -0
  17. data/app/assets/javascripts/geoblacklight/modules/geosearch.js +77 -0
  18. data/app/assets/javascripts/geoblacklight/modules/home.js +10 -0
  19. data/app/assets/javascripts/geoblacklight/modules/item.js +72 -0
  20. data/app/assets/javascripts/geoblacklight/modules/map-view.js +7 -7
  21. data/app/assets/javascripts/geoblacklight/modules/results.js +50 -0
  22. data/app/assets/stylesheets/geoblacklight/_geoblacklight.css.scss +20 -0
  23. data/app/assets/stylesheets/geoblacklight/_styles.css.scss +44 -0
  24. data/app/assets/stylesheets/geoblacklight/application.css.scss +3 -0
  25. data/app/assets/stylesheets/geoblacklight/modules/home.css.scss +3 -0
  26. data/app/assets/stylesheets/geoblacklight/modules/icon-customization.css.scss +10 -0
  27. data/app/assets/stylesheets/geoblacklight/modules/icons.css.scss +77 -0
  28. data/app/assets/stylesheets/geoblacklight/modules/item.css.scss +4 -0
  29. data/app/assets/stylesheets/geoblacklight/modules/results.css.scss +29 -0
  30. data/app/controllers/download_controller.rb +22 -94
  31. data/app/controllers/wms_controller.rb +2 -74
  32. data/app/helpers/geoblacklight_helper.rb +6 -36
  33. data/app/views/catalog/_document_split.html.erb +4 -0
  34. data/app/views/catalog/_home_text.html.erb +2 -39
  35. data/app/views/catalog/_index_split_default.html.erb +24 -0
  36. data/app/views/catalog/_show_default.html.erb +4 -57
  37. data/app/views/catalog/_show_header_default.html.erb +8 -0
  38. data/app/views/catalog/_show_sidebar.html.erb +17 -57
  39. data/app/views/catalog/_upper_metadata.html.erb +38 -0
  40. data/config/initializers/rails_config.rb +3 -0
  41. data/config/jetty.yml +6 -0
  42. data/config/locales/geoblacklight.en.yml +5 -0
  43. data/geoblacklight.gemspec +5 -5
  44. data/lib/generators/geoblacklight/install_generator.rb +45 -15
  45. data/lib/generators/geoblacklight/templates/geoblacklight.css.scss +2 -78
  46. data/lib/generators/geoblacklight/templates/settings.yml +9 -0
  47. data/lib/geoblacklight.rb +13 -0
  48. data/lib/geoblacklight/controller_override.rb +18 -0
  49. data/lib/geoblacklight/download.rb +63 -0
  50. data/lib/geoblacklight/download/kmz_download.rb +14 -0
  51. data/lib/geoblacklight/download/shapefile_download.rb +14 -0
  52. data/lib/geoblacklight/engine.rb +11 -1
  53. data/lib/geoblacklight/solr_document.rb +30 -0
  54. data/lib/geoblacklight/version.rb +1 -1
  55. data/lib/geoblacklight/view_helper_override.rb +17 -0
  56. data/lib/geoblacklight/wms_layer.rb +38 -0
  57. data/lib/geoblacklight/wms_layer/feature_info_response.rb +30 -0
  58. data/lib/tasks/geoblacklight.rake +15 -0
  59. data/spec/features/download_layer_spec.rb +18 -0
  60. data/spec/features/home_page_spec.rb +49 -0
  61. data/spec/features/layer_inspection_spec.rb +9 -0
  62. data/spec/features/layer_preview_spec.rb +16 -0
  63. data/spec/features/split_view.html.erb_spec.rb +35 -0
  64. data/spec/fixtures/test-berkeley-fields.json +44 -0
  65. data/spec/lib/geoblacklight/controller_override_spec.rb +28 -0
  66. data/spec/lib/geoblacklight/download/kmz_download_spec.rb +15 -0
  67. data/spec/lib/geoblacklight/download/shapefile_download_spec.rb +14 -0
  68. data/spec/lib/geoblacklight/download_spec.rb +76 -0
  69. data/spec/lib/geoblacklight/solr_document.rb +52 -0
  70. data/spec/lib/geoblacklight/view_helper_override_spec.rb +23 -0
  71. data/spec/lib/geoblacklight/wms_layer/feature_info_response_spec.rb +43 -0
  72. data/spec/lib/geoblacklight/wms_layer_spec.rb +33 -0
  73. data/spec/spec_helper.rb +3 -6
  74. data/spec/test_app_templates/lib/generators/test_app_generator.rb +2 -2
  75. data/spec/views/catalog/_document_split.html.erb_spec.rb +5 -0
  76. data/spec/views/catalog/_index_split.html.erb_spec.rb +5 -0
  77. data/template.rb +10 -0
  78. data/vendor/assets/javascripts/native.history.js +1 -0
  79. metadata +129 -82
  80. data/app/assets/images/geoblacklight/src_berkeley.png +0 -0
  81. data/app/assets/images/geoblacklight/src_cambridge.png +0 -0
  82. data/app/assets/images/geoblacklight/src_harvard.png +0 -0
  83. data/app/assets/images/geoblacklight/src_maryland.png +0 -0
  84. data/app/assets/images/geoblacklight/src_massgis.png +0 -0
  85. data/app/assets/images/geoblacklight/src_mit.png +0 -0
  86. data/app/assets/images/geoblacklight/src_princeton.png +0 -0
  87. data/app/assets/images/geoblacklight/src_stanford.png +0 -0
  88. data/app/assets/images/geoblacklight/src_tufts.png +0 -0
  89. data/app/assets/images/geoblacklight/src_un.png +0 -0
  90. data/app/assets/images/geoblacklight/type_arc.png +0 -0
  91. data/app/assets/images/geoblacklight/type_dot.png +0 -0
  92. data/app/assets/images/geoblacklight/type_library.png +0 -0
  93. data/app/assets/images/geoblacklight/type_map.png +0 -0
  94. data/app/assets/images/geoblacklight/type_polygon.png +0 -0
  95. data/app/assets/images/geoblacklight/type_raster.png +0 -0
  96. data/app/assets/javascripts/geoblacklight/modules/map-home.js +0 -25
  97. data/app/assets/javascripts/geoblacklight/modules/map-results.js +0 -72
  98. data/app/views/catalog/_document_list.html.erb +0 -12
  99. data/app/views/catalog/_index_header_default.html.erb +0 -59
  100. data/spec/fixtures/geoblacklight_schema/transformed.json +0 -53
@@ -0,0 +1,6 @@
1
+ Blacklight.onLoad(function() {
2
+ $('#content')
3
+ .on('click', '#documents [data-layer-id]', function() {
4
+ $(this).find('.collapse').collapse('toggle');
5
+ });
6
+ });
@@ -0,0 +1,45 @@
1
+ Blacklight.onLoad(function() {
2
+ var downloads = [];
3
+ $('[data-download-path]').each(function(i, element) {
4
+ downloads.push(new GeoBlacklight.Download(element));
5
+ });
6
+ });
7
+
8
+ GeoBlacklight.Download = function(element) {
9
+ var _this = this;
10
+ _this.element = $(element);
11
+ _this.url = _this.element.data('download-path');
12
+ _this.buttonGroup = _this.element.closest('.btn-group');
13
+ _this.spinner = $('<i class="fa fa-spinner fa-spin fa-2x fa-align-center"></i>');
14
+ _this.buttonGroup.append(_this.spinner.hide());
15
+ _this.setupClickListener();
16
+ };
17
+
18
+ GeoBlacklight.Download.prototype = {
19
+ setupClickListener: function() {
20
+ var _this = this;
21
+ _this.element.on('click', function(e) {
22
+ e.preventDefault();
23
+ _this.requestDownload();
24
+ });
25
+ },
26
+ requestDownload: function() {
27
+ var _this = this;
28
+ _this.spinner.show();
29
+ $.ajax({
30
+ url: _this.url,
31
+ dataType: 'json'
32
+ }).done(function(data) {
33
+ _this.renderFlashMessage(data);
34
+ _this.spinner.hide();
35
+ }).fail(function(data, e) {
36
+ _this.spinner.hide();
37
+ });
38
+ },
39
+ renderFlashMessage: function(response) {
40
+ $.each(response, function(i, val) {
41
+ var flashHtml = '<div class="alert alert-' + val[0] + '"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>' + val[1] + '</div>';
42
+ $('div.flash_messages').append(flashHtml);
43
+ });
44
+ }
45
+ };
@@ -0,0 +1,77 @@
1
+ !function(global) {
2
+ "use strict";
3
+
4
+ /**
5
+ * Convert LatLngBounds to array of values.
6
+ *
7
+ * Additionally, this will wrap the longitude values for the corners.
8
+ * @param {L.LatLngBounds} bounds Leaflet LatLngBounds object
9
+ * @return {Array} Array of values as [sw.x, sw.y, ne.x, ne.y]
10
+ */
11
+ L.boundsToBbox = function(bounds) {
12
+ var sw = bounds.getSouthWest().wrap(),
13
+ ne = bounds.getNorthEast().wrap();
14
+ return [
15
+ L.Util.formatNum(sw.lng, 6),
16
+ L.Util.formatNum(sw.lat, 6),
17
+ L.Util.formatNum(ne.lng, 6),
18
+ L.Util.formatNum(ne.lat, 6)
19
+ ];
20
+ };
21
+
22
+ L.Control.GeoSearch = L.Control.extend({
23
+
24
+ options: {
25
+ button: false
26
+ },
27
+
28
+ initialize: function(searcher, options) {
29
+ L.Util.setOptions(this, options);
30
+ this._searcher = L.Util.bind(searcher, this);
31
+ },
32
+
33
+ onAdd: function(map) {
34
+ var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control');
35
+ this._map = map;
36
+
37
+ if (this.options.button === true) {
38
+ this.link = L.DomUtil.create('a', 'leaflet-bar-part search-control',
39
+ container);
40
+ this.link.href = '';
41
+ this.icon = L.DomUtil.create('i', 'glyphicon glyphicon-search',
42
+ this.link);
43
+ }
44
+
45
+ map.on("moveend", this._search, this);
46
+
47
+ return container;
48
+ },
49
+
50
+ _search: function() {
51
+ var params = this.filterParams(['bbox', 'page']),
52
+ bounds = L.boundsToBbox(this._map.getBounds());
53
+
54
+ params.push('bbox=' + encodeURIComponent(bounds.join(' ')));
55
+
56
+ this._searcher(params.join('&'));
57
+ },
58
+
59
+ filterParams: function(filterList) {
60
+ var querystring = window.location.search.substr(1),
61
+ params = [];
62
+
63
+ if (querystring !== "") {
64
+ params = $.map(querystring.split('&'), function(value) {
65
+ if ($.inArray(value.split('=')[0], filterList) > -1) {
66
+ return null;
67
+ } else {
68
+ return value;
69
+ }
70
+ });
71
+ }
72
+ return params;
73
+ }
74
+
75
+ });
76
+
77
+ }(this);
@@ -0,0 +1,10 @@
1
+ Blacklight.onLoad(function () {
2
+ $('[data-map="home"]').each(function(i, element) {
3
+ var geoblacklight = new GeoBlacklight(this),
4
+ search;
5
+ search = new L.Control.GeoSearch(function(querystring) {
6
+ this.link.href = "/catalog?" + querystring;
7
+ }, { button: true });
8
+ geoblacklight.map.addControl(search);
9
+ });
10
+ });
@@ -0,0 +1,72 @@
1
+ Blacklight.onLoad(function() {
2
+ $('[data-map="item"]').each(function(i, element) {
3
+ var layerMap = new GeoBlacklight.Item(element);
4
+ });
5
+ });
6
+
7
+ GeoBlacklight.Item = GeoBlacklight.extend({
8
+
9
+ initialize: function(element) {
10
+ GeoBlacklight.prototype.initialize.call(this, element);
11
+ this.dataAttributes = $(element).data();
12
+ this.layer = new L.layerGroup().addTo(this.map);
13
+ if (this.dataAttributes.available) {
14
+ this.addPreviewLayer();
15
+ } else {
16
+ this.addBoundsOverlay(L.bboxToBounds(this.dataAttributes.mapBbox));
17
+ }
18
+ },
19
+
20
+ addPreviewLayer: function() {
21
+ var _this = this;
22
+ _this.wmsLayer = L.tileLayer.wms(_this.dataAttributes.wmsUrl, {
23
+ layers: _this.dataAttributes.layerId,
24
+ format: 'image/png',
25
+ transparent: true,
26
+ tiled: true,
27
+ CRS: 'EPSG:900913',
28
+ opacity: 0.75
29
+ });
30
+ _this.layer.addLayer(_this.wmsLayer);
31
+ _this.setupInspection();
32
+ },
33
+
34
+ setupInspection: function() {
35
+ var _this = this;
36
+ _this.map.on('click', function(e) {
37
+ spinner = '<span id="attribute-table"><i class="fa fa-spinner fa-spin fa-3x fa-align-center"></i></span>';
38
+ $('#attribute-table').replaceWith(spinner);
39
+ var wmsoptions = {
40
+ URL: _this.dataAttributes.wmsUrl,
41
+ LAYERS: _this.dataAttributes.layerId,
42
+ BBOX: _this.map.getBounds().toBBoxString(),
43
+ WIDTH: $('#map').width(),
44
+ HEIGHT: $('#map').height(),
45
+ QUERY_LAYERS: _this.dataAttributes.layerId,
46
+ X: Math.round(e.containerPoint.x),
47
+ Y: Math.round(e.containerPoint.y)
48
+ };
49
+
50
+ $.ajax({
51
+ type: 'POST',
52
+ url: '/wms/handle',
53
+ data: wmsoptions,
54
+ success: function(data) {
55
+ if (data.hasOwnProperty('error')) {
56
+ $('#attribute-table').html('Could not find that feature');
57
+ return;
58
+ }
59
+ var t = $('<table id="attribute-table" class="table table-hover table-condensed table-responsive table-striped table-bordered"><thead><tr><th>Attribute</th><th>Value</th></tr></thead><tbody>');
60
+ $.each(data.values, function(i,val) {
61
+ t.append('<tr><td>' + val[0] + '</td><td>' + val[1] + '</tr>');
62
+ });
63
+ $('#attribute-table').replaceWith(t);
64
+ },
65
+ fail: function(error) {
66
+ console.log(error);
67
+ }
68
+ });
69
+ });
70
+ }
71
+
72
+ });
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
 
3
- console.log('DEBUG: Inside geoblacklight/modules/map-view.js');
3
+ // console.log('DEBUG: Inside geoblacklight/modules/map-view.js');
4
4
  Blacklight.onLoad(function () {
5
- $('#geoblacklight-map-view').geoBlacklight_setupMapView();
6
- $('#geoblacklight-tools').geoBlacklight_setupTools();
5
+ // $('#geoblacklight-map-view').geoBlacklight_setupMapView();
6
+ // $('#geoblacklight-tools').geoBlacklight_setupTools();
7
7
  });
8
8
 
9
9
  /* Requires leaflet */
@@ -21,7 +21,7 @@ Blacklight.onLoad(function () {
21
21
  return this.each(function () {
22
22
  console.log(this)
23
23
  map = L.map('map');
24
- console.log(solrDoc)
24
+ // console.log(solrDoc)
25
25
  // var layerBbox;
26
26
  // var location = JSON.parse(doc.Location);
27
27
  if (solrDoc.solr_bbox){
@@ -30,10 +30,10 @@ Blacklight.onLoad(function () {
30
30
  [solrDoc.solr_ne_pt_0_d, solrDoc.solr_ne_pt_1_d]]);
31
31
  }
32
32
 
33
- /* XXX: externalize configuration for Mapbox application key */
34
- var basemap = L.tileLayer('http://otile1.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.png', {
33
+ var basemap = L.tileLayer('http://otile{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.png', {
35
34
  attribution: '&copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, Tiles Courtesy of <a href="http://www.mapquest.com/" target="_blank">MapQuest</a> <img src="http://developer.mapquest.com/content/osm/mq_logo.png">',
36
- maxZoom: 18
35
+ maxZoom: 18,
36
+ subdomains: '1234' // see http://developer.mapquest.com/web/products/open/map
37
37
  }).addTo(map);
38
38
 
39
39
  map.on('click', function(e){
@@ -0,0 +1,50 @@
1
+ Blacklight.onLoad(function() {
2
+ var dynamicSearcher;
3
+
4
+ dynamicSearcher = GeoBlacklight.debounce(function(querystring) {
5
+ History.pushState(null, null, "/catalog?" + querystring);
6
+ }, 800);
7
+
8
+ History.Adapter.bind(window, 'statechange', function() {
9
+ var state = History.getState();
10
+ updatePage(state.url);
11
+ });
12
+
13
+ $('[data-map="index"]').each(function() {
14
+ var geoblacklight = new GeoBlacklight(this).setHoverListeners(),
15
+ search = new L.Control.GeoSearch(dynamicSearcher);
16
+ geoblacklight.map.addControl(search);
17
+ });
18
+
19
+ function updatePage(url) {
20
+ $.get(url).done(function(data) {
21
+ var resp = $.parseHTML(data);
22
+ $doc = $(resp);
23
+ $("#documents").replaceWith($doc.find("#documents"));
24
+ $("#sidebar").replaceWith($doc.find("#sidebar"));
25
+ $("#sortAndPerPage").replaceWith($doc.find("#sortAndPerPage"));
26
+ if ($("#map").next().length) {
27
+ $("#map").next().replaceWith($doc.find("#map").next());
28
+ } else {
29
+ $("#map").after($doc.find("#map").next());
30
+ }
31
+ });
32
+ }
33
+
34
+ });
35
+
36
+ GeoBlacklight.prototype.setHoverListeners = function() {
37
+ var _this = this;
38
+
39
+ $("#content")
40
+ .on("mouseenter", "#documents [data-layer-id]", function() {
41
+ var bounds = L.bboxToBounds($(this).data('bbox'));
42
+ _this.addBoundsOverlay(bounds);
43
+ })
44
+ .on("mouseleave", "#documents [data-layer-id]", function() {
45
+ _this.removeBoundsOverlay();
46
+ });
47
+
48
+ return this;
49
+
50
+ };
@@ -0,0 +1,20 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require leaflet
12
+ *= require font-awesome
13
+ */
14
+
15
+ @import 'geoblacklight/styles';
16
+ @import 'modules/icons';
17
+ @import 'modules/icon-customization';
18
+ @import 'modules/home';
19
+ @import 'modules/item';
20
+ @import 'modules/results';
@@ -0,0 +1,44 @@
1
+ #table-container{
2
+ overflow:scroll;
3
+ max-height: 450px;
4
+ }
5
+
6
+ #control {
7
+ text-align: center;
8
+ background: #FFF;
9
+ position: absolute;
10
+ left: 24px;
11
+ top: 120px;
12
+ height: 200px;
13
+ width: 28px;
14
+ border: 1px solid #BBB;
15
+ -webkit-border-radius: 3px;
16
+ border-radius: 3px;
17
+ z-index: 999;
18
+ }
19
+
20
+ #handle {
21
+ background: #000;
22
+ position: absolute;
23
+ left: -1px;
24
+ top: 20px;
25
+ width: 28px;
26
+ height: 10px;
27
+ }
28
+
29
+ #bottom {
30
+ position: absolute;
31
+ bottom:0px;
32
+ left: 8px;
33
+ text-align: center;
34
+ }
35
+
36
+ #handle:hover {
37
+ cursor: pointer;
38
+ background: #444;
39
+ cursor: ns-resize;
40
+ }
41
+
42
+ .show-tools .bookmark_toggle {
43
+ padding: 0px 0px;
44
+ }
@@ -0,0 +1,3 @@
1
+ @import 'bootstrap-sprockets';
2
+ @import 'bootstrap';
3
+ @import 'geoblacklight/geoblacklight';
@@ -0,0 +1,3 @@
1
+ [data-map="home"] {
2
+ height: 600px;
3
+ }
@@ -0,0 +1,10 @@
1
+ // Additional customizations beyond generated FontCustom styles
2
+
3
+ .geoblacklight-icon {
4
+ color: $gray-light;
5
+ font-size: 1.2em;
6
+ }
7
+
8
+ .geoblacklight-stanford {
9
+ color: #8c1515;
10
+ }
@@ -0,0 +1,77 @@
1
+ //
2
+ // Icon Font: geoblacklight
3
+ //
4
+ // From https://github.com/geoblacklight/geoblacklight-icons/blob/master/app/assets/stylesheets/_geoblacklight.scss
5
+
6
+ @font-face {
7
+ font-family: "geoblacklight";
8
+ src: font-url("geoblacklight.eot");
9
+ src: font-url("geoblacklight.eot?#iefix") format("embedded-opentype"),
10
+ font-url("geoblacklight.woff") format("woff"),
11
+ font-url("geoblacklight.ttf") format("truetype"),
12
+ font-url("geoblacklight.svg#geoblacklight") format("svg");
13
+ font-weight: normal;
14
+ font-style: normal;
15
+ }
16
+
17
+ @media screen and (-webkit-min-device-pixel-ratio:0) {
18
+ @font-face {
19
+ font-family: "geoblacklight";
20
+ src: font-url("geoblacklight.svg#geoblacklight") format("svg");
21
+ }
22
+ }
23
+
24
+ [data-icon]:before { content: attr(data-icon); }
25
+
26
+ [data-icon]:before,
27
+ .geoblacklight-berkeley:before,
28
+ .geoblacklight-harvard:before,
29
+ .geoblacklight-image:before,
30
+ .geoblacklight-line:before,
31
+ .geoblacklight-massgis:before,
32
+ .geoblacklight-mit:before,
33
+ .geoblacklight-paper-map:before,
34
+ .geoblacklight-point:before,
35
+ .geoblacklight-polygon:before,
36
+ .geoblacklight-raster:before,
37
+ .geoblacklight-stanford:before,
38
+ .geoblacklight-tufts:before {
39
+ display: inline-block;
40
+ font-family: "geoblacklight";
41
+ font-style: normal;
42
+ font-weight: normal;
43
+ font-variant: normal;
44
+ line-height: 1;
45
+ text-decoration: inherit;
46
+ text-rendering: optimizeLegibility;
47
+ text-transform: none;
48
+ -moz-osx-font-smoothing: grayscale;
49
+ -webkit-font-smoothing: antialiased;
50
+ font-smoothing: antialiased;
51
+ }
52
+
53
+ .geoblacklight-berkeley:before { content: "\f101"; }
54
+ .geoblacklight-harvard:before { content: "\f103"; }
55
+ .geoblacklight-image:before { content: "\f10a"; }
56
+ .geoblacklight-line:before { content: "\f108"; }
57
+ .geoblacklight-massgis:before { content: "\f106"; }
58
+ .geoblacklight-mit:before { content: "\f104"; }
59
+ .geoblacklight-paper-map:before { content: "\f110"; }
60
+ .geoblacklight-point:before { content: "\f109"; }
61
+ .geoblacklight-polygon:before { content: "\f107"; }
62
+ .geoblacklight-raster:before { content: "\f10d"; }
63
+ .geoblacklight-stanford:before { content: "\f102"; }
64
+ .geoblacklight-tufts:before { content: "\f105"; }
65
+
66
+ $font-geoblacklight-berkeley: "\f101";
67
+ $font-geoblacklight-harvard: "\f103";
68
+ $font-geoblacklight-image: "\f10a";
69
+ $font-geoblacklight-line: "\f108";
70
+ $font-geoblacklight-massgis: "\f106";
71
+ $font-geoblacklight-mit: "\f104";
72
+ $font-geoblacklight-paper-map: "\f110";
73
+ $font-geoblacklight-point: "\f109";
74
+ $font-geoblacklight-polygon: "\f107";
75
+ $font-geoblacklight-raster: "\f10d";
76
+ $font-geoblacklight-stanford: "\f102";
77
+ $font-geoblacklight-tufts: "\f105";