diff options
-rw-r--r-- | .tmuxinator.yml | 4 | ||||
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | bower.json | 5 | ||||
-rw-r--r-- | package.json | 6 | ||||
-rw-r--r-- | public/icon.png | bin | 0 -> 399 bytes | |||
-rw-r--r-- | public/index.html | 4 | ||||
-rw-r--r-- | public/main.css | 26 | ||||
-rw-r--r-- | src/Aliment.purs | 13 | ||||
-rw-r--r-- | src/Food.purs | 25 | ||||
-rw-r--r-- | src/Format.purs | 29 | ||||
-rw-r--r-- | src/Page.purs | 45 | ||||
-rwxr-xr-x | stop | 2 | ||||
-rw-r--r-- | test/Main.purs | 27 |
13 files changed, 162 insertions, 28 deletions
diff --git a/.tmuxinator.yml b/.tmuxinator.yml index be3eac8..914bf4f 100644 --- a/.tmuxinator.yml +++ b/.tmuxinator.yml @@ -1,4 +1,4 @@ -name: sucre +name: glycemie windows: - main: @@ -7,4 +7,4 @@ windows: - # Empty - build: - webfsd -r public -f index.html -p 9000 - - npm install pulp && bower install && ./watch + - npm install && bower install && ./watch @@ -1,5 +1,5 @@ -Sucre -===== +Glycémie +======== Getting started --------------- @@ -1,5 +1,5 @@ { - "name": "sucre", + "name": "glycemie", "private": true, "ignore": [ "**/.*", @@ -8,6 +8,7 @@ "output" ], "dependencies": { - "purescript-halogen": "*" + "purescript-halogen": "*", + "purescript-spec": "*" } } diff --git a/package.json b/package.json new file mode 100644 index 0000000..a3d0b92 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "devDependencies": { + "pulp": "^10.0.4" + } +} diff --git a/public/icon.png b/public/icon.png Binary files differnew file mode 100644 index 0000000..48210e7 --- /dev/null +++ b/public/icon.png diff --git a/public/index.html b/public/index.html index f1bb196..a322388 100644 --- a/public/index.html +++ b/public/index.html @@ -1,8 +1,10 @@ <!doctype html> <html> <head> - <title>Sucre</title> + <title>Glycémie</title> + <meta charset="UTF-8"> <link rel="stylesheet" href="main.css"> + <link rel="icon" href="icon.png"> </head> <body> <script src="main.js"></script> diff --git a/public/main.css b/public/main.css index 6388837..86455a6 100644 --- a/public/main.css +++ b/public/main.css @@ -4,3 +4,29 @@ h1 { font-size: 46px; color: #33AA00; } + +ul.aliments { + display: table; + margin: 0 auto; +} + +ul.aliments > li { + display: table-row; +} + +ul.aliments > li.title { + font-weight: bold; +} + +ul.aliments > li > div { + display: table-cell; + padding: 15px; +} + +ul.aliments > li > .number { + text-align: right; +} + +ul.aliments > li:nth-child(2n+3) { + background-color: #EEEEEE; +} diff --git a/src/Aliment.purs b/src/Aliment.purs deleted file mode 100644 index e7c4fc8..0000000 --- a/src/Aliment.purs +++ /dev/null @@ -1,13 +0,0 @@ -module Aliment where - -all :: Array Aliment -all = - [ { name: "Oignon", gi: 15 } - , { name: "Olive", gi: 15 } - , { name: "Haricot rouge", gi: 35 } - ] - -type Aliment = - { name :: String - , gi :: Int - } diff --git a/src/Food.purs b/src/Food.purs new file mode 100644 index 0000000..b1e3d29 --- /dev/null +++ b/src/Food.purs @@ -0,0 +1,25 @@ +module Food + ( Aliment + , all + , glycemicLoad + ) where + +import Data.Int (toNumber) +import Prelude + +type Aliment = + { name :: String + , glycemicIndex :: Int + , carbohydrates :: Int -- for 100 grams + } + +glycemicLoad :: Aliment -> Number +glycemicLoad aliment = toNumber aliment.glycemicIndex * toNumber aliment.carbohydrates / 100.0 + +all :: Array Aliment +all = + [ { name: "oignon", glycemicIndex: 15, carbohydrates: 9 } + , { name: "olive", glycemicIndex: 15, carbohydrates: 6 } + , { name: "haricot rouge", glycemicIndex: 35, carbohydrates: 24 } + , { name: "haricot blanc", glycemicIndex: 35, carbohydrates: 13 } + ] diff --git a/src/Format.purs b/src/Format.purs new file mode 100644 index 0000000..22593e5 --- /dev/null +++ b/src/Format.purs @@ -0,0 +1,29 @@ +module Format where + +import Data.Int (toNumber, fromNumber) +import Data.Array (replicate) +import Data.Maybe (fromMaybe) +import Data.String (length, joinWith) +import Math (round, trunc, pow) + +import Prelude + +number :: Int -> Number -> String +number decimalLength num = formattedIntegerPart <> formattedDecimalPart + where + formattedIntegerPart = + (if decimalLength > 0 then trunc num else round num) + # fromNumber + # fromMaybe 0 + # show + + formattedDecimalPart = + if decimalLength > 0 then + ((num - trunc num) * pow 10.0 (toNumber decimalLength)) + # round + # fromNumber + # fromMaybe 0 + # show + # \str -> "," <> (joinWith "" $ replicate (decimalLength - length str) "0") <> str + else + "" diff --git a/src/Page.purs b/src/Page.purs index 83e4d73..76cdf8d 100644 --- a/src/Page.purs +++ b/src/Page.purs @@ -1,12 +1,14 @@ module Page where -import Prelude import Data.Maybe (Maybe(..)) import Halogen as H import Halogen.HTML as HH +import Halogen.HTML.Properties as HP +import Prelude -import Aliment as Aliment -import Aliment (Aliment) +import Food (Aliment) +import Food as Food +import Format as Format type State = Unit @@ -27,19 +29,48 @@ component = render state = HH.div [] - [ HH.h1 [] [ HH.text "Sucre" ] + [ HH.h1 [] [ HH.text "Glycémie" ] , HH.ul - [] - (map renderAliment Aliment.all) + [ HP.class_ $ HH.ClassName "aliments" ] + ([renderTitle] <> (map renderAliment Food.all)) ] eval :: Query ~> H.ComponentDSL State Query Message m eval = case _ of NoOp next -> pure next +renderTitle :: H.ComponentHTML Query +renderTitle = + HH.li + [ HP.class_ $ HH.ClassName "title" ] + [ HH.div + [] + [ HH.text "Aliment" ] + , HH.div + [] + [ HH.text "Index glycémique" ] + , HH.div + [] + [ HH.text "Glucides pour 100 g" ] + , HH.div + [] + [ HH.text "Charge glycémique" ] + ] + renderAliment :: Aliment -> H.ComponentHTML Query renderAliment aliment = HH.li [] - [ HH.text (aliment.name <> ", index glycémique: " <> (show aliment.gi)) + [ HH.div + [] + [ HH.text aliment.name ] + , HH.div + [ HP.class_ $ HH.ClassName "number" ] + [ HH.text (show aliment.glycemicIndex) ] + , HH.div + [ HP.class_ $ HH.ClassName "number" ] + [ HH.text (show aliment.carbohydrates) ] + , HH.div + [ HP.class_ $ HH.ClassName "number" ] + [ HH.text (Format.number 2 <<< Food.glycemicLoad $ aliment) ] ] @@ -1,3 +1,3 @@ #!/bin/sh pkill webfsd -tmux kill-session -t sucre +tmux kill-session -t glycemie diff --git a/test/Main.purs b/test/Main.purs new file mode 100644 index 0000000..5ebbb03 --- /dev/null +++ b/test/Main.purs @@ -0,0 +1,27 @@ +module Test.Main where + +import Prelude +import Control.Monad.Aff (later') +import Control.Monad.Eff (Eff) +import Test.Spec (describe, it) +import Test.Spec.Assertions (shouldEqual) +import Test.Spec.Reporter.Console (consoleReporter) +import Test.Spec.Runner (RunnerEffects, run) + +import Format as Format + +main :: Eff (RunnerEffects ()) Unit +main = run [consoleReporter] do + + describe "Format" do + it "format numbers" $ do + (Format.number 0 0.0) `shouldEqual` "0" + (Format.number 0 (-0.0)) `shouldEqual` "0" + (Format.number 0 8.0) `shouldEqual` "8" + (Format.number 0 (-4.0)) `shouldEqual` "-4" + (Format.number 2 25.0) `shouldEqual` "25,00" + (Format.number 5 25.0) `shouldEqual` "25,00000" + (Format.number 5 25.13) `shouldEqual` "25,13000" + (Format.number 1 25.13) `shouldEqual` "25,1" + (Format.number 1 25.15) `shouldEqual` "25,1" + (Format.number 1 25.19) `shouldEqual` "25,2" |