gooby 0.9.3

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.
Files changed (224) hide show
  1. data/README +242 -0
  2. data/bin/example_usage.rb +38 -0
  3. data/bin/tests_gen.rb +16 -0
  4. data/data/20050305_corporate_cup_hm.csv +251 -0
  5. data/data/20050305_corporate_cup_hm.xml +2208 -0
  6. data/data/20050430_nashville_marathon.csv +1208 -0
  7. data/data/20050430_nashville_marathon.xml +10043 -0
  8. data/data/20051119_dowd_ymca_hm.csv +251 -0
  9. data/data/20051119_dowd_ymca_hm.xml +2210 -0
  10. data/data/20051124_hyatt_turkey_trot_8K.csv +321 -0
  11. data/data/20051124_hyatt_turkey_trot_8K.xml +2651 -0
  12. data/data/2007_03_03.tcx +6207 -0
  13. data/data/forerunner_2007.xml +259014 -0
  14. data/data/geo_data.txt +171 -0
  15. data/data/phx.csv +1280 -0
  16. data/data/phx.xml +10620 -0
  17. data/data/run_2007_01_01_16_38_27.xml +2020 -0
  18. data/data/run_2007_01_06_15_27_31.xml +2020 -0
  19. data/data/run_2007_01_10_12_25_47.xml +820 -0
  20. data/data/run_2007_01_10_22_44_54.csv +112 -0
  21. data/data/run_2007_01_10_22_44_54.xml +908 -0
  22. data/data/run_2007_01_11_10_48_45.xml +1292 -0
  23. data/data/run_2007_01_13_15_37_06.xml +1964 -0
  24. data/data/run_2007_01_14_15_46_02.xml +1368 -0
  25. data/data/run_2007_01_15_14_01_48.xml +1868 -0
  26. data/data/run_2007_01_20_16_22_05.xml +1702 -0
  27. data/data/run_2007_01_27_17_32_13.xml +3626 -0
  28. data/data/run_2007_01_28_19_14_52.xml +2538 -0
  29. data/data/run_2007_02_03_14_30_20.xml +2016 -0
  30. data/data/run_2007_02_04_18_02_30.xml +1476 -0
  31. data/data/run_2007_02_17_16_29_35.xml +1236 -0
  32. data/data/run_2007_02_19_14_44_33.xml +1816 -0
  33. data/data/run_2007_02_23_15_53_55.xml +36 -0
  34. data/data/run_2007_02_23_15_55_20.xml +1296 -0
  35. data/data/run_2007_02_24_15_01_35.csv +484 -0
  36. data/data/run_2007_02_24_15_01_35.xml +3884 -0
  37. data/data/test1.txt +4 -0
  38. data/img/gicons/blank.png +0 -0
  39. data/img/gicons/dd-end.png +0 -0
  40. data/img/gicons/dd-start.png +0 -0
  41. data/img/gicons/marker.png +0 -0
  42. data/img/gicons/marker0.png +0 -0
  43. data/img/gicons/marker00.png +0 -0
  44. data/img/gicons/marker01.png +0 -0
  45. data/img/gicons/marker02.png +0 -0
  46. data/img/gicons/marker03.png +0 -0
  47. data/img/gicons/marker04.png +0 -0
  48. data/img/gicons/marker05.png +0 -0
  49. data/img/gicons/marker06.png +0 -0
  50. data/img/gicons/marker07.png +0 -0
  51. data/img/gicons/marker08.png +0 -0
  52. data/img/gicons/marker09.png +0 -0
  53. data/img/gicons/marker1.png +0 -0
  54. data/img/gicons/marker10.png +0 -0
  55. data/img/gicons/marker11.png +0 -0
  56. data/img/gicons/marker12.png +0 -0
  57. data/img/gicons/marker13.png +0 -0
  58. data/img/gicons/marker14.png +0 -0
  59. data/img/gicons/marker15.png +0 -0
  60. data/img/gicons/marker16.png +0 -0
  61. data/img/gicons/marker17.png +0 -0
  62. data/img/gicons/marker18.png +0 -0
  63. data/img/gicons/marker19.png +0 -0
  64. data/img/gicons/marker2.png +0 -0
  65. data/img/gicons/marker20.png +0 -0
  66. data/img/gicons/marker21.png +0 -0
  67. data/img/gicons/marker22.png +0 -0
  68. data/img/gicons/marker23.png +0 -0
  69. data/img/gicons/marker24.png +0 -0
  70. data/img/gicons/marker25.png +0 -0
  71. data/img/gicons/marker26.png +0 -0
  72. data/img/gicons/marker27.png +0 -0
  73. data/img/gicons/marker28.png +0 -0
  74. data/img/gicons/marker29.png +0 -0
  75. data/img/gicons/marker3.png +0 -0
  76. data/img/gicons/marker30.png +0 -0
  77. data/img/gicons/marker31.png +0 -0
  78. data/img/gicons/marker32.png +0 -0
  79. data/img/gicons/marker33.png +0 -0
  80. data/img/gicons/marker34.png +0 -0
  81. data/img/gicons/marker35.png +0 -0
  82. data/img/gicons/marker36.png +0 -0
  83. data/img/gicons/marker37.png +0 -0
  84. data/img/gicons/marker38.png +0 -0
  85. data/img/gicons/marker39.png +0 -0
  86. data/img/gicons/marker4.png +0 -0
  87. data/img/gicons/marker40.png +0 -0
  88. data/img/gicons/marker41.png +0 -0
  89. data/img/gicons/marker42.png +0 -0
  90. data/img/gicons/marker43.png +0 -0
  91. data/img/gicons/marker44.png +0 -0
  92. data/img/gicons/marker45.png +0 -0
  93. data/img/gicons/marker46.png +0 -0
  94. data/img/gicons/marker47.png +0 -0
  95. data/img/gicons/marker48.png +0 -0
  96. data/img/gicons/marker49.png +0 -0
  97. data/img/gicons/marker5.png +0 -0
  98. data/img/gicons/marker50.png +0 -0
  99. data/img/gicons/marker51.png +0 -0
  100. data/img/gicons/marker52.png +0 -0
  101. data/img/gicons/marker53.png +0 -0
  102. data/img/gicons/marker54.png +0 -0
  103. data/img/gicons/marker55.png +0 -0
  104. data/img/gicons/marker56.png +0 -0
  105. data/img/gicons/marker57.png +0 -0
  106. data/img/gicons/marker58.png +0 -0
  107. data/img/gicons/marker59.png +0 -0
  108. data/img/gicons/marker6.png +0 -0
  109. data/img/gicons/marker60.png +0 -0
  110. data/img/gicons/marker61.png +0 -0
  111. data/img/gicons/marker62.png +0 -0
  112. data/img/gicons/marker63.png +0 -0
  113. data/img/gicons/marker64.png +0 -0
  114. data/img/gicons/marker65.png +0 -0
  115. data/img/gicons/marker66.png +0 -0
  116. data/img/gicons/marker67.png +0 -0
  117. data/img/gicons/marker68.png +0 -0
  118. data/img/gicons/marker69.png +0 -0
  119. data/img/gicons/marker7.png +0 -0
  120. data/img/gicons/marker70.png +0 -0
  121. data/img/gicons/marker71.png +0 -0
  122. data/img/gicons/marker72.png +0 -0
  123. data/img/gicons/marker73.png +0 -0
  124. data/img/gicons/marker74.png +0 -0
  125. data/img/gicons/marker75.png +0 -0
  126. data/img/gicons/marker76.png +0 -0
  127. data/img/gicons/marker77.png +0 -0
  128. data/img/gicons/marker78.png +0 -0
  129. data/img/gicons/marker79.png +0 -0
  130. data/img/gicons/marker8.png +0 -0
  131. data/img/gicons/marker80.png +0 -0
  132. data/img/gicons/marker81.png +0 -0
  133. data/img/gicons/marker82.png +0 -0
  134. data/img/gicons/marker83.png +0 -0
  135. data/img/gicons/marker84.png +0 -0
  136. data/img/gicons/marker85.png +0 -0
  137. data/img/gicons/marker86.png +0 -0
  138. data/img/gicons/marker87.png +0 -0
  139. data/img/gicons/marker88.png +0 -0
  140. data/img/gicons/marker89.png +0 -0
  141. data/img/gicons/marker9.png +0 -0
  142. data/img/gicons/marker90.png +0 -0
  143. data/img/gicons/marker91.png +0 -0
  144. data/img/gicons/marker92.png +0 -0
  145. data/img/gicons/marker93.png +0 -0
  146. data/img/gicons/marker94.png +0 -0
  147. data/img/gicons/marker95.png +0 -0
  148. data/img/gicons/marker96.png +0 -0
  149. data/img/gicons/marker97.png +0 -0
  150. data/img/gicons/marker98.png +0 -0
  151. data/img/gicons/marker99.png +0 -0
  152. data/img/gicons/markerA.png +0 -0
  153. data/img/gicons/markerB.png +0 -0
  154. data/img/gicons/markerC.png +0 -0
  155. data/img/gicons/markerD.png +0 -0
  156. data/img/gicons/markerE.png +0 -0
  157. data/img/gicons/markerF.png +0 -0
  158. data/img/gicons/markerG.png +0 -0
  159. data/img/gicons/markerH.png +0 -0
  160. data/img/gicons/markerI.png +0 -0
  161. data/img/gicons/markerJ.png +0 -0
  162. data/img/gicons/mm_20_red.png +0 -0
  163. data/img/gicons/mm_20_shadow.png +0 -0
  164. data/img/gicons/readme.txt +11 -0
  165. data/img/gicons/shadow50.png +0 -0
  166. data/lib/gooby/cls_counter_hash.rb +78 -0
  167. data/lib/gooby/cls_delim_line.rb +35 -0
  168. data/lib/gooby/cls_dttm.rb +79 -0
  169. data/lib/gooby/cls_duration.rb +79 -0
  170. data/lib/gooby/cls_forerunner_xml_parser.rb +178 -0
  171. data/lib/gooby/cls_forerunner_xml_splitter.rb +109 -0
  172. data/lib/gooby/cls_geo_data.rb +181 -0
  173. data/lib/gooby/cls_gooby_command.rb +35 -0
  174. data/lib/gooby/cls_gooby_object.rb +18 -0
  175. data/lib/gooby/cls_google_map_generator.rb +363 -0
  176. data/lib/gooby/cls_history.rb +33 -0
  177. data/lib/gooby/cls_lap.rb +22 -0
  178. data/lib/gooby/cls_line.rb +75 -0
  179. data/lib/gooby/cls_options.rb +67 -0
  180. data/lib/gooby/cls_position.rb +44 -0
  181. data/lib/gooby/cls_run.rb +194 -0
  182. data/lib/gooby/cls_simple_xml_parser.rb +41 -0
  183. data/lib/gooby/cls_test_regen.rb +182 -0
  184. data/lib/gooby/cls_track.rb +47 -0
  185. data/lib/gooby/cls_trackpoint.rb +200 -0
  186. data/lib/gooby/mod_introspect.rb +26 -0
  187. data/lib/gooby/mod_io.rb +58 -0
  188. data/lib/gooby/mod_project_info.rb +80 -0
  189. data/lib/gooby/mod_string.rb +19 -0
  190. data/lib/gooby/mod_test_helper.rb +15 -0
  191. data/lib/gooby.rb +2265 -0
  192. data/pkg/code_header.txt +21 -0
  193. data/pkg/pkg.rb +236 -0
  194. data/pkg/test_header.txt +19 -0
  195. data/samples/20041113_richmond_marathon.html +532 -0
  196. data/samples/20050305_corporate_cup_hm.html +448 -0
  197. data/samples/20050430_nashville_marathon.html +530 -0
  198. data/samples/gps_point_capture.html +54 -0
  199. data/samples/phoenix_marathon.html +542 -0
  200. data/samples/run_2007_01_10_22_44_54.html +201 -0
  201. data/samples/run_2007_02_24_15_01_35.html +298 -0
  202. data/tests/tc_cls_counter_hash.rb +107 -0
  203. data/tests/tc_cls_delim_line.rb +74 -0
  204. data/tests/tc_cls_dttm.rb +131 -0
  205. data/tests/tc_cls_duration.rb +51 -0
  206. data/tests/tc_cls_forerunner_xml_parser.rb +70 -0
  207. data/tests/tc_cls_geo_data.xxx +71 -0
  208. data/tests/tc_cls_gooby_object.rb +26 -0
  209. data/tests/tc_cls_google_map_generator.rb +109 -0
  210. data/tests/tc_cls_history.rb +46 -0
  211. data/tests/tc_cls_lap.rb +38 -0
  212. data/tests/tc_cls_line.rb +110 -0
  213. data/tests/tc_cls_options.rb +79 -0
  214. data/tests/tc_cls_position.rb +66 -0
  215. data/tests/tc_cls_run.rb +142 -0
  216. data/tests/tc_cls_simple_xml_parser.rb +50 -0
  217. data/tests/tc_cls_track.rb +70 -0
  218. data/tests/tc_cls_trackpoint.rb +145 -0
  219. data/tests/tc_mod_introspect.rb +32 -0
  220. data/tests/tc_mod_io.rb +53 -0
  221. data/tests/tc_mod_project_info.rb +79 -0
  222. data/tests/tc_mod_string.rb +58 -0
  223. data/tests/ts_gooby.rb +1237 -0
  224. metadata +270 -0
