require 'fit4ruby'
require 'postrunner/HTMLBuilder'
require 'postrunner/ActivityReport'
require 'postrunner/ViewWidgets'
require 'postrunner/TrackView'
require 'postrunner/ChartView'
module PostRunner
class ActivityView
include ViewWidgets
def initialize(activity, output_dir)
@activity = activity
@output_dir = output_dir
@output_file = nil
ensure_output_dir
@doc = HTMLBuilder.new
generate_html(@doc)
write_file
show_in_browser
end
private
def ensure_output_dir
unless Dir.exists?(@output_dir)
begin
Dir.mkdir(@output_dir)
rescue SystemCallError
Log.fatal "Cannot create output directory '#{@output_dir}': #{$!}"
end
end
end
def generate_html(doc)
@report = ActivityReport.new(@activity.fit_activity)
@track_view = TrackView.new(@activity)
@chart_view = ChartView.new(@activity)
doc.html {
head(doc)
body(doc)
}
end
def head(doc)
doc.head {
doc.meta({ 'http-equiv' => 'Content-Type',
'content' => 'text/html; charset=utf-8' })
doc.meta({ 'name' => 'viewport',
'content' => 'width=device-width, ' +
'initial-scale=1.0, maximum-scale=1.0, ' +
'user-scalable=0' })
doc.title("PostRunner Activity: #{@activity.name}")
style(doc)
view_widgets_style(doc)
@chart_view.head(doc)
@track_view.head(doc)
}
end
def style(doc)
doc.style(< 'init()' }) {
doc.div({ 'class' => 'main' }) {
doc.div({ 'class' => 'left_col' }) {
@report.to_html(doc)
@track_view.div(doc)
}
doc.div({ 'class' => 'right_col' }) {
@chart_view.div(doc)
}
}
}
end
def write_file
@output_file = File.join(@output_dir, "#{@activity.fit_file[0..-5]}.html")
begin
File.write(@output_file, @doc.to_html)
rescue IOError
Log.fatal "Cannot write activity view file '#{@output_file}: #{$!}"
end
end
def show_in_browser
system("firefox \"#{@output_file}\" &")
end
end
end