jekyll-maps 1.0.2 → 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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +26 -0
- data/History.md +6 -0
- data/README.md +1 -0
- data/jekyll-maps.gemspec +1 -1
- data/lib/jekyll-maps/google_map_api.js +89 -0
- data/lib/jekyll-maps/google_map_api.rb +50 -0
- data/lib/jekyll-maps/google_map_tag.rb +31 -15
- data/lib/jekyll-maps/location_finder.rb +10 -10
- data/lib/jekyll-maps/options_parser.rb +18 -5
- data/lib/jekyll-maps/version.rb +1 -1
- data/lib/jekyll-maps.rb +2 -0
- metadata +7 -5
- data/lib/jekyll-maps/google_map.html +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e93f2ab559d3a815471eb4785a05b30239a88b7
|
4
|
+
data.tar.gz: 742dd19383883194546ff1d121ef1bce0209c28e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16e36155f5f2f59d08b2e6a93dd2378aade5d95897a161b6849778b86c41c08916f06e0b38d3dec349c99a86f4120eb2604ed7a44682562dc2143c4dfb03be69
|
7
|
+
data.tar.gz: 0b203611ebfef3cf6f7d970ae5bc81dcb62b0e653c6eb3157357978569fa30283e091b8b2d5391b226c98f6d9a178c3b19fdbbcfd9e79f93831c9c43457fb90b
|
data/.codeclimate.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
engines:
|
3
|
+
duplication:
|
4
|
+
enabled: true
|
5
|
+
config:
|
6
|
+
languages:
|
7
|
+
- ruby
|
8
|
+
- javascript
|
9
|
+
fixme:
|
10
|
+
enabled: true
|
11
|
+
rubocop:
|
12
|
+
enabled: true
|
13
|
+
eslint:
|
14
|
+
enabled: true
|
15
|
+
ratings:
|
16
|
+
paths:
|
17
|
+
- "**.inc"
|
18
|
+
- "**.js"
|
19
|
+
- "**.jsx"
|
20
|
+
- "**.module"
|
21
|
+
- "**.php"
|
22
|
+
- "**.py"
|
23
|
+
- "**.rb"
|
24
|
+
exclude_paths:
|
25
|
+
- script/
|
26
|
+
- spec/
|
data/History.md
CHANGED
data/README.md
CHANGED
@@ -4,5 +4,6 @@
|
|
4
4
|
[](https://travis-ci.org/ayastreb/jekyll-maps)
|
5
5
|
[](https://codeclimate.com/github/ayastreb/jekyll-maps)
|
6
6
|
[](https://codeclimate.com/github/ayastreb/jekyll-maps/coverage)
|
7
|
+
[](https://gemnasium.com/github.com/ayastreb/jekyll-maps)
|
7
8
|
|
8
9
|
Google Maps support in Jekyll blog to easily embed maps with posts' locations
|
data/jekyll-maps.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
|
19
19
|
spec.add_dependency "jekyll", "~> 3.0"
|
20
20
|
|
21
|
-
spec.add_development_dependency "rake", "~>
|
21
|
+
spec.add_development_dependency "rake", "~> 11.0"
|
22
22
|
spec.add_development_dependency "rspec", "~> 3.0"
|
23
23
|
spec.add_development_dependency "rubocop", "~> 0.41"
|
24
24
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
var jekyllMaps = (function () {
|
2
|
+
'use strict';
|
3
|
+
|
4
|
+
return {
|
5
|
+
data: [],
|
6
|
+
maps: [],
|
7
|
+
initializeMap: initializeMap,
|
8
|
+
initializeCluster: initializeCluster,
|
9
|
+
register: register,
|
10
|
+
render: render,
|
11
|
+
processCluster: processCluster
|
12
|
+
};
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Setup Google Maps options and call renderer.
|
16
|
+
*/
|
17
|
+
function initializeMap() {
|
18
|
+
this.options = {
|
19
|
+
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
20
|
+
center: new google.maps.LatLng(0, 0),
|
21
|
+
zoom: 3
|
22
|
+
}
|
23
|
+
this.mapReady = true;
|
24
|
+
this.render();
|
25
|
+
}
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Register map data to be rendered once Google Maps API is loaded.
|
29
|
+
*
|
30
|
+
* @param String id
|
31
|
+
* @param Array locations
|
32
|
+
*/
|
33
|
+
function register(id, locations) {
|
34
|
+
this.data.push({id: id, locations: locations});
|
35
|
+
this.render();
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Render maps data if Google Maps API is loaded.
|
40
|
+
*/
|
41
|
+
function render() {
|
42
|
+
if (!this.mapReady) return;
|
43
|
+
|
44
|
+
while (this.data.length > 0) {
|
45
|
+
var data = this.data.pop(),
|
46
|
+
bounds = new google.maps.LatLngBounds(),
|
47
|
+
map = new google.maps.Map(document.getElementById(data.id), this.options),
|
48
|
+
markers = data.locations.map(createMarker);
|
49
|
+
|
50
|
+
map.fitBounds(bounds);
|
51
|
+
this.maps.push({map: map, markers: markers});
|
52
|
+
this.processCluster();
|
53
|
+
}
|
54
|
+
|
55
|
+
function createMarker(location) {
|
56
|
+
var position = new google.maps.LatLng(location.latitude, location.longitude),
|
57
|
+
marker = new google.maps.Marker({
|
58
|
+
position: position,
|
59
|
+
title: location.title,
|
60
|
+
url: location.url,
|
61
|
+
map: map
|
62
|
+
});
|
63
|
+
|
64
|
+
bounds.extend(position);
|
65
|
+
marker.addListener('click', function () {
|
66
|
+
window.location.href = this.url
|
67
|
+
});
|
68
|
+
|
69
|
+
return marker;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
function initializeCluster() {
|
74
|
+
this.clusterReady = true;
|
75
|
+
this.processCluster();
|
76
|
+
}
|
77
|
+
|
78
|
+
function processCluster() {
|
79
|
+
if (!this.clusterReady) return;
|
80
|
+
|
81
|
+
while (this.maps.length > 0) {
|
82
|
+
var obj = this.maps.pop();
|
83
|
+
new MarkerClusterer(obj.map, obj.markers, {
|
84
|
+
gridSize: 25,
|
85
|
+
imagePath: 'https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/images/m'
|
86
|
+
});
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}());
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module Maps
|
3
|
+
class GoogleMapApi
|
4
|
+
HEAD_END_TAG = %r!</.*head.*>!
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def prepend_api_code(doc)
|
8
|
+
if doc.output =~ HEAD_END_TAG
|
9
|
+
# Insert API code before header's end if this document has one.
|
10
|
+
doc.output.gsub!(HEAD_END_TAG, %(#{api_code}#{Regexp.last_match}))
|
11
|
+
else
|
12
|
+
doc.output.prepend(api_code)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def api_code
|
18
|
+
<<HTML
|
19
|
+
<script type='text/javascript'>
|
20
|
+
#{js_lib_contents}
|
21
|
+
</script>
|
22
|
+
<script async defer src='https://maps.googleapis.com/maps/api/js?callback=jekyllMaps.initializeMap'></script>
|
23
|
+
<script async defer src='https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/src/markerclusterer.js'
|
24
|
+
onload='jekyllMaps.initializeCluster()'></script>
|
25
|
+
HTML
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def js_lib_contents
|
30
|
+
@js_lib_contents ||= begin
|
31
|
+
File.read(js_lib_path)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def js_lib_path
|
37
|
+
@js_lib_path ||= begin
|
38
|
+
File.expand_path("./google_map_api.js", File.dirname(__FILE__))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Jekyll::Hooks.register [:pages, :documents], :post_render do |doc|
|
47
|
+
if doc.output =~ %r!#{Jekyll::Maps::GoogleMapTag::JS_LIB_NAME}!
|
48
|
+
Jekyll::Maps::GoogleMapApi.prepend_api_code(doc)
|
49
|
+
end
|
50
|
+
end
|
@@ -1,35 +1,51 @@
|
|
1
1
|
module Jekyll
|
2
2
|
module Maps
|
3
3
|
class GoogleMapTag < Liquid::Tag
|
4
|
+
JS_LIB_NAME = "jekyllMaps".freeze
|
5
|
+
DEFAULT_MAP_WIDTH = 600
|
6
|
+
DEFAULT_MAP_HEIGHT = 400
|
7
|
+
|
4
8
|
def initialize(_, args, _)
|
5
|
-
|
6
|
-
@finder = LocationFinder.new(
|
9
|
+
@args = OptionsParser.parse(args)
|
10
|
+
@finder = LocationFinder.new(@args)
|
7
11
|
super
|
8
12
|
end
|
9
13
|
|
10
14
|
def render(context)
|
11
|
-
|
12
|
-
|
13
|
-
|
15
|
+
locations = @finder.find(context.registers[:site])
|
16
|
+
@args[:attributes][:id] ||= SecureRandom.uuid
|
17
|
+
|
18
|
+
<<HTML
|
19
|
+
<div #{render_attributes}></div>
|
20
|
+
<script type='text/javascript'>
|
21
|
+
#{JS_LIB_NAME}.register('#{@args[:attributes][:id]}', #{locations.to_json});
|
22
|
+
</script>
|
23
|
+
HTML
|
14
24
|
end
|
15
25
|
|
16
26
|
private
|
17
|
-
def
|
18
|
-
|
27
|
+
def render_attributes
|
28
|
+
attributes = []
|
29
|
+
attributes << "id='#{@args[:attributes][:id]}'"
|
30
|
+
attributes << render_dimensions
|
31
|
+
attributes << render_class if @args[:attributes][:class]
|
32
|
+
attributes.join(" ")
|
19
33
|
end
|
20
34
|
|
21
35
|
private
|
22
|
-
def
|
23
|
-
@
|
24
|
-
|
25
|
-
|
36
|
+
def render_dimensions
|
37
|
+
width = @args[:attributes][:width] || DEFAULT_MAP_WIDTH
|
38
|
+
height = @args[:attributes][:height] || DEFAULT_MAP_HEIGHT
|
39
|
+
width_unit = width.to_s.include?("%") ? "" : "px"
|
40
|
+
height_unit = height.to_s.include?("%") ? "" : "px"
|
41
|
+
%(style='width:#{width}#{width_unit};height:#{height}#{height_unit};')
|
26
42
|
end
|
27
43
|
|
28
44
|
private
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
45
|
+
def render_class
|
46
|
+
css = @args[:attributes][:class]
|
47
|
+
css = css.join(" ") if css.is_a?(Array)
|
48
|
+
%(class='#{css}')
|
33
49
|
end
|
34
50
|
end
|
35
51
|
end
|
@@ -2,29 +2,29 @@ module Jekyll
|
|
2
2
|
module Maps
|
3
3
|
class LocationFinder
|
4
4
|
def initialize(options)
|
5
|
-
@
|
5
|
+
@documents = []
|
6
|
+
@options = options
|
6
7
|
end
|
7
8
|
|
8
9
|
def find(site)
|
9
|
-
|
10
|
+
site.collections.each { |_, collection| filter(collection.docs) }
|
11
|
+
site.data.each { |_, docs| filter(docs) }
|
12
|
+
|
13
|
+
@documents.map do |document|
|
10
14
|
{
|
11
15
|
:latitude => document["location"]["latitude"],
|
12
16
|
:longitude => document["location"]["longitude"],
|
13
17
|
:title => document["title"],
|
14
|
-
:url => document.url
|
18
|
+
:url => document["url"] || document.url
|
15
19
|
}
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
19
23
|
private
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
-
collection.docs.each do |doc|
|
24
|
-
documents << doc if location?(doc) && match_filters?(doc)
|
25
|
-
end
|
24
|
+
def filter(docs)
|
25
|
+
docs.each do |doc|
|
26
|
+
@documents << doc if location?(doc) && match_filters?(doc)
|
26
27
|
end
|
27
|
-
documents
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
@@ -1,14 +1,27 @@
|
|
1
1
|
module Jekyll
|
2
2
|
module Maps
|
3
3
|
class OptionsParser
|
4
|
+
OPTIONS_SYNTAX = %r!([^\s]+)\s*:\s*([^\s]+)!
|
5
|
+
ALLOWED_ATTRIBUTES = %w(
|
6
|
+
id
|
7
|
+
width
|
8
|
+
height
|
9
|
+
class
|
10
|
+
).freeze
|
11
|
+
|
4
12
|
class << self
|
5
13
|
def parse(raw_options)
|
6
|
-
options = {
|
7
|
-
|
8
|
-
|
9
|
-
|
14
|
+
options = {
|
15
|
+
:attributes => {},
|
16
|
+
:filters => {}
|
17
|
+
}
|
18
|
+
raw_options.scan(OPTIONS_SYNTAX).each do |key, value|
|
10
19
|
value = value.split(",") if value.include?(",")
|
11
|
-
|
20
|
+
if ALLOWED_ATTRIBUTES.include?(key)
|
21
|
+
options[:attributes][key.to_sym] = value
|
22
|
+
else
|
23
|
+
options[:filters][key] = value
|
24
|
+
end
|
12
25
|
end
|
13
26
|
options
|
14
27
|
end
|
data/lib/jekyll-maps/version.rb
CHANGED
data/lib/jekyll-maps.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-maps
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anatoliy Yastreb
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '11.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '11.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,6 +73,7 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
+
- ".codeclimate.yml"
|
76
77
|
- ".gitignore"
|
77
78
|
- ".rubocop.yml"
|
78
79
|
- ".travis.yml"
|
@@ -83,7 +84,8 @@ files:
|
|
83
84
|
- Rakefile
|
84
85
|
- jekyll-maps.gemspec
|
85
86
|
- lib/jekyll-maps.rb
|
86
|
-
- lib/jekyll-maps/
|
87
|
+
- lib/jekyll-maps/google_map_api.js
|
88
|
+
- lib/jekyll-maps/google_map_api.rb
|
87
89
|
- lib/jekyll-maps/google_map_tag.rb
|
88
90
|
- lib/jekyll-maps/location_finder.rb
|
89
91
|
- lib/jekyll-maps/options_parser.rb
|
@@ -1,53 +0,0 @@
|
|
1
|
-
<div id='google-map'></div>
|
2
|
-
|
3
|
-
<script type='text/javascript'>
|
4
|
-
var jekyllMaps = (function () {
|
5
|
-
'use strict';
|
6
|
-
|
7
|
-
return {
|
8
|
-
loadScript: function (url) {
|
9
|
-
var script = document.createElement('script');
|
10
|
-
script.type = 'text/javascript';
|
11
|
-
script.src = url;
|
12
|
-
document.body.appendChild(script);
|
13
|
-
},
|
14
|
-
initialize: function () {
|
15
|
-
this.options = {
|
16
|
-
center: new google.maps.LatLng(0, 0),
|
17
|
-
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
18
|
-
zoom: 3
|
19
|
-
}
|
20
|
-
this.map = new google.maps.Map(document.getElementById('google-map'), this.options);
|
21
|
-
this.showMarkers({{ locations }});
|
22
|
-
},
|
23
|
-
showMarkers: function (locations) {
|
24
|
-
var map = this.map,
|
25
|
-
bounds = new google.maps.LatLngBounds(),
|
26
|
-
markers = locations.map(function (location) {
|
27
|
-
var position = new google.maps.LatLng(location.latitude, location.longitude);
|
28
|
-
var marker = new google.maps.Marker({
|
29
|
-
position: position,
|
30
|
-
title: location.title,
|
31
|
-
url: location.url,
|
32
|
-
map: map
|
33
|
-
});
|
34
|
-
|
35
|
-
marker.addListener('click', function () {
|
36
|
-
window.location.href = this.url
|
37
|
-
});
|
38
|
-
bounds.extend(position);
|
39
|
-
|
40
|
-
return marker;
|
41
|
-
});
|
42
|
-
|
43
|
-
new MarkerClusterer(map, markers, {
|
44
|
-
gridSize: 25,
|
45
|
-
imagePath: 'https://raw.githubusercontent.com/googlemaps/js-marker-clusterer/gh-pages/images/m'
|
46
|
-
});
|
47
|
-
map.fitBounds(bounds);
|
48
|
-
},
|
49
|
-
};
|
50
|
-
}());
|
51
|
-
</script>
|
52
|
-
<script src='https://googlemaps.github.io/js-marker-clusterer/src/markerclusterer.js'></script>
|
53
|
-
<script src='https://maps.googleapis.com/maps/api/js?callback=jekyllMaps.initialize'></script>
|