#!/usr/bin/env bash # Prepara o Shogi e o Hanafuda Koi-Koi do Asobi (Miguel Carino, AGPL-3.0-or-later; HTML, CSS e JavaScript puros) a partir do # commit c6a128d de github.com/MiguelCarino/Asobi. O site do autor e uma pagina unica com a barra de navegacao, o relogio, o # seletor de idioma e a marca "Carino" (carino-navbar.js, carino-clock.js, carino-lang.js, carino-theme.*, logo, og.jpg, canonical e # hreflang apontando para asobi.carino.systems). Aqui cada jogo vira uma pagina propria, sem nada disso: # - js/shogi.js e js/hanafuda.js, o i18n.js (interface em en, es, pt-BR, ja, ru), o carino-ui.css e o css/styles.css (tokens e # componentes que os jogos usam) e as fontes (IBM Plex, Red Hat Display, Shippori Mincho; SIL OFL 1.1) saem sem mudanca; # - o index.html, o shell.js (que monta o jogo, a ajuda, a pausa e as teclas, escrito a partir do js/app.js do autor) e o lang.js # (idioma pelo navigator.language, no lugar do cookie compartilhado do autor) sao nossos, em Builds/asobi/ (AGPL, como o resto). # O Pentarch (auto-battler) nao entra. Nenhuma requisicao sai do site. # # src/FredGames.Bundler/Builds/build-asobi.sh # # Saida: artifacts/build/asobi-c6a128d/{shogi,hanafuda}-c6a128d-site.tar.gz (pasta site/); dois builds seguidos dao os mesmos bytes. set -euo pipefail COMMIT=c6a128d76b1092883a0627d62bd61fa144197207 SHA256=c5481ddd1bd1d924097946143a6930bc28cb08f82b7ed2c8870d49c818ce48fb here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/asobi-${COMMIT:0:7}" cache="$root/artifacts/build/cache" mkdir -p "$cache" tarball="$cache/asobi-${COMMIT:0:7}.tar.gz" [ -f "$tarball" ] || curl -fsSL --retry 4 "https://github.com/MiguelCarino/Asobi/archive/$COMMIT.tar.gz" -o "$tarball" echo "$SHA256 $tarball" | shasum -a 256 -c - rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$tarball" -C "$out/tree" --strip-components 1 one() { # id titulo kanji css-extra local id=$1 name=$2 jp=$3 extra=${4:-} local site="$out/$id/site" mkdir -p "$site/css" "$site/js" cp "$out/tree/carino-ui.css" "$out/tree/i18n.js" "$site/" cp "$out/tree/css/styles.css" "$site/css/" cp "$out/tree/js/$id.js" "$site/js/" cp -R "$out/tree/fonts" "$site/fonts" cp "$here/asobi/lang.js" "$here/asobi/shell.js" "$site/" python3 -I - "$here/asobi/page.tmpl.html" "$site/index.html" "$id" "$name" "$jp" "$extra" <<'PY' import sys tmpl, dest, id_, name, jp, extra = sys.argv[1:] s = open(tmpl, encoding="utf-8").read() for k, v in (("@TITLE@", name), ("@ID@", id_), ("@NAME@", name), ("@JP@", jp), ("@EXTRA_CSS@", extra)): assert k in s s = s.replace(k, v) open(dest, "w", encoding="utf-8", newline="").write(s) PY find "$site" -exec touch -t 202611010000 {} + ( cd "$out/$id" && find site -type f | LC_ALL=C sort > files.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T files.txt \ | gzip -n -9 > "$id-${COMMIT:0:7}-site.tar.gz" && mv "$id-${COMMIT:0:7}-site.tar.gz" "$out/" && rm -rf files.txt site ) } # O tabuleiro do shogi e um quadrado da largura da coluna (ate ~760 px) e passava da altura do quadro do player: aqui a largura # maxima acompanha a altura da janela, para o tabuleiro inteiro caber sem rolagem. one shogi "Shogi" "将棋" " .shogi-boardwrap { max-width: calc(100vh - 235px); margin-left: auto; margin-right: auto; width: 100%; } " one hanafuda "Hanafuda Koi-Koi" "花札" rm -rf "$out/tree" "$out/shogi" "$out/hanafuda" shasum -a 256 "$out"/*.tar.gz