website-htmx-rustelo-code/scripts/sync/sync-all-pages.nu

64 lines
2 KiB
Text
Raw Normal View History

2026-07-10 03:44:13 +01:00
#!/usr/bin/env nu
# sync-all-pages.nu
# Reads source_html from each project's index.ncl and syncs FTL files.
#
# Usage:
# nu scripts/sync/sync-all-pages.nu
# nu scripts/sync/sync-all-pages.nu --only ontoref
# nu scripts/sync/sync-all-pages.nu --dry-run
const PROJECTS_DIR = "site/content/projects/en"
const I18N_EN = "site/i18n/locales/en/pages"
const I18N_ES = "site/i18n/locales/es/pages"
def main [
--only: string = "", # Sync a single project by id
--dry-run # Preview without writing
] {
# Collect all project dirs that have an index.ncl with source_html
let project_dirs = (ls $PROJECTS_DIR | where type == dir | get name)
let projects = $project_dirs | each { |dir|
let ncl_path = $"($dir)/index.ncl"
if not ($ncl_path | path exists) { return null }
let content = open $ncl_path
let id_match = $content | parse --regex 'id\s*=\s*"(?P<id>[^"]+)"' | first | get id? | default ""
let src_match = $content | parse --regex 'source_html\s*=\s*"(?P<path>[^"]+)"' | first | get path? | default ""
if $src_match == "" { return null }
{ id: $id_match, source_html: $src_match }
} | compact | where { |p| $p != null and $p.id != "" and $p.source_html != "" }
if ($projects | length) == 0 {
print "No projects with source_html found."
return
}
let targets = if $only != "" {
$projects | where id == $only
} else {
$projects
}
if ($targets | length) == 0 {
print $"Project '($only)' not found or has no source_html."
return
}
for p in $targets {
print $"\n── ($p.id) ──"
let out_en = $"($I18N_EN)/($p.id).ftl"
let out_es = $"($I18N_ES)/($p.id).ftl"
if $dry_run {
nu scripts/sync/sync-page-ftl.nu --html $p.source_html --out-en $out_en --out-es $out_es --dry-run
} else {
nu scripts/sync/sync-page-ftl.nu --html $p.source_html --out-en $out_en --out-es $out_es
}
}
print "\n✓ Done"
}