natour 0.7.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +81 -31
- data/README.adoc +71 -18
- data/bin/natour +157 -106
- data/lib/natour/asciinurse.rb +18 -8
- data/lib/natour/config.rb +6 -3
- data/lib/natour/{convert.rb → convert_report.rb} +6 -6
- data/lib/natour/{create.rb → create_reports.rb} +5 -3
- data/lib/natour/data/js/loader.js +6 -6
- data/lib/natour/fit_file.rb +2 -2
- data/lib/natour/gps_track.rb +1 -1
- data/lib/natour/gpx_file.rb +1 -1
- data/lib/natour/image.rb +2 -2
- data/lib/natour/map_geo_admin.rb +100 -41
- data/lib/natour/public_transport.rb +2 -2
- data/lib/natour/report.rb +2 -2
- data/lib/natour/utils/boolean_utils.rb +11 -0
- data/lib/natour/utils/errno_utils.rb +9 -0
- data/lib/natour/version.rb +5 -0
- data/lib/natour.rb +21 -18
- metadata +37 -6
data/lib/natour/fit_file.rb
CHANGED
data/lib/natour/gps_track.rb
CHANGED
data/lib/natour/gpx_file.rb
CHANGED
data/lib/natour/image.rb
CHANGED
data/lib/natour/map_geo_admin.rb
CHANGED
@@ -1,31 +1,40 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'pathname'
|
3
|
-
require 'webrick'
|
4
1
|
require 'concurrent'
|
5
2
|
require 'ferrum'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'pathname'
|
6
5
|
require 'uri'
|
6
|
+
require 'webrick'
|
7
|
+
require 'webrick/https'
|
7
8
|
|
8
9
|
module Natour
|
9
10
|
class MapGeoAdmin
|
10
11
|
def initialize(port: 0)
|
11
|
-
@doc_root = Dir.mktmpdir
|
12
|
+
@doc_root = Pathname(Dir.mktmpdir)
|
12
13
|
FileUtils.cp_r("#{__dir__}/data/js", @doc_root)
|
13
14
|
event = Concurrent::Event.new
|
14
|
-
@server =
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
@server = StdoutUtils.suppress_output do
|
16
|
+
WEBrick::HTTPServer.new(
|
17
|
+
StartCallback: -> { event.set },
|
18
|
+
Logger: WEBrick::Log.new(File.open(File::NULL, 'w')),
|
19
|
+
AccessLog: [],
|
20
|
+
DocumentRoot: @doc_root,
|
21
|
+
BindAddress: 'localhost',
|
22
|
+
Port: port,
|
23
|
+
SSLEnable: true,
|
24
|
+
SSLCertName: [%w[CN localhost]]
|
25
|
+
)
|
26
|
+
end
|
22
27
|
@server.mount('/map', MapServlet)
|
23
28
|
@thread = Thread.new { @server.start }
|
24
29
|
event.wait
|
25
30
|
@browser = Ferrum::Browser.new(
|
26
31
|
slowmo: 2.0,
|
32
|
+
timout: 30,
|
27
33
|
window_size: [5000, 5000],
|
28
|
-
browser_options: {
|
34
|
+
browser_options: {
|
35
|
+
'no-sandbox': nil,
|
36
|
+
'ignore-certificate-errors': nil
|
37
|
+
}
|
29
38
|
)
|
30
39
|
end
|
31
40
|
|
@@ -36,21 +45,28 @@ module Natour
|
|
36
45
|
FileUtils.remove_entry(@doc_root)
|
37
46
|
end
|
38
47
|
|
39
|
-
def save_image(filename,
|
40
|
-
FileUtils.cp(
|
41
|
-
|
42
|
-
uri = URI("http://#{@server[:BindAddress]}:#{@server[:Port]}/map")
|
48
|
+
def save_image(filename, overwrite: false, gps_files: [], gps_colors: [], map_layers: [], image_size: [1200, 900])
|
49
|
+
FileUtils.cp(gps_files, @doc_root)
|
50
|
+
uri = URI("https://#{@server[:BindAddress]}:#{@server[:Port]}/map")
|
43
51
|
uri.query = URI.encode_www_form(
|
44
|
-
|
45
|
-
|
46
|
-
|
52
|
+
'gps-files': gps_files.map { |gps_file| Pathname(gps_file).basename }.join(','),
|
53
|
+
'gps-colors': gps_colors.join(','),
|
54
|
+
'map-layers': map_layers.join(','),
|
55
|
+
'map-size': image_size.map { |dim| dim.is_a?(String) ? dim : "#{dim}px" }.join(',')
|
47
56
|
)
|
48
57
|
@browser.goto(uri)
|
58
|
+
tmp_filename = @doc_root.join(Pathname(filename).basename)
|
49
59
|
@browser.screenshot(
|
50
|
-
path:
|
60
|
+
path: tmp_filename,
|
51
61
|
quality: 100,
|
52
62
|
selector: '.map'
|
53
63
|
)
|
64
|
+
FileUtils.mkdir_p(Pathname(filename).dirname)
|
65
|
+
mode = File::WRONLY | File::CREAT | File::TRUNC | File::BINARY
|
66
|
+
mode |= File::EXCL unless overwrite
|
67
|
+
File.open(filename, mode) do |file|
|
68
|
+
file.write(File.read(tmp_filename, mode: 'rb'))
|
69
|
+
end
|
54
70
|
end
|
55
71
|
|
56
72
|
def self.open(*args)
|
@@ -66,11 +82,13 @@ module Natour
|
|
66
82
|
def do_GET(request, response) # rubocop:disable Naming/MethodName
|
67
83
|
raise WEBrick::HTTPStatus::NotFound unless request.path == '/map'
|
68
84
|
|
69
|
-
|
70
|
-
|
71
|
-
|
85
|
+
files = request.query.fetch('gps-files', '').split(',')
|
86
|
+
colors = request.query.fetch('gps-colors', '').split(',')
|
87
|
+
(files.size - colors.size).times { colors << (colors.last || 'blueviolet') }
|
88
|
+
layers = ['ch.swisstopo.pixelkarte-farbe']
|
89
|
+
layers |= request.query.fetch('map-layers', '').split(',')
|
72
90
|
|
73
|
-
width, height = request.query.fetch('size', '').split(',')
|
91
|
+
width, height = request.query.fetch('map-size', '').split(',')
|
74
92
|
raise WEBrick::HTTPStatus::BadRequest unless width && height
|
75
93
|
|
76
94
|
doc = []
|
@@ -81,36 +99,77 @@ module Natour
|
|
81
99
|
doc << '<script src="js/loader.js"></script>'
|
82
100
|
doc << '<script type="text/javascript">'
|
83
101
|
doc << ' $(function() {'
|
84
|
-
doc << '
|
102
|
+
doc << ' let map = new ga.Map({'
|
85
103
|
doc << ' controls: [],'
|
86
104
|
doc << ' target: "map",'
|
87
105
|
doc << ' view: new ol.View()'
|
88
106
|
doc << ' })'
|
89
|
-
doc << "
|
107
|
+
doc << " let layers = [#{layers.map { |layer| "\"#{layer}\"" }.join(', ')}]"
|
90
108
|
doc << ' layers.forEach(function(layer) {'
|
91
109
|
doc << ' map.addLayer(ga.layer.create(layer))'
|
92
110
|
doc << ' })'
|
93
|
-
doc <<
|
94
|
-
doc << '
|
95
|
-
doc << '
|
96
|
-
doc << '
|
97
|
-
doc << '
|
98
|
-
doc << '
|
111
|
+
doc << ' let getStyles = function(color) {'
|
112
|
+
doc << ' return {'
|
113
|
+
doc << ' "Point": new ol.style.Style({'
|
114
|
+
doc << ' image: new ol.style.Circle({'
|
115
|
+
doc << ' fill: new ol.style.Fill({'
|
116
|
+
doc << ' color: function() {'
|
117
|
+
doc << ' let [r, g, b, a] = ol.color.asArray(color)'
|
118
|
+
doc << ' a = 0.3'
|
119
|
+
doc << ' return ol.color.asString([r, g, b, a])'
|
120
|
+
doc << ' }()'
|
121
|
+
doc << ' }),'
|
122
|
+
doc << ' radius: 6,'
|
123
|
+
doc << ' stroke: new ol.style.Stroke({'
|
124
|
+
doc << ' color: color,'
|
125
|
+
doc << ' width: 1.5'
|
126
|
+
doc << ' })'
|
127
|
+
doc << ' })'
|
128
|
+
doc << ' }),'
|
129
|
+
doc << ' "LineString": new ol.style.Style({'
|
130
|
+
doc << ' stroke: new ol.style.Stroke({'
|
131
|
+
doc << ' color: color,'
|
132
|
+
doc << ' width: 3'
|
133
|
+
doc << ' })'
|
99
134
|
doc << ' }),'
|
100
|
-
doc << '
|
135
|
+
doc << ' "MultiLineString": new ol.style.Style({'
|
101
136
|
doc << ' stroke: new ol.style.Stroke({'
|
102
|
-
doc << ' color:
|
137
|
+
doc << ' color: color,'
|
103
138
|
doc << ' width: 3'
|
104
139
|
doc << ' })'
|
105
140
|
doc << ' })'
|
141
|
+
doc << ' }'
|
142
|
+
doc << ' }'
|
143
|
+
doc << " let sources = [#{files.zip(colors)
|
144
|
+
.map { |file, color| "{ file: \"#{file}\", color: \"#{color}\" }" }
|
145
|
+
.join(', ')}]"
|
146
|
+
doc << ' let vectors = sources.map(function(source) {'
|
147
|
+
doc << ' return new ol.layer.Vector({'
|
148
|
+
doc << ' source: new ol.source.Vector({'
|
149
|
+
doc << ' format: function() {'
|
150
|
+
doc << ' if (source.file.endsWith(".gpx")) {'
|
151
|
+
doc << ' return new ol.format.GPX()'
|
152
|
+
doc << ' } else if (source.file.endsWith(".kml")) {'
|
153
|
+
doc << ' return new ol.format.KML({'
|
154
|
+
doc << ' extractStyles: false'
|
155
|
+
doc << ' })'
|
156
|
+
doc << ' } else {'
|
157
|
+
doc << ' return null'
|
158
|
+
doc << ' }'
|
159
|
+
doc << ' }(),'
|
160
|
+
doc << ' url: source.file'
|
161
|
+
doc << ' }),'
|
162
|
+
doc << ' style: function(feature) {'
|
163
|
+
doc << ' return getStyles(source.color)[feature.getGeometry().getType()]'
|
164
|
+
doc << ' }'
|
106
165
|
doc << ' })'
|
107
166
|
doc << ' })'
|
108
|
-
doc << '
|
109
|
-
doc << ' map.addLayer(
|
110
|
-
doc << '
|
111
|
-
doc << '
|
112
|
-
doc << '
|
113
|
-
doc << ' ol.extent.extend(extent,
|
167
|
+
doc << ' vectors.forEach(function(vector) {'
|
168
|
+
doc << ' map.addLayer(vector)'
|
169
|
+
doc << ' vector.getSource().on("change", function(evt) {'
|
170
|
+
doc << ' let extent = ol.extent.createEmpty()'
|
171
|
+
doc << ' vectors.forEach(function(vector) {'
|
172
|
+
doc << ' ol.extent.extend(extent, vector.getSource().getExtent())'
|
114
173
|
doc << ' })'
|
115
174
|
doc << ' map.getView().fit(extent, map.getSize())'
|
116
175
|
doc << ' })'
|
data/lib/natour/report.rb
CHANGED
@@ -29,7 +29,7 @@ module Natour
|
|
29
29
|
@arrival_point = arrival_point
|
30
30
|
end
|
31
31
|
|
32
|
-
def self.load_directory(dir, track_formats: %i[gpx fit], create_map: true, map_layers: [])
|
32
|
+
def self.load_directory(dir, track_formats: %i[gpx fit], create_map: true, overwrite_map: false, map_layers: [])
|
33
33
|
Dir.chdir(dir) do
|
34
34
|
path = Pathname(dir)
|
35
35
|
title = Pathname.pwd.basename.to_s.encode('utf-8')
|
@@ -61,7 +61,7 @@ module Natour
|
|
61
61
|
track = Pathname(tmp_dir).join(gps_track.path).sub_ext('.gpx')
|
62
62
|
gps_track.save_gpx(track, overwrite: true)
|
63
63
|
filename = Pathname(gps_track.path).sub_ext('.jpg')
|
64
|
-
map.save_image(filename,
|
64
|
+
map.save_image(filename, overwrite: overwrite_map, gps_files: [track], map_layers: map_layers)
|
65
65
|
Image.load_file(filename.to_s)
|
66
66
|
end
|
67
67
|
end
|
data/lib/natour.rb
CHANGED
@@ -1,18 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
1
|
+
require_relative 'natour/utils/boolean_utils'
|
2
|
+
require_relative 'natour/utils/botanical_name_utils'
|
3
|
+
require_relative 'natour/utils/date_utils'
|
4
|
+
require_relative 'natour/utils/errno_utils'
|
5
|
+
require_relative 'natour/utils/stdout_utils'
|
6
|
+
require_relative 'natour/asciinurse'
|
7
|
+
require_relative 'natour/config'
|
8
|
+
require_relative 'natour/convert_report'
|
9
|
+
require_relative 'natour/create_reports'
|
10
|
+
require_relative 'natour/gps_track'
|
11
|
+
require_relative 'natour/gps_track_point'
|
12
|
+
require_relative 'natour/gpx_file'
|
13
|
+
require_relative 'natour/fit_file'
|
14
|
+
require_relative 'natour/image'
|
15
|
+
require_relative 'natour/map_geo_admin'
|
16
|
+
require_relative 'natour/public_transport'
|
17
|
+
require_relative 'natour/report'
|
18
|
+
require_relative 'natour/species'
|
19
|
+
require_relative 'natour/species_list'
|
20
|
+
require_relative 'natour/station'
|
21
|
+
require_relative 'natour/version'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: natour
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Gysi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: clamp
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: concurrent-ruby
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '1.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: deep_merge
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.2'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.2'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: ferrum
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,8 +220,8 @@ files:
|
|
192
220
|
- lib/natour.rb
|
193
221
|
- lib/natour/asciinurse.rb
|
194
222
|
- lib/natour/config.rb
|
195
|
-
- lib/natour/
|
196
|
-
- lib/natour/
|
223
|
+
- lib/natour/convert_report.rb
|
224
|
+
- lib/natour/create_reports.rb
|
197
225
|
- lib/natour/data/fonts/dejavuserifcondensed-bold.ttf
|
198
226
|
- lib/natour/data/fonts/dejavuserifcondensed-bold_italic.ttf
|
199
227
|
- lib/natour/data/fonts/dejavuserifcondensed-italic.ttf
|
@@ -213,9 +241,12 @@ files:
|
|
213
241
|
- lib/natour/species.rb
|
214
242
|
- lib/natour/species_list.rb
|
215
243
|
- lib/natour/station.rb
|
244
|
+
- lib/natour/utils/boolean_utils.rb
|
216
245
|
- lib/natour/utils/botanical_name_utils.rb
|
217
246
|
- lib/natour/utils/date_utils.rb
|
247
|
+
- lib/natour/utils/errno_utils.rb
|
218
248
|
- lib/natour/utils/stdout_utils.rb
|
249
|
+
- lib/natour/version.rb
|
219
250
|
homepage: https://github.com/simongysi/natour
|
220
251
|
licenses:
|
221
252
|
- MIT
|
@@ -238,8 +269,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
238
269
|
- !ruby/object:Gem::Version
|
239
270
|
version: '0'
|
240
271
|
requirements: []
|
241
|
-
rubygems_version: 3.
|
272
|
+
rubygems_version: 3.3.7
|
242
273
|
signing_key:
|
243
274
|
specification_version: 4
|
244
|
-
summary: natour provides an application and a library
|
275
|
+
summary: natour provides an application and a library to document nature activities.
|
245
276
|
test_files: []
|