diff --git a/css/external.svg b/css/external.svg index 1157edbc..308df1cd 100644 --- a/css/external.svg +++ b/css/external.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/css/webassembly.svg b/css/webassembly.svg index 9c081290..edf0ade8 100644 --- a/css/webassembly.svg +++ b/css/webassembly.svg @@ -1,35 +1 @@ - - - - - web-assembly-logo - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/images/bca.svg b/images/bca.svg index d91371ef..4efb0425 100644 --- a/images/bca.svg +++ b/images/bca.svg @@ -1 +1 @@ -Bytecode Alliance logo \ No newline at end of file + \ No newline at end of file diff --git a/images/chrome.svg b/images/chrome.svg index 381be82c..90ddfedb 100644 --- a/images/chrome.svg +++ b/images/chrome.svg @@ -1 +1 @@ -Chrome logo \ No newline at end of file + \ No newline at end of file diff --git a/images/deno.svg b/images/deno.svg index f87ef30e..c3e71fad 100644 --- a/images/deno.svg +++ b/images/deno.svg @@ -1 +1 @@ -Deno logo \ No newline at end of file + \ No newline at end of file diff --git a/images/edge.svg b/images/edge.svg index ad41c550..5612e34e 100644 --- a/images/edge.svg +++ b/images/edge.svg @@ -1 +1 @@ -Edge logo \ No newline at end of file + \ No newline at end of file diff --git a/images/firefox.svg b/images/firefox.svg index c530ab22..3fae25d1 100644 --- a/images/firefox.svg +++ b/images/firefox.svg @@ -1 +1 @@ -Firefox logo \ No newline at end of file + \ No newline at end of file diff --git a/images/graalvm.svg b/images/graalvm.svg index b85b2929..27209814 100644 --- a/images/graalvm.svg +++ b/images/graalvm.svg @@ -1,8 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/images/nodejs.svg b/images/nodejs.svg index db19b09b..6b6b36a5 100644 --- a/images/nodejs.svg +++ b/images/nodejs.svg @@ -1 +1 @@ -Node.js Logo \ No newline at end of file + \ No newline at end of file diff --git a/images/safari.svg b/images/safari.svg index 9c40a6f6..13b01e91 100644 --- a/images/safari.svg +++ b/images/safari.svg @@ -1 +1 @@ -Safari logo \ No newline at end of file + \ No newline at end of file diff --git a/images/wasm2c.svg b/images/wasm2c.svg index e6f68671..cbc2066f 100644 --- a/images/wasm2c.svg +++ b/images/wasm2c.svg @@ -1,32 +1 @@ - - - - - - - - - - web-assembly-logo - - - - - - - - - - - - web-assembly-logo - - - - + \ No newline at end of file diff --git a/images/wasmer.svg b/images/wasmer.svg index c38c773f..f678cd2c 100644 --- a/images/wasmer.svg +++ b/images/wasmer.svg @@ -1 +1 @@ -Wasmer logo \ No newline at end of file + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c3398b00..dc51c3cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,216 @@ "version": "1.0.0", "license": "Apache-2.0", "devDependencies": { - "prettier": "^3.4.2" + "prettier": "^3.4.2", + "svgo": "^3.3.2" } }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/prettier": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", @@ -27,6 +234,42 @@ "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } } } } diff --git a/package.json b/package.json index b68bae25..d162f35c 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ }, "scripts": { "start": "bundle exec jekyll serve", - "prettier": "npx prettier . --write" + "prettier": "npx prettier . --write", + "optimize-svgs": "node scripts/optimize-svgs.js" }, "keywords": [ "webassembly", @@ -17,6 +18,8 @@ "author": "The WebAssembly community", "license": "Apache-2.0", "devDependencies": { - "prettier": "^3.4.2" - } + "prettier": "^3.4.2", + "svgo": "^3.3.2" + }, + "type": "module" } diff --git a/scripts/optimize-svgs.js b/scripts/optimize-svgs.js new file mode 100644 index 00000000..9de27fb3 --- /dev/null +++ b/scripts/optimize-svgs.js @@ -0,0 +1,58 @@ +import fs from 'fs'; +import path from 'path'; +import { optimize } from 'svgo'; + +// Function to recursively find all SVG files in a directory +function findSvgFiles(dir, fileList = []) { + const files = fs.readdirSync(dir); + + files.forEach(file => { + const filePath = path.join(dir, file); + const stats = fs.statSync(filePath); + + if (stats.isDirectory()) { + findSvgFiles(filePath, fileList); // Recursively call for subdirectories + } else if (stats.isFile() && path.extname(file).toLowerCase() === '.svg') { + fileList.push(filePath); // Add SVG file to the list + } + }); + + return fileList; +} + +// Function to optimize an SVG file +function optimizeSvg(filePath) { + const svgString = fs.readFileSync(filePath, 'utf8'); + + const result = optimize(svgString, { + path: filePath, // Recommended for better error reporting + multipass: true, // Enable multipass optimization + // Add any other SVGO plugin configuration here if needed + }); + + // Write the optimized SVG back to the file + fs.writeFileSync(filePath, result.data, 'utf8'); + console.log(`Optimized: ${filePath}`); +} + +// Main function to process a given directory +function processDirectory(baseDir) { + const svgFiles = findSvgFiles(baseDir); + + if (svgFiles.length === 0) { + console.log('No SVG files found.'); + return; + } + + console.log(`Found ${svgFiles.length} SVG file(s). Optimizing...`); + svgFiles.forEach(filePath => { + try { + optimizeSvg(filePath); + } catch (error) { + console.error(`Error optimizing ${filePath}:`, error.message); + } + }); +} + +const directoryToOptimize = '.'; +processDirectory(directoryToOptimize);