#!/usr/bin/env python3 """Monta a pagina de um jogo de PuzzleScript: o standalone_inlined.txt do repositorio (o modelo que o proprio editor usa em "Export"), com o texto do jogo embutido e quatro mudancas nossas (ver build-puzzlescript-games.sh). uso: make.py """ import json, re, sys, html template, game, slug, bg, fg, riff, out = sys.argv[1:8] page = open(template, encoding='utf-8').read() src = open(game, encoding='utf-8').read().replace('\r\n', '\n') title = re.search(r'^title\s+(.+)$', src, re.M).group(1).strip() def sub(old, new, count=1): global page assert page.count(old) == count, (old, page.count(old)) page = page.replace(old, new) # 1. a licenca GPL-2.0-only do riffwave.js fica de fora: bloco ', start) + len('') page = page[:a] + '' + page[b:] assert 'Copyright (C) 2011' not in page and 'GNU General' not in page # 2. progresso e preferencias no localStorage com prefixo do jogo (o original usa document.URL, que muda com o hash do bundle) page = page.replace('document.URL', "'ps-%s:progress'" % slug) sub("'puzzlescript:' + ", "'ps-%s:' + " % slug, 2) # 3. sem link para o site do autor nem botao "hack" (que envia o codigo ao editor em puzzlescript.net) footer = re.search(r'\n', page, re.S) page = page[:footer.start()] + page[footer.end():] sub('\n', '') # 4. titulo, cores, CSP (nada sai do site) e o texto do jogo csp = ("default-src 'none'; script-src 'unsafe-inline' 'unsafe-eval'; style-src 'unsafe-inline'; img-src data: blob:; media-src data: blob:") sub('', '\n' % csp) page = page.replace('___BGCOLOR___', bg).replace('___TEXTCOLOR___', fg) page = page.replace('__GAMETITLE__', html.escape(title)) code = json.dumps(src).replace('<', '\\u003c').replace('\u2028', '\\u2028').replace('\u2029', '\\u2029') sub('"__GAMEDAT__"', code) open(out, 'w', encoding='utf-8', newline='\n').write(page)