class AIPP::LF::ENR55

Sporting and Recreational Activities

Constants

ACTIVITIES

Map raw activities to activity and airspace type

Public Instance Methods

parse() click to toggle source
   # File lib/aipp/regions/LF/ENR-5.5.rb
18 def parse
19   prepare(html: read).css('tbody').each do |tbody|
20     tbody.css('tr').to_enum.each_slice(2).with_index(1) do |trs, index|
21       begin
22         id, activity_and_name, upper_limit, timetable = trs.first.css('td')
23         activity, name = activity_and_name.css('span')
24         lateral_limit, lower_limit, remarks = trs.last.css('td')
25         lateral_limit.search('br').each { _1.replace("|||") }
26         geometry, lateral_limit = lateral_limit.text.split('|||', 2)
27         lateral_limit&.gsub!('|||', "\n")
28         remarks = [remarks&.text&.cleanup&.blank_to_nil]
29         s = timetable&.text&.cleanup and remarks.prepend('**SCHEDULE**', s, '')
30         s = lateral_limit&.cleanup and remarks.prepend('**LATERAL LIMIT**', s, '')
31         airspace = AIXM.airspace(
32           source: source(position: trs.first.line),
33           id: id.text.strip,
34           type: ACTIVITIES.fetch(activity.text.downcase).fetch(:airspace_type),
35           name: [id.text.strip, name.text.cleanup].join(' ')
36         ).tap do |airspace|
37           airspace.geometry = geometry_from(geometry)
38           airspace.add_layer(
39             layer_from([upper_limit.text, lower_limit.text].join('---').cleanup).tap do |layer|
40               layer.activity = ACTIVITIES.fetch(activity.text.downcase).fetch(:activity)
41               layer.remarks = remarks.compact.join("\n")
42             end
43           )
44         end
45       rescue => error
46         warn("error parsing #{airspace.type} `#{airspace.name}' at ##{index}: #{error.message}", pry: error)
47       end
48       add airspace
49     end
50   end
51 end