jekyll-maps 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/ayastreb/jekyll-maps.svg?branch=master)](https://travis-ci.org/ayastreb/jekyll-maps)
|
5
5
|
[![Code Climate](https://codeclimate.com/github/ayastreb/jekyll-maps/badges/gpa.svg)](https://codeclimate.com/github/ayastreb/jekyll-maps)
|
6
6
|
[![Test Coverage](https://codeclimate.com/github/ayastreb/jekyll-maps/badges/coverage.svg)](https://codeclimate.com/github/ayastreb/jekyll-maps/coverage)
|
7
|
+
[![Dependency Status](https://gemnasium.com/badges/github.com/ayastreb/jekyll-maps.svg)](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>
|