├── .gitignore ├── en-EN ├── code │ ├── 10 │ │ ├── vite.config.js │ │ └── index.html │ ├── 11 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ └── html-template.js │ │ ├── index.html │ │ └── index.js │ ├── 12 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ │ ├── index.html │ │ └── index.js │ ├── 13 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ ├── 14 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ ├── 15 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ ├── 16 │ │ ├── assets │ │ │ └── image.png │ │ ├── project │ │ │ ├── script.js │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ ├── lib │ │ └── vite-plugin-https-imports-esm │ │ │ ├── types.js │ │ │ ├── index.d.ts │ │ │ ├── loader.d.ts │ │ │ ├── matcher.d.ts │ │ │ ├── resolver.d.ts │ │ │ ├── resolver.js │ │ │ ├── types.d.ts │ │ │ ├── index.js │ │ │ ├── matcher.js │ │ │ ├── loader.js │ │ │ └── LICENSE │ ├── 01 │ │ └── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ ├── index.html │ │ │ └── style.css │ ├── 02 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ ├── index.html │ │ │ └── style.css │ │ ├── index.js │ │ ├── index.html │ │ └── lib │ │ │ └── utils-zip.js │ ├── 04 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ ├── index.html │ │ │ └── style.css │ │ ├── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── utils-zip.js │ │ │ └── html-template.js │ │ └── index.js │ ├── 05 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ ├── index.html │ │ │ └── style.css │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ │ ├── index.html │ │ └── index.js │ ├── 06 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ ├── index.html │ │ │ └── style.css │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ │ ├── index.html │ │ └── index.js │ ├── 07 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ │ ├── index.html │ │ └── index.js │ ├── 08 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── utils-zip.js │ │ │ └── html-template.js │ │ ├── index.html │ │ ├── index.js │ │ └── assets │ │ │ └── main.js │ ├── 09 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── utils-zip.js │ │ │ └── html-template.js │ │ ├── index.html │ │ ├── index.js │ │ └── assets │ │ │ └── main.js │ ├── final │ │ ├── project │ │ │ ├── script.js │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── assets │ │ │ └── image.png │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ └── 03 │ │ ├── vite.config.js │ │ ├── index.html │ │ └── index.js ├── images │ ├── favicon.png │ ├── qr-code.png │ └── qr-code-mini.png ├── reveal │ ├── theme │ │ └── fonts │ │ │ ├── league-gothic │ │ │ ├── LICENSE │ │ │ ├── league-gothic.eot │ │ │ ├── league-gothic.ttf │ │ │ ├── league-gothic.woff │ │ │ └── league-gothic.css │ │ │ └── source-sans-pro │ │ │ ├── source-sans-pro-italic.eot │ │ │ ├── source-sans-pro-italic.ttf │ │ │ ├── source-sans-pro-italic.woff │ │ │ ├── source-sans-pro-regular.eot │ │ │ ├── source-sans-pro-regular.ttf │ │ │ ├── source-sans-pro-regular.woff │ │ │ ├── source-sans-pro-semibold.eot │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ ├── source-sans-pro-semibold.woff │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ └── source-sans-pro-semibolditalic.woff │ └── reset.css ├── dist │ └── presentation-polyglot-png-zip-html_en-EN.html └── plugin │ └── highlight │ ├── monokai.css │ ├── kimbie-light.css │ └── zenburn.css ├── fr-FR ├── code │ ├── 10 │ │ ├── vite.config.js │ │ └── index.html │ ├── 11 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ └── html-template.js │ │ ├── index.html │ │ └── index.js │ ├── 12 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ │ ├── index.html │ │ └── index.js │ ├── 13 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ ├── 14 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ ├── 15 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ ├── 16 │ │ ├── assets │ │ │ └── image.png │ │ ├── project │ │ │ ├── script.js │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ ├── lib │ │ └── vite-plugin-https-imports-esm │ │ │ ├── types.js │ │ │ ├── index.d.ts │ │ │ ├── loader.d.ts │ │ │ ├── matcher.d.ts │ │ │ ├── resolver.d.ts │ │ │ ├── resolver.js │ │ │ ├── types.d.ts │ │ │ ├── index.js │ │ │ ├── matcher.js │ │ │ ├── loader.js │ │ │ └── LICENSE │ ├── 01 │ │ └── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ ├── 02 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.js │ │ ├── index.html │ │ └── lib │ │ │ └── utils-zip.js │ ├── 04 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── utils-zip.js │ │ │ └── html-template.js │ │ └── index.js │ ├── 05 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ │ ├── index.html │ │ └── index.js │ ├── 06 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ │ ├── index.html │ │ └── index.js │ ├── 07 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ │ ├── index.html │ │ └── index.js │ ├── 08 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── utils-zip.js │ │ │ └── html-template.js │ │ ├── index.html │ │ ├── index.js │ │ └── assets │ │ │ └── main.js │ ├── 09 │ │ ├── project │ │ │ ├── script.js │ │ │ ├── image.png │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── lib │ │ │ ├── utils.js │ │ │ ├── utils-zip.js │ │ │ └── html-template.js │ │ ├── index.html │ │ ├── index.js │ │ └── assets │ │ │ └── main.js │ ├── final │ │ ├── project │ │ │ ├── script.js │ │ │ ├── background.png │ │ │ ├── properties.css │ │ │ └── index.html │ │ ├── assets │ │ │ └── image.png │ │ ├── index.html │ │ └── lib │ │ │ ├── utils.js │ │ │ ├── html-template.js │ │ │ └── utils-zip.js │ └── 03 │ │ ├── vite.config.js │ │ ├── index.html │ │ └── index.js ├── RESUME.pdf ├── images │ ├── favicon.png │ ├── qr-code.png │ └── qr-code-mini.png ├── reveal │ ├── theme │ │ └── fonts │ │ │ ├── league-gothic │ │ │ ├── LICENSE │ │ │ ├── league-gothic.eot │ │ │ ├── league-gothic.ttf │ │ │ ├── league-gothic.woff │ │ │ └── league-gothic.css │ │ │ └── source-sans-pro │ │ │ ├── source-sans-pro-italic.eot │ │ │ ├── source-sans-pro-italic.ttf │ │ │ ├── source-sans-pro-italic.woff │ │ │ ├── source-sans-pro-regular.eot │ │ │ ├── source-sans-pro-regular.ttf │ │ │ ├── source-sans-pro-regular.woff │ │ │ ├── source-sans-pro-semibold.eot │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ ├── source-sans-pro-semibold.woff │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ └── source-sans-pro-semibolditalic.woff │ └── reset.css ├── dist │ └── presentation-polyglot-png-zip-html_fr-FR.html └── plugin │ └── highlight │ ├── monokai.css │ ├── kimbie-light.css │ └── zenburn.css ├── SUMMARY.pdf ├── demo.png.zip.html ├── util └── web-extension │ ├── web-extension.zip │ ├── script-proxy.js │ ├── background.js │ ├── manifest.json │ └── script.js ├── _includes └── head-custom.html ├── package.json └── LICENSE.txt /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/types.js: -------------------------------------------------------------------------------- 1 | export {}; 2 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/types.js: -------------------------------------------------------------------------------- 1 | export {}; 2 | -------------------------------------------------------------------------------- /SUMMARY.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/SUMMARY.pdf -------------------------------------------------------------------------------- /demo.png.zip.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/demo.png.zip.html -------------------------------------------------------------------------------- /fr-FR/RESUME.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/RESUME.pdf -------------------------------------------------------------------------------- /en-EN/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/images/favicon.png -------------------------------------------------------------------------------- /en-EN/images/qr-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/images/qr-code.png -------------------------------------------------------------------------------- /fr-FR/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/images/favicon.png -------------------------------------------------------------------------------- /fr-FR/images/qr-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/images/qr-code.png -------------------------------------------------------------------------------- /en-EN/code/01/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/02/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/04/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/05/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/06/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/07/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/08/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/09/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/11/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/12/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/13/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/14/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/15/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/16/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/16/assets/image.png -------------------------------------------------------------------------------- /en-EN/code/16/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/code/final/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /en-EN/images/qr-code-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/images/qr-code-mini.png -------------------------------------------------------------------------------- /fr-FR/code/01/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/02/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/04/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/05/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/06/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/07/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/08/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/09/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/11/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/12/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/13/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/14/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/15/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/16/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/16/assets/image.png -------------------------------------------------------------------------------- /fr-FR/code/16/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/code/final/project/script.js: -------------------------------------------------------------------------------- 1 | document.querySelector("button").onclick = () => 2 | alert("Hello la communauté RennesJS ! 😚"); -------------------------------------------------------------------------------- /fr-FR/images/qr-code-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/images/qr-code-mini.png -------------------------------------------------------------------------------- /en-EN/code/01/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/01/project/image.png -------------------------------------------------------------------------------- /en-EN/code/02/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/02/project/image.png -------------------------------------------------------------------------------- /en-EN/code/04/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/04/project/image.png -------------------------------------------------------------------------------- /en-EN/code/05/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/05/project/image.png -------------------------------------------------------------------------------- /en-EN/code/06/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/06/project/image.png -------------------------------------------------------------------------------- /en-EN/code/07/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/07/project/image.png -------------------------------------------------------------------------------- /en-EN/code/08/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/08/project/image.png -------------------------------------------------------------------------------- /en-EN/code/09/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/09/project/image.png -------------------------------------------------------------------------------- /en-EN/code/11/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/11/project/image.png -------------------------------------------------------------------------------- /en-EN/code/12/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/12/project/image.png -------------------------------------------------------------------------------- /en-EN/code/13/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/13/project/image.png -------------------------------------------------------------------------------- /en-EN/code/14/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/14/project/image.png -------------------------------------------------------------------------------- /en-EN/code/15/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/15/project/image.png -------------------------------------------------------------------------------- /en-EN/code/final/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/final/assets/image.png -------------------------------------------------------------------------------- /fr-FR/code/01/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/01/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/02/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/02/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/04/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/04/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/05/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/05/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/06/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/06/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/07/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/07/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/08/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/08/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/09/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/09/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/11/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/11/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/12/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/12/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/13/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/13/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/14/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/14/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/15/project/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/15/project/image.png -------------------------------------------------------------------------------- /fr-FR/code/final/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/final/assets/image.png -------------------------------------------------------------------------------- /en-EN/code/01/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/01/project/background.png -------------------------------------------------------------------------------- /en-EN/code/02/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/02/project/background.png -------------------------------------------------------------------------------- /en-EN/code/04/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/04/project/background.png -------------------------------------------------------------------------------- /en-EN/code/05/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/05/project/background.png -------------------------------------------------------------------------------- /en-EN/code/06/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/06/project/background.png -------------------------------------------------------------------------------- /en-EN/code/07/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/07/project/background.png -------------------------------------------------------------------------------- /en-EN/code/08/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | export { 6 | encodeText 7 | }; -------------------------------------------------------------------------------- /en-EN/code/08/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/08/project/background.png -------------------------------------------------------------------------------- /en-EN/code/09/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | export { 6 | encodeText 7 | }; -------------------------------------------------------------------------------- /en-EN/code/09/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/09/project/background.png -------------------------------------------------------------------------------- /en-EN/code/11/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/11/project/background.png -------------------------------------------------------------------------------- /en-EN/code/12/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/12/project/background.png -------------------------------------------------------------------------------- /en-EN/code/13/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/13/project/background.png -------------------------------------------------------------------------------- /en-EN/code/14/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/14/project/background.png -------------------------------------------------------------------------------- /en-EN/code/15/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/15/project/background.png -------------------------------------------------------------------------------- /en-EN/code/16/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/16/project/background.png -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /fr-FR/code/01/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/01/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/02/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/02/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/04/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/04/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/05/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/05/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/06/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/06/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/07/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/07/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/08/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | export { 6 | encodeText 7 | }; -------------------------------------------------------------------------------- /fr-FR/code/08/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/08/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/09/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | export { 6 | encodeText 7 | }; -------------------------------------------------------------------------------- /fr-FR/code/09/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/09/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/11/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/11/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/12/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/12/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/13/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/13/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/14/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/14/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/15/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/15/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/16/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/16/project/background.png -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /util/web-extension/web-extension.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/util/web-extension/web-extension.zip -------------------------------------------------------------------------------- /en-EN/code/01/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/02/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/04/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/05/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/06/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/07/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/08/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/09/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/11/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/12/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/13/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/14/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/15/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/16/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/code/final/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/code/final/project/background.png -------------------------------------------------------------------------------- /en-EN/code/final/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/01/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/02/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/04/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/05/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/06/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/07/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/08/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/09/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/11/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/12/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/13/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/14/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/15/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/16/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /fr-FR/code/final/project/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/code/final/project/background.png -------------------------------------------------------------------------------- /fr-FR/code/final/project/properties.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #2c71fa; 3 | --text-color: #fff; 4 | --font-family: Arial, sans-serif; 5 | } -------------------------------------------------------------------------------- /en-EN/dist/presentation-polyglot-png-zip-html_en-EN.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/dist/presentation-polyglot-png-zip-html_en-EN.html -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /fr-FR/dist/presentation-polyglot-png-zip-html_fr-FR.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/dist/presentation-polyglot-png-zip-html_fr-FR.html -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/en-EN/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG/HEAD/fr-FR/reveal/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/index.d.ts: -------------------------------------------------------------------------------- 1 | import { Plugin } from 'vite'; 2 | import { HttpsImportsOptions } from './types'; 3 | export default function (options?: HttpsImportsOptions): Plugin; 4 | export * from './types'; 5 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/index.d.ts: -------------------------------------------------------------------------------- 1 | import { Plugin } from 'vite'; 2 | import { HttpsImportsOptions } from './types'; 3 | export default function (options?: HttpsImportsOptions): Plugin; 4 | export * from './types'; 5 | -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/loader.d.ts: -------------------------------------------------------------------------------- 1 | import { Matcher } from './matcher'; 2 | import { LoggerOptions } from './types'; 3 | export declare function loader(matcher: Matcher, options: LoggerOptions): (id: string) => Promise; 4 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/loader.d.ts: -------------------------------------------------------------------------------- 1 | import { Matcher } from './matcher'; 2 | import { LoggerOptions } from './types'; 3 | export declare function loader(matcher: Matcher, options: LoggerOptions): (id: string) => Promise; 4 | -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/matcher.d.ts: -------------------------------------------------------------------------------- 1 | import { MatcherOptions } from './types'; 2 | export declare function matcher(options: MatcherOptions): (id: string | undefined) => boolean; 3 | export type Matcher = ReturnType; 4 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/matcher.d.ts: -------------------------------------------------------------------------------- 1 | import { MatcherOptions } from './types'; 2 | export declare function matcher(options: MatcherOptions): (id: string | undefined) => boolean; 3 | export type Matcher = ReturnType; 4 | -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/resolver.d.ts: -------------------------------------------------------------------------------- 1 | import { Matcher } from './matcher'; 2 | export declare function resolver(matcher: Matcher): (id: string, importer?: string) => string | undefined; 3 | export type Resolver = ReturnType; 4 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/resolver.d.ts: -------------------------------------------------------------------------------- 1 | import { Matcher } from './matcher'; 2 | export declare function resolver(matcher: Matcher): (id: string, importer?: string) => string | undefined; 3 | export type Resolver = ReturnType; 4 | -------------------------------------------------------------------------------- /en-EN/code/05/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /en-EN/code/06/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /en-EN/code/07/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /en-EN/code/11/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /en-EN/code/12/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /fr-FR/code/05/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /fr-FR/code/06/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /fr-FR/code/07/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /fr-FR/code/11/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /fr-FR/code/12/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | export { 10 | encodeText, 11 | minifyScript 12 | }; -------------------------------------------------------------------------------- /_includes/head-custom.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /util/web-extension/script-proxy.js: -------------------------------------------------------------------------------- 1 | addEventListener("proxy-fetch", async function (event) { 2 | const { url, options } = event.detail; 3 | const response = await chrome.runtime.sendMessage({ type: "proxy-fetch", url, options }); 4 | dispatchEvent(new CustomEvent("proxy-fetch-response", { detail: response })); 5 | }); -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/resolver.js: -------------------------------------------------------------------------------- 1 | export function resolver(matcher) { 2 | return (id, importer) => { 3 | if (matcher(id)) { 4 | return id; 5 | } 6 | else if (matcher(importer)) { 7 | return new URL(id, importer).toString(); 8 | } 9 | return undefined; 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/resolver.js: -------------------------------------------------------------------------------- 1 | export function resolver(matcher) { 2 | return (id, importer) => { 3 | if (matcher(id)) { 4 | return id; 5 | } 6 | else if (matcher(importer)) { 7 | return new URL(id, importer).toString(); 8 | } 9 | return undefined; 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /en-EN/code/03/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import httpsImports from "../lib/vite-plugin-https-imports-esm/index.js"; 3 | 4 | export default defineConfig(() => { 5 | return { 6 | base: "./", 7 | build: { 8 | target: "esnext", 9 | outDir: "../../build/code/03", 10 | }, 11 | plugins: [ 12 | httpsImports() 13 | ], 14 | }; 15 | }); 16 | -------------------------------------------------------------------------------- /en-EN/code/10/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import httpsImports from "../lib/vite-plugin-https-imports-esm/index.js"; 3 | 4 | export default defineConfig(() => { 5 | return { 6 | base: "./", 7 | build: { 8 | target: "esnext", 9 | outDir: "../../build/code/10", 10 | }, 11 | plugins: [ 12 | httpsImports() 13 | ], 14 | }; 15 | }); 16 | -------------------------------------------------------------------------------- /fr-FR/code/03/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import httpsImports from "../lib/vite-plugin-https-imports-esm/index.js"; 3 | 4 | export default defineConfig(() => { 5 | return { 6 | base: "./", 7 | build: { 8 | target: "esnext", 9 | outDir: "../../build/code/03", 10 | }, 11 | plugins: [ 12 | httpsImports() 13 | ], 14 | }; 15 | }); 16 | -------------------------------------------------------------------------------- /fr-FR/code/10/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import httpsImports from "../lib/vite-plugin-https-imports-esm/index.js"; 3 | 4 | export default defineConfig(() => { 5 | return { 6 | base: "./", 7 | build: { 8 | target: "esnext", 9 | outDir: "../../build/code/10", 10 | }, 11 | plugins: [ 12 | httpsImports() 13 | ], 14 | }; 15 | }); 16 | -------------------------------------------------------------------------------- /en-EN/code/10/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 10 7 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /fr-FR/code/10/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 10 7 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /en-EN/reveal/theme/fonts/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('./league-gothic.eot'); 4 | src: url('./league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('./league-gothic.woff') format('woff'), 6 | url('./league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | -------------------------------------------------------------------------------- /fr-FR/reveal/theme/fonts/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('./league-gothic.eot'); 4 | src: url('./league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('./league-gothic.woff') format('woff'), 6 | url('./league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/types.d.ts: -------------------------------------------------------------------------------- 1 | type PatternSingle = string | RegExp | ((id: string) => boolean); 2 | export type Pattern = PatternSingle | PatternSingle[]; 3 | export interface MatcherOptions { 4 | include?: Pattern; 5 | exclude?: Pattern; 6 | } 7 | export interface LoggerOptions { 8 | silent?: boolean; 9 | } 10 | export interface HttpsImportsOptions extends MatcherOptions, LoggerOptions { 11 | } 12 | export {}; 13 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/types.d.ts: -------------------------------------------------------------------------------- 1 | type PatternSingle = string | RegExp | ((id: string) => boolean); 2 | export type Pattern = PatternSingle | PatternSingle[]; 3 | export interface MatcherOptions { 4 | include?: Pattern; 5 | exclude?: Pattern; 6 | } 7 | export interface LoggerOptions { 8 | silent?: boolean; 9 | } 10 | export interface HttpsImportsOptions extends MatcherOptions, LoggerOptions { 11 | } 12 | export {}; 13 | -------------------------------------------------------------------------------- /en-EN/code/02/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | 3 | const PROJECT_FOLDER_NAME = "project"; 4 | const FILENAMES = [ 5 | "index.html", 6 | "style.css", 7 | "properties.css", 8 | "script.js", 9 | "image.png", 10 | "background.png" 11 | ]; 12 | 13 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES); 14 | const linkElement = document.querySelector("a"); 15 | linkElement.href = URL.createObjectURL(new Blob([zipData])); -------------------------------------------------------------------------------- /fr-FR/code/02/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | 3 | const PROJECT_FOLDER_NAME = "project"; 4 | const FILENAMES = [ 5 | "index.html", 6 | "style.css", 7 | "properties.css", 8 | "script.js", 9 | "image.png", 10 | "background.png" 11 | ]; 12 | 13 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES); 14 | const linkElement = document.querySelector("a"); 15 | linkElement.href = URL.createObjectURL(new Blob([zipData])); -------------------------------------------------------------------------------- /en-EN/code/08/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 08 7 | 19 | 20 | 21 | 22 | Download HTML file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/09/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 09 7 | 19 | 20 | 21 | 22 | Download HTML file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/02/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 02 7 | 19 | 20 | 21 | 22 | Download ZIP file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/08/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 08 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/09/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 09 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/index.js: -------------------------------------------------------------------------------- 1 | import { matcher } from './matcher.js'; 2 | import { resolver } from './resolver.js'; 3 | import { loader } from './loader.js'; 4 | export default function (options = {}) { 5 | const match = matcher(options); 6 | return { 7 | name: 'vite-plugin-https-imports-esm', 8 | enforce: 'pre', 9 | apply: 'build', 10 | resolveId: resolver(match), 11 | load: loader(match, options), 12 | }; 13 | } 14 | export * from './types'; 15 | -------------------------------------------------------------------------------- /fr-FR/code/02/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 02 7 | 19 | 20 | 21 | 22 | Télécharger fichier ZIP 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/index.js: -------------------------------------------------------------------------------- 1 | import { matcher } from './matcher.js'; 2 | import { resolver } from './resolver.js'; 3 | import { loader } from './loader.js'; 4 | export default function (options = {}) { 5 | const match = matcher(options); 6 | return { 7 | name: 'vite-plugin-https-imports-esm', 8 | enforce: 'pre', 9 | apply: 'build', 10 | resolveId: resolver(match), 11 | load: loader(match, options), 12 | }; 13 | } 14 | export * from './types'; 15 | -------------------------------------------------------------------------------- /en-EN/code/04/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 04 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/05/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 05 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/06/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 06 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/07/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 07 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/11/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 11 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/12/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 12 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/13/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 13 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP/PNG file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/14/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 14 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP/PNG file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/15/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 15 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP/PNG file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/16/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 16 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP/PNG file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/04/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 04 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/05/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 05 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/06/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 06 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/07/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 07 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/11/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 11 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/12/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 12 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/final/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Final step 7 | 19 | 20 | 21 | 22 | Download HTML/ZIP/PNG file 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/13/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 13 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP/PNG 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/14/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 14 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP/PNG 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/15/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 15 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP/PNG 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/16/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 16 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP/PNG 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /fr-FR/code/final/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Final step 7 | 19 | 20 | 21 | 22 | Télécharger fichier HTML/ZIP/PNG 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /en-EN/code/04/lib/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Encodes a text string into a Uint8Array. 3 | * 4 | * @param {string} text The text string. 5 | * @returns {Uint8Array} The encoded text. 6 | */ 7 | function encodeText(text) { 8 | return new TextEncoder().encode(text); 9 | } 10 | 11 | /** 12 | * Minifies a script by removing whitespace characters. 13 | * 14 | * @param {string} script 15 | * @returns {string} The minified script. 16 | */ 17 | function minifyScript(script) { 18 | return script.replace(/[ \t\n]+/g, " "); 19 | } 20 | 21 | export { 22 | encodeText, 23 | minifyScript 24 | }; -------------------------------------------------------------------------------- /fr-FR/code/04/lib/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Encodes a text string into a Uint8Array. 3 | * 4 | * @param {string} text The text string. 5 | * @returns {Uint8Array} The encoded text. 6 | */ 7 | function encodeText(text) { 8 | return new TextEncoder().encode(text); 9 | } 10 | 11 | /** 12 | * Minifies a script by removing whitespace characters. 13 | * 14 | * @param {string} script 15 | * @returns {string} The minified script. 16 | */ 17 | function minifyScript(script) { 18 | return script.replace(/[ \t\n]+/g, " "); 19 | } 20 | 21 | export { 22 | encodeText, 23 | minifyScript 24 | }; -------------------------------------------------------------------------------- /en-EN/code/14/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | function mergeData(...data) { 10 | const totalLength = data.reduce((total, array) => total + array.length, 0); 11 | const result = new Uint8Array(totalLength); 12 | let offset = 0; 13 | data.forEach(array => { 14 | result.set(array, offset); 15 | offset += array.length; 16 | }); 17 | return result; 18 | } 19 | 20 | export { 21 | encodeText, 22 | minifyScript, 23 | mergeData 24 | }; -------------------------------------------------------------------------------- /en-EN/code/15/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | function mergeData(...data) { 10 | const totalLength = data.reduce((total, array) => total + array.length, 0); 11 | const result = new Uint8Array(totalLength); 12 | let offset = 0; 13 | data.forEach(array => { 14 | result.set(array, offset); 15 | offset += array.length; 16 | }); 17 | return result; 18 | } 19 | 20 | export { 21 | encodeText, 22 | minifyScript, 23 | mergeData 24 | }; -------------------------------------------------------------------------------- /en-EN/code/16/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | function mergeData(...data) { 10 | const totalLength = data.reduce((total, array) => total + array.length, 0); 11 | const result = new Uint8Array(totalLength); 12 | let offset = 0; 13 | data.forEach(array => { 14 | result.set(array, offset); 15 | offset += array.length; 16 | }); 17 | return result; 18 | } 19 | 20 | export { 21 | encodeText, 22 | minifyScript, 23 | mergeData 24 | }; -------------------------------------------------------------------------------- /fr-FR/code/14/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | function mergeData(...data) { 10 | const totalLength = data.reduce((total, array) => total + array.length, 0); 11 | const result = new Uint8Array(totalLength); 12 | let offset = 0; 13 | data.forEach(array => { 14 | result.set(array, offset); 15 | offset += array.length; 16 | }); 17 | return result; 18 | } 19 | 20 | export { 21 | encodeText, 22 | minifyScript, 23 | mergeData 24 | }; -------------------------------------------------------------------------------- /fr-FR/code/15/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | function mergeData(...data) { 10 | const totalLength = data.reduce((total, array) => total + array.length, 0); 11 | const result = new Uint8Array(totalLength); 12 | let offset = 0; 13 | data.forEach(array => { 14 | result.set(array, offset); 15 | offset += array.length; 16 | }); 17 | return result; 18 | } 19 | 20 | export { 21 | encodeText, 22 | minifyScript, 23 | mergeData 24 | }; -------------------------------------------------------------------------------- /fr-FR/code/16/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | function mergeData(...data) { 10 | const totalLength = data.reduce((total, array) => total + array.length, 0); 11 | const result = new Uint8Array(totalLength); 12 | let offset = 0; 13 | data.forEach(array => { 14 | result.set(array, offset); 15 | offset += array.length; 16 | }); 17 | return result; 18 | } 19 | 20 | export { 21 | encodeText, 22 | minifyScript, 23 | mergeData 24 | }; -------------------------------------------------------------------------------- /en-EN/code/final/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | function mergeData(...data) { 10 | const totalLength = data.reduce((total, array) => total + array.length, 0); 11 | const result = new Uint8Array(totalLength); 12 | let offset = 0; 13 | data.forEach(array => { 14 | result.set(array, offset); 15 | offset += array.length; 16 | }); 17 | return result; 18 | } 19 | 20 | export { 21 | encodeText, 22 | minifyScript, 23 | mergeData 24 | }; -------------------------------------------------------------------------------- /fr-FR/code/final/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | function mergeData(...data) { 10 | const totalLength = data.reduce((total, array) => total + array.length, 0); 11 | const result = new Uint8Array(totalLength); 12 | let offset = 0; 13 | data.forEach(array => { 14 | result.set(array, offset); 15 | offset += array.length; 16 | }); 17 | return result; 18 | } 19 | 20 | export { 21 | encodeText, 22 | minifyScript, 23 | mergeData 24 | }; -------------------------------------------------------------------------------- /en-EN/code/03/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 03 7 | 28 | 29 | 30 | 31 | 32 |
33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /fr-FR/code/03/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Step 03 7 | 28 | 29 | 30 | 31 | 32 |
33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /en-EN/code/05/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | `]; 20 | 21 | export default template; -------------------------------------------------------------------------------- /en-EN/code/06/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | `]; 20 | 21 | export default template; -------------------------------------------------------------------------------- /en-EN/code/07/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | `]; 20 | 21 | export default template; -------------------------------------------------------------------------------- /en-EN/code/08/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | BlobWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new BlobWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/matcher.js: -------------------------------------------------------------------------------- 1 | import { minimatch } from 'minimatch'; 2 | function test(pattern, id) { 3 | if (pattern instanceof RegExp) { 4 | return pattern.test(id); 5 | } 6 | else if (typeof pattern === 'function') { 7 | return pattern(id); 8 | } 9 | else if (Array.isArray(pattern)) { 10 | return pattern.some(p => test(p, id)); 11 | } 12 | else { 13 | return minimatch(id, pattern); 14 | } 15 | } 16 | export function matcher(options) { 17 | return (id) => !!id && id.startsWith('https://') 18 | && test(options.include || '**', id) 19 | && !test(options.exclude || [], id); 20 | } 21 | -------------------------------------------------------------------------------- /fr-FR/code/05/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | `]; 20 | 21 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/06/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | `]; 20 | 21 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/07/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | `]; 20 | 21 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/08/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | BlobWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new BlobWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/matcher.js: -------------------------------------------------------------------------------- 1 | import { minimatch } from 'minimatch'; 2 | function test(pattern, id) { 3 | if (pattern instanceof RegExp) { 4 | return pattern.test(id); 5 | } 6 | else if (typeof pattern === 'function') { 7 | return pattern(id); 8 | } 9 | else if (Array.isArray(pattern)) { 10 | return pattern.some(p => test(p, id)); 11 | } 12 | else { 13 | return minimatch(id, pattern); 14 | } 15 | } 16 | export function matcher(options) { 17 | return (id) => !!id && id.startsWith('https://') 18 | && test(options.include || '**', id) 19 | && !test(options.exclude || [], id); 20 | } 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "scripts": { 4 | "build": "cd ./en-EN && ./build.sh && cd ../fr-FR && ./build.sh", 5 | "build-pdf": "npx md-to-pdf SUMMARY.md --document-title 'How to Create HTML/ZIP/PNG Polyglot Files' && cd ./fr-FR && npx md-to-pdf RESUME.md --document-title 'Comment créer des fichiers polyglottes HTML/ZIP/PNG'" 6 | }, 7 | "engines": { 8 | "node": ">=22.0.0" 9 | }, 10 | "devDependencies": { 11 | "axios": "^1.7.9", 12 | "chalk": "^5.4.1", 13 | "inclusion": "^1.0.1", 14 | "md-to-pdf": "^5.2.4", 15 | "minimatch": "^10.0.1", 16 | "ora": "^8.1.1", 17 | "single-file-cli": "^2.0.73", 18 | "vite": "^6.0.6" 19 | } 20 | } -------------------------------------------------------------------------------- /en-EN/code/05/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /en-EN/code/06/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /en-EN/code/07/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /en-EN/code/09/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /fr-FR/code/05/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /fr-FR/code/06/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /fr-FR/code/07/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /fr-FR/code/09/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | const zip = new ZipWriter(zipDataWriter, { offset }); 11 | for (const filename of filenames) { 12 | const path = `${inputFolder}/${filename}`; 13 | const data = await (await fetch(path)).blob(); 14 | await zip.add(filename, new BlobReader(data)); 15 | }; 16 | await zip.close(); 17 | return zipDataWriter.getData(); 18 | } 19 | 20 | export { 21 | getZipData 22 | }; -------------------------------------------------------------------------------- /en-EN/code/16/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/16/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/01/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/02/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/04/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/05/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/06/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/07/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/08/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/09/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/11/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/12/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/13/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/14/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/15/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/final/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/01/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/02/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/04/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/05/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/06/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/07/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/08/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/09/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/11/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/12/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/13/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/14/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/15/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /fr-FR/code/final/project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Démo fichier HTML polyglotte 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Démo fichier HTML polyglotte

