From 02128e78b74ac310ede440450851e287d3d1f1d3 Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 00:09:32 +0200 Subject: [PATCH 01/12] Started on linsen --- mat-chalmers.cabal | 1 + src/Model/Linsen.hs | 104 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 src/Model/Linsen.hs diff --git a/mat-chalmers.cabal b/mat-chalmers.cabal index b6a1e6a..04ef57a 100644 --- a/mat-chalmers.cabal +++ b/mat-chalmers.cabal @@ -24,6 +24,7 @@ library exposed-modules: Model , Model.Types , Model.Karen + , Model.Linsen , Model.Wijkanders , View , Config diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs new file mode 100644 index 0000000..bef2ec7 --- /dev/null +++ b/src/Model/Linsen.hs @@ -0,0 +1,104 @@ +{-# LANGUAGE FlexibleContexts, OverloadedStrings, QuasiQuotes #-} + +module Model.Linsen + ( fetch + , parse + , fetchAndCreateRestaurant + ) +where + +import Control.Monad ( (>=>) + , foldM + ) +import Control.Monad.Catch ( MonadThrow ) +import Control.Monad.IO.Class ( MonadIO ) +import Data.Aeson ( -- object + -- , (.=) + (.:) + -- , withArray + , withObject + , Value + ) +import Data.Aeson.Key ( fromString ) +import Data.Aeson.Types ( Parser + , parseEither + ) +import Data.Bifunctor ( first ) +import qualified Data.ByteString.Lazy.Char8 as BL8 +import Data.Functor ( (<&>) ) +import Data.Text.Lazy ( Text + ) +import Data.Thyme.Calendar ( Day) +-- import Lens.Micro.Platform ( (^.) +-- , (&) +-- , (%~) +-- , view +-- ) +import Network.HTTP.Req +-- import Text.Heredoc ( str ) + +import Model.Types ( NoMenu(..) + , Menu(..) + , Restaurant + ( Restaurant + ) + ) +import Util ( menusToEitherNoLunch ) +import Data.Thyme.Calendar.WeekDate ( toWeekDate ) + +fetch + :: (MonadHttp m, MonadIO m, MonadThrow m) + => m Value -- ^ A JSON response or horrible crash +fetch = + req + POST + (https "cafe-linsen.se" /: "api" /: "menu") + NoReqBody + jsonResponse + mempty + <&> responseBody + +parse + :: Day -- ^ Day to parse + -> Value -- ^ JSON result from `fetch` + -> Either NoMenu [Menu] -- ^ Either list of parsed `Menu`s or `NoMenu` error +parse day = + failWithNoMenu + (parseEither + ( withObject "Parse meals" + $ (.: "docs") + >=> (.: fromString (show (6 - (\(_,_,a) -> a) (toWeekDate day)))) + >=> (.: "richText") + >=> (.: "root") + >=> (.: "children") + >=> (foldM menuParser [] :: [Value] -> Parser [Menu]) + ) + ) + >=> menusToEitherNoLunch + where + failWithNoMenu :: Show a => (a -> Either String b) -> a -> Either NoMenu b + failWithNoMenu action x = + first (\msg -> NMParseError msg . BL8.pack . show $ x) (action x) + + menuParser :: [Menu] -> Value -> Parser [Menu] + menuParser o v = (:o) <$> (withObject "Menu Object" $ \_obj -> + Menu + <$> undefined + <*> undefined --TODO: parse + -- Just needs fields (2,3), & (6,7), & (10,11) + -- (2,3) is Meat + -- (6,7) is Fish + -- (10,11) is Vegetarian + ) v + + +fetchAndCreateRestaurant + :: (MonadHttp m, MonadIO m, MonadThrow m) + => Day -- ^ Day + -> Text -- ^ Title + -> m Restaurant -- ^ Fetched Restaurant +fetchAndCreateRestaurant day title = + Restaurant + title + "https://plateimpact-screen.azurewebsites.net/menu/week/" + <$> fmap (parse day) fetch From f25bd679d1f8d9a61780232c30d6871ba88fc2c7 Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 12:37:18 +0200 Subject: [PATCH 02/12] Now fetches first part of the food --- mat-chalmers.cabal | 2 +- src/Model.hs | 2 ++ src/Model/Linsen.hs | 61 +++++++++++++++++++++++---------------------- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/mat-chalmers.cabal b/mat-chalmers.cabal index 04ef57a..eab96f5 100644 --- a/mat-chalmers.cabal +++ b/mat-chalmers.cabal @@ -20,7 +20,7 @@ data-files: library default-language: Haskell2010 hs-source-dirs: src - ghc-options: -Wall -Werror -Wunused-binds -Wunused-imports -Wcompat + ghc-options: exposed-modules: Model , Model.Types , Model.Karen diff --git a/src/Model.hs b/src/Model.hs index 02edb10..d9b5c9a 100644 --- a/src/Model.hs +++ b/src/Model.hs @@ -56,6 +56,7 @@ import Config import Model.Types import Model.Karen import Model.Wijkanders +import Model.Linsen -- | Refreshes menus. -- The refresh function evaluates to `Some monad m => m (View model, Update signal)`, @@ -108,6 +109,7 @@ update = do , karenR "L's Kitchen" "ls-kitchen" "c74da2cf-aa1a-4d3a-9ba6-08d5569587a1" , Restaurant "Wijkanders" (fromStrict $ renderUrl wijkandersAPIURL) . getWijkanders day' . responseBody <$> req GET wijkandersAPIURL NoReqBody lbsResponse mempty + , fetchAndCreateLinsen day' ] for_ rest $ \r -> case menu r of diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index bef2ec7..0ad5023 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -1,14 +1,16 @@ -{-# LANGUAGE FlexibleContexts, OverloadedStrings, QuasiQuotes #-} +{-# LANGUAGE FlexibleContexts, OverloadedStrings, LambdaCase #-} module Model.Linsen - ( fetch - , parse - , fetchAndCreateRestaurant + ( + fetchAndCreateLinsen ) where import Control.Monad ( (>=>) + , (<=<) , foldM + , zipWithM + , ap ) import Control.Monad.Catch ( MonadThrow ) import Control.Monad.IO.Class ( MonadIO ) @@ -26,17 +28,10 @@ import Data.Aeson.Types ( Parser import Data.Bifunctor ( first ) import qualified Data.ByteString.Lazy.Char8 as BL8 import Data.Functor ( (<&>) ) -import Data.Text.Lazy ( Text - ) -import Data.Thyme.Calendar ( Day) --- import Lens.Micro.Platform ( (^.) --- , (&) --- , (%~) --- , view --- ) +import Data.Text.Lazy ( Text ) +import Data.Thyme.Calendar ( Day ) import Network.HTTP.Req -- import Text.Heredoc ( str ) - import Model.Types ( NoMenu(..) , Menu(..) , Restaurant @@ -51,7 +46,7 @@ fetch => m Value -- ^ A JSON response or horrible crash fetch = req - POST + GET (https "cafe-linsen.se" /: "api" /: "menu") NoReqBody jsonResponse @@ -67,11 +62,11 @@ parse day = (parseEither ( withObject "Parse meals" $ (.: "docs") - >=> (.: fromString (show (6 - (\(_,_,a) -> a) (toWeekDate day)))) + >=> (pure . (!! (6 - (\(_,_,a) -> a) (toWeekDate day)))) >=> (.: "richText") >=> (.: "root") >=> (.: "children") - >=> (foldM menuParser [] :: [Value] -> Parser [Menu]) + >=> menuParser ) ) >=> menusToEitherNoLunch @@ -80,25 +75,31 @@ parse day = failWithNoMenu action x = first (\msg -> NMParseError msg . BL8.pack . show $ x) (action x) - menuParser :: [Menu] -> Value -> Parser [Menu] - menuParser o v = (:o) <$> (withObject "Menu Object" $ \_obj -> - Menu - <$> undefined - <*> undefined --TODO: parse - -- Just needs fields (2,3), & (6,7), & (10,11) - -- (2,3) is Meat - -- (6,7) is Fish - -- (10,11) is Vegetarian - ) v + menuParser :: [Value] -> Parser [Menu] + menuParser = pure . concatMap f . zip [0..] <=< ap (zipWithM sumFood) tail + + f :: (Int, Text) -> [Menu] + f = (\case + (2 ,a) -> [Menu "Kött" a] + (6 ,a) -> [Menu "Fisk" a] + (10,a) -> [Menu "Veg" a] + _ -> []) + + sumFood :: Value -> Value -> Parser Text + sumFood a b = getFood a <> pure " " <> getFood b + getFood :: Value -> Parser Text + getFood = withObject "Menu Object" + $ (.: "children") + >=> pure . last + >=> (.: "text") -fetchAndCreateRestaurant +fetchAndCreateLinsen :: (MonadHttp m, MonadIO m, MonadThrow m) => Day -- ^ Day - -> Text -- ^ Title -> m Restaurant -- ^ Fetched Restaurant -fetchAndCreateRestaurant day title = +fetchAndCreateLinsen day = Restaurant - title + "Café Linsen" "https://plateimpact-screen.azurewebsites.net/menu/week/" <$> fmap (parse day) fetch From a3c9089fb7cb74d753657f6bfd049fc9a9127477 Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 14:08:58 +0200 Subject: [PATCH 03/12] Now works --- mat-chalmers.cabal | 1 + src/Model/Linsen.hs | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/mat-chalmers.cabal b/mat-chalmers.cabal index eab96f5..ab7a114 100644 --- a/mat-chalmers.cabal +++ b/mat-chalmers.cabal @@ -53,6 +53,7 @@ library , file-embed >= 0.0.15.0 && < 1.0 , thyme >= 0.4 && <= 0.5 , word8 == 0.1.3 + , vector == 0.13.1.0 executable mat-chalmers main-is: Main.hs diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index 0ad5023..e9ea10e 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -14,10 +14,8 @@ import Control.Monad ( (>=>) ) import Control.Monad.Catch ( MonadThrow ) import Control.Monad.IO.Class ( MonadIO ) -import Data.Aeson ( -- object - -- , (.=) - (.:) - -- , withArray +import Data.Aeson ( (.:) + , withArray , withObject , Value ) @@ -30,6 +28,7 @@ import qualified Data.ByteString.Lazy.Char8 as BL8 import Data.Functor ( (<&>) ) import Data.Text.Lazy ( Text ) import Data.Thyme.Calendar ( Day ) +import qualified Data.Vector as V ( last ) import Network.HTTP.Req -- import Text.Heredoc ( str ) import Model.Types ( NoMenu(..) @@ -76,23 +75,28 @@ parse day = first (\msg -> NMParseError msg . BL8.pack . show $ x) (action x) menuParser :: [Value] -> Parser [Menu] - menuParser = pure . concatMap f . zip [0..] <=< ap (zipWithM sumFood) tail + menuParser = pure . concatMap f . zip [0..] <=< ap (zipWithM sumFood) tail f :: (Int, Text) -> [Menu] - f = (\case + f = \case (2 ,a) -> [Menu "Kött" a] (6 ,a) -> [Menu "Fisk" a] (10,a) -> [Menu "Veg" a] - _ -> []) + _ -> [] sumFood :: Value -> Value -> Parser Text - sumFood a b = getFood a <> pure " " <> getFood b + sumFood a b = do + a' <- getFood a + b' <- getFood b + pure (a' <> " " <> b') + getFood :: Value -> Parser Text getFood = withObject "Menu Object" $ (.: "children") - >=> pure . last - >=> (.: "text") + >=> \case + [] -> pure mempty + vs -> last vs .: "text" --TODO: replace / with , fetchAndCreateLinsen :: (MonadHttp m, MonadIO m, MonadThrow m) From d9d1f6d45b0e1f0dba22eec6b3662a4b03b53a41 Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 15:02:52 +0200 Subject: [PATCH 04/12] Mjahaja --- src/Model/Linsen.hs | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index e9ea10e..363440c 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -26,11 +26,11 @@ import Data.Aeson.Types ( Parser import Data.Bifunctor ( first ) import qualified Data.ByteString.Lazy.Char8 as BL8 import Data.Functor ( (<&>) ) -import Data.Text.Lazy ( Text ) +import Data.Text.Lazy ( Text + , replace ) import Data.Thyme.Calendar ( Day ) import qualified Data.Vector as V ( last ) import Network.HTTP.Req --- import Text.Heredoc ( str ) import Model.Types ( NoMenu(..) , Menu(..) , Restaurant @@ -75,28 +75,22 @@ parse day = first (\msg -> NMParseError msg . BL8.pack . show $ x) (action x) menuParser :: [Value] -> Parser [Menu] - menuParser = pure . concatMap f . zip [0..] <=< ap (zipWithM sumFood) tail - - f :: (Int, Text) -> [Menu] - f = \case - (2 ,a) -> [Menu "Kött" a] - (6 ,a) -> [Menu "Fisk" a] - (10,a) -> [Menu "Veg" a] - _ -> [] - - sumFood :: Value -> Value -> Parser Text - sumFood a b = do - a' <- getFood a - b' <- getFood b - pure (a' <> " " <> b') + menuParser = pure . (zip [0..] >=> \case + (2 ,vs) -> [vs] + (6 ,vs) -> [vs] + (10,vs) -> [vs] + _ -> []) <=< ap (zipWithM sumFood) tail + sumFood :: Value -> Value -> Parser Menu + sumFood a b = Menu <$> getFood a <*> getFood b getFood :: Value -> Parser Text getFood = withObject "Menu Object" $ (.: "children") >=> \case [] -> pure mempty - vs -> last vs .: "text" --TODO: replace / with , + vs -> last vs .: "text" + <&> replace "/ " ", " --TODO: replace / with , fetchAndCreateLinsen :: (MonadHttp m, MonadIO m, MonadThrow m) From f99f05e954a1dbf2dcf8531e25be2f621dffb77a Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 15:05:50 +0200 Subject: [PATCH 05/12] Return the cabal --- mat-chalmers.cabal | 3 +-- src/Model/Linsen.hs | 6 +----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/mat-chalmers.cabal b/mat-chalmers.cabal index ab7a114..04ef57a 100644 --- a/mat-chalmers.cabal +++ b/mat-chalmers.cabal @@ -20,7 +20,7 @@ data-files: library default-language: Haskell2010 hs-source-dirs: src - ghc-options: + ghc-options: -Wall -Werror -Wunused-binds -Wunused-imports -Wcompat exposed-modules: Model , Model.Types , Model.Karen @@ -53,7 +53,6 @@ library , file-embed >= 0.0.15.0 && < 1.0 , thyme >= 0.4 && <= 0.5 , word8 == 0.1.3 - , vector == 0.13.1.0 executable mat-chalmers main-is: Main.hs diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index 363440c..802c9b2 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -8,18 +8,15 @@ where import Control.Monad ( (>=>) , (<=<) - , foldM , zipWithM , ap ) import Control.Monad.Catch ( MonadThrow ) import Control.Monad.IO.Class ( MonadIO ) import Data.Aeson ( (.:) - , withArray , withObject , Value ) -import Data.Aeson.Key ( fromString ) import Data.Aeson.Types ( Parser , parseEither ) @@ -29,7 +26,6 @@ import Data.Functor ( (<&>) ) import Data.Text.Lazy ( Text , replace ) import Data.Thyme.Calendar ( Day ) -import qualified Data.Vector as V ( last ) import Network.HTTP.Req import Model.Types ( NoMenu(..) , Menu(..) @@ -75,7 +71,7 @@ parse day = first (\msg -> NMParseError msg . BL8.pack . show $ x) (action x) menuParser :: [Value] -> Parser [Menu] - menuParser = pure . (zip [0..] >=> \case + menuParser = pure . (zip [0 :: Integer ..] >=> \case (2 ,vs) -> [vs] (6 ,vs) -> [vs] (10,vs) -> [vs] From f4818cc4e936f93ed6518495108f012b575a899e Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 15:07:20 +0200 Subject: [PATCH 06/12] We have gathered here today --- src/Model/Linsen.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index 802c9b2..c52d14e 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -86,7 +86,7 @@ parse day = >=> \case [] -> pure mempty vs -> last vs .: "text" - <&> replace "/ " ", " --TODO: replace / with , + <&> replace "/ " ", " fetchAndCreateLinsen :: (MonadHttp m, MonadIO m, MonadThrow m) From 30700ea006c3d17f3c67aa5ffa512da945dea9d0 Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 15:36:42 +0200 Subject: [PATCH 07/12] Added test and now strips whitespace --- src/Model/Linsen.hs | 8 +++++--- test/Main.hs | 20 ++++++++++++++++++++ test/linsen.json | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 test/linsen.json diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index c52d14e..d1a0975 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -2,7 +2,8 @@ module Model.Linsen ( - fetchAndCreateLinsen + parse + , fetchAndCreateLinsen ) where @@ -24,7 +25,8 @@ import Data.Bifunctor ( first ) import qualified Data.ByteString.Lazy.Char8 as BL8 import Data.Functor ( (<&>) ) import Data.Text.Lazy ( Text - , replace ) + , replace + , strip ) import Data.Thyme.Calendar ( Day ) import Network.HTTP.Req import Model.Types ( NoMenu(..) @@ -86,7 +88,7 @@ parse day = >=> \case [] -> pure mempty vs -> last vs .: "text" - <&> replace "/ " ", " + <&> strip . replace "/ " ", " fetchAndCreateLinsen :: (MonadHttp m, MonadIO m, MonadThrow m) diff --git a/test/Main.hs b/test/Main.hs index a788386..72f464f 100644 --- a/test/Main.hs +++ b/test/Main.hs @@ -5,6 +5,7 @@ import Data.Aeson ( decode ) import Data.Maybe ( fromJust ) import Data.Thyme.Time.Core ( fromGregorian ) import Model.Karen ( parse ) +import qualified Model.Linsen as L ( parse ) import Model.Types ( Menu(..) , NoMenu ) @@ -48,6 +49,25 @@ main = hspec $ do ) ) + describe "Cafe Linsen" $ it + "parses a blob of JSON without error" + (do + s1 <- BL.readFile "test/linsen.json" + testFun + [ Menu + (T.pack "Natt Överbakad Högrev.") + (T.pack "Rotfrukter, Timjansky, Persilja, Pommes Chateau.") + , Menu + (T.pack "Stekt Fisk.") + (T.pack "Remouladsås, Citron, Dill, Picklade Morötter, Rostad Potatis.") + , Menu + (T.pack "Chana Masala.") + (T.pack "Kikärtor, Grönsaker, Potatis Pakora, Nannbröd, Ris") + ] (L.parse + (fromGregorian 2024 05 31) + (fromJust $ decode s1)) + ) + describe "The Wijkander's" $ it "Parses two blobs of HTML correctly on fridays" $ do diff --git a/test/linsen.json b/test/linsen.json new file mode 100644 index 0000000..c5d269b --- /dev/null +++ b/test/linsen.json @@ -0,0 +1 @@ +{"docs":[{"id":"6622a60540a21ce1eea7aa6e","title":"Tårtor","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Frukttårta 8, 12 & 18 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Princesstårta 8, 12 & 18 bitar","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":" Gräddfrukttårta 8, 12 & 18 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"White lady 8, 12 & 18 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Schwarzwald 8 & 12 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Chokladtårta 8 & 12 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Moccatårta 8 & 12 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Passionsmousse 8 & 12 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Chokladtryffeltårta 8 bitar","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"Jordgubbsmoussetårta 12 bitar","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"Italiensk hallonmaräng 12 bitar","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"Cheesecake moussetårta 12 bitar 47:-/bit","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Cheesecake moussetårta 6 bitar","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":" Italiensk hallonmaräng 6 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Prinstårta (gluten, laktos, nöt och mandelfri) 10 bitar 49:-/bit","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Trippelchoklad moussetårta 6 bitar Jordgubbsmoussetårta 6 bitar 52:-/bit","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"cake-menu","createdAt":"2024-04-19T17:12:37.508Z","updatedAt":"2024-04-20T10:07:40.733Z","richText_html":"

Frukttårta 8, 12 & 18 bitar

Princesstårta 8, 12 & 18 bitar

Gräddfrukttårta 8, 12 & 18 bitar

White lady 8, 12 & 18 bitar

Schwarzwald 8 & 12 bitar

Chokladtårta 8 & 12 bitar

Moccatårta 8 & 12 bitar

Passionsmousse 8 & 12 bitar

Chokladtryffeltårta 8 bitar

Jordgubbsmoussetårta 12 bitar

Italiensk hallonmaräng 12 bitar Cheesecake moussetårta 12 bitar 47:-/bit

Cheesecake moussetårta 6 bitar

Italiensk hallonmaräng 6 bitar

Prinstårta (gluten, laktos, nöt och mandelfri) 10 bitar 49:-/bit

Trippelchoklad moussetårta 6 bitar Jordgubbsmoussetårta 6 bitar 52:-/bit

"},{"id":"6622a51440a21ce1eea7a998","title":"Fredag","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Meny. V 22","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"31-05-2024","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"type":"linebreak","version":1},{"detail":0,"format":1,"mode":"normal","style":"","text":"Natt Överbakad Högrev. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Rotfrukter/ Timjansky/ Persilja/ Pommes Chateau.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Night Overbaked Hörev. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Root vegetables/ Thyme/ Parsley/ Pommes Chateau.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Stekt Fisk.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Remouladsås/ Citron/ Dill/ Picklade Morötter/ Rostad Potatis.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Fried fish.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Remoulade sauce/ Lemon/ Dill/ Pickled carrots/ Roasted potatoes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Chana Masala.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Kikärtor/ Grönsaker/ Potatis Pakora/ Nannbröd/ Ris ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Chana Masala. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Chickpeas/ Vegetables/ Potato Pakora/ Naan Bread/ Rice","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Caesarsallad med kyckling och bacon/räkor","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":2,"mode":"normal","style":"","text":"Caesar salad with chicken and bacon/shrimp","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Wokade nudlar med kyckling/tofu","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" Stir-fried noodles with chicken/tofu","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"95:-/90:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"En tallrik med sallad","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" A plate of salad","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"70:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"friday-menu","createdAt":"2024-04-19T17:08:36.895Z","updatedAt":"2024-05-28T13:54:45.355Z","richText_html":"

Meny. V 22

31-05-2024


Natt Överbakad Högrev.

Rotfrukter/ Timjansky/ Persilja/ Pommes Chateau.

Night Overbaked Hörev.

Root vegetables/ Thyme/ Parsley/ Pommes Chateau.

Stekt Fisk.

Remouladsås/ Citron/ Dill/ Picklade Morötter/ Rostad Potatis.

Fried fish.

Remoulade sauce/ Lemon/ Dill/ Pickled carrots/ Roasted potatoes.

Chana Masala.

Kikärtor/ Grönsaker/ Potatis Pakora/ Nannbröd/ Ris

Chana Masala.

Chickpeas/ Vegetables/ Potato Pakora/ Naan Bread/ Rice

115:-/105:-

Caesarsallad med kyckling och bacon/räkor 

Caesar salad with chicken and bacon/shrimp 115:-/105:-

Wokade nudlar med kyckling/tofu Stir-fried noodles with chicken/tofu 95:-/90:-

En tallrik med sallad A plate of salad 70:-

"},{"id":"6622a50540a21ce1eea7a966","title":"Torsdag","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Meny. V22","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"30-05-2024","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Högrevsburgare.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Lökringar/ Inlagd Gurka/ Rostad Lök/ Feferoni Kräm/ Pommes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Beef burger.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Onion Rings/ Pickled Cucumber/ Roasted Onion/ Pepperoni Cream/ French Fries.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Italiensk Fisksoppa.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Räkor/ Tomater/ Vit vin/ Timjan/ Vitlökskrutonger.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Italian Fish Soup.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Prawns/ Tomatoes/ White wine/ Thyme/ Garlic croutons.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Tofu Burgare.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Lökringar/ Inlagd Gurka/ Rostad Lök/ Feferoni Kräm/ Pommes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Tofu Burger.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Onion Rings/ Pickled Cucumber/ Roasted Onion/ Pepperoni Cream/ French Fries.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Caesarsallad med kyckling och bacon/räkor","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":2,"mode":"normal","style":"","text":"Caesar salad with chicken and bacon/shrimp","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Wokade nudlar med kyckling/tofu","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" Stir-fried noodles with chicken/tofu","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"95:-/90:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"En tallrik med sallad","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" A plate of salad","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"70:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"thursday-menu","createdAt":"2024-04-19T17:08:21.777Z","updatedAt":"2024-05-24T13:15:59.352Z","richText_html":"

Meny. V22

30-05-2024

Högrevsburgare.

Lökringar/ Inlagd Gurka/ Rostad Lök/ Feferoni Kräm/ Pommes.

Beef burger.

Onion Rings/ Pickled Cucumber/ Roasted Onion/ Pepperoni Cream/ French Fries.

Italiensk Fisksoppa.

Räkor/ Tomater/ Vit vin/ Timjan/ Vitlökskrutonger.

Italian Fish Soup.

Prawns/ Tomatoes/ White wine/ Thyme/ Garlic croutons.

Tofu Burgare.

Lökringar/ Inlagd Gurka/ Rostad Lök/ Feferoni Kräm/ Pommes.

Tofu Burger.

Onion Rings/ Pickled Cucumber/ Roasted Onion/ Pepperoni Cream/ French Fries.

115:-/105:-

Caesarsallad med kyckling och bacon/räkor 

Caesar salad with chicken and bacon/shrimp 115:-/105:-

Wokade nudlar med kyckling/tofu Stir-fried noodles with chicken/tofu 95:-/90:-

En tallrik med sallad A plate of salad 70:-

"},{"id":"6622a4f140a21ce1eea7a92d","title":"Onsdag","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":" V.22","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"29-05-2024","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Kalops.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Rödbetor/ Saltgurka/ Persilja/ Kokt Potatis.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Swedish Beef Stew.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Beetroot/ Pickled cucumber/ Parsley/ Boiled potatoes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Paella.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Fisk/ Räkor/ Musslor/ Gröna Ärtor/ Saffran. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Paella.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Fish/ Prawns/ Mussels/ Green Peas/ Saffron.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Bönbiffar.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Currysås/ Broccoli/ Vårlök/ Ris.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Bean patties.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Curry sauce/ Broccoli/ Spring onions/ Rice.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Caesarsallad med kyckling och bacon/räkor","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":"Caesar salad with chicken and bacon/shrimp","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Wokade nudlar med kyckling/tofu","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" Stir-fried noodles with chicken/tofu","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"95:-/90:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"En tallrik med sallad","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" A plate of salad","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"70:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"wednesday-menu","createdAt":"2024-04-19T17:08:01.045Z","updatedAt":"2024-05-24T13:09:36.997Z","richText_html":"

 V.22

29-05-2024

Kalops.

Rödbetor/ Saltgurka/ Persilja/ Kokt Potatis.

Swedish Beef Stew.

Beetroot/ Pickled cucumber/ Parsley/ Boiled potatoes.

Paella.

Fisk/ Räkor/ Musslor/ Gröna Ärtor/ Saffran.

Paella.

Fish/ Prawns/ Mussels/ Green Peas/ Saffron.

Bönbiffar.

Currysås/ Broccoli/ Vårlök/ Ris.

Bean patties.

Curry sauce/ Broccoli/ Spring onions/ Rice.

115:-/105:-

Caesarsallad med kyckling och bacon/räkor  Caesar salad with chicken and bacon/shrimp 115:-/105:-

Wokade nudlar med kyckling/tofu Stir-fried noodles with chicken/tofu 95:-/90:-

En tallrik med sallad A plate of salad 70:-

"},{"id":"6622a4dd40a21ce1eea7a8fa","title":"Tisdag","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Meny V. 22","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"28-05-2024 ","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Raggmunk & Stekt Fläsk.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Lingon/ Persilja.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Raggmunk & Fried Pork.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Lingonberry/ Parsley.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Pocherad Dagens Fångst.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Bryntsmör/ Friterade Kapris/ Kpris/ Rödbetor/ Blomkålpure.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Poached Catch of the Day. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Clarified butter/ Fried capers/ Capers/ Beetroot/ Cauliflower puree.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Pasta Arrabiata.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Het Tomatsås/ Sojafärs/ Svamp/ Kantareller/ Grana Padano/ Basilika.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Pasta Arrabiata.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Hot Tomato Sauce/ Minced Soy/ Mushrooms/ Chanterelles/ Grana Padano/ Basil.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Caesarsallad med kyckling och bacon/räkor","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":"Caesar salad with chicken and bacon/shrimp","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Wokade nudlar med kyckling/tofu","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" Stir-fried noodles with chicken/tofu ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"95:-/90:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"En tallrik med sallad","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" A plate of salad","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"70:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"tuesday-menu","createdAt":"2024-04-19T17:07:41.594Z","updatedAt":"2024-05-27T14:33:59.712Z","richText_html":"

Meny V. 22

28-05-2024 

Raggmunk & Stekt Fläsk.

Lingon/ Persilja.

Raggmunk & Fried Pork.

Lingonberry/ Parsley.

Pocherad Dagens Fångst.

Bryntsmör/ Friterade Kapris/ Kpris/ Rödbetor/ Blomkålpure.

Poached Catch of the Day.

Clarified butter/ Fried capers/ Capers/ Beetroot/ Cauliflower puree.

Pasta Arrabiata.

Het Tomatsås/ Sojafärs/ Svamp/ Kantareller/ Grana Padano/ Basilika.

Pasta Arrabiata.

Hot Tomato Sauce/ Minced Soy/ Mushrooms/ Chanterelles/ Grana Padano/ Basil.

115:-/105:-

Caesarsallad med kyckling och bacon/räkor Caesar salad with chicken and bacon/shrimp 115:-/105:-

Wokade nudlar med kyckling/tofu Stir-fried noodles with chicken/tofu 95:-/90:-

En tallrik med sallad A plate of salad 70:-

"},{"id":"6622a4b440a21ce1eea7a8c4","title":"Monday","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Meny V.22","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"27-05-2024","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Kalv Wallenbergare.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Gröna Ärtor/ Skirat Smör/ Lingon/ Potatis Pure.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Calf Wallenberger.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Green Peas/ Clarified Butter/ Lingonberry/ Potato Puree.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Halstrad Dagens Fångst.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Dillmajo/ Pakchoi/ Ärtskott/ Lökstekta Potatis.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Grilled Catch of the Day.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Dill Mayo/ Pakchoi/ Pea Shoots/ Onion Fried Potatoes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Baingan Masala.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Aubergine/ Paprika/ Svamp/ Raita/ Naanbröd/ Ris.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Baingan Masala. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Eggplant/ Paprika/ Mushroom/ Raita/ Naan bread/ Rice.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Caesarsallad med kyckling och bacon/räkor","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":"Caesar salad with chicken and bacon/shrimp","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Wokade nudlar med kyckling/tofu","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" Stir-fried noodles with chicken/tofu ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"95:-/90:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"En tallrik med sallad","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" A plate of salad","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"70:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"monday-menu","createdAt":"2024-04-19T17:07:00.008Z","updatedAt":"2024-05-27T08:49:31.008Z","richText_html":"

Meny V.22

27-05-2024

Kalv Wallenbergare.

Gröna Ärtor/ Skirat Smör/ Lingon/ Potatis Pure.

Calf Wallenberger.

Green Peas/ Clarified Butter/ Lingonberry/ Potato Puree.

Halstrad Dagens Fångst.

Dillmajo/ Pakchoi/ Ärtskott/ Lökstekta Potatis.

Grilled Catch of the Day.

Dill Mayo/ Pakchoi/ Pea Shoots/ Onion Fried Potatoes.

Baingan Masala.

Aubergine/ Paprika/ Svamp/ Raita/ Naanbröd/ Ris.

Baingan Masala.

Eggplant/ Paprika/ Mushroom/ Raita/ Naan bread/ Rice.

115:-/105:-

Caesarsallad med kyckling och bacon/räkor Caesar salad with chicken and bacon/shrimp 115:-/105:-

Wokade nudlar med kyckling/tofu Stir-fried noodles with chicken/tofu 95:-/90:-

En tallrik med sallad A plate of salad 70:-

"}],"totalDocs":6,"limit":10,"totalPages":1,"page":1,"pagingCounter":1,"hasPrevPage":false,"hasNextPage":false,"prevPage":null,"nextPage":null} \ No newline at end of file From 6bfd82e08bb9e53a72e13822caac74ba0c5f11f0 Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 22:12:54 +0200 Subject: [PATCH 08/12] Based on some comments of Ekeroot --- src/Model/Linsen.hs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index d1a0975..3f71a60 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -28,6 +28,7 @@ import Data.Text.Lazy ( Text , replace , strip ) import Data.Thyme.Calendar ( Day ) +import Lens.Micro.Platform ( (^.) ) import Network.HTTP.Req import Model.Types ( NoMenu(..) , Menu(..) @@ -36,7 +37,8 @@ import Model.Types ( NoMenu(..) ) ) import Util ( menusToEitherNoLunch ) -import Data.Thyme.Calendar.WeekDate ( toWeekDate ) +import Data.Thyme.Calendar.WeekDate ( weekDate + , _wdDay) fetch :: (MonadHttp m, MonadIO m, MonadThrow m) @@ -59,7 +61,7 @@ parse day = (parseEither ( withObject "Parse meals" $ (.: "docs") - >=> (pure . (!! (6 - (\(_,_,a) -> a) (toWeekDate day)))) + >=> (pure . (!! (6 - (day ^. weekDate . _wdDay)))) >=> (.: "richText") >=> (.: "root") >=> (.: "children") @@ -74,9 +76,9 @@ parse day = menuParser :: [Value] -> Parser [Menu] menuParser = pure . (zip [0 :: Integer ..] >=> \case - (2 ,vs) -> [vs] - (6 ,vs) -> [vs] - (10,vs) -> [vs] + (2 ,vs) -> [vs] -- Index of Meat dish + (6 ,vs) -> [vs] -- Index of Fish dish + (10,vs) -> [vs] -- Index of Veg dish _ -> []) <=< ap (zipWithM sumFood) tail sumFood :: Value -> Value -> Parser Menu @@ -87,8 +89,8 @@ parse day = $ (.: "children") >=> \case [] -> pure mempty - vs -> last vs .: "text" - <&> strip . replace "/ " ", " + vs -> strip . replace "/ " ", " + <$> last vs .: "text" fetchAndCreateLinsen :: (MonadHttp m, MonadIO m, MonadThrow m) From 5b4e3c75ed9512e4c9e2792790bfeb3fc1fb08fc Mon Sep 17 00:00:00 2001 From: pingu Date: Thu, 30 May 2024 22:38:51 +0200 Subject: [PATCH 09/12] In case the index of food doesn't work --- mat-chalmers.cabal | 1 + src/Model/Linsen.hs | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mat-chalmers.cabal b/mat-chalmers.cabal index 04ef57a..f60e142 100644 --- a/mat-chalmers.cabal +++ b/mat-chalmers.cabal @@ -53,6 +53,7 @@ library , file-embed >= 0.0.15.0 && < 1.0 , thyme >= 0.4 && <= 0.5 , word8 == 0.1.3 + , extra >= 1.7.10 && <= 1.8 executable mat-chalmers main-is: Main.hs diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index 3f71a60..ef560e4 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -24,6 +24,7 @@ import Data.Aeson.Types ( Parser import Data.Bifunctor ( first ) import qualified Data.ByteString.Lazy.Char8 as BL8 import Data.Functor ( (<&>) ) +import Data.List.Extra ( (!?) ) import Data.Text.Lazy ( Text , replace , strip ) @@ -61,7 +62,9 @@ parse day = (parseEither ( withObject "Parse meals" $ (.: "docs") - >=> (pure . (!! (6 - (day ^. weekDate . _wdDay)))) + >=> ((!? (6 - (day ^. weekDate . _wdDay))) <&> \case + Nothing -> fail "Day doesnt exist" + Just v -> pure v) >=> (.: "richText") >=> (.: "root") >=> (.: "children") From b6fa09ebc8963b154a24f7c180cd0371a0fdf11f Mon Sep 17 00:00:00 2001 From: pingu Date: Sat, 1 Jun 2024 21:21:04 +0200 Subject: [PATCH 10/12] Fix one issue --- src/Model/Linsen.hs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index ef560e4..f862b02 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -63,11 +63,12 @@ parse day = ( withObject "Parse meals" $ (.: "docs") >=> ((!? (6 - (day ^. weekDate . _wdDay))) <&> \case - Nothing -> fail "Day doesnt exist" + Nothing -> fail "Day doesnt exist" -- TODO: Should early return to shortcircuit to [] Just v -> pure v) >=> (.: "richText") >=> (.: "root") >=> (.: "children") + >=> pure . (\v -> if length v >= 9 then v else mempty) >=> menuParser ) ) @@ -82,7 +83,8 @@ parse day = (2 ,vs) -> [vs] -- Index of Meat dish (6 ,vs) -> [vs] -- Index of Fish dish (10,vs) -> [vs] -- Index of Veg dish - _ -> []) <=< ap (zipWithM sumFood) tail + _ -> []) + <=< ap (zipWithM sumFood) tail sumFood :: Value -> Value -> Parser Menu sumFood a b = Menu <$> getFood a <*> getFood b From 92d28ab6655bd2246243459f4430c1c225bde297 Mon Sep 17 00:00:00 2001 From: pingu Date: Mon, 3 Jun 2024 14:49:14 +0200 Subject: [PATCH 11/12] Now shouldn't produce errors --- src/Model/Linsen.hs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Model/Linsen.hs b/src/Model/Linsen.hs index f862b02..f41129f 100644 --- a/src/Model/Linsen.hs +++ b/src/Model/Linsen.hs @@ -60,16 +60,19 @@ parse parse day = failWithNoMenu (parseEither - ( withObject "Parse meals" - $ (.: "docs") - >=> ((!? (6 - (day ^. weekDate . _wdDay))) <&> \case - Nothing -> fail "Day doesnt exist" -- TODO: Should early return to shortcircuit to [] - Just v -> pure v) - >=> (.: "richText") - >=> (.: "root") - >=> (.: "children") - >=> pure . (\v -> if length v >= 9 then v else mempty) - >=> menuParser + (let index = 6 - day ^. weekDate . _wdDay in + if index `notElem` [1..5] then + pure . const [] + else + withObject "Parse meals" + $ (.: "docs") + >=> (\case + Nothing -> fail "Failed to index into days" + Just v -> pure v) . (!? index) + >=> (.: "richText") + >=> (.: "root") + >=> (.: "children") + >=> menuParser . (\v' -> if length v' >= 9 then v' else mempty) ) ) >=> menusToEitherNoLunch From 8feb0a9aa5b313ef5f79bc7aba8c7f3095c6f79c Mon Sep 17 00:00:00 2001 From: pingu Date: Mon, 3 Jun 2024 15:08:48 +0200 Subject: [PATCH 12/12] More tests --- src/Model/Types.hs | 2 +- test/Main.hs | 42 +++++++++++++++++++----------- test/{linsen.json => linsen1.json} | 0 test/linsen2.json | 1 + 4 files changed, 29 insertions(+), 16 deletions(-) rename test/{linsen.json => linsen1.json} (100%) create mode 100644 test/linsen2.json diff --git a/src/Model/Types.hs b/src/Model/Types.hs index f1e0ab3..e145f07 100644 --- a/src/Model/Types.hs +++ b/src/Model/Types.hs @@ -24,7 +24,7 @@ data Restaurant = Restaurant data NoMenu = NoLunch | NMParseError String ByteString -- ^ The parse error. The string we tried to parse. - deriving (Show) + deriving (Eq, Show) -- | Menu of a restaurant. -- Title, Body text diff --git a/test/Main.hs b/test/Main.hs index 72f464f..5a4eebb 100644 --- a/test/Main.hs +++ b/test/Main.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE LambdaCase #-} import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Lazy.Char8 as BL8 import qualified Data.Text.Lazy as T @@ -7,7 +8,7 @@ import Data.Thyme.Time.Core ( fromGregorian ) import Model.Karen ( parse ) import qualified Model.Linsen as L ( parse ) import Model.Types ( Menu(..) - , NoMenu + , NoMenu( NoLunch ) ) import Model.Wijkanders ( getWijkanders , hasDate @@ -20,10 +21,16 @@ import Test.HUnit ( (@?=) , assertFailure ) -testFun :: [Menu] -> Either NoMenu [Menu] -> IO () -testFun expected = either - (assertFailure . mappend "This is not expected, input was:\n" . show) - (@?= expected) +testFun :: Either NoMenu [Menu] -> Either NoMenu [Menu] -> IO () +testFun = \case + Right e -> + either + (assertFailure . mappend "This is not expected, input was:\n" . show) + (@?= e) + Left e -> + either + (@?= e) + (assertFailure . mappend "This is not expected, input was:\n" . show) main :: IO () main = hspec $ do @@ -32,7 +39,7 @@ main = hspec $ do describe "The Karen Express" $ it "parses a blob of JSON without error" ( testFun - [ Menu + (Right [ Menu (T.pack "Street food") (T.pack "Chicken africana, banan, mango raja, ris") , Menu @@ -41,7 +48,7 @@ main = hspec $ do , Menu (T.pack "Nordic") (T.pack "F\228rskost bakad sej, vitvinss\229s, broccoli, potatis") - ] + ]) $ parse "Swedish" (fromJust . decode $ BL8.pack @@ -50,11 +57,11 @@ main = hspec $ do ) describe "Cafe Linsen" $ it - "parses a blob of JSON without error" + "parses two blob of JSON without error" (do - s1 <- BL.readFile "test/linsen.json" + s1 <- BL.readFile "test/linsen1.json" testFun - [ Menu + (Right [ Menu (T.pack "Natt Överbakad Högrev.") (T.pack "Rotfrukter, Timjansky, Persilja, Pommes Chateau.") , Menu @@ -63,9 +70,14 @@ main = hspec $ do , Menu (T.pack "Chana Masala.") (T.pack "Kikärtor, Grönsaker, Potatis Pakora, Nannbröd, Ris") - ] (L.parse + ]) (L.parse (fromGregorian 2024 05 31) (fromJust $ decode s1)) + s2 <- BL.readFile "test/linsen2.json" -- Test that has no lunch + testFun (Left NoLunch) + (L.parse + (fromGregorian 2024 06 06) + (fromJust $ decode s2)) ) describe "The Wijkander's" @@ -73,7 +85,7 @@ main = hspec $ do $ do s1 <- BL.readFile "test/190517 wijkanders.html" testFun - [ Menu + (Right [ Menu (T.pack "Fisk") (T.pack "Havets Wallenbergare, kallpressad rapsolja, ärtor, dill & potatismos" @@ -83,11 +95,11 @@ main = hspec $ do (T.pack "Helstekt kotlettred, potatisgratäng, skysås & örtbakad tomat" ) - ] + ]) (getWijkanders (fromGregorian 2019 05 17) s1) s2 <- BL.readFile "test/190913 wijkanders.html" testFun - [ Menu + (Right [ Menu (T.pack "Vegetarisk ") (T.pack "Pasta, svamp, grädde, citron, grana padano & rotfruktschips" @@ -100,5 +112,5 @@ main = hspec $ do (T.pack "Helstekt kotlettrad, rostad potatis, svampsås & inlagd gurka" ) - ] + ]) (getWijkanders (fromGregorian 2019 09 13) s2) diff --git a/test/linsen.json b/test/linsen1.json similarity index 100% rename from test/linsen.json rename to test/linsen1.json diff --git a/test/linsen2.json b/test/linsen2.json new file mode 100644 index 0000000..d74293d --- /dev/null +++ b/test/linsen2.json @@ -0,0 +1 @@ +{"docs":[{"id":"6622a60540a21ce1eea7aa6e","title":"Tårtor","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Frukttårta 8, 12 & 18 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Princesstårta 8, 12 & 18 bitar","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":" Gräddfrukttårta 8, 12 & 18 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"White lady 8, 12 & 18 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Schwarzwald 8 & 12 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Chokladtårta 8 & 12 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Moccatårta 8 & 12 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Passionsmousse 8 & 12 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Chokladtryffeltårta 8 bitar","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"Jordgubbsmoussetårta 12 bitar","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"Italiensk hallonmaräng 12 bitar","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"Cheesecake moussetårta 12 bitar 47:-/bit","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Cheesecake moussetårta 6 bitar","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":" Italiensk hallonmaräng 6 bitar ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Prinstårta (gluten, laktos, nöt och mandelfri) 10 bitar 49:-/bit","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Trippelchoklad moussetårta 6 bitar Jordgubbsmoussetårta 6 bitar 52:-/bit","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"cake-menu","createdAt":"2024-04-19T17:12:37.508Z","updatedAt":"2024-04-20T10:07:40.733Z","richText_html":"

Frukttårta 8, 12 & 18 bitar

Princesstårta 8, 12 & 18 bitar

Gräddfrukttårta 8, 12 & 18 bitar

White lady 8, 12 & 18 bitar

Schwarzwald 8 & 12 bitar

Chokladtårta 8 & 12 bitar

Moccatårta 8 & 12 bitar

Passionsmousse 8 & 12 bitar

Chokladtryffeltårta 8 bitar

Jordgubbsmoussetårta 12 bitar

Italiensk hallonmaräng 12 bitar Cheesecake moussetårta 12 bitar 47:-/bit

Cheesecake moussetårta 6 bitar

Italiensk hallonmaräng 6 bitar

Prinstårta (gluten, laktos, nöt och mandelfri) 10 bitar 49:-/bit

Trippelchoklad moussetårta 6 bitar Jordgubbsmoussetårta 6 bitar 52:-/bit

"},{"id":"6622a51440a21ce1eea7a998","title":"Fredag","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Meny. V 23","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"07-06-2024","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"type":"linebreak","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Restaurang Stängd!","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Restaurant Closed!","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"friday-menu","createdAt":"2024-04-19T17:08:36.895Z","updatedAt":"2024-05-31T14:13:18.330Z","richText_html":"

Meny. V 23

07-06-2024


Restaurang Stängd!

Restaurant Closed!

"},{"id":"6622a50540a21ce1eea7a966","title":"Torsdag","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Meny. V23","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"06-06-2024","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Restaurang Stängd!","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Restaurant Closed!","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"thursday-menu","createdAt":"2024-04-19T17:08:21.777Z","updatedAt":"2024-05-31T14:12:26.760Z","richText_html":"

Meny. V23

06-06-2024

Restaurang Stängd!

Restaurant Closed!

"},{"id":"6622a4f140a21ce1eea7a92d","title":"Onsdag","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":" V.23","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"05-06-2024","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Grillad Kycklingfile.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Kimchi/ Gochujang majo/ Pommes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Grilled Chicken Fillet","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":". ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Kimchi/ Gochujang Mayo/ Fries.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Halstrad Dagens Fångst.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Skagensås/ Broccoli/ Citron/ Dill/ Rostad Potatis.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Grilled Catch of the Day.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Skagen sauce/ Broccoli/ Lemon/ Dill/ Roasted potatoes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Dagens Pasta.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Ostsås/ Kantareller/ Baby Spenat/ Soltorkade tomater/ Grillad Grönsaker/ Grana Padano.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Today's Pasta. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Cheese sauce/ Chanterelles/ Baby spinach/ Sun-dried tomatoes/ Grilled vegetables/ Grana Padano.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Caesarsallad med kyckling och bacon/räkor","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":"Caesar salad with chicken and bacon/shrimp","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Wokade nudlar med kyckling/tofu","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" Stir-fried noodles with chicken/tofu","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"95:-/90:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"En tallrik med sallad","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" A plate of salad","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"70:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"wednesday-menu","createdAt":"2024-04-19T17:08:01.045Z","updatedAt":"2024-05-31T14:11:14.474Z","richText_html":"

 V.23

05-06-2024

Grillad Kycklingfile.

Kimchi/ Gochujang majo/ Pommes.

Grilled Chicken Fillet.

Kimchi/ Gochujang Mayo/ Fries.

Halstrad Dagens Fångst.

Skagensås/ Broccoli/ Citron/ Dill/ Rostad Potatis.

Grilled Catch of the Day.

Skagen sauce/ Broccoli/ Lemon/ Dill/ Roasted potatoes.

Dagens Pasta.

Ostsås/ Kantareller/ Baby Spenat/ Soltorkade tomater/ Grillad Grönsaker/ Grana Padano.

Today's Pasta.

Cheese sauce/ Chanterelles/ Baby spinach/ Sun-dried tomatoes/ Grilled vegetables/ Grana Padano.

115:-/105:-

Caesarsallad med kyckling och bacon/räkor  Caesar salad with chicken and bacon/shrimp 115:-/105:-

Wokade nudlar med kyckling/tofu Stir-fried noodles with chicken/tofu 95:-/90:-

En tallrik med sallad A plate of salad 70:-

"},{"id":"6622a4dd40a21ce1eea7a8fa","title":"Tisdag","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Meny V. 23","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"04-06-2024 ","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Fläsk Schnitzel.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Gröna Ärtor/ Kaprissky/ Citron/ Persilja/ Stekt Potatis.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Pork schnitzel. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Green Peas/ Capers/ Lemon/ Parsley/ Fried Potatoes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Vin Pocherad Fisk.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Räkor/ Pepparrot/ Ägg/ Dill/ Sandefjordsås/ Potatis Pure.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Wine Poached Fish.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Shrimp/ Horseradish/ Egg/ Dill/ Sandefjord sauce/ Potato puree.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Arancini. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Risottoris/ Brie/ Tomatsås/ Ruccola/ Rostad Frön/ Basilika/ Grana Padano.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Arancini. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Risotto rice/ Brie/ Tomato sauce/ Arugula/ Roasted seeds/ Basil/ Grana Padano.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Caesarsallad med kyckling och bacon/räkor","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":"Caesar salad with chicken and bacon/shrimp","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Wokade nudlar med kyckling/tofu","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" Stir-fried noodles with chicken/tofu ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"95:-/90:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"En tallrik med sallad","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" A plate of salad","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"70:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"tuesday-menu","createdAt":"2024-04-19T17:07:41.594Z","updatedAt":"2024-05-31T14:02:23.799Z","richText_html":"

Meny V. 23

04-06-2024 

Fläsk Schnitzel.

Gröna Ärtor/ Kaprissky/ Citron/ Persilja/ Stekt Potatis.

Pork schnitzel.

Green Peas/ Capers/ Lemon/ Parsley/ Fried Potatoes.

Vin Pocherad Fisk.

Räkor/ Pepparrot/ Ägg/ Dill/ Sandefjordsås/ Potatis Pure.

Wine Poached Fish.

Shrimp/ Horseradish/ Egg/ Dill/ Sandefjord sauce/ Potato puree.

Arancini.

Risottoris/ Brie/ Tomatsås/ Ruccola/ Rostad Frön/ Basilika/ Grana Padano.

Arancini.

Risotto rice/ Brie/ Tomato sauce/ Arugula/ Roasted seeds/ Basil/ Grana Padano.

115:-/105:-

Caesarsallad med kyckling och bacon/räkor Caesar salad with chicken and bacon/shrimp 115:-/105:-

Wokade nudlar med kyckling/tofu Stir-fried noodles with chicken/tofu 95:-/90:-

En tallrik med sallad A plate of salad 70:-

"},{"id":"6622a4b440a21ce1eea7a8c4","title":"Monday","richText":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Meny V.23","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"03-06-2024","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Nötfärsbiffar.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Skogssvampsås/ Svartvinbärsgele/ Pressgurka/ Potatis Mos.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Ground beef patties. ","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Forest mushroom sauce/ Blackcurrant jelly/ Pressed cucumber/ Mashed potatoes.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Stekt Makrill.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Gräddstuvad Spenat/ Bakad Tomat/ Kokt Potatis.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Fried Mackerel.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Cream stewed Spinach/ Baked Tomato/ Boiled Potato.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Palak Paneer.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Spenat/ Ost/ Chili/ Svamp/ Raita/ Pickel/ Ris.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":1,"mode":"normal","style":"","text":"Palak Paneer.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Spinach/ Cheese/ Chili/ Mushroom/ Raita/ Pickle/ Rice.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Caesarsallad med kyckling och bacon/räkor","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":"Caesar salad with chicken and bacon/shrimp","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"115:-/105:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"Wokade nudlar med kyckling/tofu","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" Stir-fried noodles with chicken/tofu ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"95:-/90:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":3,"mode":"normal","style":"","text":"En tallrik med sallad","type":"text","version":1},{"detail":0,"format":2,"mode":"normal","style":"","text":" A plate of salad","type":"text","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":" ","type":"text","version":1},{"detail":0,"format":3,"mode":"normal","style":"","text":"70:-","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr"}},"slug":"monday-menu","createdAt":"2024-04-19T17:07:00.008Z","updatedAt":"2024-05-31T14:16:38.391Z","richText_html":"

Meny V.23

03-06-2024

Nötfärsbiffar.

Skogssvampsås/ Svartvinbärsgele/ Pressgurka/ Potatis Mos.

Ground beef patties.

Forest mushroom sauce/ Blackcurrant jelly/ Pressed cucumber/ Mashed potatoes.

Stekt Makrill.

Gräddstuvad Spenat/ Bakad Tomat/ Kokt Potatis.

Fried Mackerel.

Cream stewed Spinach/ Baked Tomato/ Boiled Potato.

Palak Paneer.

Spenat/ Ost/ Chili/ Svamp/ Raita/ Pickel/ Ris.

Palak Paneer.

Spinach/ Cheese/ Chili/ Mushroom/ Raita/ Pickle/ Rice.

115:-/105:-

Caesarsallad med kyckling och bacon/räkor Caesar salad with chicken and bacon/shrimp 115:-/105:-

Wokade nudlar med kyckling/tofu Stir-fried noodles with chicken/tofu 95:-/90:-

En tallrik med sallad A plate of salad 70:-

"}],"totalDocs":6,"limit":10,"totalPages":1,"page":1,"pagingCounter":1,"hasPrevPage":false,"hasNextPage":false,"prevPage":null,"nextPage":null} \ No newline at end of file