natour 0.1.0 → 0.2.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/CHANGELOG.adoc +20 -0
- data/bin/natour +4 -4
- data/lib/natour.rb +2 -2
- data/lib/natour/asciinurse.rb +5 -6
- data/lib/natour/{cli/convert.rb → convert.rb} +5 -1
- data/lib/natour/{cli/create.rb → create.rb} +0 -0
- data/lib/natour/{js → data/js}/bootstrap.min.js +0 -0
- data/lib/natour/{js → data/js}/jquery-3.5.1.slim.min.js +0 -0
- data/lib/natour/{js → data/js}/loader.js +0 -0
- data/lib/natour/data/themes/natour-theme.yml +13 -0
- data/lib/natour/image.rb +5 -9
- data/lib/natour/map_geo_admin.rb +1 -1
- data/lib/natour/report.rb +1 -1
- data/lib/natour/species_list.rb +23 -7
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb00323054987bfbb4e15631640c781d2e44f1c1a86dae3d7fafca37ecdfe0d8
|
4
|
+
data.tar.gz: 99cb9c130f9aefaecb5c68684b1e52ccd12628ae2b1d0e4e316a485a304ce761
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35670a2a3872135b9cad97eac2c27af4205aaea5cf1db6b38c8757589e281061ad6b22b3469e2c4ae0c350701541fdea92170d837ed4e931445f26d2f2bb7aa7
|
7
|
+
data.tar.gz: a784e70dba0803b538a58676f143e38f93b9d252d706ae470bb91bc90caef687c86464179ae2d53d20522595af02e0aadfb1cdc7b89b60f1d36449547e7b7e92
|
data/CHANGELOG.adoc
CHANGED
@@ -6,6 +6,26 @@ The format is based on https://keepachangelog.com/en/1.0.0/[Keep a Changelog^],
|
|
6
6
|
|
7
7
|
== Unreleased
|
8
8
|
|
9
|
+
== 0.2.0 - 2021-01-24
|
10
|
+
|
11
|
+
=== Added
|
12
|
+
|
13
|
+
- Add this gem's name to the footer of the PDF output
|
14
|
+
- Support species lists from https://www.ornitho.ch/[ornitho.ch^] (KML format only)
|
15
|
+
- Classify species lists by taxonomic groups (i.e. `SpeciesList.group`)
|
16
|
+
|
17
|
+
=== Changed
|
18
|
+
|
19
|
+
- Change `SpeciesList.name` to `SpeciesList.title`
|
20
|
+
- Return an empty array from `SpeciesList.load_file` if the format is unknown
|
21
|
+
- Change the format of the start time in the AsciiDoc output from _12:30_ to _12:30 Uhr_
|
22
|
+
- Change the format of the duration in the AsciiDoc output from _1h30_ to _1:30 h_
|
23
|
+
|
24
|
+
=== Fixed
|
25
|
+
|
26
|
+
- Get the date from images even if the orientation tag is missing
|
27
|
+
- Fix typo in help message
|
28
|
+
|
9
29
|
== 0.1.0 - 2020-12-04
|
10
30
|
|
11
31
|
=== Added
|
data/bin/natour
CHANGED
@@ -27,9 +27,9 @@ option_parser = OptionParser.new do |opts|
|
|
27
27
|
opts.separator(WordWrap.ww(
|
28
28
|
'If PATH refers to a directory, one or more reports are created in ' \
|
29
29
|
'AsciiDoc format. GPS tracks, images and species lists (Kosmos ' \
|
30
|
-
'Vogelführer, Flora Helvetica, Info Flora Online-Feldbuch)
|
31
|
-
'included. Images of the map section covered by the GPS tracks are
|
32
|
-
'created and included. If PATH refers to an AsciiDoc file, it is ' \
|
30
|
+
'Vogelführer, ornitho.ch, Flora Helvetica, Info Flora Online-Feldbuch) ' \
|
31
|
+
'are included. Images of the map section covered by the GPS tracks are ' \
|
32
|
+
'also created and included. If PATH refers to an AsciiDoc file, it is ' \
|
33
33
|
'converted to PDF (or any other supported format).'
|
34
34
|
))
|
35
35
|
opts.separator('')
|
@@ -49,7 +49,7 @@ option_parser = OptionParser.new do |opts|
|
|
49
49
|
end
|
50
50
|
opts.separator('')
|
51
51
|
opts.separator('Creation:')
|
52
|
-
opts.on('--track-formats FORMATS', Array, 'GPS track formats (gpx, fit') do |value|
|
52
|
+
opts.on('--track-formats FORMATS', Array, 'GPS track formats (gpx, fit)') do |value|
|
53
53
|
config['track-formats'] = value.map(&:to_sym)
|
54
54
|
end
|
55
55
|
opts.on('--[no-]map', 'Create map images') do |value|
|
data/lib/natour.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'natour/cli/convert'
|
2
|
-
require 'natour/cli/create'
|
3
1
|
require 'natour/helpers/date_parser'
|
4
2
|
require 'natour/helpers/suppress_output'
|
3
|
+
require 'natour/convert'
|
4
|
+
require 'natour/create'
|
5
5
|
require 'natour/asciinurse'
|
6
6
|
require 'natour/config'
|
7
7
|
require 'natour/gps_track'
|
data/lib/natour/asciinurse.rb
CHANGED
@@ -51,8 +51,8 @@ module Natour
|
|
51
51
|
doc << '[cols="h,3"]'
|
52
52
|
doc << '|==='
|
53
53
|
doc << "|Datum |#{gps_track&.date&.strftime('%d.%m.%Y')}"
|
54
|
-
doc << "|Startzeit |#{gps_track&.start_point&.time&.strftime('%H:%M')}"
|
55
|
-
doc << "|Dauer |#{gps_track&.duration&.strftime('%
|
54
|
+
doc << "|Startzeit |#{gps_track&.start_point&.time&.strftime('%H:%M Uhr')}"
|
55
|
+
doc << "|Dauer |#{gps_track&.duration&.strftime('%th:%M h')}"
|
56
56
|
doc << "|Strecke |#{distance.call(gps_track)}"
|
57
57
|
doc << "|Aufstieg |#{ascent.call(gps_track)}"
|
58
58
|
doc << "|Abstieg |#{descent.call(gps_track)}"
|
@@ -104,10 +104,9 @@ module Natour
|
|
104
104
|
doc << ''
|
105
105
|
species_lists.each.with_index(1) do |species_list, index|
|
106
106
|
info = {
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
}[species_list.type]
|
107
|
+
birds: birds_info,
|
108
|
+
plants: plants_info
|
109
|
+
}[species_list.group]
|
111
110
|
doc << "=== #{info.title}"
|
112
111
|
doc << ''
|
113
112
|
doc << '[cols="1,5,5",options=header]'
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/lib/natour/image.rb
CHANGED
@@ -11,15 +11,11 @@ module Natour
|
|
11
11
|
image = Vips::Image.new_from_file(path)
|
12
12
|
width, height = image.size
|
13
13
|
@portrait = width < height
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
format: 'yyyy:mm:dd hh:nn:ss'
|
20
|
-
)
|
21
|
-
rescue Vips::Error => e
|
22
|
-
raise unless e.to_s =~ /exif-ifd0-(Orientation|DateTime)/
|
14
|
+
get_field = ->(name) { image.get(name) if image.get_fields.include?(name) }
|
15
|
+
orientation = get_field.call('exif-ifd0-Orientation')
|
16
|
+
@portrait = orientation[/^(\d) \(/, 1].to_i.between?(5, 8) if orientation
|
17
|
+
date_time = get_field.call('exif-ifd0-DateTime')
|
18
|
+
@date_time = Timeliness.parse(date_time[/^(.*?) \(/, 1], format: 'yyyy:mm:dd hh:nn:ss') if date_time
|
23
19
|
end
|
24
20
|
|
25
21
|
def portrait?
|
data/lib/natour/map_geo_admin.rb
CHANGED
@@ -9,7 +9,7 @@ module Natour
|
|
9
9
|
class MapGeoAdmin
|
10
10
|
def initialize(port: 0)
|
11
11
|
@doc_root = Dir.mktmpdir
|
12
|
-
FileUtils.cp_r("#{__dir__}/js", @doc_root)
|
12
|
+
FileUtils.cp_r("#{__dir__}/data/js", @doc_root)
|
13
13
|
event = Concurrent::Event.new
|
14
14
|
@server = WEBrick::HTTPServer.new(
|
15
15
|
StartCallback: -> { event.set },
|
data/lib/natour/report.rb
CHANGED
@@ -38,7 +38,7 @@ module Natour
|
|
38
38
|
.map { |filename| Image.new(filename.to_s) }
|
39
39
|
.sort_by { |image| [image.date_time ? 0 : 1, image.date_time, image.path] }
|
40
40
|
species_lists =
|
41
|
-
Pathname.glob('**/*.csv', File::FNM_CASEFOLD)
|
41
|
+
Pathname.glob('**/*.{csv,kml}', File::FNM_CASEFOLD)
|
42
42
|
.map { |filename| SpeciesList.load_file(filename.to_s) }
|
43
43
|
.flatten
|
44
44
|
.sort_by { |species_list| [species_list.type, species_list.date ? 0 : 1, species_list.date] }
|
data/lib/natour/species_list.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'csv'
|
2
|
+
require 'nokogiri'
|
2
3
|
require 'pathname'
|
3
4
|
|
4
5
|
module Natour
|
@@ -6,26 +7,28 @@ module Natour
|
|
6
7
|
attr_reader :path
|
7
8
|
attr_reader :date
|
8
9
|
attr_reader :type
|
9
|
-
attr_reader :
|
10
|
+
attr_reader :group
|
11
|
+
attr_reader :title
|
10
12
|
attr_reader :description
|
11
13
|
|
12
|
-
def initialize(path, date, type,
|
14
|
+
def initialize(path, date, type, group, title, description, items)
|
13
15
|
@path = path
|
14
16
|
@date = date
|
15
17
|
@type = type
|
16
|
-
@
|
18
|
+
@group = group
|
19
|
+
@title = title
|
17
20
|
@description = description
|
18
21
|
@items = items
|
19
22
|
end
|
20
23
|
|
21
24
|
def self.load_file(filename)
|
22
|
-
block = IO.binread(filename,
|
25
|
+
block = IO.binread(filename, 128)
|
23
26
|
header = if block.unpack('CC') == [0xff, 0xfe]
|
24
27
|
block[2..-1].force_encoding('utf-16le').encode('utf-8')
|
25
28
|
elsif block.unpack('CCC') == [0xef, 0xbb, 0xbf]
|
26
29
|
block[3..-1].force_encoding('utf-8')
|
27
30
|
else
|
28
|
-
block
|
31
|
+
block
|
29
32
|
end
|
30
33
|
|
31
34
|
case header
|
@@ -34,8 +37,18 @@ module Natour
|
|
34
37
|
date = DateParser.parse(Pathname(filename).basename).compact.first
|
35
38
|
items = csv.map { |row| Species.new(row[1], row[0]) }
|
36
39
|
.sort_by(&:name_de).uniq
|
37
|
-
[SpeciesList.new(filename, date, :kosmos_vogelfuehrer, nil, nil, items)]
|
40
|
+
[SpeciesList.new(filename, date, :kosmos_vogelfuehrer, :birds, nil, nil, items)]
|
38
41
|
end
|
42
|
+
when /^<\?xml.*?www\.ornitho\.ch/m
|
43
|
+
date = DateParser.parse(Pathname(filename).basename).compact.first
|
44
|
+
doc = Nokogiri.XML(File.read(filename, mode: 'r:utf-8'))
|
45
|
+
folder = doc.at('/xmlns:kml/xmlns:Document/xmlns:Folder/xmlns:Folder/xmlns:Folder')
|
46
|
+
name = folder.at('./xmlns:name').text
|
47
|
+
items = folder.xpath('./xmlns:Placemark/xmlns:description')
|
48
|
+
.map(&:text)
|
49
|
+
.map { |description| Species.new(*description.scan(/>([^&(]+)</).flatten.reverse) }
|
50
|
+
.sort_by(&:name_de).uniq
|
51
|
+
[SpeciesList.new(filename, date, :ornitho_ch, :birds, name, nil, items)]
|
39
52
|
when /^Favoriten/
|
40
53
|
CSV.open(filename, 'r:bom|utf-8', col_sep: ';', skip_blanks: true) do |csv|
|
41
54
|
chunks = csv.reject { |row| row.count == 1 && row[0] != 'Favoriten' }
|
@@ -51,6 +64,7 @@ module Natour
|
|
51
64
|
filename,
|
52
65
|
date,
|
53
66
|
:flora_helvetica,
|
67
|
+
:plants,
|
54
68
|
name&.gsub(/^(\d{4}-)?\d{2}-\d{2}( |_|-)?/, ''),
|
55
69
|
description,
|
56
70
|
items
|
@@ -63,8 +77,10 @@ module Natour
|
|
63
77
|
items = csv.select { |row| row[0] }
|
64
78
|
.map { |row| Species.new(row[11][/^(([^ ]+ [^ ]+)(( aggr\.)|( subsp\. [^ ]+))?)/, 1], nil) }
|
65
79
|
.sort_by(&:name).uniq
|
66
|
-
[SpeciesList.new(filename, date, :info_flora, nil, nil, items)]
|
80
|
+
[SpeciesList.new(filename, date, :info_flora, :plants, nil, nil, items)]
|
67
81
|
end
|
82
|
+
else
|
83
|
+
[]
|
68
84
|
end
|
69
85
|
end
|
70
86
|
|
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.2.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:
|
11
|
+
date: 2021-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -177,9 +177,13 @@ files:
|
|
177
177
|
- bin/natour
|
178
178
|
- lib/natour.rb
|
179
179
|
- lib/natour/asciinurse.rb
|
180
|
-
- lib/natour/cli/convert.rb
|
181
|
-
- lib/natour/cli/create.rb
|
182
180
|
- lib/natour/config.rb
|
181
|
+
- lib/natour/convert.rb
|
182
|
+
- lib/natour/create.rb
|
183
|
+
- lib/natour/data/js/bootstrap.min.js
|
184
|
+
- lib/natour/data/js/jquery-3.5.1.slim.min.js
|
185
|
+
- lib/natour/data/js/loader.js
|
186
|
+
- lib/natour/data/themes/natour-theme.yml
|
183
187
|
- lib/natour/fit_file.rb
|
184
188
|
- lib/natour/gps_track.rb
|
185
189
|
- lib/natour/gps_track_point.rb
|
@@ -187,9 +191,6 @@ files:
|
|
187
191
|
- lib/natour/helpers/date_parser.rb
|
188
192
|
- lib/natour/helpers/suppress_output.rb
|
189
193
|
- lib/natour/image.rb
|
190
|
-
- lib/natour/js/bootstrap.min.js
|
191
|
-
- lib/natour/js/jquery-3.5.1.slim.min.js
|
192
|
-
- lib/natour/js/loader.js
|
193
194
|
- lib/natour/map_geo_admin.rb
|
194
195
|
- lib/natour/public_transport.rb
|
195
196
|
- lib/natour/report.rb
|