{-# LANGUAGE OverloadedLists #-} module Worksheets.Writing.RosettaSpec where import Data.GenValidity.Map () import Data.GenValidity.Sequence () import Data.GenValidity.Set () import Data.GenValidity.Text () import Data.List qualified as List import Data.Text qualified as Text import Data.Validity.Map () import Data.Validity.Set () import Data.Validity.Text () import System.FilePath (joinPath, pathSeparator, (<.>), ()) import Test.Syd import Language.Chinese qualified as Chinese import Utils.Prelude import Worksheets.Writing.Rosetta runRosetta :: String -> Rosetta -> TestDefM (Chinese.ChineseDict : outers) () () runRosetta title rose = do descrPath <- getTestDescriptionPath let dirPath = List.reverse descrPath <&> Text.unpack . Text.replace (Text.pack ".") (Text.singleton pathSeparator) & joinPath let outPath = "tests" dirPath title "rosetta" <.> "html" itWithOuter title \dict -> do goldenByteStringBuilderFile outPath $ rosettaHTML dict (Text.pack title) rose spec :: HasCallStack => Spec spec = aroundAll readDict do -- runRosetta "Avion" avion -- runRosetta "Bateau" bateau -- runRosetta "Chocolat" chocolat -- runRosetta "Pistache" pistache -- runRosetta "Egg" egg -- runRosetta "Pluie" pluie -- runRosetta "TarteAuxPommes" tarteAuxPommesDanniversaire -- runRosetta "ChatChevalVélo" chatChevalVélo -- runRosetta "chevauxDormirDebout" chevauxDormirDebout runRosetta "ponies" ponies runRosetta "poniesRaces1" poniesRaces1 runRosetta "poniesRaces2" poniesRaces2 runRosetta "Culicoides" culicoides runRosetta "Fraise" fraise runRosetta "poupéeArielle" poupéeArielle runRosetta "poupéeBella" poupéeBella where readDict :: (Chinese.ChineseDict -> IO ()) -> IO () readDict = (Chinese.readChineseDict >>=) français v = v{rosettaPartLangue = LangueFrançais} anglais v = v{rosettaPartLangue = LangueAnglais} mandarin v = v{rosettaPartLangue = LangueMandarin} {- chocolat = mempty { rosettaParts = [ RosettaPart { rosettaPartPicture = "Plantes/Cacao/Fruit-cacao-tree-source-cocoa-chocolate-plant.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "Le chocolat contient du cacao" } , RosettaPart { rosettaPartPicture = "Plantes/Cacao/42f651_95f537d693fb48068880a02efa662822~mv2.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "Chocolate contains cocoa" } , RosettaPart { rosettaPartPicture = "Plantes/Cacao/Chocolate-Ingredients_520x500_c496776e-df9b-4348-a662-5ff65279f5ca.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "巧克力 含有 可可" } ] } pistache = mempty { rosettaParts = [ RosettaPart { rosettaPartPicture = "Plantes/Pistache/581614a479ee6b4df250c4caddc04bca.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "La glace à la pistache est délicieuse" } , RosettaPart { rosettaPartPicture = "Plantes/Pistache/pistachios.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "Pistachio ice cream is delicious" } , RosettaPart { rosettaPartPicture = "Plantes/Pistache/No-Churn-Vegan-Pistachio-Ice-Cream-3-e1502503524224.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "开心果 冰淇淋 很 好吃" } ] } bateau = mempty { rosettaParts = [ RosettaPart { rosettaPartPicture = "Bateau/pirate-boat.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "Bateau sur l'eau" } , RosettaPart { rosettaPartPicture = "Bateau/tanker.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "Boat on the water" } , RosettaPart { rosettaPartPicture = "Bateau/catamaran.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "水上 的 船" } ] } avion = mempty { rosettaParts = [ RosettaPart { rosettaPartPicture = "Avion/sound-barrier.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "Avion dans le ciel" } , RosettaPart { rosettaPartPicture = "Avion/mustang.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "Airoplane in the sky" } , RosettaPart { rosettaPartPicture = "Avion/cockpit.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "天空 中 有 一 架 飞机" } ] } egg = mempty { rosettaParts = [ RosettaPart { rosettaPartPicture = "Egg/R.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "Les poules pondent des œufs" } , RosettaPart { rosettaPartPicture = "Egg/everything-you-ever-wanted-to-know-about-chicken-eggs.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "Hens lay eggs" } , RosettaPart { rosettaPartPicture = "Egg/OIP.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "母鸡 下蛋" } ] } pluie = mempty { rosettaParts = [ RosettaPart { rosettaPartPicture = "Pluie/R.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "L'eau de pluie retourne à l'océan" } , RosettaPart { rosettaPartPicture = "Pluie/OIP2.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "Rainwater returns to the ocean" } , RosettaPart { rosettaPartPicture = "Pluie/c1b4767475208de5a389045b7ad856a0.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "雨水 回归 海洋" } ] } tarteAuxPommesDanniversaire = mempty { rosettaParts = [ RosettaPart { rosettaPartPicture = "TarteAuxPommesDanniversaire/IMG_20250605_180725.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "Délicieuse tarte aux pommes d'anniversaire" } , RosettaPart { rosettaPartPicture = "TarteAuxPommesDanniversaire/VID_20250605_214924.mp4.00-01-40-421.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "Delicious birthday apple pie" } , RosettaPart { rosettaPartPicture = "TarteAuxPommesDanniversaire/VID_20250605_214924.mp4.00-01-47-284.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "美味 的 生日 苹果派" } ] } chatChevalVélo = mempty { rosettaParts = [ RosettaPart { rosettaPartPicture = "Chat/IMG_20250605_194233_truffe.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "chat cheval vélo" } , RosettaPart { rosettaPartPicture = "Cheval/IMG_20250602_170549_himalaya.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "cat horse bicycle" } , RosettaPart { rosettaPartPicture = "Vélo/IMG_20250602_155624.fav.vélos.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "猫 马 自行车" } ] } -} rosetta :: Rosetta rosetta = typeDefault { rosettaDifficulties = typeDefault & rosettaDifficultiesLatinBig & rosettaDifficultiesLatinHidden & rosettaDifficultiesCJKBig } chevauxDormirDebout = rosettaLandscape $ rosetta { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "Cheval/R5.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueFrançais , rosettaPartText = "Les chevaux peuvent dormir debout" } , anglais $ typeDefault { rosettaPartPicture = "Cheval/Do-Horses-Lay-Down-to-Sleep.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueAnglais , rosettaPartText = "Horses can sleep standing up" } , mandarin $ typeDefault { rosettaPartPicture = "Cheval/3YVGNyR45fw5NwHQxvJ8P6.avif" , rosettaPartDescription = "" , rosettaPartLangue = LangueMandarin , rosettaPartText = "马 可以 站 着 睡觉" } ] } ponies = rosettaLandscape $ rosetta { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "Poney/Horse-and-pony2.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "" , rosettaPartText = "Les poneys sont petits mais costauds" } , anglais $ typeDefault { rosettaPartPicture = "Poney/A-girl-equestrian-athlete-jumps-on-a-horse-high-barrier-ss230301-768x448.jpg.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "" , rosettaPartText = "Ponies are small but strong" } , mandarin $ typeDefault { rosettaPartPicture = "Poney/horse-pull.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "" , rosettaPartText = "小马 虽 小 但 很 强壮" } ] } poniesRaces1 = rosettaLandscape $ rosetta { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "Poney/Shetland/Canva-Ponies-of-the-New-Forest-scaled.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Shetland Pony" , rosettaPartText = "Il existe environ 159 races de poneys" } , anglais $ typeDefault { rosettaPartPicture = "Poney/PoneyFrançaisDeSelle/pho11-1441004372-ulk-modele1.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Poney Français de Selle" , rosettaPartText = "There are approximately 159 pony breeds" } , mandarin $ typeDefault { rosettaPartPicture = "Poney/NorwegianFjord/shutterstock_2092896190-1024x683.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Norwegian Fjord Pony" , rosettaPartText = "有 大约 159 个 小马 品种" } ] } poniesRaces2 = rosettaLandscape $ rosetta { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "Poney/Haflinger/GettyImages-546441489-3087a0a3f3a0486f96e7e6d7eb0b6bc1.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Haflinger Pony" , rosettaPartText = "Il existe environ 159 races de poneys" } , anglais $ typeDefault { rosettaPartPicture = "Poney/Dartmoor/GettyImages-149824058-ee7fd8a5e9984f5a9dc73c5916a238aa.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Dartmoor Pony" , rosettaPartText = "There are approximately 159 pony breeds" } , mandarin $ typeDefault { rosettaPartPicture = "Poney/Connemara/eaa17d54a2978f5962edc405f0beabb7.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Connemara Pony" , rosettaPartText = "有 大约 159 个 小马 品种" } ] } poniesRaces3 = rosettaLandscape $ rosetta { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "Poney/" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Pony" , rosettaPartText = "Il existe environ 159 races de poneys" } , anglais $ typeDefault { rosettaPartPicture = "Poney/Dartmoor/GettyImages-149824058-ee7fd8a5e9984f5a9dc73c5916a238aa.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Dartmoor Pony" , rosettaPartText = "There are approximately 159 pony breeds" } , mandarin $ typeDefault { rosettaPartPicture = "Poney/Connemara/eaa17d54a2978f5962edc405f0beabb7.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartDescription = "Connemara Pony" , rosettaPartText = "有 大约 159 个 小马 品种" } ] } culicoides = typeDefault { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "Culicoides/Blood-Feeding-Culicoides-Midges.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartText = "Les moucherons culicoides sont des vampires infectieuses" } , anglais $ typeDefault { rosettaPartPicture = "Culicoides/Mosquito_(Ochlerotatus_annulipes)_and_Midge_(Culicoides_impunctatus)_biting_human_(me).avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartText = "Culicoides midges are infectious vampires" } , mandarin $ typeDefault { rosettaPartPicture = "Culicoides/CSIRO_ScienceImage_1791_SEM_of_a_biting_midge_Culicoides_brevitarsis.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartText = "库蠓属 具有 传染性 的 吸血鬼" } ] } fraise = rosettaLandscape $ rosetta { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "Fraise/96caabc77f79887c4bbcb2383092707b.avif" , rosettaPartText = "Les fruits de la fraise sont les akènes" } , anglais $ typeDefault { rosettaPartPicture = "Fraise/OIP.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartText = "Strawberry's fruits are the achenes" } , mandarin $ typeDefault { rosettaPartPicture = "Fraise/Coupe_d'une_fraise_dont_les_akènes_ont_germés.avif" , rosettaPartText = "草莓 的 果实 是 瘦果" } ] } poupéeArielle = rosettaLandscape $ rosetta { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "ArielleLaPetiteSirène/3aff97d2a3c36b307c12e7ea36e2000b.avif" , rosettaPartText = "Arielle la poupée et Merlin le garçon" } , anglais $ typeDefault { rosettaPartPicture = "ArielleLaPetiteSirène/halle-bailey-as-ariel-in-the-little-mermaid-zk-1280x2120.small.avif" , rosettaPartText = "Ariel the doll and Merlin the boy" } , mandarin $ typeDefault { rosettaPartPicture = "Poupée/IMG_20250613_111606.avif" , rosettaPartText = "娃娃 Arielle 和 男孩 梅林" } ] } poupéeBella = rosettaPortrait $ rosetta { rosettaParts = [ français $ typeDefault { rosettaPartPicture = "LaBelleEtLaBête/batbjpg-fe2293_1280w.avif" , rosettaPartText = "Bella la poupée et Maya la fille" } , anglais $ typeDefault { rosettaPartPicture = "LaBelleEtLaBête/disney-live-action-02.avif" , rosettaPartPictureFit = ObjectFitCover , rosettaPartText = "Bella the doll and Maya the girl" } , mandarin $ typeDefault { rosettaPartPicture = "Poupée/IMG_20250613_111730.avif" , rosettaPartText = "娃娃 Bella 和 女孩 马雅" -- 玛雅 } ] }