@@ -0,0 +1,178 @@
1
+ module Gooby
2
+
3
+ =begin rdoc
4
+ Instances of this class are used to parse a Forerunner XML file in a SAX-like
5
+ manner. Instances of the model classes - History, Run, Track, Trackpoint,
6
+ etc. are created in this parsing process.
7
+
8
+ See http://www.garmin.com/xmlschemas/ForerunnerLogbookv1.xsd for the XML Schema
9
+ Definition for the Garmin Forerunner XML. The Gooby object model mirrors this XSD.
10
+ =end
11
+
12
+ class ForerunnerXmlParser
13
+
14
+ DETAIL_TAGS = %w( Notes StartTime Duration Length Latitude Longitude Altitude Time BeginPosition EndPosition )
15
+
16
+ include REXML::StreamListener
17
+
18
+ attr_reader :history, :cvHash, :tagCount
19
+
20
+ def initialize
21
+ @cvHash = Hash.new("")
22
+ @tagCount = 0
23
+ @runCount = 0
24
+ @lapCount = 0
25
+ @trackCount = 0
26
+ @trackpoint_count = 0
27
+ @currText = "";
28
+ @history = History.new
29
+ @currRun = nil
30
+ @currLap = nil
31
+ @currTrack = nil
32
+ @currBeginPosition = nil
33
+ @currEndPosition = nil
34
+ end
35
+
36
+ public
37
+
38
+ # SAX API method; handles 'Run', 'Lap', 'Track'.
39
+ def tag_start(tagname, attrs)
40
+ @tagCount += 1
41
+ @currTag = tagname
42
+ @cvHash[tagname] = ''
43
+
44
+ if detail_tag?(tagname)
45
+ @inDetail = true
46
+ end
47
+
48
+ if is_tag?('Run', tagname)
49
+ @runCount = @runCount + 1
50
+ @lapCount = 0
51
+ @trackCount = 0
52
+ @currRun = Run.new(@runCount)
53
+ @history.add_run(@currRun)
54
+ @cvHash['Notes'] = ''
55
+ return
56
+ end
57
+
58
+ if is_tag?('Lap', tagname)
59
+ @lapCount = @lapCount + 1
60
+ @currLap = Lap.new(@lapCount)
61
+ return
62
+ end
63
+
64
+ if is_tag?('Track', tagname)
65
+ @trackCount = @trackCount + 1
66
+ @currTrack = Track.new(@trackCount)
67
+ @trackpoint_count = 0
68
+ return
69
+ end
70
+
71
+ end
72
+
73
+ # SAX API method; handles 'Position', 'Trackpoint', 'Track', 'Lap', 'Run'.
74
+ def tag_end(tagname)
75
+ if @inDetail
76
+ @cvHash[tagname] = @currText
77
+ else
78
+ if is_tag?('Position', tagname)
79
+ lat = @cvHash['Latitude']
80
+ long = @cvHash['Longitude']
81
+ @currBeginPosition = Position.new(lat.strip, long.strip, '')
82
+ @currEndPosition = Position.new(lat.strip, long.strip, '')
83
+ end
84
+
85
+ if is_tag?('BeginPosition', tagname)
86
+ lat = @cvHash['Latitude']
87
+ long = @cvHash['Longitude']
88
+ @currBeginPosition = Position.new(lat.strip, long.strip, '')
89
+ end
90
+
91
+ if is_tag?('EndPosition', tagname)
92
+ lat = @cvHash['Latitude']
93
+ long = @cvHash['Longitude']
94
+ @currEndPosition = Position.new(lat.strip, long.strip, '')
95
+ end
96
+
97
+ if is_tag?('Trackpoint', tagname)
98
+ @trackpoint_count = @trackpoint_count + 1
99
+ lat = @cvHash['Latitude']
100
+ long = @cvHash['Longitude']
101
+ alt = @cvHash['Altitude']
102
+ time = @cvHash['Time']
103
+ tp = Trackpoint.new(@trackpoint_count, lat, long, alt, time)
104
+ @currTrack.add_trackpoint(tp)
105
+ end
106
+
107
+ if is_tag?('Track', tagname)
108
+ if @currRun != nil
109
+ @currRun.add_track(@currTrack)
110
+ end
111
+ end
112
+
113
+ if is_tag?('Lap', tagname)
114
+ @currLap.startTime = @cvHash['StartTime']
115
+ @currLap.duration = Duration.new(@cvHash['Duration'])
116
+ @currLap.length = @cvHash['Length']
117
+ @currLap.beginPosition = @currBeginPosition
118
+ @currLap.endPosition = @currEndPosition
119
+ @currRun.add_lap(@currLap)
120
+ end
121
+
122
+ if is_tag?('Run', tagname)
123
+ @currRun.notes = @cvHash['Notes']
124
+ end
125
+ end
126
+
127
+ @inDetail = false
128
+ @currText = ""
129
+ @currTag = ""
130
+ end
131
+
132
+ # SAX API method.
133
+ def text(txt)
134
+ if @inDetail
135
+ @currText = @currText + txt
136
+ end
137
+ end
138
+
139
+ # Iterate all parsed Run objects and print each with to_s.
140
+ def gdump()
141
+ @history.runs().each { |run| puts run.to_s }
142
+ end
143
+
144
+ # Iterate all parsed Run objects and print each with to_s.
145
+ def dump()
146
+ @history.runs().each { |run| puts run.to_s }
147
+ end
148
+
149
+ # Iterate all parsed Run objects and print each with put_csv.
150
+ def put_run_csv()
151
+ @history.runs().each { |run| run.put_csv() }
152
+ end
153
+
154
+ # Iterate all parsed Run objects and print each with put_tkpt_csv.
155
+ def put_all_run_tkpt_csv(with_header_comment)
156
+ @history.runs.each { |run|
157
+ run.put_tkpt_csv(with_header_comment)
158
+ }
159
+ end
160
+
161
+ private
162
+
163
+ def is_tag?(tagname, value)
164
+ tagname == value
165
+ end
166
+
167
+ def detail_tag?(tagname)
168
+ DETAIL_TAGS.each { |typ|
169
+ if typ == tagname
170
+ return true
171
+ end
172
+ }
173
+ return false
174
+ end
175
+
176
+ end
177
+
178
+ end # end of module
@@ -0,0 +1,109 @@
1
+ module Gooby
2
+
3
+ =begin rdoc
4
+ Instances of this class are used to split a large ForerunnerLogbook
5
+ XML file into individual 'run_' files.
6
+ =end
7
+
8
+ class ForerunnerXmlSplitter < GoobyObject
9
+
10
+ attr_reader :out_dir, :forerunner_files, :out_files_hash
11
+
12
+ def initialize(xml_file, out_dir)
13
+ @out_dir = out_dir
14
+ @forerunner_files = Array.new
15
+ @forerunner_files << xml_file
16
+ @out_files_hash = Hash.new
17
+ end
18
+
19
+ def split
20
+ @forerunner_files.each { |f| process_file(f) }
21
+ write_files
22
+ end
23
+
24
+ private
25
+
26
+ def process_file(forerunnerXmlFile)
27
+ @file_name = forerunnerXmlFile
28
+ @xml_lines = read_lines(@file_name, false)
29
+ @line_num = 0
30
+ @run_num = 0
31
+ @curr_run_lines = Array.new
32
+ @curr_run_tkpts = 0
33
+ @start_line_num = 0
34
+ @end_line_num = 0
35
+ @first_start_time = nil
36
+
37
+ @xml_lines.each { |line|
38
+ @line_num = @line_num + 1
39
+ if (line.match(/<Run>/))
40
+ @run_num = @run_num + 1
41
+ @start_line_num = @line_num
42
+ @curr_run_lines = Array.new
43
+ @curr_run_lines << line
44
+ elsif (line.match(/<StartTime>/)) # <StartTime>2007-01-13T15:37:06Z</StartTime>
45
+ @curr_run_lines << line
46
+ if @first_start_time == nil
47
+ clone = String.new(line)
48
+ clone.gsub!(/[<>]/, ' ')
49
+ clone.gsub!(/[-:T]/, '_')
50
+ clone.gsub!(/[Z]/, '')
51
+ tokens = clone.split
52
+ @first_start_time = tokens[1]
53
+ end
54
+ elsif (line.match(/<Trackpoint>/))
55
+ @curr_run_tkpts = @curr_run_tkpts + 1
56
+ @curr_run_lines << line
57
+ elsif (line.match(/<\/Run>/))
58
+ @end_line_num = @line_num
59
+ @curr_run_lines << line
60
+ end_run
61
+ elsif (@curr_run_lines.size > 0)
62
+ @curr_run_lines << line
63
+ end
64
+ }
65
+ end
66
+
67
+ def end_run
68
+ out_file = "#{@out_dir}/run_#{@first_start_time}.xml"
69
+ comment = "<!-- file: #{out_file} lines: #{@curr_run_lines.size} (#{@start_line_num} to #{@end_line_num}) tkpts: #{@curr_run_tkpts} --> \n"
70
+ @curr_run_lines.insert(0, comment)
71
+
72
+ prev_entry = @out_files_hash[out_file]
73
+ if prev_entry
74
+ if (@curr_run_lines.size >= prev_entry.size)
75
+ puts "previous entry overlaid for #{out_file}. curr=#{@curr_run_lines.size} prev=#{prev_entry.size}"
76
+ @out_files_hash[out_file] = @curr_run_lines
77
+ else
78
+ puts "previous entry retained for #{out_file}. curr=#{@curr_run_lines.size} prev=#{prev_entry.size}"
79
+ end
80
+ else
81
+ puts "new entry for #{out_file}. curr=#{@curr_run_lines.size}"
82
+ @out_files_hash[out_file] = @curr_run_lines
83
+ end
84
+
85
+ @curr_run_lines = Array.new
86
+ @curr_run_tkpts = 0
87
+ @start_line_num = 0
88
+ @end_line_num = 0
89
+ @first_start_time = nil
90
+ end
91
+
92
+ def write_files
93
+ out_names = @out_files_hash.keys.sort
94
+ puts "Writing #{out_names.size} extract files..."
95
+ out_names.each { |out_name|
96
+ lines = @out_files_hash[out_name]
97
+ out = File.new out_name, "w+"
98
+ lines.each { |line| out.write line }
99
+ out.flush
100
+ out.close
101
+ puts "File written: #{out_name}"
102
+ }
103
+ puts "output files written."
104
+ end
105
+
106
+ end
107
+
108
+ end # end of module
109
+
@@ -0,0 +1,181 @@
1
+ module Gooby
2
+
3
+ =begin rdoc
4
+ Instances of this class represent a the set of Geographic data defined in file geo.txt
5
+ =end
6
+
7
+ class GeoData < GoobyObject
8
+
9
+ attr_reader :filename, :lines, :poi_hash, :poi_array, :track_hash, :track_array, :route_hash, :route_array
10
+
11
+ def initialize(filename)
12
+ @filename = filename
13
+ @filename = 'data/geo_data.txt' if @filename == nil
14
+ @lines = read_lines(@filename, true)
15
+ @poi_hash = Hash.new
16
+ @poi_array = Array.new
17
+ @track_hash = Hash.new
18
+ @track_array = Array.new
19
+ @route_hash = Hash.new
20
+ @route_array = Array.new
21
+ parse_poi
22
+ parse_tracks
23
+ parse_routes
24
+ end
25
+
26
+ private
27
+
28
+ def parse_poi
29
+ in_poi, poi_number = false, 0
30
+ @lines.each { |line|
31
+ line_obj = Line.new(line, nil, true)
32
+ tok_count = line_obj.token_count
33
+ is_point = line_obj.token_idx_equals(0, '.')
34
+
35
+ if line_obj.is_populated_non_comment
36
+ if line_obj.match('points_of_interest_start')
37
+ in_poi = true
38
+ elsif line_obj.match('points_of_interest_end')
39
+ in_poi = false
40
+ elsif in_poi && tok_count > 2 && is_point
41
+ poi_number = poi_number + 1
42
+ tkpt = Trackpoint.new(
43
+ poi_number, line_obj.tokens[1], line_obj.tokens[2],
44
+ '0', '', line_obj.concatinate_tokens(3))
45
+ add_poi(tkpt)
46
+ end
47
+ end
48
+ }
49
+ end
50
+
51
+ def parse_tracks
52
+ in_track, trk_number, tkpt_number = false, 0, 0
53
+ curr_trk, curr_run = nil, nil
54
+ @lines.each { |line|
55
+ line_obj = Line.new(line, nil, true)
56
+ tok_count = line_obj.token_count
57
+ is_point = line_obj.token_idx_equals(0, '.')
58
+
59
+ if line_obj.is_populated_non_comment
60
+ if line_obj.match('track_start')
61
+ in_track = true
62
+ trk_number = trk_number + 1
63
+ tkpt_number = 0
64
+ curr_trk = Track.new(0, line_obj.concatinate_tokens(1))
65
+ curr_run = Run.new(trk_number, line_obj.concatinate_tokens(1))
66
+ curr_run.add_track(curr_trk)
67
+ elsif line_obj.match('track_end')
68
+ in_track = false
69
+ curr_run.finish
70
+ add_track(curr_trk)
71
+ add_route(curr_run)
72
+ elsif in_track && tok_count > 2 && is_point
73
+ tkpt_number = tkpt_number + 1
74
+ tkpt = Trackpoint.new(
75
+ tkpt_number, line_obj.tokens[1], line_obj.tokens[2],
76
+ '0', '', line_obj.concatinate_tokens(3))
77
+ curr_trk.add_trackpoint(tkpt)
78
+ end
79
+ end
80
+ }
81
+ end
82
+
83
+ def parse_routes
84
+ in_route, route_number, trk_number, tkpt_number = false, 0, 0, 0
85
+ curr_trk, curr_run = nil, nil
86
+ @lines.each { |line|
87
+ line_obj = Line.new(line, nil, true)
88
+ tok_count = line_obj.token_count
89
+ is_point = line_obj.token_idx_equals(0, '.')
90
+
91
+ if line_obj.is_populated_non_comment
92
+ if line_obj.match('route_start')
93
+ in_route = true
94
+ trk_number = trk_number + 1
95
+ tkpt_number = 0
96
+ curr_trk = Track.new(0, line_obj.concatinate_tokens(1))
97
+ curr_run = Run.new(trk_number, line_obj.concatinate_tokens(1))
98
+ curr_run.add_track(curr_trk)
99
+ elsif line_obj.match('route_end')
100
+ in_route = false
101
+ curr_run.finish
102
+ add_route(curr_run)
103
+ elsif in_route && tok_count > 2 && is_point
104
+ tkpt_number = tkpt_number + 1
105
+ tkpt = Trackpoint.new(
106
+ tkpt_number, line_obj.tokens[1], line_obj.tokens[2],
107
+ '0', '', line_obj.concatinate_tokens(3))
108
+ curr_trk.add_trackpoint(tkpt)
109
+ elsif in_route && line_obj.token_idx_equals(0, 'track') && tok_count > 1
110
+ trk_desc = line_obj.concatinate_tokens(1)
111
+ trk = @track_hash[trk_desc]
112
+ if trk
113
+ trk.trackpoints.each { |tkpt| curr_trk.add_trackpoint(tkpt) }
114
+ end
115
+ elsif in_route && line_obj.token_idx_equals(0, 'track_rev') && tok_count > 1
116
+ trk_desc = line_obj.concatinate_tokens(1)
117
+ trk = @track_hash[trk_desc]
118
+ if trk
119
+ array = trk.trackpoints
120
+ trk.trackpoints.each { |tkpt| curr_trk.add_trackpoint(tkpt) }
121
+ end
122
+ end
123
+ end
124
+ }
125
+ end
126
+
127
+ def add_poi(tkpt)
128
+ if tkpt
129
+ descr = tkpt.descr
130
+ if @poi_hash.has_key? descr
131
+ puts "Duplicate POI key ignored - '#{descr}'"
132
+ else
133
+ #puts "Adding POI: #{tkpt.to_poi_csv}"
134
+ @poi_hash[descr] = tkpt
135
+ @poi_array << tkpt
136
+ end
137
+ end
138
+ end
139
+
140
+ def add_track(trk)
141
+ if trk
142
+ descr = trk.descr
143
+ if @track_hash.has_key? descr
144
+ puts "Duplicate Track key ignored - '#{descr}'"
145
+ else
146
+ @track_hash[descr] = trk
147
+ @track_array << trk
148
+ end
149
+ end
150
+ end
151
+
152
+ def add_route(run)
153
+ if run
154
+ descr = run.descr
155
+ if @route_hash.has_key? descr
156
+ puts "Duplicate Route key ignored - '#{descr}'"
157
+ else
158
+ @route_hash[descr] = run
159
+ @route_array << run
160
+ end
161
+ end
162
+ end
163
+
164
+ public
165
+
166
+ def to_s
167
+ return "GeoData lines: #{lines.size} poi: #{@poi_hash.size} tracks: #{@track_hash.size} routes: #{@route_hash.size} "
168
+ end
169
+
170
+ def dump
171
+ puts "#{self.class} dump:"
172
+ @poi_array.each { |tkpt| puts "POI: #{tkpt.to_geo_s}" }
173
+ @track_array.each { |trk| trk.dump }
174
+ @route_hash.keys.sort.each { |key|
175
+ puts "Route: '#{key}'"
176
+ }
177
+ end
178
+
179
+ end
180
+
181
+ end # end of module
@@ -0,0 +1,35 @@
1
+ module Gooby
2
+
3
+ =begin rdoc
4
+ This class provides "user friendly DSL" functionality for the use
5
+ of Gooby.
6
+ =end
7
+
8
+ class GoobyCommand < GoobyObject
9
+
10
+ def initialize
11
+ end
12
+
13
+ def options(yaml_filename)
14
+ Gooby::Options.new(yaml_filename)
15
+ end
16
+
17
+ def split_forerunner_xml(xml_filename, out_dir)
18
+ splitter = Gooby::ForerunnerXmlSplitter.new(xml_filename, out_dir)
19
+ splitter.split
20
+ end
21
+
22
+ def parse_forerunner_xml(xml_filename)
23
+ handler = Gooby::ForerunnerXmlParser.new
24
+ Document.parse_stream((File.new xml_filename), handler)
25
+ handler.put_all_run_tkpt_csv(true)
26
+ end
27
+
28
+ def generate_google_map(csv_filename, options_obj)
29
+ generator = Gooby::GoogleMapGenerator.new(csv_filename)
30
+ generator.generate_page(options_obj)
31
+ end
32
+
33
+ end
34
+
35
+ end # end of module
@@ -0,0 +1,18 @@
1
+ module Gooby
2
+
3
+ =begin rdoc
4
+ This is the abstract superclass of several Gooby classes.
5
+ Includes modules GoobyIO, Introspect, and GoobyProjectInfo.
6
+ =end
7
+
8
+ class GoobyObject
9
+
10
+ include Gooby::GoobyIO
11
+ include Gooby::GoobyString
12
+ include Gooby::Introspect
13
+ include Gooby::GoobyProjectInfo
14
+ include Gooby::Con
15
+
16
+ end
17
+
18
+ end # end of module