jekyll-maps-debugging 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.codeclimate.yml +26 -0
- data/.gitignore +9 -0
- data/.rubocop.yml +127 -0
- data/.travis.yml +11 -0
- data/Gemfile +5 -0
- data/History.md +71 -0
- data/LICENSE +21 -0
- data/README.md +179 -0
- data/Rakefile +6 -0
- data/jekyll-maps.gemspec +23 -0
- data/lib/jekyll-maps.rb +12 -0
- data/lib/jekyll-maps/google_map_api.js +146 -0
- data/lib/jekyll-maps/google_map_api.rb +72 -0
- data/lib/jekyll-maps/google_map_tag.rb +75 -0
- data/lib/jekyll-maps/location_finder.rb +119 -0
- data/lib/jekyll-maps/options_parser.rb +46 -0
- data/lib/jekyll-maps/version.rb +5 -0
- data/script/bootstrap +3 -0
- data/script/cibuild +4 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1c55dbd0cceed5e8a5cdc93272042d22283b19cc
|
4
|
+
data.tar.gz: 158f0d192e8aebe8576ec66eab27c7f48b2495a2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5fa91b504b6b32daf85911c8c7e392b60c0164e25b476405dd9ba22f5421697689c4effeceb897fafa0d3efe7eb08a81304a0b881234da6f62a2a0c255bf76e6
|
7
|
+
data.tar.gz: be2b0eefa3081dc2cfa347eb9694ad4357fb00b447b71f1a6b7f0302e059c72677fa1af32bfe32cc3e000aa821dd8055c517c9b85ffd7599ab376cb316a2df1f
|
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/.gitignore
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
---
|
2
|
+
AllCops:
|
3
|
+
TargetRubyVersion: 2.0
|
4
|
+
Include:
|
5
|
+
- lib/**/*.rb
|
6
|
+
- spec/**/*.rb
|
7
|
+
Lint/EndAlignment:
|
8
|
+
Severity: error
|
9
|
+
Lint/UnreachableCode:
|
10
|
+
Severity: error
|
11
|
+
Lint/UselessAccessModifier:
|
12
|
+
Enabled: false
|
13
|
+
Metrics/AbcSize:
|
14
|
+
Max: 20
|
15
|
+
Metrics/BlockLength:
|
16
|
+
Exclude:
|
17
|
+
- spec/**/*.rb
|
18
|
+
Metrics/ClassLength:
|
19
|
+
Max: 300
|
20
|
+
Exclude:
|
21
|
+
- !ruby/regexp /spec\/.*.rb$/
|
22
|
+
Metrics/CyclomaticComplexity:
|
23
|
+
Max: 8
|
24
|
+
Metrics/LineLength:
|
25
|
+
Exclude:
|
26
|
+
- Rakefile
|
27
|
+
- Gemfile
|
28
|
+
- jekyll-maps.gemspec
|
29
|
+
Max: 90
|
30
|
+
Severity: warning
|
31
|
+
Metrics/MethodLength:
|
32
|
+
Max: 20
|
33
|
+
CountComments: false
|
34
|
+
Severity: error
|
35
|
+
Metrics/ModuleLength:
|
36
|
+
Max: 240
|
37
|
+
Metrics/ParameterLists:
|
38
|
+
Max: 4
|
39
|
+
Metrics/PerceivedComplexity:
|
40
|
+
Max: 8
|
41
|
+
Style/Alias:
|
42
|
+
Enabled: false
|
43
|
+
Style/AlignArray:
|
44
|
+
Enabled: false
|
45
|
+
Style/AlignHash:
|
46
|
+
EnforcedHashRocketStyle: table
|
47
|
+
Style/AlignParameters:
|
48
|
+
EnforcedStyle: with_fixed_indentation
|
49
|
+
Enabled: false
|
50
|
+
Style/AndOr:
|
51
|
+
Severity: error
|
52
|
+
Style/Attr:
|
53
|
+
Enabled: false
|
54
|
+
Style/BracesAroundHashParameters:
|
55
|
+
Enabled: false
|
56
|
+
Style/ClassAndModuleChildren:
|
57
|
+
Enabled: false
|
58
|
+
Style/Documentation:
|
59
|
+
Enabled: false
|
60
|
+
Style/DoubleNegation:
|
61
|
+
Enabled: false
|
62
|
+
Style/EmptyLinesAroundAccessModifier:
|
63
|
+
Enabled: false
|
64
|
+
Style/EmptyLinesAroundModuleBody:
|
65
|
+
Enabled: false
|
66
|
+
Style/ExtraSpacing:
|
67
|
+
AllowForAlignment: true
|
68
|
+
Style/FileName:
|
69
|
+
Enabled: false
|
70
|
+
Style/FirstParameterIndentation:
|
71
|
+
EnforcedStyle: consistent
|
72
|
+
Style/GuardClause:
|
73
|
+
Enabled: false
|
74
|
+
Style/HashSyntax:
|
75
|
+
EnforcedStyle: hash_rockets
|
76
|
+
Severity: error
|
77
|
+
Style/IfUnlessModifier:
|
78
|
+
Enabled: false
|
79
|
+
Style/IndentArray:
|
80
|
+
EnforcedStyle: consistent
|
81
|
+
Style/IndentHash:
|
82
|
+
EnforcedStyle: consistent
|
83
|
+
Style/IndentationWidth:
|
84
|
+
Severity: error
|
85
|
+
Style/ModuleFunction:
|
86
|
+
Enabled: false
|
87
|
+
Style/MultilineMethodCallIndentation:
|
88
|
+
EnforcedStyle: indented
|
89
|
+
Style/MultilineOperationIndentation:
|
90
|
+
EnforcedStyle: indented
|
91
|
+
Style/MultilineTernaryOperator:
|
92
|
+
Severity: error
|
93
|
+
Style/PercentLiteralDelimiters:
|
94
|
+
PreferredDelimiters:
|
95
|
+
"%q": "{}"
|
96
|
+
"%Q": "{}"
|
97
|
+
"%r": "!!"
|
98
|
+
"%s": "()"
|
99
|
+
"%w": "()"
|
100
|
+
"%W": "()"
|
101
|
+
"%x": "()"
|
102
|
+
Style/RedundantReturn:
|
103
|
+
Enabled: false
|
104
|
+
Style/RedundantSelf:
|
105
|
+
Enabled: false
|
106
|
+
Style/RegexpLiteral:
|
107
|
+
EnforcedStyle: percent_r
|
108
|
+
Style/RescueModifier:
|
109
|
+
Enabled: false
|
110
|
+
Style/SignalException:
|
111
|
+
EnforcedStyle: only_raise
|
112
|
+
Style/SingleLineMethods:
|
113
|
+
Enabled: false
|
114
|
+
Style/SpaceAroundOperators:
|
115
|
+
Enabled: false
|
116
|
+
Style/SpaceInsideBrackets:
|
117
|
+
Enabled: false
|
118
|
+
Style/StringLiterals:
|
119
|
+
EnforcedStyle: double_quotes
|
120
|
+
Style/StringLiteralsInInterpolation:
|
121
|
+
EnforcedStyle: double_quotes
|
122
|
+
Style/UnneededCapitalW:
|
123
|
+
Enabled: false
|
124
|
+
Style/IndentHeredoc:
|
125
|
+
Enabled: false
|
126
|
+
Style/SymbolArray:
|
127
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/History.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
## 2.1.1 / 2018-01-25
|
2
|
+
|
3
|
+
* fixed JS lib injection in header (fix #31)
|
4
|
+
|
5
|
+
## 2.1.0 / 2018-01-10
|
6
|
+
|
7
|
+
* fixed base_url in marker url (fix #28)
|
8
|
+
|
9
|
+
## 2.0.4 / 2017-07-19
|
10
|
+
|
11
|
+
* allow multiple locations per document (fix #6)
|
12
|
+
* allow inline locations with map attributes, e.g. `{% google_map laititude='42.23323' longitude='3.213232' %}` (fix #23)
|
13
|
+
|
14
|
+
## 2.0.3 / 2017-05-17
|
15
|
+
|
16
|
+
* load locations from specific data file (fix #26)
|
17
|
+
|
18
|
+
## 2.0.2 / 2017-04-24
|
19
|
+
|
20
|
+
* allow multi-word filters (fix #25)
|
21
|
+
|
22
|
+
## 2.0.1 / 2017-04-11
|
23
|
+
|
24
|
+
* add option to hide markers (show_marker="false")
|
25
|
+
* do not show link in marker popup when no URL is set
|
26
|
+
|
27
|
+
## 2.0.0 / 2016-11-06
|
28
|
+
|
29
|
+
* change default behaviour to load location from current page
|
30
|
+
* removed on-page flag
|
31
|
+
* change attributes syntax to HTML-style
|
32
|
+
|
33
|
+
## 1.1.6 / 2016-09-07
|
34
|
+
|
35
|
+
* fix #15 - broken page if there is <header> tag used
|
36
|
+
* allow setting custom zoom level with `zoom:10` attribute
|
37
|
+
|
38
|
+
## 1.1.5 / 2016-09-03
|
39
|
+
|
40
|
+
* allow to disable marker popup on the map
|
41
|
+
|
42
|
+
## 1.1.4 / 2016-07-31
|
43
|
+
|
44
|
+
* open info window when marker is clicked
|
45
|
+
|
46
|
+
## 1.1.3 / 2016-07-28
|
47
|
+
|
48
|
+
* on-page map flag
|
49
|
+
|
50
|
+
## 1.1.2 / 2016-07-22
|
51
|
+
|
52
|
+
* configurable marker cluster
|
53
|
+
|
54
|
+
## 1.1.1 / 2016-07-20
|
55
|
+
|
56
|
+
* configure GoogleMaps API key from \_config.yml
|
57
|
+
|
58
|
+
## 1.1.0 / 2016-07-19
|
59
|
+
|
60
|
+
* add multiple maps to single page
|
61
|
+
* load external JavaScript asynchronously
|
62
|
+
* configure map element's id, CSS class and dimensions
|
63
|
+
|
64
|
+
## 1.0.2 / 2016-07-18
|
65
|
+
|
66
|
+
* fix script loading
|
67
|
+
* look for location coordinates in all collections
|
68
|
+
|
69
|
+
## 1.0.1 / 2016-07-17
|
70
|
+
|
71
|
+
* implement Google Maps tag
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Anatoliy Yastreb
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
# Jekyll Maps
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/jekyll-maps.svg)](https://badge.fury.io/rb/jekyll-maps)
|
4
|
+
[![Build Status](https://travis-ci.org/ayastreb/jekyll-maps.svg?branch=master)](https://travis-ci.org/ayastreb/jekyll-maps)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/ayastreb/jekyll-maps/badges/gpa.svg)](https://codeclimate.com/github/ayastreb/jekyll-maps)
|
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)
|
8
|
+
|
9
|
+
Jekyll Maps is a plugin that allows you to easily create different maps on your Jekyll site pages.
|
10
|
+
It allows you to select which points to display on the map with different filters.
|
11
|
+
|
12
|
+
GoogleMaps Marker Clusterer can be used if you have many points within close proximity.
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
1. Add the following to your site's `Gemfile`:
|
17
|
+
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
gem 'jekyll-maps'
|
21
|
+
```
|
22
|
+
|
23
|
+
2. Add the following to your site's `_config.yml`:
|
24
|
+
|
25
|
+
|
26
|
+
```yml
|
27
|
+
plugins:
|
28
|
+
- jekyll-maps
|
29
|
+
```
|
30
|
+
|
31
|
+
## Usage
|
32
|
+
|
33
|
+
### Configure Google API Key
|
34
|
+
|
35
|
+
To be able to use Google Maps you need to obtain
|
36
|
+
[API Key](https://developers.google.com/maps/documentation/javascript/get-api-key).
|
37
|
+
|
38
|
+
Once you have your API Key you need to add it to Jekyll's `_config.yml`:
|
39
|
+
|
40
|
+
```yml
|
41
|
+
maps:
|
42
|
+
google:
|
43
|
+
api_key: <YOUR_KEY>
|
44
|
+
```
|
45
|
+
|
46
|
+
### Data Source
|
47
|
+
|
48
|
+
First, add location information to your posts YAML front-matter:
|
49
|
+
|
50
|
+
```yml
|
51
|
+
location:
|
52
|
+
latitude: 51.5285582
|
53
|
+
longitude: -0.2416807
|
54
|
+
```
|
55
|
+
|
56
|
+
You can specify multiple locations per post:
|
57
|
+
|
58
|
+
```yml
|
59
|
+
location:
|
60
|
+
- latitude: 51.5285582
|
61
|
+
longitude: -0.2416807
|
62
|
+
- latitude: 52.5285582
|
63
|
+
longitude: -2.2416807
|
64
|
+
- title: custom marker title
|
65
|
+
image: custom marker image
|
66
|
+
url: custom marker url
|
67
|
+
latitude: 51.5285582
|
68
|
+
longitude: -0.2416807
|
69
|
+
```
|
70
|
+
|
71
|
+
Alternatively, you can add location info to your custom collection's documents or even in data
|
72
|
+
files:
|
73
|
+
|
74
|
+
```yml
|
75
|
+
- title: Paris
|
76
|
+
url: http://google.fr
|
77
|
+
location:
|
78
|
+
latitude: 48.8587741
|
79
|
+
longitude: 2.2074741
|
80
|
+
|
81
|
+
- title: Madrid
|
82
|
+
url: http://google.es
|
83
|
+
location:
|
84
|
+
latitude: 40.4378698
|
85
|
+
longitude: -3.8196204
|
86
|
+
```
|
87
|
+
|
88
|
+
By default this plugin will display location from the page it's placed on:
|
89
|
+
|
90
|
+
```
|
91
|
+
{% google_map %}
|
92
|
+
```
|
93
|
+
|
94
|
+
But you can use src attribute to load locations from other places, like posts, collections or data
|
95
|
+
files!
|
96
|
+
|
97
|
+
For example, this map will show locations from all posts from 2016:
|
98
|
+
|
99
|
+
```
|
100
|
+
{% google_map src="_posts/2016" %}
|
101
|
+
```
|
102
|
+
|
103
|
+
This map will show locations from a collection called 'my_collection':
|
104
|
+
|
105
|
+
```
|
106
|
+
{% google_map src="_collections/my_collection" %}
|
107
|
+
```
|
108
|
+
|
109
|
+
This map will show locations from all data files located in 'my_points' sub-folder:
|
110
|
+
|
111
|
+
```
|
112
|
+
{% google_map src="_data/my_points" %}
|
113
|
+
```
|
114
|
+
|
115
|
+
You can configure map's dimensions and assign custom CSS class to the element:
|
116
|
+
|
117
|
+
```
|
118
|
+
{% google_map width="100%" height="400" class="my-map" %}
|
119
|
+
```
|
120
|
+
|
121
|
+
You can also just set marker coordinates directly in tag attributes:
|
122
|
+
|
123
|
+
```
|
124
|
+
{% google_map latitude="48.8587741" longitude="2.2074741" marker_title="My Location" marker_img="/img.jpg" marker_url="/my-location.html" %}
|
125
|
+
```
|
126
|
+
|
127
|
+
This will create a map with single marker in given location. `marker_title`, `marker_img` and
|
128
|
+
`marker_url` attributes are optional and current page's data will be used by default.
|
129
|
+
|
130
|
+
### Filters
|
131
|
+
|
132
|
+
You can also filter which locations to display on the map!<br/> For instance, following tag will
|
133
|
+
only display locations from documents which have `lang: en` in their front-matter data.
|
134
|
+
|
135
|
+
```
|
136
|
+
{% google_map src="_posts" lang="en" %}
|
137
|
+
```
|
138
|
+
|
139
|
+
### Marker Cluster
|
140
|
+
|
141
|
+
By default [Marker Clusterer](https://github.com/googlemaps/js-marker-clusterer) is enabled. If you
|
142
|
+
have many markers on the map, it will group them and show icon with the count of markers in each
|
143
|
+
cluster -
|
144
|
+
[see example](https://googlemaps.github.io/js-marker-clusterer/examples/advanced_example.html).
|
145
|
+
|
146
|
+
If you don't want to use marker cluster, you can disable it globally in `_config.yml`:
|
147
|
+
|
148
|
+
```yml
|
149
|
+
maps:
|
150
|
+
google:
|
151
|
+
marker_cluster:
|
152
|
+
enabled: false
|
153
|
+
```
|
154
|
+
|
155
|
+
Or you can disable it per single map tag:
|
156
|
+
|
157
|
+
```
|
158
|
+
{% google_map no_cluster %}
|
159
|
+
```
|
160
|
+
|
161
|
+
If you have any questions or proposals - open up an
|
162
|
+
[issue](https://github.com/ayastreb/jekyll-maps/issues/new)!
|
163
|
+
|
164
|
+
## Examples
|
165
|
+
|
166
|
+
Want to see it in action? Check out [Demo Page](https://ayastreb.me/jekyll-maps/#examples)!
|
167
|
+
|
168
|
+
## Contributing
|
169
|
+
|
170
|
+
1. Fork it (https://github.com/ayastreb/jekyll-maps/fork)
|
171
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
172
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
173
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
174
|
+
5. Create a new Pull Request
|
175
|
+
|
176
|
+
## License
|
177
|
+
|
178
|
+
[MIT](https://github.com/ayastreb/jekyll-maps/blob/master/LICENSE). Feel free to use, copy or
|
179
|
+
distribute it.
|
data/Rakefile
ADDED
data/jekyll-maps.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "jekyll-maps/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "jekyll-maps-debugging"
|
7
|
+
spec.summary = "Jekyll Google Maps integration"
|
8
|
+
spec.description = "Google Maps support in Jekyll blog to easily embed maps with posts' locations"
|
9
|
+
spec.version = Jekyll::Maps::VERSION
|
10
|
+
spec.authors = ["Chris Lyman, c/o Anatoliy Yastreb"]
|
11
|
+
spec.email = ["chris.a.lyman@gmail.com"]
|
12
|
+
|
13
|
+
spec.homepage = "https://ayastreb.me/jekyll-maps/"
|
14
|
+
spec.licenses = ["MIT"]
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r!^(test|spec|features)/!) }
|
16
|
+
spec.require_paths = ["lib"]
|
17
|
+
|
18
|
+
spec.add_dependency "jekyll", "~> 3.0"
|
19
|
+
|
20
|
+
spec.add_development_dependency "rake", "~> 11.0"
|
21
|
+
spec.add_development_dependency "rspec", "~> 3.5"
|
22
|
+
spec.add_development_dependency "rubocop", "0.49.1"
|
23
|
+
end
|
data/lib/jekyll-maps.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
require "ostruct"
|
3
|
+
require "jekyll-maps/google_map_api"
|
4
|
+
require "jekyll-maps/google_map_tag"
|
5
|
+
require "jekyll-maps/location_finder"
|
6
|
+
require "jekyll-maps/options_parser"
|
7
|
+
require "jekyll-maps/version"
|
8
|
+
|
9
|
+
module Jekyll
|
10
|
+
module Maps
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
/* global google */
|
2
|
+
/* global MarkerClusterer */
|
3
|
+
// eslint-disable-next-line no-unused-vars
|
4
|
+
var jekyllMaps = (function() {
|
5
|
+
'use strict'
|
6
|
+
var clusterSettings = {}
|
7
|
+
var clusterReady = false
|
8
|
+
var mapReady = false
|
9
|
+
var options = {}
|
10
|
+
var data = []
|
11
|
+
var maps = []
|
12
|
+
|
13
|
+
return {
|
14
|
+
initializeMap: initializeMap,
|
15
|
+
initializeCluster: initializeCluster,
|
16
|
+
register: register
|
17
|
+
}
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Setup Google Maps options and call renderer.
|
21
|
+
*/
|
22
|
+
function initializeMap() {
|
23
|
+
options = {
|
24
|
+
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
25
|
+
center: new google.maps.LatLng(0, 0)
|
26
|
+
}
|
27
|
+
mapReady = true
|
28
|
+
render()
|
29
|
+
}
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Register map data to be rendered once Google Maps API is loaded.
|
33
|
+
*
|
34
|
+
* @param string id
|
35
|
+
* @param Array locations
|
36
|
+
* @param Object settings
|
37
|
+
*/
|
38
|
+
function register(id, locations, options) {
|
39
|
+
data.push({ id: id, locations: locations, options: options })
|
40
|
+
render()
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Render maps data if Google Maps API is loaded.
|
45
|
+
*/
|
46
|
+
function render() {
|
47
|
+
if (!mapReady) return
|
48
|
+
|
49
|
+
while (data.length > 0) {
|
50
|
+
var item = data.pop()
|
51
|
+
var bounds = new google.maps.LatLngBounds()
|
52
|
+
var mapOptions = Object.assign({}, options, item.options)
|
53
|
+
var map = new google.maps.Map(
|
54
|
+
document.getElementById(item.id),
|
55
|
+
mapOptions
|
56
|
+
)
|
57
|
+
var infoWindow = new google.maps.InfoWindow()
|
58
|
+
var markers = item.locations.map(createMarker)
|
59
|
+
|
60
|
+
map.fitBounds(bounds)
|
61
|
+
google.maps.event.addListenerOnce(map, 'bounds_changed', function() {
|
62
|
+
if (this.customZoom) this.setZoom(this.customZoom)
|
63
|
+
})
|
64
|
+
if (mapOptions.useCluster) {
|
65
|
+
maps.push({ map: map, markers: markers })
|
66
|
+
processCluster()
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
function createMarker(location) {
|
71
|
+
var position = new google.maps.LatLng(
|
72
|
+
location.latitude,
|
73
|
+
location.longitude
|
74
|
+
)
|
75
|
+
bounds.extend(position)
|
76
|
+
if (!mapOptions.showMarker) return false
|
77
|
+
|
78
|
+
var marker = new google.maps.Marker({
|
79
|
+
position: position,
|
80
|
+
title: location.title,
|
81
|
+
image: location.image,
|
82
|
+
url: location.url.length > 0 ? mapOptions.baseUrl + location.url : '',
|
83
|
+
map: map
|
84
|
+
})
|
85
|
+
if (mapOptions.showMarkerPopup) marker.addListener('click', markerPopup)
|
86
|
+
|
87
|
+
return marker
|
88
|
+
}
|
89
|
+
|
90
|
+
function markerPopup() {
|
91
|
+
var contentHtml =
|
92
|
+
'<div class="map-info-window"><h5>' + this.title + '</h5>'
|
93
|
+
var imageHtml = '<img src="' + this.image + '" alt="' + this.title + '"/>'
|
94
|
+
if (this.url.length > 0) {
|
95
|
+
var linkText = this.image.length > 0 ? imageHtml : 'View'
|
96
|
+
contentHtml += '<a href="' + this.url + '">' + linkText + '</a></div>'
|
97
|
+
} else if (this.image.length > 0) {
|
98
|
+
contentHtml += imageHtml
|
99
|
+
}
|
100
|
+
infoWindow.setContent(contentHtml)
|
101
|
+
infoWindow.open(map, this)
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
function initializeCluster(settings) {
|
106
|
+
clusterReady = true
|
107
|
+
clusterSettings = settings || {}
|
108
|
+
processCluster()
|
109
|
+
}
|
110
|
+
|
111
|
+
function processCluster() {
|
112
|
+
if (!clusterReady) return
|
113
|
+
|
114
|
+
while (maps.length > 0) {
|
115
|
+
var obj = maps.pop()
|
116
|
+
// eslint-disable-next-line no-new
|
117
|
+
new MarkerClusterer(obj.map, obj.markers, {
|
118
|
+
gridSize: clusterSettings.grid_size || 25,
|
119
|
+
imagePath:
|
120
|
+
'https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/images/m'
|
121
|
+
})
|
122
|
+
}
|
123
|
+
}
|
124
|
+
})()
|
125
|
+
/* Object.assign polyfill */
|
126
|
+
if (typeof Object.assign !== 'function') {
|
127
|
+
Object.assign = function(target) {
|
128
|
+
'use strict'
|
129
|
+
if (target == null) {
|
130
|
+
throw new TypeError('Cannot convert undefined or null to object')
|
131
|
+
}
|
132
|
+
|
133
|
+
target = Object(target)
|
134
|
+
for (var index = 1; index < arguments.length; index++) {
|
135
|
+
var source = arguments[index]
|
136
|
+
if (source != null) {
|
137
|
+
for (var key in source) {
|
138
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
139
|
+
target[key] = source[key]
|
140
|
+
}
|
141
|
+
}
|
142
|
+
}
|
143
|
+
}
|
144
|
+
return target
|
145
|
+
}
|
146
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module Maps
|
3
|
+
class GoogleMapApi
|
4
|
+
HEAD_END_TAG = %r!</[\s\t]*head>!
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def prepend_api_code(doc)
|
8
|
+
@config = doc.site.config
|
9
|
+
if doc.output =~ HEAD_END_TAG
|
10
|
+
# Insert API code before header's end if this document has one.
|
11
|
+
doc.output.gsub!(HEAD_END_TAG, %(#{api_code}#{Regexp.last_match}))
|
12
|
+
else
|
13
|
+
doc.output.prepend(api_code)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def api_code
|
19
|
+
<<HTML
|
20
|
+
<script type='text/javascript'>
|
21
|
+
#{js_lib_contents}
|
22
|
+
</script>
|
23
|
+
#{load_google_maps_api}
|
24
|
+
#{load_marker_cluster}
|
25
|
+
HTML
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def load_google_maps_api
|
30
|
+
api_key = @config.fetch("maps", {})
|
31
|
+
.fetch("google", {})
|
32
|
+
.fetch("api_key", "")
|
33
|
+
<<HTML
|
34
|
+
<script async defer src='https://maps.googleapis.com/maps/api/js?key=#{api_key}&callback=#{Jekyll::Maps::GoogleMapTag::JS_LIB_NAME}.initializeMap'></script>
|
35
|
+
HTML
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def load_marker_cluster
|
40
|
+
settings = @config.fetch("maps", {})
|
41
|
+
.fetch("google", {})
|
42
|
+
.fetch("marker_cluster", {})
|
43
|
+
return unless settings.fetch("enabled", true)
|
44
|
+
<<HTML
|
45
|
+
<script async defer src='https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/src/markerclusterer.js'
|
46
|
+
onload='#{Jekyll::Maps::GoogleMapTag::JS_LIB_NAME}.initializeCluster(#{settings.to_json})'></script>
|
47
|
+
HTML
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def js_lib_contents
|
52
|
+
@js_lib_contents ||= begin
|
53
|
+
File.read(js_lib_path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def js_lib_path
|
59
|
+
@js_lib_path ||= begin
|
60
|
+
File.expand_path("./google_map_api.js", File.dirname(__FILE__))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
Jekyll::Hooks.register [:pages, :documents], :post_render do |doc|
|
69
|
+
if doc.output =~ %r!#{Jekyll::Maps::GoogleMapTag::JS_LIB_NAME}!
|
70
|
+
Jekyll::Maps::GoogleMapApi.prepend_api_code(doc)
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module Maps
|
3
|
+
class GoogleMapTag < Liquid::Tag
|
4
|
+
JS_LIB_NAME = "jekyllMaps".freeze
|
5
|
+
DEFAULT_MAP_WIDTH = 600
|
6
|
+
DEFAULT_MAP_HEIGHT = 400
|
7
|
+
|
8
|
+
def initialize(_, args, _)
|
9
|
+
@args = OptionsParser.parse(args)
|
10
|
+
@finder = LocationFinder.new(@args)
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def render(context)
|
15
|
+
locations = @finder.find(context.registers[:site], context.registers[:page])
|
16
|
+
@args[:attributes][:id] ||= SecureRandom.uuid
|
17
|
+
|
18
|
+
<<HTML
|
19
|
+
<div #{render_attributes}></div>
|
20
|
+
<script type='text/javascript'>
|
21
|
+
#{JS_LIB_NAME}.register(
|
22
|
+
'#{@args[:attributes][:id]}',
|
23
|
+
#{locations.to_json},
|
24
|
+
#{map_options(context.registers[:site]).to_json}
|
25
|
+
);
|
26
|
+
</script>
|
27
|
+
HTML
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def render_attributes
|
32
|
+
attributes = []
|
33
|
+
attributes << "id='#{@args[:attributes][:id]}'"
|
34
|
+
attributes << render_dimensions
|
35
|
+
attributes << render_class if @args[:attributes][:class]
|
36
|
+
attributes.join(" ")
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def render_dimensions
|
41
|
+
width = @args[:attributes][:width] || DEFAULT_MAP_WIDTH
|
42
|
+
height = @args[:attributes][:height] || DEFAULT_MAP_HEIGHT
|
43
|
+
width_unit = width.to_s.include?("%") ? "" : "px"
|
44
|
+
height_unit = height.to_s.include?("%") ? "" : "px"
|
45
|
+
%(style='width:#{width}#{width_unit};height:#{height}#{height_unit};')
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def render_class
|
50
|
+
css = @args[:attributes][:class]
|
51
|
+
css = css.join(" ") if css.is_a?(Array)
|
52
|
+
%(class='#{css}')
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def map_options(site)
|
57
|
+
opts = {
|
58
|
+
:baseUrl => site.baseurl || "/",
|
59
|
+
:useCluster => !@args[:flags][:no_cluster],
|
60
|
+
:showMarker => @args[:attributes][:show_marker] != "false",
|
61
|
+
:showMarkerPopup => @args[:attributes][:show_popup] != "false"
|
62
|
+
}
|
63
|
+
print @args
|
64
|
+
if @args[:attributes][:zoom]
|
65
|
+
opts[:customZoom] = @args[:attributes][:zoom].to_i
|
66
|
+
print "zoom!"
|
67
|
+
print opts[:customZoom]
|
68
|
+
end
|
69
|
+
opts
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
Liquid::Template.register_tag("google_map", Jekyll::Maps::GoogleMapTag)
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module Maps
|
3
|
+
class LocationFinder
|
4
|
+
def initialize(options)
|
5
|
+
@documents = []
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(site, page)
|
10
|
+
if @options[:attributes][:latitude] && @options[:attributes][:longitude]
|
11
|
+
return [location_from_options(page)]
|
12
|
+
elsif @options[:filters].empty?
|
13
|
+
@documents << page if with_location?(page)
|
14
|
+
else
|
15
|
+
site.collections.each_value { |collection| filter(collection.docs) }
|
16
|
+
site_data(site).each_value { |items| traverse(items) }
|
17
|
+
end
|
18
|
+
|
19
|
+
documents_to_locations
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def location_from_options(page)
|
24
|
+
{
|
25
|
+
:latitude => @options[:attributes][:latitude],
|
26
|
+
:longitude => @options[:attributes][:longitude],
|
27
|
+
:title => @options[:attributes][:marker_title] || page["title"],
|
28
|
+
:url => @options[:attributes][:marker_url] || fetch_url(page),
|
29
|
+
:image => @options[:attributes][:marker_img] || page["image"] || ""
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def site_data(site)
|
35
|
+
return {} unless data_source?
|
36
|
+
|
37
|
+
path = @options[:filters]["src"].scan(%r!_data\/([^\/]+)!).join(".")
|
38
|
+
return site.data if path.empty?
|
39
|
+
|
40
|
+
data = OpenStruct.new(site.data)
|
41
|
+
if @options[:filters]["src"] =~ %r!\.ya?ml!
|
42
|
+
{ :path => data[path.gsub(%r!\.ya?ml!, "")] }
|
43
|
+
else
|
44
|
+
data[path]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def data_source?
|
50
|
+
filters = @options[:filters]
|
51
|
+
filters.key?("src") && filters["src"].start_with?("_data")
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def traverse(items)
|
56
|
+
return filter(items) if items.is_a?(Array)
|
57
|
+
|
58
|
+
items.each_value { |children| traverse(children) } if items.is_a?(Hash)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def filter(docs)
|
63
|
+
docs.each do |doc|
|
64
|
+
@documents << doc if with_location?(doc) && match_filters?(doc)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def with_location?(doc)
|
70
|
+
!doc["location"].nil? && !doc["location"].empty?
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
def match_filters?(doc)
|
75
|
+
@options[:filters].each do |filter, value|
|
76
|
+
if filter == "src"
|
77
|
+
return true unless doc.respond_to?(:relative_path)
|
78
|
+
return false unless doc.relative_path.start_with?(value)
|
79
|
+
elsif doc[filter].nil? || doc[filter] != value
|
80
|
+
return false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
def documents_to_locations
|
87
|
+
locations = []
|
88
|
+
@documents.each do |document|
|
89
|
+
if document["location"].is_a?(Array)
|
90
|
+
document["location"].each do |location|
|
91
|
+
locations.push(convert(document, location))
|
92
|
+
end
|
93
|
+
else
|
94
|
+
locations.push(convert(document, document["location"]))
|
95
|
+
end
|
96
|
+
end
|
97
|
+
locations
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
def convert(document, location)
|
102
|
+
{
|
103
|
+
:latitude => location["latitude"],
|
104
|
+
:longitude => location["longitude"],
|
105
|
+
:title => location["title"] || document["title"],
|
106
|
+
:url => location["url"] || fetch_url(document),
|
107
|
+
:image => location["image"] || document["image"] || ""
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
def fetch_url(document)
|
113
|
+
return document["url"] if document.is_a?(Hash) && document.key?("url")
|
114
|
+
return document.url if document.respond_to? :url
|
115
|
+
""
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module Maps
|
3
|
+
class OptionsParser
|
4
|
+
OPTIONS_SYNTAX = %r!([^\s]+)\s*=\s*['"]+([^'"]+)['"]+!
|
5
|
+
ALLOWED_FLAGS = %w(
|
6
|
+
no_cluster
|
7
|
+
).freeze
|
8
|
+
ALLOWED_ATTRIBUTES = %w(
|
9
|
+
id
|
10
|
+
width
|
11
|
+
height
|
12
|
+
class
|
13
|
+
show_marker
|
14
|
+
show_popup
|
15
|
+
zoom
|
16
|
+
latitude
|
17
|
+
longitude
|
18
|
+
marker_title
|
19
|
+
marker_img
|
20
|
+
marker_url
|
21
|
+
).freeze
|
22
|
+
|
23
|
+
class << self
|
24
|
+
def parse(raw_options)
|
25
|
+
options = {
|
26
|
+
:attributes => {},
|
27
|
+
:filters => {},
|
28
|
+
:flags => {}
|
29
|
+
}
|
30
|
+
raw_options.scan(OPTIONS_SYNTAX).each do |key, value|
|
31
|
+
value = value.split(",") if value.include?(",")
|
32
|
+
if ALLOWED_ATTRIBUTES.include?(key)
|
33
|
+
options[:attributes][key.to_sym] = value
|
34
|
+
else
|
35
|
+
options[:filters][key] = value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
ALLOWED_FLAGS.each do |key|
|
39
|
+
options[:flags][key.to_sym] = true if raw_options.include?(key)
|
40
|
+
end
|
41
|
+
options
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/script/bootstrap
ADDED
data/script/cibuild
ADDED
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll-maps-debugging
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Lyman, c/o Anatoliy Yastreb
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-02-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: jekyll
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '11.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '11.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.49.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.49.1
|
69
|
+
description: Google Maps support in Jekyll blog to easily embed maps with posts' locations
|
70
|
+
email:
|
71
|
+
- chris.a.lyman@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".codeclimate.yml"
|
77
|
+
- ".gitignore"
|
78
|
+
- ".rubocop.yml"
|
79
|
+
- ".travis.yml"
|
80
|
+
- Gemfile
|
81
|
+
- History.md
|
82
|
+
- LICENSE
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- jekyll-maps.gemspec
|
86
|
+
- lib/jekyll-maps.rb
|
87
|
+
- lib/jekyll-maps/google_map_api.js
|
88
|
+
- lib/jekyll-maps/google_map_api.rb
|
89
|
+
- lib/jekyll-maps/google_map_tag.rb
|
90
|
+
- lib/jekyll-maps/location_finder.rb
|
91
|
+
- lib/jekyll-maps/options_parser.rb
|
92
|
+
- lib/jekyll-maps/version.rb
|
93
|
+
- script/bootstrap
|
94
|
+
- script/cibuild
|
95
|
+
homepage: https://ayastreb.me/jekyll-maps/
|
96
|
+
licenses:
|
97
|
+
- MIT
|
98
|
+
metadata: {}
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 2.5.1
|
116
|
+
signing_key:
|
117
|
+
specification_version: 4
|
118
|
+
summary: Jekyll Google Maps integration
|
119
|
+
test_files: []
|