From 786f256bc5d84b18d7f65b0119ff517eb8cbfef7 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Wed, 31 Mar 2021 18:27:16 -0500 Subject: [PATCH] Convert fix-uploaded-svgs addon to a builtin feature There is no reason to turn this off. --- .../addons-l10n/de/fix-uploaded-svgs.json | 1 - .../addons-l10n/es/fix-uploaded-svgs.json | 1 - .../addons-l10n/fr/fix-uploaded-svgs.json | 1 - .../addons-l10n/it/fix-uploaded-svgs.json | 1 - .../addons-l10n/ja/fix-uploaded-svgs.json | 1 - .../addons-l10n/pl/fix-uploaded-svgs.json | 1 - .../addons-l10n/pt-br/fix-uploaded-svgs.json | 1 - .../addons-l10n/ro/fix-uploaded-svgs.json | 1 - .../addons-l10n/sl/fix-uploaded-svgs.json | 1 - .../addons-l10n/tr/fix-uploaded-svgs.json | 1 - src/addons/addons.json | 1 - .../addons/fix-uploaded-svgs/addon.json | 14 ------- .../addons/fix-uploaded-svgs/userscript.js | 40 ------------------- src/lib/file-uploader.js | 2 + src/lib/tw-svg-fixer.js | 27 +++++++++++++ 15 files changed, 29 insertions(+), 65 deletions(-) delete mode 100644 src/addons/addons-l10n/de/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/es/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/fr/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/it/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/ja/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/pl/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/pt-br/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/ro/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/sl/fix-uploaded-svgs.json delete mode 100644 src/addons/addons-l10n/tr/fix-uploaded-svgs.json delete mode 100644 src/addons/addons/fix-uploaded-svgs/addon.json delete mode 100644 src/addons/addons/fix-uploaded-svgs/userscript.js create mode 100644 src/lib/tw-svg-fixer.js diff --git a/src/addons/addons-l10n/de/fix-uploaded-svgs.json b/src/addons/addons-l10n/de/fix-uploaded-svgs.json deleted file mode 100644 index 44c29a035..000000000 --- a/src/addons/addons-l10n/de/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Korrigiere fehlerhafte SVG-Uploads","fix-uploaded-svgs/@description":"Korrigiert ein Bug im Scratch Editor, wodurch SVG-Dateien von externen Bildeditoren wie Affinity Designer fehlerhaft hochgeladen werden."} \ No newline at end of file diff --git a/src/addons/addons-l10n/es/fix-uploaded-svgs.json b/src/addons/addons-l10n/es/fix-uploaded-svgs.json deleted file mode 100644 index b8dc77693..000000000 --- a/src/addons/addons-l10n/es/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Arreglar archivos SVG subidos","fix-uploaded-svgs/@description":"Arregla un error en el editor de Scratch que provoca que algunos SVG creados con ciertos editores de imagen, como Affinity Designer, no se suban correctamente."} \ No newline at end of file diff --git a/src/addons/addons-l10n/fr/fix-uploaded-svgs.json b/src/addons/addons-l10n/fr/fix-uploaded-svgs.json deleted file mode 100644 index ac54eab4e..000000000 --- a/src/addons/addons-l10n/fr/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Règler les exportations échouées des graphismes au format SVG","fix-uploaded-svgs/@description":"Règle un bug dans l'éditeur Scratch qui n'arrivait pas à exporter des fichiers SVG créés avec certains éditeurs d'images correctement, comme Affinity Designer."} \ No newline at end of file diff --git a/src/addons/addons-l10n/it/fix-uploaded-svgs.json b/src/addons/addons-l10n/it/fix-uploaded-svgs.json deleted file mode 100644 index e7cead2df..000000000 --- a/src/addons/addons-l10n/it/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Correggi errore caricamento file SVG","fix-uploaded-svgs/@description":"Risolve un errore nell'editor di Scratch a causa del quale fallisce il caricamento di file SVG creati con alcuni editor di immagini, come ad esempio Affinity Designer."} \ No newline at end of file diff --git a/src/addons/addons-l10n/ja/fix-uploaded-svgs.json b/src/addons/addons-l10n/ja/fix-uploaded-svgs.json deleted file mode 100644 index 608a18bef..000000000 --- a/src/addons/addons-l10n/ja/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"SVGアップロードの修正","fix-uploaded-svgs/@description":"SVGアップロード時のバグを修正する。"} \ No newline at end of file diff --git a/src/addons/addons-l10n/pl/fix-uploaded-svgs.json b/src/addons/addons-l10n/pl/fix-uploaded-svgs.json deleted file mode 100644 index 2c29ce350..000000000 --- a/src/addons/addons-l10n/pl/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Napraw zepsute przesyłanie plików SVG","fix-uploaded-svgs/@description":"Naprawia błąd w Edytorze Scratcha edytor zawodzi dokładnie przesłać pliki SVG stworzone z niektórymi edytorami zdjęć np. Affinity Designer"} \ No newline at end of file diff --git a/src/addons/addons-l10n/pt-br/fix-uploaded-svgs.json b/src/addons/addons-l10n/pt-br/fix-uploaded-svgs.json deleted file mode 100644 index 06db7e67b..000000000 --- a/src/addons/addons-l10n/pt-br/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Consertar uploads de SVG quebrados","fix-uploaded-svgs/@description":"Conserta um bug no editor do Scratch que falha ao fazer upload de arquivos SVG criados com alguns editores de imagem, como o Affinity Designer."} \ No newline at end of file diff --git a/src/addons/addons-l10n/ro/fix-uploaded-svgs.json b/src/addons/addons-l10n/ro/fix-uploaded-svgs.json deleted file mode 100644 index 2c081602a..000000000 --- a/src/addons/addons-l10n/ro/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Repară încărcările SVG stricate","fix-uploaded-svgs/@description":"Repară o eroare în editorul Scratch care eșuează în încărcarea corectă a fișierelor SVG create cu unii editori de imagini, cum ar fi Affinity Designer."} \ No newline at end of file diff --git a/src/addons/addons-l10n/sl/fix-uploaded-svgs.json b/src/addons/addons-l10n/sl/fix-uploaded-svgs.json deleted file mode 100644 index 32b36d2b4..000000000 --- a/src/addons/addons-l10n/sl/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Popravi nalaganje SVG-jev","fix-uploaded-svgs/@description":"Popravi napako v Scratchevem urejevalniku, ki povzroči, da se datoteke SVG, ustvarjene z nekaterimi urejevalniki, kot je Affinity Designer, ne naložijo pravilno."} \ No newline at end of file diff --git a/src/addons/addons-l10n/tr/fix-uploaded-svgs.json b/src/addons/addons-l10n/tr/fix-uploaded-svgs.json deleted file mode 100644 index 503376eab..000000000 --- a/src/addons/addons-l10n/tr/fix-uploaded-svgs.json +++ /dev/null @@ -1 +0,0 @@ -{"fix-uploaded-svgs/@name":"Bozuk SVG yüklemelerini düzeltin","fix-uploaded-svgs/@description":"Scratch düzenleyicide Affinity Designer gibi bazı görüntü düzenleyicilerle oluşturulmuş SVG dosyalarını düzgün şekilde yüklemeyen bir hatayı düzeltir."} \ No newline at end of file diff --git a/src/addons/addons.json b/src/addons/addons.json index 6042067a8..4cfd0dad9 100644 --- a/src/addons/addons.json +++ b/src/addons/addons.json @@ -24,7 +24,6 @@ "variable-manager", "load-extensions", "tw-interface-customization", - "fix-uploaded-svgs", "drag-drop", "cat-blocks" ] \ No newline at end of file diff --git a/src/addons/addons/fix-uploaded-svgs/addon.json b/src/addons/addons/fix-uploaded-svgs/addon.json deleted file mode 100644 index 0cf2ec9fa..000000000 --- a/src/addons/addons/fix-uploaded-svgs/addon.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "Fix broken SVG uploads", - "description": "Fixes a bug in the Scratch editor that fails to properly upload SVG files created with some image editors, such as Affinity Designer.", - "userscripts": [ - { - "url": "userscript.js", - "matches": ["https://scratch.mit.edu/projects/*"], - "runAtComplete": false - } - ], - "tags": ["editor"], - "enabledByDefault": true, - "l10n": true -} diff --git a/src/addons/addons/fix-uploaded-svgs/userscript.js b/src/addons/addons/fix-uploaded-svgs/userscript.js deleted file mode 100644 index 19216b3c0..000000000 --- a/src/addons/addons/fix-uploaded-svgs/userscript.js +++ /dev/null @@ -1,40 +0,0 @@ -export default async function ({ addon, global, console }) { - const originalFileReader = window.FileReader; - window.FileReader = function () { - const realFileReader = new originalFileReader(); - const readAsArrayBuffer = Symbol(); - realFileReader[readAsArrayBuffer] = realFileReader.readAsArrayBuffer; - realFileReader.readAsArrayBuffer = function (file) { - (async () => { - if (file.type === "image/svg+xml") { - try { - let text = await file.text(); - const xmlParser = new DOMParser(); - const xmlDocument = xmlParser.parseFromString(text, "text/xml"); - const svgElement = xmlDocument.children[0]; - if ( - svgElement.height.baseVal.valueAsString === "100%" && - svgElement.width.baseVal.valueAsString === "100%" - ) { - svgElement.removeAttribute("height"); - svgElement.removeAttribute("width"); - text = xmlDocument.documentElement.outerHTML; - } - const newFile = new File([text], file.name, { - type: file.type, - lastModified: file.lastModified, - }); - realFileReader[readAsArrayBuffer](newFile); - } catch (err) { - console.warn(err); - realFileReader[readAsArrayBuffer](file); - } - } else { - realFileReader[readAsArrayBuffer](file); - } - })(); - return undefined; - }; - return realFileReader; - }; -} diff --git a/src/lib/file-uploader.js b/src/lib/file-uploader.js index 6c5cfde6a..9299323fa 100644 --- a/src/lib/file-uploader.js +++ b/src/lib/file-uploader.js @@ -2,6 +2,7 @@ import {BitmapAdapter} from 'scratch-svg-renderer'; import randomizeSpritePosition from './randomize-sprite-position.js'; import bmpConverter from './bmp-converter'; import gifDecoder from './gif-decoder'; +import fixSVG from './tw-svg-fixer'; import twStageSize from './tw-stage-size'; /** @@ -105,6 +106,7 @@ const costumeUpload = function (fileData, fileType, storage, handleCostume, hand case 'image/svg+xml': { costumeFormat = storage.DataFormat.SVG; assetType = storage.AssetType.ImageVector; + fileData = fixSVG(fileData); break; } case 'image/jpeg': { diff --git a/src/lib/tw-svg-fixer.js b/src/lib/tw-svg-fixer.js new file mode 100644 index 000000000..a1e6286d0 --- /dev/null +++ b/src/lib/tw-svg-fixer.js @@ -0,0 +1,27 @@ +import {TextDecoder, TextEncoder} from './tw-text-encoder'; + +const fixSVG = fileData => { + // width="100%" and height="100%" on SVGs can break things + // Demo: https://scratch.mit.edu/projects/447085841/ + // Based on: https://github.com/ScratchAddons/ScratchAddons/pull/748 + try { + const bytes = new Uint8Array(fileData); + const str = new TextDecoder().decode(bytes); + const xmlDocument = new DOMParser().parseFromString(str, 'text/xml'); + const svgElement = xmlDocument.children[0]; + if ( + svgElement.height.baseVal.valueAsString === '100%' && + svgElement.width.baseVal.valueAsString === '100%' + ) { + svgElement.removeAttribute('height'); + svgElement.removeAttribute('width'); + const fixed = xmlDocument.documentElement.outerHTML; + return new TextEncoder().encode(fixed).buffer; + } + return fileData; + } catch (e) { + return fileData; + } +}; + +export default fixSVG;