14 |
15 |
16 |
17 | Logo de RennesJS 18 |
19 | Communauté des développeurs JavaScript passionnés à Rennes 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /en-EN/code/08/lib/html-template.js: -------------------------------------------------------------------------------- 1 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 2 | 3 | const template = [` 4 | 5 | 6 | 7 | HEX View (UTF-8) 8 | 20 | 21 | 22 |

Please wait...

23 | 24 | 25 | 26 | `]; 27 | 28 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/08/lib/html-template.js: -------------------------------------------------------------------------------- 1 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 2 | 3 | const template = [` 4 | 5 | 6 | 7 | HEX View (UTF-8) 8 | 20 | 21 | 22 |

Please wait...

23 | 24 | 25 | 26 | `]; 27 | 28 | export default template; -------------------------------------------------------------------------------- /en-EN/code/09/lib/html-template.js: -------------------------------------------------------------------------------- 1 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 2 | 3 | const template = [` 4 | 5 | 6 | 7 | HEX View (windows-1252) 8 | 20 | 21 | 22 |

Please wait...

23 | 24 | 25 | 26 | `]; 27 | 28 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/09/lib/html-template.js: -------------------------------------------------------------------------------- 1 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 2 | 3 | const template = [` 4 | 5 | 6 | 7 | HEX View (windows-1252) 8 | 20 | 21 | 22 |

Please wait...

23 | 24 | 25 | 26 | `]; 27 | 28 | export default template; -------------------------------------------------------------------------------- /en-EN/code/04/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | // Set the offset of the first entry 11 | const zip = new ZipWriter(zipDataWriter, { offset }); 12 | for (const filename of filenames) { 13 | const path = `${inputFolder}/${filename}`; 14 | const data = await (await fetch(path)).blob(); 15 | await zip.add(filename, new BlobReader(data)); 16 | }; 17 | await zip.close(); 18 | return zipDataWriter.getData(); 19 | } 20 | 21 | export { 22 | getZipData 23 | }; -------------------------------------------------------------------------------- /fr-FR/code/04/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | async function getZipData(inputFolder, filenames, offset = 0) { 8 | const zipDataWriter = new Uint8ArrayWriter(); 9 | await zipDataWriter.init(); 10 | // Set the offset of the first entry 11 | const zip = new ZipWriter(zipDataWriter, { offset }); 12 | for (const filename of filenames) { 13 | const path = `${inputFolder}/${filename}`; 14 | const data = await (await fetch(path)).blob(); 15 | await zip.add(filename, new BlobReader(data)); 16 | }; 17 | await zip.close(); 18 | return zipDataWriter.getData(); 19 | } 20 | 21 | export { 22 | getZipData 23 | }; -------------------------------------------------------------------------------- /util/web-extension/background.js: -------------------------------------------------------------------------------- 1 | chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { 2 | onMessage(request, sender, sendResponse); 3 | return true; 4 | }); 5 | 6 | async function onMessage(request, sender, sendResponse) { 7 | if (request.type === "proxy-fetch") { 8 | const { url, options } = request; 9 | try { 10 | const response = await fetch(url, options); 11 | sendResponse({ 12 | url, 13 | array: Array.from(new Uint8Array(await response.arrayBuffer())) 14 | }); 15 | 16 | } catch (error) { 17 | sendResponse({ 18 | url, 19 | error: error.message 20 | }); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /en-EN/code/11/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | `]; 21 | 22 | export default template; -------------------------------------------------------------------------------- /en-EN/code/12/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | `]; 21 | 22 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/11/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | `]; 21 | 22 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/12/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | `]; 21 | 22 | export default template; -------------------------------------------------------------------------------- /en-EN/code/13/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | /** 10 | * Merges multiple Uint8Array instances into a single one. 11 | * 12 | * @param {...Uint8Array} data 13 | * @returns {Uint8Array} The merged data. 14 | */ 15 | function mergeData(...data) { 16 | const totalLength = data.reduce((total, array) => total + array.length, 0); 17 | const result = new Uint8Array(totalLength); 18 | let offset = 0; 19 | data.forEach(array => { 20 | result.set(array, offset); 21 | offset += array.length; 22 | }); 23 | return result; 24 | } 25 | 26 | export { 27 | encodeText, 28 | minifyScript, 29 | mergeData 30 | }; -------------------------------------------------------------------------------- /fr-FR/code/13/lib/utils.js: -------------------------------------------------------------------------------- 1 | function encodeText(text) { 2 | return new TextEncoder().encode(text); 3 | } 4 | 5 | function minifyScript(script) { 6 | return script.replace(/[ \t\n]+/g, " "); 7 | } 8 | 9 | /** 10 | * Merges multiple Uint8Array instances into a single one. 11 | * 12 | * @param {...Uint8Array} data 13 | * @returns {Uint8Array} The merged data. 14 | */ 15 | function mergeData(...data) { 16 | const totalLength = data.reduce((total, array) => total + array.length, 0); 17 | const result = new Uint8Array(totalLength); 18 | let offset = 0; 19 | data.forEach(array => { 20 | result.set(array, offset); 21 | offset += array.length; 22 | }); 23 | return result; 24 | } 25 | 26 | export { 27 | encodeText, 28 | minifyScript, 29 | mergeData 30 | }; -------------------------------------------------------------------------------- /en-EN/code/04/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | // The zip.js script 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | // The main script for the page extraction 5 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 6 | 7 | // The HTML template for the output file 8 | const template = [` 9 | 10 | 11 | 12 | Please wait... 13 | 14 | 15 | 16 | 17 |

