New-Item -ItemType Directory -Force data | Out-Null $source = Get-Content "src/activities.js" -Raw $pattern = 'createActivity\("(?[^"]+)",\s*\{(?.*?)\}\)' $matches = [regex]::Matches( $source, $pattern, [System.Text.RegularExpressions.RegexOptions]::Singleline ) function Get-FieldValue { param( [string]$Body, [string]$Field ) $pattern = "$Field\s*:\s*(?.*?)(,`r?`n|\n\s*[a-z_]+\s*:|\r?\n\s*\})" $match = [regex]::Match( $Body, $pattern, [System.Text.RegularExpressions.RegexOptions]::Singleline ) if (-not $match.Success) { return $null } return $match.Groups["value"].Value.Trim().TrimEnd(",") } function Convert-ArrayLiteral { param([string]$Value) $items = [regex]::Matches($Value, '"([^"]+)"') | ForEach-Object { $_.Groups[1].Value } return @($items) } function Infer-Category { param( [string]$Name, [string[]]$Types ) $n = $Name.ToLower() $hasSport = $Types -contains "sport" $hasCreatif = $Types -contains "creatif" $hasEducatif = $Types -contains "educatif" if ($n.Contains("film") -or $n.Contains("dessin anime") -or $n.Contains("podcast") -or $n.Contains("musique") -or $n.Contains("sieste") -or $n.Contains("etoiles") -or $n.Contains("nuages")) { return "calme" } if ($n.Contains("monopoly") -or $n.Contains("scrabble") -or $n.Contains("uno") -or $n.Contains("dominos") -or $n.Contains("cluedo") -or $n.Contains("dobble") -or $n.Contains("puissance 4") -or $n.Contains("echecs") -or $n.Contains("dames") -or $n.Contains("trivial pursuit") -or $n.Contains("jungle speed") -or $n.Contains("jeu de l'oie")) { return "jeux_de_societe" } if ($n.Contains("velo") -or $n.Contains("trottinette") -or $n.Contains("football") -or $n.Contains("basket") -or $n.Contains("parcours") -or $n.Contains("course") -or $n.Contains("yoga") -or $n.Contains("etirements") -or $n.Contains("relais") -or $hasSport) { return "sport" } if ($n.Contains("parc") -or $n.Contains("foret") -or $n.Contains("plage") -or $n.Contains("jardin") -or $n.Contains("cerf-volant") -or $n.Contains("balade") -or $n.Contains("canards") -or $n.Contains("barbecue") -or $n.Contains("jardiner") -or $n.Contains("graines")) { return "plein_air" } if ($n.Contains("dessin") -or $n.Contains("peindre") -or $n.Contains("colorier") -or $n.Contains("collage") -or $n.Contains("bande dessinee") -or $n.Contains("papier") -or $n.Contains("pate a modeler") -or $n.Contains("lego") -or $n.Contains("maquette") -or $n.Contains("bricolage") -or $n.Contains("cadeau") -or $n.Contains("diy") -or $n.Contains("cailloux") -or $hasCreatif) { return "creatif" } if ($n.Contains("deguis") -or $n.Contains("spectacle") -or $n.Contains("theatre") -or $n.Contains("karaoke") -or $n.Contains("devinettes") -or $n.Contains("jeu de role") -or $n.Contains("faire semblant")) { return "imaginatif" } if ($n.Contains("gateau") -or $n.Contains("crepes") -or $n.Contains("repas") -or $n.Contains("cookies") -or $n.Contains("cupcakes") -or $n.Contains("pizza") -or $n.Contains("recette") -or $n.Contains("smoothie") -or $n.Contains("gouter")) { return "cuisine" } if ($n.Contains("puzzles") -or $n.Contains("enigmes") -or $n.Contains("escape game") -or $n.Contains("langue") -or $n.Contains("video educative") -or $n.Contains("logique") -or $n.Contains("competence") -or $n.Contains("experience scientifique") -or $hasEducatif) { return "educatif" } if ($n.Contains("jeu video") -or $n.Contains("quiz interactif") -or $n.Contains("application educative") -or $n.Contains("telephone") -or $n.Contains("video") -or $n.Contains("numerique")) { return "numerique" } return "famille" } $activities = foreach ($match in $matches) { $body = $match.Groups["body"].Value $types = Convert-ArrayLiteral (Get-FieldValue $body "type") [pscustomobject]@{ name = $match.Groups["name"].Value location = [object[]](Convert-ArrayLiteral (Get-FieldValue $body "location")) min_players = [int](Get-FieldValue $body "min_players") max_players = [int](Get-FieldValue $body "max_players") category = Infer-Category $match.Groups["name"].Value $types energy = (Get-FieldValue $body "energy").Trim('"') type = [object[]]$types duration = (Get-FieldValue $body "duration").Trim('"') material = [System.Convert]::ToBoolean((Get-FieldValue $body "material")) noise = (Get-FieldValue $body "noise").Trim('"') } } $activities | ConvertTo-Json -Depth 5 | Set-Content -Encoding UTF8 "data/activities.json" Write-Output "Export JSON cree : data/activities.json"