1 {-# LANGUAGE OverloadedLists #-}
3 module Worksheets.Writing.RosettaSpec where
5 import Data.GenValidity.Map ()
6 import Data.GenValidity.Sequence ()
7 import Data.GenValidity.Set ()
8 import Data.GenValidity.Text ()
9 import Data.List qualified as List
10 import Data.Text qualified as Text
11 import Data.Validity.Map ()
12 import Data.Validity.Set ()
13 import Data.Validity.Text ()
14 import System.FilePath (joinPath, pathSeparator, (<.>), (</>))
17 import Language.Chinese qualified as Chinese
19 import Worksheets.Writing.Rosetta
21 runRosetta :: String -> Rosetta -> TestDefM (Chinese.ChineseDict : outers) () ()
22 runRosetta title rose = do
23 descrPath <- getTestDescriptionPath
25 List.reverse descrPath
29 (Text.singleton pathSeparator)
31 let outPath = "tests" </> dirPath </> title </> "rosetta" <.> "html"
32 itWithOuter title \dict -> do
33 goldenByteStringBuilderFile outPath
34 $ rosettaHTML dict (Text.pack title) rose
36 spec :: HasCallStack => Spec
37 spec = aroundAll readDict do
38 -- runRosetta "Avion" avion
39 -- runRosetta "Bateau" bateau
40 -- runRosetta "Chocolat" chocolat
41 -- runRosetta "Pistache" pistache
42 -- runRosetta "Egg" egg
43 -- runRosetta "Pluie" pluie
44 -- runRosetta "TarteAuxPommes" tarteAuxPommesDanniversaire
45 -- runRosetta "ChatChevalVélo" chatChevalVélo
46 -- runRosetta "chevauxDormirDebout" chevauxDormirDebout
47 runRosetta "ponies" ponies
48 runRosetta "poniesRaces1" poniesRaces1
49 runRosetta "poniesRaces2" poniesRaces2
50 runRosetta "Culicoides" culicoides
51 runRosetta "Fraise" fraise
52 runRosetta "poupéeArielle" poupéeArielle
53 runRosetta "poupéeBella" poupéeBella
54 runRosetta "Mûre" mûre
55 runRosetta "Framboise" framboise
57 readDict :: (Chinese.ChineseDict -> IO ()) -> IO ()
58 readDict = (Chinese.readChineseDict >>=)
60 français v = v{rosettaPartLangue = LangueFrançais}
61 anglais v = v{rosettaPartLangue = LangueAnglais}
62 mandarin v = v{rosettaPartLangue = LangueMandarin}
69 { rosettaPartPicture = "Plantes/Cacao/Fruit-cacao-tree-source-cocoa-chocolate-plant.avif"
70 , rosettaPartDescription = ""
71 , rosettaPartLangue = LangueFrançais
72 , rosettaPartText = "Le chocolat contient du cacao"
75 { rosettaPartPicture = "Plantes/Cacao/42f651_95f537d693fb48068880a02efa662822~mv2.avif"
76 , rosettaPartDescription = ""
77 , rosettaPartLangue = LangueAnglais
78 , rosettaPartText = "Chocolate contains cocoa"
81 { rosettaPartPicture = "Plantes/Cacao/Chocolate-Ingredients_520x500_c496776e-df9b-4348-a662-5ff65279f5ca.avif"
82 , rosettaPartDescription = ""
83 , rosettaPartLangue = LangueMandarin
84 , rosettaPartText = "巧克力 含有 可可"
92 { rosettaPartPicture = "Plantes/Pistache/581614a479ee6b4df250c4caddc04bca.avif"
93 , rosettaPartDescription = ""
94 , rosettaPartLangue = LangueFrançais
95 , rosettaPartText = "La glace à la pistache est délicieuse"
98 { rosettaPartPicture = "Plantes/Pistache/pistachios.avif"
99 , rosettaPartDescription = ""
100 , rosettaPartLangue = LangueAnglais
101 , rosettaPartText = "Pistachio ice cream is delicious"
104 { rosettaPartPicture = "Plantes/Pistache/No-Churn-Vegan-Pistachio-Ice-Cream-3-e1502503524224.avif"
105 , rosettaPartDescription = ""
106 , rosettaPartLangue = LangueMandarin
107 , rosettaPartText = "开心果 冰淇淋 很 好吃"
115 { rosettaPartPicture = "Bateau/pirate-boat.avif"
116 , rosettaPartDescription = ""
117 , rosettaPartLangue = LangueFrançais
118 , rosettaPartText = "Bateau sur l'eau"
121 { rosettaPartPicture = "Bateau/tanker.avif"
122 , rosettaPartDescription = ""
123 , rosettaPartLangue = LangueAnglais
124 , rosettaPartText = "Boat on the water"
127 { rosettaPartPicture = "Bateau/catamaran.avif"
128 , rosettaPartDescription = ""
129 , rosettaPartLangue = LangueMandarin
130 , rosettaPartText = "水上 的 船"
138 { rosettaPartPicture = "Avion/sound-barrier.avif"
139 , rosettaPartDescription = ""
140 , rosettaPartLangue = LangueFrançais
141 , rosettaPartText = "Avion dans le ciel"
144 { rosettaPartPicture = "Avion/mustang.avif"
145 , rosettaPartDescription = ""
146 , rosettaPartLangue = LangueAnglais
147 , rosettaPartText = "Airoplane in the sky"
150 { rosettaPartPicture = "Avion/cockpit.avif"
151 , rosettaPartDescription = ""
152 , rosettaPartLangue = LangueMandarin
153 , rosettaPartText = "天空 中 有 一 架 飞机"
161 { rosettaPartPicture = "Egg/R.avif"
162 , rosettaPartDescription = ""
163 , rosettaPartLangue = LangueFrançais
164 , rosettaPartText = "Les poules pondent des œufs"
167 { rosettaPartPicture = "Egg/everything-you-ever-wanted-to-know-about-chicken-eggs.avif"
168 , rosettaPartDescription = ""
169 , rosettaPartLangue = LangueAnglais
170 , rosettaPartText = "Hens lay eggs"
173 { rosettaPartPicture = "Egg/OIP.avif"
174 , rosettaPartDescription = ""
175 , rosettaPartLangue = LangueMandarin
176 , rosettaPartText = "母鸡 下蛋"
184 { rosettaPartPicture = "Pluie/R.avif"
185 , rosettaPartDescription = ""
186 , rosettaPartLangue = LangueFrançais
187 , rosettaPartText = "L'eau de pluie retourne à l'océan"
190 { rosettaPartPicture = "Pluie/OIP2.avif"
191 , rosettaPartDescription = ""
192 , rosettaPartLangue = LangueAnglais
193 , rosettaPartText = "Rainwater returns to the ocean"
196 { rosettaPartPicture = "Pluie/c1b4767475208de5a389045b7ad856a0.avif"
197 , rosettaPartDescription = ""
198 , rosettaPartLangue = LangueMandarin
199 , rosettaPartText = "雨水 回归 海洋"
203 tarteAuxPommesDanniversaire =
207 { rosettaPartPicture = "TarteAuxPommesDanniversaire/IMG_20250605_180725.avif"
208 , rosettaPartDescription = ""
209 , rosettaPartLangue = LangueFrançais
210 , rosettaPartText = "Délicieuse tarte aux pommes d'anniversaire"
213 { rosettaPartPicture = "TarteAuxPommesDanniversaire/VID_20250605_214924.mp4.00-01-40-421.avif"
214 , rosettaPartDescription = ""
215 , rosettaPartLangue = LangueAnglais
216 , rosettaPartText = "Delicious birthday apple pie"
219 { rosettaPartPicture = "TarteAuxPommesDanniversaire/VID_20250605_214924.mp4.00-01-47-284.avif"
220 , rosettaPartDescription = ""
221 , rosettaPartLangue = LangueMandarin
222 , rosettaPartText = "美味 的 生日 苹果派"
230 { rosettaPartPicture = "Chat/IMG_20250605_194233_truffe.avif"
231 , rosettaPartDescription = ""
232 , rosettaPartLangue = LangueFrançais
233 , rosettaPartText = "chat cheval vélo"
236 { rosettaPartPicture = "Cheval/IMG_20250602_170549_himalaya.avif"
237 , rosettaPartDescription = ""
238 , rosettaPartLangue = LangueAnglais
239 , rosettaPartText = "cat horse bicycle"
242 { rosettaPartPicture = "Vélo/IMG_20250602_155624.fav.vélos.avif"
243 , rosettaPartDescription = ""
244 , rosettaPartLangue = LangueMandarin
245 , rosettaPartText = "猫 马 自行车"
254 { rosettaDifficulties =
256 & rosettaDifficultiesLatinBig
257 & rosettaDifficultiesLatinHidden
258 & rosettaDifficultiesCJKBig
261 chevauxDormirDebout =
267 { rosettaPartPicture = "Cheval/R5.avif"
268 , rosettaPartDescription = ""
269 , rosettaPartLangue = LangueFrançais
270 , rosettaPartText = "Les chevaux peuvent dormir debout"
274 { rosettaPartPicture = "Cheval/Do-Horses-Lay-Down-to-Sleep.avif"
275 , rosettaPartDescription = ""
276 , rosettaPartLangue = LangueAnglais
277 , rosettaPartText = "Horses can sleep standing up"
281 { rosettaPartPicture = "Cheval/3YVGNyR45fw5NwHQxvJ8P6.avif"
282 , rosettaPartDescription = ""
283 , rosettaPartLangue = LangueMandarin
284 , rosettaPartText = "马 可以 站 着 睡觉"
294 { rosettaPartPicture = "Poney/Horse-and-pony2.avif"
295 , rosettaPartPictureCSS = cssBlockObjectFitCover
296 , rosettaPartDescription = ""
297 , rosettaPartText = "Les poneys sont petits mais costauds"
301 { rosettaPartPicture = "Poney/A-girl-equestrian-athlete-jumps-on-a-horse-high-barrier-ss230301-768x448.jpg.avif"
302 , rosettaPartPictureCSS = cssBlockObjectFitCover
303 , rosettaPartDescription = ""
304 , rosettaPartText = "Ponies are small but strong"
308 { rosettaPartPicture = "Poney/horse-pull.avif"
309 , rosettaPartPictureCSS = cssBlockObjectFitCover
310 , rosettaPartDescription = ""
311 , rosettaPartText = "小马 虽 小 但 很 强壮"
321 { rosettaPartPicture = "Poney/Shetland/Canva-Ponies-of-the-New-Forest-scaled.avif"
322 , rosettaPartPictureCSS = cssBlockObjectFitCover
323 , rosettaPartDescription = "Shetland Pony"
324 , rosettaPartText = "Il existe environ 159 races de poneys"
328 { rosettaPartPicture = "Poney/PoneyFrançaisDeSelle/pho11-1441004372-ulk-modele1.avif"
329 , rosettaPartPictureCSS = cssBlockObjectFitCover
330 , rosettaPartDescription = "Poney Français de Selle"
331 , rosettaPartText = "There are approximately 159 pony breeds"
335 { rosettaPartPicture = "Poney/NorwegianFjord/shutterstock_2092896190-1024x683.avif"
336 , rosettaPartPictureCSS = cssBlockObjectFitCover
337 , rosettaPartDescription = "Norwegian Fjord Pony"
338 , rosettaPartText = "有 大约 159 个 小马 品种"
348 { rosettaPartPicture = "Poney/Haflinger/GettyImages-546441489-3087a0a3f3a0486f96e7e6d7eb0b6bc1.avif"
349 , rosettaPartPictureCSS = cssBlockObjectFitCover
350 , rosettaPartDescription = "Haflinger Pony"
351 , rosettaPartText = "Il existe environ 159 races de poneys"
355 { rosettaPartPicture = "Poney/Dartmoor/GettyImages-149824058-ee7fd8a5e9984f5a9dc73c5916a238aa.avif"
356 , rosettaPartPictureCSS = cssBlockObjectFitCover
357 , rosettaPartDescription = "Dartmoor Pony"
358 , rosettaPartText = "There are approximately 159 pony breeds"
362 { rosettaPartPicture = "Poney/Connemara/eaa17d54a2978f5962edc405f0beabb7.avif"
363 , rosettaPartPictureCSS = cssBlockObjectFitCover
364 , rosettaPartDescription = "Connemara Pony"
365 , rosettaPartText = "有 大约 159 个 小马 品种"
375 { rosettaPartPicture = "Poney/"
376 , rosettaPartPictureCSS = cssBlockObjectFitCover
377 , rosettaPartDescription = "Pony"
378 , rosettaPartText = "Il existe environ 159 races de poneys"
382 { rosettaPartPicture = "Poney/Dartmoor/GettyImages-149824058-ee7fd8a5e9984f5a9dc73c5916a238aa.avif"
383 , rosettaPartPictureCSS = cssBlockObjectFitCover
384 , rosettaPartDescription = "Dartmoor Pony"
385 , rosettaPartText = "There are approximately 159 pony breeds"
389 { rosettaPartPicture = "Poney/Connemara/eaa17d54a2978f5962edc405f0beabb7.avif"
390 , rosettaPartPictureCSS = cssBlockObjectFitCover
391 , rosettaPartDescription = "Connemara Pony"
392 , rosettaPartText = "有 大约 159 个 小马 品种"
401 { rosettaPartPicture = "Culicoides/Blood-Feeding-Culicoides-Midges.avif"
402 , rosettaPartPictureCSS = cssBlockObjectFitCover
403 , rosettaPartText = "Les moucherons culicoides sont des vampires infectieuses"
407 { rosettaPartPicture = "Culicoides/Mosquito_(Ochlerotatus_annulipes)_and_Midge_(Culicoides_impunctatus)_biting_human_(me).avif"
408 , rosettaPartPictureCSS = cssBlockObjectFitCover
409 , rosettaPartText = "Culicoides midges are infectious vampires"
413 { rosettaPartPicture = "Culicoides/CSIRO_ScienceImage_1791_SEM_of_a_biting_midge_Culicoides_brevitarsis.avif"
414 , rosettaPartPictureCSS = cssBlockObjectFitCover
415 , rosettaPartText = "库蠓属 具有 传染性 的 吸血鬼"
426 { rosettaPartPicture = "Fraise/96caabc77f79887c4bbcb2383092707b.avif"
427 , rosettaPartText = "Les fruits de la fraise sont les akènes"
431 { rosettaPartPicture = "Fraise/OIP.avif"
432 , rosettaPartPictureCSS = cssBlockObjectFitCover
433 , rosettaPartText = "Strawberry's fruits are the achenes"
437 { rosettaPartPicture = "Fraise/Coupe_d'une_fraise_dont_les_akènes_ont_germés.avif"
438 , rosettaPartText = "草莓 的 果实 是 瘦果"
448 { rosettaPartPicture = "ArielleLaPetiteSirène/3aff97d2a3c36b307c12e7ea36e2000b.avif"
449 , rosettaPartText = "Arielle la poupée et Merlin le garçon"
453 { rosettaPartPicture = "ArielleLaPetiteSirène/halle-bailey-as-ariel-in-the-little-mermaid-zk-1280x2120.small.avif"
454 , rosettaPartText = "Ariel the doll and Merlin the boy"
458 { rosettaPartPicture = "Poupée/IMG_20250613_111606.avif"
459 , rosettaPartText = "娃娃 Arielle 和 男孩 梅林"
469 { rosettaPartPicture = "LaBelleEtLaBête/batbjpg-fe2293_1280w.avif"
470 , rosettaPartText = "Bella la poupée et Maya la fille"
474 { rosettaPartPicture = "LaBelleEtLaBête/disney-live-action-02.avif"
475 , rosettaPartPictureCSS = cssBlockObjectFitCover
476 , rosettaPartText = "Bella the doll and Maya the girl"
480 { rosettaPartPicture = "Poupée/IMG_20250613_111730.avif"
481 , rosettaPartText = "娃娃 Bella 和 女孩 马雅" -- 玛雅
491 { rosettaPartPicture = "Mûre/Bee-Feeding-on-Blackberry-Blossom.avif"
492 , rosettaPartPictureCSS = cssBlockObjectFitCover
493 , rosettaPartText = "Les fruits de la mûre sont des drupéoles"
497 { rosettaPartPicture = "Mûre/blackberry-anatomy.avif"
498 , rosettaPartText = "Blackberry's fruits are drupelets"
502 { rosettaPartPicture = "Mûre/berryblack.avif"
503 , rosettaPartPictureCSS = cssBlockObjectFitCover
504 , rosettaPartText = "黑莓 的 果实 是 小 核果"
514 { rosettaPartPicture = "Framboise/ghows-SR-6c5aadd8-13b2-7679-e053-0100007f79b5-ad44228b.avif"
515 , rosettaPartPictureCSS =
516 cssBlockObjectFitCover
517 <> ["object-position" := "left center"]
518 , rosettaPartText = ""
522 { rosettaPartPicture = "Framboise/framboise-schema-fr.avif"
523 , rosettaPartText = ""
527 { rosettaPartPicture = "Framboise/RR.avif"
528 , rosettaPartPictureCSS =
529 cssBlockObjectFitCover
530 <> ["object-position" := "right bottom"]
531 , rosettaPartText = ""