Please wait...

18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/04/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | // The zip.js script 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | // The main script for the page extraction 5 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 6 | 7 | // The HTML template for the output file 8 | const template = [` 9 | 10 | 11 | 12 | Please wait... 13 | 14 | 15 | 16 | 17 |

Please wait...

18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /en-EN/code/13/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /en-EN/code/14/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /en-EN/code/15/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /en-EN/code/16/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/13/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/14/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/15/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/16/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /en-EN/code/final/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /fr-FR/code/final/lib/html-template.js: -------------------------------------------------------------------------------- 1 | import { minifyScript } from "./utils.js"; 2 | 3 | const ZIP_JS_SCRIPT = await (await fetch("assets/zip.min.js")).text(); 4 | const MAIN_SCRIPT = await (await fetch("assets/main.js")).text(); 5 | 6 | const template = [` 7 | 8 | 9 | 10 | Please wait... 11 | 12 | 13 | 14 | 15 |

Please wait...

16 | 17 | 18 | 19 | 20 | 21 | `]; 22 | 23 | export default template; -------------------------------------------------------------------------------- /en-EN/code/05/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /en-EN/code/06/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /en-EN/code/07/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /en-EN/code/08/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /en-EN/code/09/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /fr-FR/code/05/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /fr-FR/code/06/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /fr-FR/code/07/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /fr-FR/code/08/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /fr-FR/code/09/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]) 25 | ], { type: "text/html" }); 26 | const linkElement = document.querySelector("a"); 27 | linkElement.href = URL.createObjectURL(result); 28 | } -------------------------------------------------------------------------------- /en-EN/code/02/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | /** 8 | * Returns a zip file containing the files in the input folder with the given 9 | * filenames. 10 | * 11 | * @param {string} inputFolder The input folder. 12 | * @param {string[]} filenames The filenames. 13 | * @returns {Promise} The zip file. 14 | */ 15 | async function getZipData(inputFolder, filenames) { 16 | const zipDataWriter = new Uint8ArrayWriter(); 17 | const zip = new ZipWriter(zipDataWriter); 18 | for (const filename of filenames) { 19 | const path = `${inputFolder}/${filename}`; 20 | const data = await (await fetch(path)).blob(); 21 | await zip.add(filename, new BlobReader(data)); 22 | }; 23 | await zip.close(); 24 | return zipDataWriter.getData(); 25 | } 26 | 27 | export { 28 | getZipData 29 | }; -------------------------------------------------------------------------------- /fr-FR/code/02/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | /** 8 | * Returns a zip file containing the files in the input folder with the given 9 | * filenames. 10 | * 11 | * @param {string} inputFolder The input folder. 12 | * @param {string[]} filenames The filenames. 13 | * @returns {Promise} The zip file. 14 | */ 15 | async function getZipData(inputFolder, filenames) { 16 | const zipDataWriter = new Uint8ArrayWriter(); 17 | const zip = new ZipWriter(zipDataWriter); 18 | for (const filename of filenames) { 19 | const path = `${inputFolder}/${filename}`; 20 | const data = await (await fetch(path)).blob(); 21 | await zip.add(filename, new BlobReader(data)); 22 | }; 23 | await zip.close(); 24 | return zipDataWriter.getData(); 25 | } 26 | 27 | export { 28 | getZipData 29 | }; -------------------------------------------------------------------------------- /util/web-extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Support fetch from filesystem", 4 | "version": "1.0", 5 | "description": "Support fetch from filesystem", 6 | "background": { 7 | "service_worker": "background.js" 8 | }, 9 | "content_scripts": [ 10 | { 11 | "matches": [ 12 | "" 13 | ], 14 | "run_at": "document_start", 15 | "js": [ 16 | "script-proxy.js" 17 | ] 18 | }, 19 | { 20 | "matches": [ 21 | "" 22 | ], 23 | "run_at": "document_start", 24 | "js": [ 25 | "script.js" 26 | ], 27 | "world": "MAIN" 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /en-EN/code/12/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData, getConsolidationData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]), 25 | getConsolidationData(zipData), 26 | encodeText(HTML_PARTS[2]) 27 | ], { type: "text/html" }); 28 | const linkElement = document.querySelector("a"); 29 | linkElement.href = URL.createObjectURL(result); 30 | } -------------------------------------------------------------------------------- /fr-FR/code/12/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData, getConsolidationData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]), 25 | getConsolidationData(zipData), 26 | encodeText(HTML_PARTS[2]) 27 | ], { type: "text/html" }); 28 | const linkElement = document.querySelector("a"); 29 | linkElement.href = URL.createObjectURL(result); 30 | } -------------------------------------------------------------------------------- /en-EN/code/04/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | /** 18 | * Creates a zip file from the files in the input folder and the given 19 | * filenames. 20 | */ 21 | async function main() { 22 | const htmlPart0 = encodeText(HTML_PARTS[0]); 23 | const zipOffset = htmlPart0.length; 24 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 25 | const result = new Blob([ 26 | htmlPart0, 27 | zipData, 28 | encodeText(HTML_PARTS[1]) 29 | ], { type: "text/html" }); 30 | const linkElement = document.querySelector("a"); 31 | linkElement.href = URL.createObjectURL(result); 32 | } -------------------------------------------------------------------------------- /fr-FR/code/04/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | /** 18 | * Creates a zip file from the files in the input folder and the given 19 | * filenames. 20 | */ 21 | async function main() { 22 | const htmlPart0 = encodeText(HTML_PARTS[0]); 23 | const zipOffset = htmlPart0.length; 24 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 25 | const result = new Blob([ 26 | htmlPart0, 27 | zipData, 28 | encodeText(HTML_PARTS[1]) 29 | ], { type: "text/html" }); 30 | const linkElement = document.querySelector("a"); 31 | linkElement.href = URL.createObjectURL(result); 32 | } -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/loader.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import inclusion from 'inclusion'; 3 | export function loader(matcher, options) { 4 | return async (id) => { 5 | if (matcher(id)) { 6 | const chalk = (await inclusion('chalk')).default; 7 | const ora = (await inclusion('ora')).default; 8 | const loading = ora({ 9 | text: chalk.dim('downloading ') + chalk.hex('1450A3')(id), 10 | isSilent: options.silent 11 | }).start(); 12 | try { 13 | const { data } = await axios.get(id); 14 | loading.succeed(chalk.dim('downloaded ') + chalk.hex('1450A3')(id)); 15 | return data; 16 | } 17 | catch (error) { 18 | loading.fail(chalk.hex('C70039')('failed to download ') + chalk.hex('FF6969')(id)); 19 | throw error; 20 | } 21 | } 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/loader.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import inclusion from 'inclusion'; 3 | export function loader(matcher, options) { 4 | return async (id) => { 5 | if (matcher(id)) { 6 | const chalk = (await inclusion('chalk')).default; 7 | const ora = (await inclusion('ora')).default; 8 | const loading = ora({ 9 | text: chalk.dim('downloading ') + chalk.hex('1450A3')(id), 10 | isSilent: options.silent 11 | }).start(); 12 | try { 13 | const { data } = await axios.get(id); 14 | loading.succeed(chalk.dim('downloaded ') + chalk.hex('1450A3')(id)); 15 | return data; 16 | } 17 | catch (error) { 18 | loading.fail(chalk.hex('C70039')('failed to download ') + chalk.hex('FF6969')(id)); 19 | throw error; 20 | } 21 | } 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /en-EN/reveal/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v4.0 | 20180602 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | main, menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, main, menu, nav, section { 29 | display: block; 30 | } -------------------------------------------------------------------------------- /fr-FR/reveal/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v4.0 | 20180602 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | main, menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, main, menu, nav, section { 29 | display: block; 30 | } -------------------------------------------------------------------------------- /en-EN/code/11/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData, getConsolidationData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]), 25 | // Generate and write consolidation data to the page 26 | getConsolidationData(zipData), 27 | encodeText(HTML_PARTS[2]) 28 | ], { type: "text/html" }); 29 | const linkElement = document.querySelector("a"); 30 | linkElement.href = URL.createObjectURL(result); 31 | } -------------------------------------------------------------------------------- /fr-FR/code/11/index.js: -------------------------------------------------------------------------------- 1 | import { getZipData, getConsolidationData } from "./lib/utils-zip.js"; 2 | import { encodeText } from "./lib/utils.js"; 3 | import HTML_PARTS from "./lib/html-template.js"; 4 | 5 | const PROJECT_FOLDER_NAME = "project"; 6 | const FILENAMES = [ 7 | "index.html", 8 | "style.css", 9 | "properties.css", 10 | "script.js", 11 | "image.png", 12 | "background.png" 13 | ]; 14 | 15 | await main(); 16 | 17 | async function main() { 18 | const htmlPart0 = encodeText(HTML_PARTS[0]); 19 | const zipOffset = htmlPart0.length; 20 | const zipData = await getZipData(PROJECT_FOLDER_NAME, FILENAMES, zipOffset); 21 | const result = new Blob([ 22 | htmlPart0, 23 | zipData, 24 | encodeText(HTML_PARTS[1]), 25 | // Generate and write consolidation data to the page 26 | getConsolidationData(zipData), 27 | encodeText(HTML_PARTS[2]) 28 | ], { type: "text/html" }); 29 | const linkElement = document.querySelector("a"); 30 | linkElement.href = URL.createObjectURL(result); 31 | } -------------------------------------------------------------------------------- /en-EN/code/03/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipReader, 3 | BlobReader, 4 | BlobWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | const fileInput = document.querySelector("input"); 8 | const mainElement = document.querySelector("main"); 9 | 10 | fileInput.onchange = async () => { 11 | const file = fileInput.files[0]; 12 | if (file) { 13 | await extractResources(file); 14 | } 15 | }; 16 | 17 | /** 18 | * Extract resources from the input zip file and display them as links in the 19 | * main element. 20 | * 21 | * @param {Blob} zipData The input zip file. 22 | */ 23 | async function extractResources(zipData) { 24 | const zipReader = new ZipReader(new BlobReader(zipData)); 25 | const entries = await zipReader.getEntries(); 26 | for (const entry of entries) { 27 | const blob = await entry.getData(new BlobWriter()); 28 | const linkElement = document.createElement("a"); 29 | linkElement.href = URL.createObjectURL(blob); 30 | linkElement.textContent = linkElement.download = entry.filename; 31 | mainElement.appendChild(linkElement); 32 | } 33 | await zipReader.close(); 34 | } -------------------------------------------------------------------------------- /fr-FR/code/03/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipReader, 3 | BlobReader, 4 | BlobWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | 7 | const fileInput = document.querySelector("input"); 8 | const mainElement = document.querySelector("main"); 9 | 10 | fileInput.onchange = async () => { 11 | const file = fileInput.files[0]; 12 | if (file) { 13 | await extractResources(file); 14 | } 15 | }; 16 | 17 | /** 18 | * Extract resources from the input zip file and display them as links in the 19 | * main element. 20 | * 21 | * @param {Blob} zipData The input zip file. 22 | */ 23 | async function extractResources(zipData) { 24 | const zipReader = new ZipReader(new BlobReader(zipData)); 25 | const entries = await zipReader.getEntries(); 26 | for (const entry of entries) { 27 | const blob = await entry.getData(new BlobWriter()); 28 | const linkElement = document.createElement("a"); 29 | linkElement.href = URL.createObjectURL(blob); 30 | linkElement.textContent = linkElement.download = entry.filename; 31 | mainElement.appendChild(linkElement); 32 | } 33 | await zipReader.close(); 34 | } -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Gildas Lormeau 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /en-EN/code/lib/vite-plugin-https-imports-esm/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Eugene Ghanizadeh Khoub 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /fr-FR/code/lib/vite-plugin-https-imports-esm/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Eugene Ghanizadeh Khoub 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /en-EN/code/08/assets/main.js: -------------------------------------------------------------------------------- 1 | await main(); 2 | 3 | async function main() { 4 | displayData(); 5 | } 6 | 7 | function displayData() { 8 | const bodyChildNodes = Array.from(document.body.childNodes); 9 | const commentNode = bodyChildNodes.find( 10 | node => node.nodeType === Node.COMMENT_NODE); 11 | const zipData = commentNode.nodeValue; 12 | let result = ""; 13 | let columnIndex = 0; 14 | for (let indexZipData = 0; indexZipData < zipData.length; indexZipData++) { 15 | const charChodeHex = getCharCodeHex(zipData, indexZipData); 16 | result += charChodeHex + " "; 17 | columnIndex++; 18 | if (columnIndex === 16) { 19 | result += "\n"; 20 | columnIndex = 0; 21 | } 22 | if (columnIndex === 8) { 23 | result += " "; 24 | } 25 | } 26 | document.body.innerHTML = result; 27 | } 28 | 29 | function getCharCodeHex(data, index) { 30 | const charCode = data.charCodeAt(index); 31 | if (charCode < 256) { 32 | return charCode.toString(16).padStart(2, "0"); 33 | } else { 34 | if (charCode === 0xFFFD) { 35 | return ` `; 36 | } else { 37 | return ` `; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /en-EN/code/09/assets/main.js: -------------------------------------------------------------------------------- 1 | await main(); 2 | 3 | async function main() { 4 | displayData(); 5 | } 6 | 7 | function displayData() { 8 | const bodyChildNodes = Array.from(document.body.childNodes); 9 | const commentNode = bodyChildNodes.find( 10 | node => node.nodeType === Node.COMMENT_NODE); 11 | const zipData = commentNode.nodeValue; 12 | let result = ""; 13 | let columnIndex = 0; 14 | for (let indexZipData = 0; indexZipData < zipData.length; indexZipData++) { 15 | const charChodeHex = getCharCodeHex(zipData, indexZipData); 16 | result += charChodeHex + " "; 17 | columnIndex++; 18 | if (columnIndex === 16) { 19 | result += "\n"; 20 | columnIndex = 0; 21 | } 22 | if (columnIndex === 8) { 23 | result += " "; 24 | } 25 | } 26 | document.body.innerHTML = result; 27 | } 28 | 29 | function getCharCodeHex(data, index) { 30 | const charCode = data.charCodeAt(index); 31 | if (charCode < 256) { 32 | return charCode.toString(16).padStart(2, "0"); 33 | } else { 34 | if (charCode === 0xFFFD) { 35 | return ` `; 36 | } else { 37 | return ` `; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /fr-FR/code/08/assets/main.js: -------------------------------------------------------------------------------- 1 | await main(); 2 | 3 | async function main() { 4 | displayData(); 5 | } 6 | 7 | function displayData() { 8 | const bodyChildNodes = Array.from(document.body.childNodes); 9 | const commentNode = bodyChildNodes.find( 10 | node => node.nodeType === Node.COMMENT_NODE); 11 | const zipData = commentNode.nodeValue; 12 | let result = ""; 13 | let columnIndex = 0; 14 | for (let indexZipData = 0; indexZipData < zipData.length; indexZipData++) { 15 | const charChodeHex = getCharCodeHex(zipData, indexZipData); 16 | result += charChodeHex + " "; 17 | columnIndex++; 18 | if (columnIndex === 16) { 19 | result += "\n"; 20 | columnIndex = 0; 21 | } 22 | if (columnIndex === 8) { 23 | result += " "; 24 | } 25 | } 26 | document.body.innerHTML = result; 27 | } 28 | 29 | function getCharCodeHex(data, index) { 30 | const charCode = data.charCodeAt(index); 31 | if (charCode < 256) { 32 | return charCode.toString(16).padStart(2, "0"); 33 | } else { 34 | if (charCode === 0xFFFD) { 35 | return ` `; 36 | } else { 37 | return ` `; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /fr-FR/code/09/assets/main.js: -------------------------------------------------------------------------------- 1 | await main(); 2 | 3 | async function main() { 4 | displayData(); 5 | } 6 | 7 | function displayData() { 8 | const bodyChildNodes = Array.from(document.body.childNodes); 9 | const commentNode = bodyChildNodes.find( 10 | node => node.nodeType === Node.COMMENT_NODE); 11 | const zipData = commentNode.nodeValue; 12 | let result = ""; 13 | let columnIndex = 0; 14 | for (let indexZipData = 0; indexZipData < zipData.length; indexZipData++) { 15 | const charChodeHex = getCharCodeHex(zipData, indexZipData); 16 | result += charChodeHex + " "; 17 | columnIndex++; 18 | if (columnIndex === 16) { 19 | result += "\n"; 20 | columnIndex = 0; 21 | } 22 | if (columnIndex === 8) { 23 | result += " "; 24 | } 25 | } 26 | document.body.innerHTML = result; 27 | } 28 | 29 | function getCharCodeHex(data, index) { 30 | const charCode = data.charCodeAt(index); 31 | if (charCode < 256) { 32 | return charCode.toString(16).padStart(2, "0"); 33 | } else { 34 | if (charCode === 0xFFFD) { 35 | return ` `; 36 | } else { 37 | return ` `; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /util/web-extension/script.js: -------------------------------------------------------------------------------- 1 | const { fetch } = globalThis; 2 | 3 | globalThis.fetch = async (url, options) => { 4 | url = new URL(url, location.href).href; 5 | if (url.startsWith("file://")) { 6 | return new Promise((resolve, reject) => { 7 | addEventListener("proxy-fetch-response", onResponse); 8 | dispatchEvent(new CustomEvent("proxy-fetch", { 9 | detail: { url, options } 10 | })); 11 | 12 | function onResponse(event) { 13 | const { detail: response } = event; 14 | if (response.url === url) { 15 | if (response.error) { 16 | reject(new Error(response.error)); 17 | } else { 18 | const { array } = response; 19 | response.blob = async () => new Blob([new Uint8Array(array)]); 20 | delete response.array; 21 | delete response.url; 22 | resolve(response); 23 | removeEventListener("proxy-fetch-response", onResponse); 24 | } 25 | } 26 | } 27 | }); 28 | } else { 29 | return fetch(url, options); 30 | } 31 | }; -------------------------------------------------------------------------------- /en-EN/plugin/highlight/monokai.css: -------------------------------------------------------------------------------- 1 | /* 2 | Monokai style - ported by Luigi Maselli - http://grigio.org 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #272822; 10 | color: #ddd; 11 | } 12 | 13 | .hljs-tag, 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal, 17 | .hljs-strong, 18 | .hljs-name { 19 | color: #f92672; 20 | } 21 | 22 | .hljs-code { 23 | color: #66d9ef; 24 | } 25 | 26 | .hljs-class .hljs-title { 27 | color: white; 28 | } 29 | 30 | .hljs-attribute, 31 | .hljs-symbol, 32 | .hljs-regexp, 33 | .hljs-link { 34 | color: #bf79db; 35 | } 36 | 37 | .hljs-string, 38 | .hljs-bullet, 39 | .hljs-subst, 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-emphasis, 43 | .hljs-type, 44 | .hljs-built_in, 45 | .hljs-builtin-name, 46 | .hljs-selector-attr, 47 | .hljs-selector-pseudo, 48 | .hljs-addition, 49 | .hljs-variable, 50 | .hljs-template-tag, 51 | .hljs-template-variable { 52 | color: #a6e22e; 53 | } 54 | 55 | .hljs-comment, 56 | .hljs-quote, 57 | .hljs-deletion, 58 | .hljs-meta { 59 | color: #75715e; 60 | } 61 | 62 | .hljs-keyword, 63 | .hljs-selector-tag, 64 | .hljs-literal, 65 | .hljs-doctag, 66 | .hljs-title, 67 | .hljs-section, 68 | .hljs-type, 69 | .hljs-selector-id { 70 | font-weight: bold; 71 | } 72 | -------------------------------------------------------------------------------- /fr-FR/plugin/highlight/monokai.css: -------------------------------------------------------------------------------- 1 | /* 2 | Monokai style - ported by Luigi Maselli - http://grigio.org 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #272822; 10 | color: #ddd; 11 | } 12 | 13 | .hljs-tag, 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal, 17 | .hljs-strong, 18 | .hljs-name { 19 | color: #f92672; 20 | } 21 | 22 | .hljs-code { 23 | color: #66d9ef; 24 | } 25 | 26 | .hljs-class .hljs-title { 27 | color: white; 28 | } 29 | 30 | .hljs-attribute, 31 | .hljs-symbol, 32 | .hljs-regexp, 33 | .hljs-link { 34 | color: #bf79db; 35 | } 36 | 37 | .hljs-string, 38 | .hljs-bullet, 39 | .hljs-subst, 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-emphasis, 43 | .hljs-type, 44 | .hljs-built_in, 45 | .hljs-builtin-name, 46 | .hljs-selector-attr, 47 | .hljs-selector-pseudo, 48 | .hljs-addition, 49 | .hljs-variable, 50 | .hljs-template-tag, 51 | .hljs-template-variable { 52 | color: #a6e22e; 53 | } 54 | 55 | .hljs-comment, 56 | .hljs-quote, 57 | .hljs-deletion, 58 | .hljs-meta { 59 | color: #75715e; 60 | } 61 | 62 | .hljs-keyword, 63 | .hljs-selector-tag, 64 | .hljs-literal, 65 | .hljs-doctag, 66 | .hljs-title, 67 | .hljs-section, 68 | .hljs-type, 69 | .hljs-selector-id { 70 | font-weight: bold; 71 | } 72 | -------------------------------------------------------------------------------- /en-EN/plugin/highlight/kimbie-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Kimbie (light) 3 | Author: Jan T. Sott 4 | License: Creative Commons Attribution-ShareAlike 4.0 Unported License 5 | URL: https://github.com/idleberg/Kimbie-highlight.js 6 | */ 7 | 8 | .hljs { 9 | background: #fbebd4; 10 | color: #84613d; 11 | } 12 | 13 | /* Kimbie Comment */ 14 | .hljs-comment, 15 | .hljs-quote { 16 | color: #a57a4c; 17 | } 18 | 19 | /* Kimbie Red */ 20 | .hljs-variable, 21 | .hljs-template-variable, 22 | .hljs-tag, 23 | .hljs-name, 24 | .hljs-selector-id, 25 | .hljs-selector-class, 26 | .hljs-regexp, 27 | .hljs-meta { 28 | color: #dc3958; 29 | } 30 | 31 | /* Kimbie Orange */ 32 | .hljs-number, 33 | .hljs-built_in, 34 | .hljs-literal, 35 | .hljs-type, 36 | .hljs-params, 37 | .hljs-deletion, 38 | .hljs-link { 39 | color: #f79a32; 40 | } 41 | 42 | /* Kimbie Green */ 43 | .hljs-string, 44 | .hljs-symbol, 45 | .hljs-bullet, 46 | .hljs-addition { 47 | color: #889b4a; 48 | } 49 | 50 | /* Kimbie Purple */ 51 | .hljs-keyword, 52 | .hljs-selector-tag, 53 | .hljs-function { 54 | color: #98676a; 55 | } 56 | 57 | /* Kimbie Yellow */ 58 | .hljs-title, 59 | .hljs-section, 60 | .hljs-attribute { 61 | color: #f06431; 62 | } 63 | 64 | .hljs-emphasis { 65 | font-style: italic; 66 | } 67 | 68 | .hljs-strong { 69 | font-weight: bold; 70 | } 71 | -------------------------------------------------------------------------------- /en-EN/plugin/highlight/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /fr-FR/plugin/highlight/kimbie-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Kimbie (light) 3 | Author: Jan T. Sott 4 | License: Creative Commons Attribution-ShareAlike 4.0 Unported License 5 | URL: https://github.com/idleberg/Kimbie-highlight.js 6 | */ 7 | 8 | .hljs { 9 | background: #fbebd4; 10 | color: #84613d; 11 | } 12 | 13 | /* Kimbie Comment */ 14 | .hljs-comment, 15 | .hljs-quote { 16 | color: #a57a4c; 17 | } 18 | 19 | /* Kimbie Red */ 20 | .hljs-variable, 21 | .hljs-template-variable, 22 | .hljs-tag, 23 | .hljs-name, 24 | .hljs-selector-id, 25 | .hljs-selector-class, 26 | .hljs-regexp, 27 | .hljs-meta { 28 | color: #dc3958; 29 | } 30 | 31 | /* Kimbie Orange */ 32 | .hljs-number, 33 | .hljs-built_in, 34 | .hljs-literal, 35 | .hljs-type, 36 | .hljs-params, 37 | .hljs-deletion, 38 | .hljs-link { 39 | color: #f79a32; 40 | } 41 | 42 | /* Kimbie Green */ 43 | .hljs-string, 44 | .hljs-symbol, 45 | .hljs-bullet, 46 | .hljs-addition { 47 | color: #889b4a; 48 | } 49 | 50 | /* Kimbie Purple */ 51 | .hljs-keyword, 52 | .hljs-selector-tag, 53 | .hljs-function { 54 | color: #98676a; 55 | } 56 | 57 | /* Kimbie Yellow */ 58 | .hljs-title, 59 | .hljs-section, 60 | .hljs-attribute { 61 | color: #f06431; 62 | } 63 | 64 | .hljs-emphasis { 65 | font-style: italic; 66 | } 67 | 68 | .hljs-strong { 69 | font-weight: bold; 70 | } 71 | -------------------------------------------------------------------------------- /fr-FR/plugin/highlight/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /en-EN/code/12/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /en-EN/code/13/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /en-EN/code/14/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /en-EN/code/15/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /en-EN/code/16/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /fr-FR/code/12/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /fr-FR/code/13/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /fr-FR/code/14/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /fr-FR/code/15/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /fr-FR/code/16/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /en-EN/code/final/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /fr-FR/code/final/lib/utils-zip.js: -------------------------------------------------------------------------------- 1 | import { 2 | ZipWriter, 3 | BlobReader, 4 | Uint8ArrayWriter 5 | } from "https://unpkg.com/@zip.js/zip.js@2.7.52/index.js"; 6 | import { 7 | encodeText 8 | } from "./utils.js"; 9 | 10 | const CARRIAGE_RETURN_CHAR_CODE = 13; 11 | const LINE_FEED_CHAR_CODE = 10; 12 | 13 | async function getZipData(inputFolder, filenames, offset = 0) { 14 | const zipDataWriter = new Uint8ArrayWriter(); 15 | await zipDataWriter.init(); 16 | const zip = new ZipWriter(zipDataWriter, { offset }); 17 | for (const filename of filenames) { 18 | const path = `${inputFolder}/${filename}`; 19 | const data = await (await fetch(path)).blob(); 20 | await zip.add(filename, new BlobReader(data)); 21 | }; 22 | await zip.close(); 23 | return zipDataWriter.getData(); 24 | } 25 | 26 | function getConsolidationData(zipData) { 27 | const insertionsCRLF = []; 28 | const substitutionsLF = []; 29 | for (let index = 0; index < zipData.length; index++) { 30 | if (zipData[index] === CARRIAGE_RETURN_CHAR_CODE) { 31 | if (zipData[index + 1] === LINE_FEED_CHAR_CODE) { 32 | insertionsCRLF.push(index); 33 | index++; 34 | } else { 35 | substitutionsLF.push(index); 36 | } 37 | } 38 | } 39 | return encodeText(JSON.stringify([insertionsCRLF, substitutionsLF])); 40 | } 41 | 42 | export { 43 | getZipData, 44 | getConsolidationData 45 | }; -------------------------------------------------------------------------------- /en-EN/code/01/project/style.css: -------------------------------------------------------------------------------- 1 | @import url(properties.css); 2 | 3 | html, 4 | body, 5 | main, 6 | figure { 7 | display: flex; 8 | flex-direction: column; 9 | align-items: center; 10 | } 11 | 12 | html { 13 | background-color: var(--background-color); 14 | color: var(--text-color); 15 | font-family: var(--font-family); 16 | height: 100%; 17 | background-image: url(background.png); 18 | animation: scroll-background 30s linear infinite; 19 | } 20 | 21 | @keyframes scroll-background { 22 | 0% { 23 | background-position: 0 320px; 24 | } 25 | 26 | 100% { 27 | background-position: 480px 0; 28 | } 29 | } 30 | 31 | body, 32 | main, 33 | figure { 34 | flex: 1; 35 | } 36 | 37 | h1, 38 | figcaption { 39 | padding-block: .5em; 40 | padding-inline: 1em; 41 | text-align: center; 42 | text-shadow: .05em 0 black, 0 .05em black, -.05em 0 black, 0 -.05em black; 43 | backdrop-filter: brightness(60%); 44 | } 45 | 46 | h1 { 47 | margin-block-start: 2em; 48 | font-size: min(5vw, 2em); 49 | } 50 | 51 | figure { 52 | justify-content: space-around; 53 | } 54 | 55 | figcaption { 56 | margin-block-start: 1em; 57 | } 58 | 59 | figcaption, figcaption > button { 60 | font-size: min(3vw, 1.25em); 61 | } 62 | 63 | img { 64 | max-width: 33vw; 65 | max-height: 33vh; 66 | } 67 | 68 | button { 69 | cursor: pointer; 70 | border: 0; 71 | background-color: inherit; 72 | } 73 | 74 | button::after { 75 | content: "👋"; 76 | } -------------------------------------------------------------------------------- /en-EN/code/02/project/style.css: -------------------------------------------------------------------------------- 1 | @import url(properties.css); 2 | 3 | html, 4 | body, 5 | main, 6 | figure { 7 | display: flex; 8 | flex-direction: column; 9 | align-items: center; 10 | } 11 | 12 | html { 13 | background-color: var(--background-color); 14 | color: var(--text-color); 15 | font-family: var(--font-family); 16 | height: 100%; 17 | background-image: url(background.png); 18 | animation: scroll-background 30s linear infinite; 19 | } 20 | 21 | @keyframes scroll-background { 22 | 0% { 23 | background-position: 0 320px; 24 | } 25 | 26 | 100% { 27 | background-position: 480px 0; 28 | } 29 | } 30 | 31 | body, 32 | main, 33 | figure { 34 | flex: 1; 35 | } 36 | 37 | h1, 38 | figcaption { 39 | padding-block: .5em; 40 | padding-inline: 1em; 41 | text-align: center; 42 | text-shadow: .05em 0 black, 0 .05em black, -.05em 0 black, 0 -.05em black; 43 | backdrop-filter: brightness(60%); 44 | } 45 | 46 | h1 { 47 | margin-block-start: 2em; 48 | font-size: min(5vw, 2em); 49 | } 50 | 51 | figure { 52 | justify-content: space-around; 53 | } 54 | 55 | figcaption { 56 | margin-block-start: 1em; 57 | } 58 | 59 | figcaption, figcaption > button { 60 | font-size: min(3vw, 1.25em); 61 | } 62 | 63 | img { 64 | max-width: 33vw; 65 | max-height: 33vh; 66 | } 67 | 68 | button { 69 | cursor: pointer; 70 | border: 0; 71 | background-color: inherit; 72 | } 73 | 74 | button::after { 75 | content: "👋"; 76 | } -------------------------------------------------------------------------------- /en-EN/code/04/project/style.css: -------------------------------------------------------------------------------- 1 | @import url(properties.css); 2 | 3 | html, 4 | body, 5 | main, 6 | figure { 7 | display: flex; 8 | flex-direction: column; 9 | align-items: center; 10 | } 11 | 12 | html { 13 | background-color: var(--background-color); 14 | color: var(--text-color); 15 | font-family: var(--font-family); 16 | height: 100%; 17 | background-image: url(background.png); 18 | animation: scroll-background 30s linear infinite; 19 | } 20 | 21 | @keyframes scroll-background { 22 | 0% { 23 | background-position: 0 320px; 24 | } 25 | 26 | 100% { 27 | background-position: 480px 0; 28 | } 29 | } 30 | 31 | body, 32 | main, 33 | figure { 34 | flex: 1; 35 | } 36 | 37 | h1, 38 | figcaption { 39 | padding-block: .5em; 40 | padding-inline: 1em; 41 | text-align: center; 42 | text-shadow: .05em 0 black, 0 .05em black, -.05em 0 black, 0 -.05em black; 43 | backdrop-filter: brightness(60%); 44 | } 45 | 46 | h1 { 47 | margin-block-start: 2em; 48 | font-size: min(5vw, 2em); 49 | } 50 | 51 | figure { 52 | justify-content: space-around; 53 | } 54 | 55 | figcaption { 56 | margin-block-start: 1em; 57 | } 58 | 59 | figcaption, figcaption > button { 60 | font-size: min(3vw, 1.25em); 61 | } 62 | 63 | img { 64 | max-width: 33vw; 65 | max-height: 33vh; 66 | } 67 | 68 | button { 69 | cursor: pointer; 70 | border: 0; 71 | background-color: inherit; 72 | } 73 | 74 | button::after { 75 | content: "👋"; 76 | } -------------------------------------------------------------------------------- /en-EN/code/05/project/style.css: -------------------------------------------------------------------------------- 1 | @import url(properties.css); 2 | 3 | html, 4 | body, 5 | main, 6 | figure { 7 | display: flex; 8 | flex-direction: column; 9 | align-items: center; 10 | } 11 | 12 | html { 13 | background-color: var(--background-color); 14 | color: var(--text-color); 15 | font-family: var(--font-family); 16 | height: 100%; 17 | background-image: url(background.png); 18 | animation: scroll-background 30s linear infinite; 19 | } 20 | 21 | @keyframes scroll-background { 22 | 0% { 23 | background-position: 0 320px; 24 | } 25 | 26 | 100% { 27 | background-position: 480px 0; 28 | } 29 | } 30 | 31 | body, 32 | main, 33 | figure { 34 | flex: 1; 35 | } 36 | 37 | h1, 38 | figcaption { 39 | padding-block: .5em; 40 | padding-inline: 1em; 41 | text-align: center; 42 | text-shadow: .05em 0 black, 0 .05em black, -.05em 0 black, 0 -.05em black; 43 | backdrop-filter: brightness(60%); 44 | } 45 | 46 | h1 { 47 | margin-block-start: 2em; 48 | font-size: min(5vw, 2em); 49 | } 50 | 51 | figure { 52 | justify-content: space-around; 53 | } 54 | 55 | figcaption { 56 | margin-block-start: 1em; 57 | } 58 | 59 | figcaption, figcaption > button { 60 | font-size: min(3vw, 1.25em); 61 | } 62 | 63 | img { 64 | max-width: 33vw; 65 | max-height: 33vh; 66 | } 67 | 68 | button { 69 | cursor: pointer; 70 | border: 0; 71 | background-color: inherit; 72 | } 73 | 74 | button::after { 75 | content: "👋"; 76 | } -------------------------------------------------------------------------------- /en-EN/code/06/project/style.css: -------------------------------------------------------------------------------- 1 | @import url(properties.css); 2 | 3 | html, 4 | body, 5 | main, 6 | figure { 7 | display: flex; 8 | flex-direction: column; 9 | align-items: center; 10 | } 11 | 12 | html { 13 | background-color: var(--background-color); 14 | color: var(--text-color); 15 | font-family: var(--font-family); 16 | height: 100%; 17 | background-image: url(background.png); 18 | animation: scroll-background 30s linear infinite; 19 | } 20 | 21 | @keyframes scroll-background { 22 | 0% { 23 | background-position: 0 320px; 24 | } 25 | 26 | 100% { 27 | background-position: 480px 0; 28 | } 29 | } 30 | 31 | body, 32 | main, 33 | figure { 34 | flex: 1; 35 | } 36 | 37 | h1, 38 | figcaption { 39 | padding-block: .5em; 40 | padding-inline: 1em; 41 | text-align: center; 42 | text-shadow: .05em 0 black, 0 .05em black, -.05em 0 black, 0 -.05em black; 43 | backdrop-filter: brightness(60%); 44 | } 45 | 46 | h1 { 47 | margin-block-start: 2em; 48 | font-size: min(5vw, 2em); 49 | } 50 | 51 | figure { 52 | justify-content: space-around; 53 | } 54 | 55 | figcaption { 56 | margin-block-start: 1em; 57 | } 58 | 59 | figcaption, figcaption > button { 60 | font-size: min(3vw, 1.25em); 61 | } 62 | 63 | img { 64 | max-width: 33vw; 65 | max-height: 33vh; 66 | } 67 | 68 | button { 69 | cursor: pointer; 70 | border: 0; 71 | background-color: inherit; 72 | } 73 | 74 | button::after { 75 | content: "👋"; 76 | } --------------------------------------------------------------------------------