-- | The `HTMLGenerator' module generates the HTML content for the index.html generated module Data.GPS.Gps2HtmlReport.HTMLGenerator ( generateHtmlPage -- :: [WptType] -> Html ) where import Text.Html import Data.GPS hiding (src,link,href) import Text.Printf import Data.Maybe import Data.GPS.Gps2HtmlReport.JourneyStats (journeyDistance,meanElevation,journeyTime,maxSpeed,meanJourneySpeed,findPoint,dateOfJourney) -- | Takes all the WayPoints and generates the HTML file generateHtmlPage :: [WptType] -> Html generateHtmlPage points = let header1 = h1 $ stringToHtml "Journey Statistics" header2 = h1 $ stringToHtml "Charts of the Journey" header3 = h1 $ stringToHtml "OpenStreetMap Chart" title = thetitle $ stringToHtml "GPX Track Report" theStyle = style (stringToHtml cssContent) ! [thetype "text/css"] theHeader = header $ concatHtml [title,theStyle] mainArea = thediv (concatHtml [header1,statsTable points,br,header2,chartTable,header3,osmImg]) theBody = body mainArea in concatHtml [theHeader,theBody,pgFooter] -- | The OpenStreetMap image area osmImg :: Html osmImg = anchor (image ! [src "osm.png"]) ! [href "osm_fullsize.png"] -- | Takes all the WayPoints and calculates the journey statistics statsTable :: [WptType] -> Html statsTable points = let tblHeader1 = th $ stringToHtml "Journey Details" tblHeader2 = th $ stringToHtml "Elevation" tblHeader3 = th $ stringToHtml "Speed" distTravelled = printf "%.2f" $ journeyDistance points maybeMaxElePt = findPoint points (head points) ele (>) maybeMinElePt = findPoint points (head points) ele (<) maxElevation = printf "%.1f" (if isJust maybeMaxElePt then snd $ fromJust maybeMaxElePt else 0.0) minElevation = printf "%.1f" (if isJust maybeMinElePt then snd $ fromJust maybeMinElePt else 0.0) meanEle = printf "%.1f" $ meanElevation points journeyMins = show $ round (journeyTime points) `div` 60 journeySecs = show $ round (journeyTime points) `rem` 60 mxSpd = printf "%.1f" $ maxSpeed points meanSpd = printf "%.1f" $ meanJourneySpeed points maybeDateOfJourney = dateOfJourney points journeyDate = (if isJust maybeDateOfJourney then show $ fromJust maybeDateOfJourney else "") li1c1 = li $ stringToHtml ("Journey Date: "++ journeyDate) li2c1 = li $ stringToHtml ("Distance Travelled: "++ distTravelled++"m") li3c1 = li $ stringToHtml ("Journey Time: "++journeyMins++"m "++journeySecs++"s") li1c2 = li $ stringToHtml ("Maximum Elevation: "++ maxElevation++"m") li2c2 = li $ stringToHtml ("Minimum Elevation: "++minElevation++"m") li3c2 = li $ stringToHtml ("Mean Elevation: "++ meanEle++"m") li1c3 = li $ stringToHtml ("Maximum speed: "++ mxSpd++"m/s") li2c3 = li $ stringToHtml ("Mean speed: "++meanSpd++"m/s") col1 = td (concatHtml [li1c1,li2c1,li3c1]) ! [valign "top"] col2 = td (concatHtml [li1c2,li2c2,li3c2]) ! [valign "top"] col3 = td (concatHtml [li1c3,li2c3]) ! [valign "top"] row1 = tr $ concatHtml [tblHeader1,tblHeader2,tblHeader3] row2 = tr $ concatHtml [col1,col2,col3] tbl = table (concatHtml [row1,row2]) -- ! [cellspacing 10] in center tbl -- | The CSS style text to format the rendering of the HTML page. It would be good to replace with Haskell HTML combinator library functions cssContent = "h1 {color: #2C558A; font-weight: normal; font-size: x-large; text-shadow: white 0px 1px 1px; letter-spacing: 0.1em; font-family: 'Gill Sans', 'PT Sans', 'Arial', sans-serif; text-transform: uppercase;} div { width: 900px; margin-top: 50px; margin:0 auto;} table {border-spacing: 20px 0px;} footer {text-align:right; background-color:#EEEEEE; width:900px; margin:0 auto; margin-top: 30px}" -- | The area holding the Cairo charts chartTable = let img1 = image ! [src "chart1.png"] img2 = image ! [src "chart2.png"] cell1 = td img1 cell2 = td img2 row1 = tr $ concatHtml [cell1,cell2] tbl = table row1 in center tbl -- | The footer pgFooter = let projectLink = anchor (stringToHtml "gps2htmlReport") ! [href "https://github.com/robstewart57/Gps2HtmlReport"] infoStr = stringToHtml "Report generated by " in footer (concatHtml [infoStr,projectLink]) ! [identifier "main"] -- | This appears to be missing from the `html' package footer = tag "FOOTER"