From 5ba2e316e4e16985e9b0ebfaad984a4652e90a79 Mon Sep 17 00:00:00 2001 From: Christopher Monsanto Date: Thu, 16 Apr 2020 02:08:29 -0400 Subject: [PATCH] Add PS spritesheet generator tool --- .gitignore | 2 + README.md | 2 + pnpm-lock.yaml | 681 +++++++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 2 + tools/sprites/package.json | 1 + tools/sprites/ps.js | 42 +++ 6 files changed, 730 insertions(+) create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 tools/sprites/package.json create mode 100755 tools/sprites/ps.js diff --git a/.gitignore b/.gitignore index 62b8af68..db913e08 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ build/ .tup +node_modules +pnpm-debug.log diff --git a/README.md b/README.md index 3bbf7fb1..af9ab28c 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ $ brew install tup graphicsmagick advancecomp ## Building +Install dependencies once with `pnpm install`. Then, to build: + ``` $ tup ``` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..67e00e06 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,681 @@ +importers: + tools/sprites: + dependencies: + commander: 5.0.0 + make-promises-safe: 5.1.0 + spritesmith: 3.4.0 + specifiers: + commander: ^5.0.0 + make-promises-safe: ^5.1.0 + spritesmith: ^3.4.0 +lockfileVersion: 5.1 +packages: + /ajv/6.12.0: + dependencies: + fast-deep-equal: 3.1.1 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.2.2 + dev: false + resolution: + integrity: sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + /asn1/0.2.4: + dependencies: + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + /assert-plus/1.0.0: + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + /async/0.9.2: + dev: false + resolution: + integrity: sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + /asynckit/0.4.0: + dev: false + resolution: + integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= + /aws-sign2/0.7.0: + dev: false + resolution: + integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + /aws4/1.9.1: + dev: false + resolution: + integrity: sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + /bcrypt-pbkdf/1.0.2: + dependencies: + tweetnacl: 0.14.5 + dev: false + resolution: + integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + /bin-pack/1.0.2: + dev: false + resolution: + integrity: sha1-wqAU7b8L7XCjKSBi7UZXe5YSBnk= + /caseless/0.12.0: + dev: false + resolution: + integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + /clone-stats/0.0.1: + dev: false + resolution: + integrity: sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= + /clone/1.0.4: + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + /combined-stream/1.0.8: + dependencies: + delayed-stream: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + /commander/5.0.0: + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ== + /concat-stream/1.5.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.0.6 + typedarray: 0.0.6 + dev: false + engines: + '0': node >= 0.8 + resolution: + integrity: sha1-cIl4Yk2FavQaWnQd790mHadSwmY= + /contentstream/1.0.0: + dependencies: + readable-stream: 1.0.34 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-C9z6RtowRkqGzo+n7OVlQQ3G+aU= + /core-util-is/1.0.2: + dev: false + resolution: + integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /cwise-compiler/1.1.3: + dependencies: + uniq: 1.0.1 + dev: false + resolution: + integrity: sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= + /dashdash/1.14.1: + dependencies: + assert-plus: 1.0.0 + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + /data-uri-to-buffer/0.0.3: + dev: false + resolution: + integrity: sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo= + /delayed-stream/1.0.0: + dev: false + engines: + node: '>=0.4.0' + resolution: + integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + /ecc-jsbn/0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + /extend/3.0.2: + dev: false + resolution: + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + /extsprintf/1.3.0: + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + /fast-deep-equal/3.1.1: + dev: false + resolution: + integrity: sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + /fast-json-stable-stringify/2.1.0: + dev: false + resolution: + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + /first-chunk-stream/1.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= + /forever-agent/0.6.1: + dev: false + resolution: + integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + /form-data/2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.26 + dev: false + engines: + node: '>= 0.12' + resolution: + integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + /get-pixels/3.3.2: + dependencies: + data-uri-to-buffer: 0.0.3 + jpeg-js: 0.3.7 + mime-types: 2.1.26 + ndarray: 1.0.19 + ndarray-pack: 1.2.1 + node-bitmap: 0.0.1 + omggif: 1.0.10 + parse-data-uri: 0.2.0 + pngjs: 3.4.0 + request: 2.88.2 + through: 2.3.8 + dev: false + resolution: + integrity: sha512-6ar+8yPxRd1pskEcl2GSEu1La0+xYRjjnkby6AYiRDDwZ0tJbPQmHnSeH9fGLskT8kvR0OukVgtZLcsENF9YKQ== + /getpass/0.1.7: + dependencies: + assert-plus: 1.0.0 + dev: false + resolution: + integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + /gif-encoder/0.4.3: + dependencies: + readable-stream: 1.1.14 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-iitP6MqJWkjjoLbLs0CgpqNXGJk= + /graceful-fs/4.2.3: + dev: false + resolution: + integrity: sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + /har-schema/2.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + /har-validator/5.1.3: + dependencies: + ajv: 6.12.0 + har-schema: 2.0.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + /http-signature/1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.1 + sshpk: 1.16.1 + dev: false + engines: + node: '>=0.8' + npm: '>=1.3.7' + resolution: + integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + /inherits/2.0.4: + dev: false + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /iota-array/1.0.0: + dev: false + resolution: + integrity: sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= + /is-buffer/1.1.6: + dev: false + resolution: + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + /is-typedarray/1.0.0: + dev: false + resolution: + integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + /is-utf8/0.2.1: + dev: false + resolution: + integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + /isarray/0.0.1: + dev: false + resolution: + integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + /isarray/1.0.0: + dev: false + resolution: + integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + /isstream/0.1.2: + dev: false + resolution: + integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + /jpeg-js/0.0.4: + dev: false + resolution: + integrity: sha1-Bqr0fv7HrwsZJKWc1pWm0rXthw4= + /jpeg-js/0.3.7: + dev: false + resolution: + integrity: sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== + /jsbn/0.1.1: + dev: false + resolution: + integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + /json-schema-traverse/0.4.1: + dev: false + resolution: + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /json-schema/0.2.3: + dev: false + resolution: + integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + /json-stringify-safe/5.0.1: + dev: false + resolution: + integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + /jsprim/1.4.1: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.2.3 + verror: 1.10.0 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + /layout/2.2.0: + dependencies: + bin-pack: 1.0.2 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-MeRL/BjdEBmz/7II5AKku/4uavQ= + /make-promises-safe/5.1.0: + dev: false + resolution: + integrity: sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g== + /mime-db/1.43.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + /mime-types/2.1.26: + dependencies: + mime-db: 1.43.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + /ndarray-ops/1.2.2: + dependencies: + cwise-compiler: 1.1.3 + dev: false + resolution: + integrity: sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= + /ndarray-pack/1.2.1: + dependencies: + cwise-compiler: 1.1.3 + ndarray: 1.0.19 + dev: false + resolution: + integrity: sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= + /ndarray/1.0.19: + dependencies: + iota-array: 1.0.0 + is-buffer: 1.1.6 + dev: false + resolution: + integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== + /node-bitmap/0.0.1: + dev: false + engines: + node: '>=v0.6.5' + resolution: + integrity: sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE= + /oauth-sign/0.9.0: + dev: false + resolution: + integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + /obj-extend/0.1.0: + dev: false + resolution: + integrity: sha1-u0SKR3X7les0p4H5CLusLfI9u1s= + /omggif/1.0.10: + dev: false + resolution: + integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== + /parse-data-uri/0.2.0: + dependencies: + data-uri-to-buffer: 0.0.3 + dev: false + resolution: + integrity: sha1-vwTYUd1ch7CrI45dAazklLYEtMk= + /performance-now/2.1.0: + dev: false + resolution: + integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + /pixelsmith/2.4.1: + dependencies: + async: 0.9.2 + concat-stream: 1.5.2 + get-pixels: 3.3.2 + mime-types: 2.1.26 + ndarray: 1.0.19 + obj-extend: 0.1.0 + save-pixels: 2.3.4 + vinyl-file: 1.3.0 + dev: false + engines: + node: '>= 8.0.0' + resolution: + integrity: sha512-6lVOPf9eBd9bWfxo5efmJcAiF6y65Ui9Ir8IR8jocrj/v/8QoLWZmgnhO7KGUfqkwPLNlCBfxVdjp4QihdPmPQ== + /pngjs-nozlib/1.0.0: + dev: false + engines: + iojs: '>= 1.0.0' + node: '>=0.10.0' + resolution: + integrity: sha1-nmTWAs/pzOTZ1Zl9BodCmnPwt9c= + /pngjs/3.4.0: + dev: false + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + /process-nextick-args/1.0.7: + dev: false + resolution: + integrity: sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + /process-nextick-args/2.0.1: + dev: false + resolution: + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + /psl/1.8.0: + dev: false + resolution: + integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + /punycode/2.1.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /qs/6.5.2: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + /readable-stream/1.0.34: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + resolution: + integrity: sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + /readable-stream/1.1.14: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + resolution: + integrity: sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + /readable-stream/2.0.6: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 1.0.7 + string_decoder: 0.10.31 + util-deprecate: 1.0.2 + dev: false + resolution: + integrity: sha1-j5A0HmilPMySh4jaz80Rs265t44= + /readable-stream/2.3.7: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + resolution: + integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + /replace-ext/0.0.1: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= + /request/2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.9.1 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.3 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.26 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.2 + safe-buffer: 5.2.0 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + deprecated: 'request has been deprecated, see https://github.com/request/request/issues/3142' + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + /safe-buffer/5.1.2: + dev: false + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safe-buffer/5.2.0: + dev: false + resolution: + integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + /safer-buffer/2.1.2: + dev: false + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /save-pixels/2.3.4: + dependencies: + contentstream: 1.0.0 + gif-encoder: 0.4.3 + jpeg-js: 0.0.4 + ndarray: 1.0.19 + ndarray-ops: 1.2.2 + pngjs-nozlib: 1.0.0 + through: 2.3.8 + dev: false + resolution: + integrity: sha1-SdNJwGuNfAEn2/DaJLRKylr7Wf4= + /semver/5.0.3: + dev: false + hasBin: true + resolution: + integrity: sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no= + /spritesmith/3.4.0: + dependencies: + concat-stream: 1.5.2 + layout: 2.2.0 + pixelsmith: 2.4.1 + semver: 5.0.3 + through2: 2.0.5 + dev: false + engines: + node: '>= 4.0.0' + resolution: + integrity: sha512-epa/Ib2GzkrzOA6ZMKH+YOX4ooBlRz8JwIV5NQDt9FvqXVHTh4dVn/0oA+n5eeu6wem1CCrtZWODlOqvwXXpyA== + /sshpk/1.16.1: + dependencies: + asn1: 0.2.4 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + engines: + node: '>=0.10.0' + hasBin: true + resolution: + integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + /string_decoder/0.10.31: + dev: false + resolution: + integrity: sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + /string_decoder/1.1.1: + dependencies: + safe-buffer: 5.1.2 + dev: false + resolution: + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /strip-bom-stream/1.0.0: + dependencies: + first-chunk-stream: 1.0.0 + strip-bom: 2.0.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4= + /strip-bom/2.0.0: + dependencies: + is-utf8: 0.2.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + /through/2.3.8: + dev: false + resolution: + integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + /through2/2.0.5: + dependencies: + readable-stream: 2.3.7 + xtend: 4.0.2 + dev: false + resolution: + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + /tough-cookie/2.5.0: + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + /tunnel-agent/0.6.0: + dependencies: + safe-buffer: 5.2.0 + dev: false + resolution: + integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + /tweetnacl/0.14.5: + dev: false + resolution: + integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + /typedarray/0.0.6: + dev: false + resolution: + integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + /uniq/1.0.1: + dev: false + resolution: + integrity: sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + /uri-js/4.2.2: + dependencies: + punycode: 2.1.1 + dev: false + resolution: + integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + /util-deprecate/1.0.2: + dev: false + resolution: + integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + /uuid/3.4.0: + dev: false + hasBin: true + resolution: + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + /verror/1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + /vinyl-file/1.3.0: + dependencies: + graceful-fs: 4.2.3 + strip-bom: 2.0.0 + strip-bom-stream: 1.0.0 + vinyl: 1.2.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qgVjTTqGe6kUR77bs0r8sm9E9uc= + /vinyl/1.2.0: + dependencies: + clone: 1.0.4 + clone-stats: 0.0.1 + replace-ext: 0.0.1 + dev: false + engines: + node: '>= 0.9' + resolution: + integrity: sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= + /xtend/4.0.2: + dev: false + engines: + node: '>=0.4' + resolution: + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..a67fab0f --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'tools/sprites' diff --git a/tools/sprites/package.json b/tools/sprites/package.json new file mode 100644 index 00000000..b67a2664 --- /dev/null +++ b/tools/sprites/package.json @@ -0,0 +1 @@ +{"dependencies":{"commander":"^5.0.0","make-promises-safe":"^5.1.0","spritesmith":"^3.4.0"}} diff --git a/tools/sprites/ps.js b/tools/sprites/ps.js new file mode 100755 index 00000000..6a1bde6a --- /dev/null +++ b/tools/sprites/ps.js @@ -0,0 +1,42 @@ + +require('make-promises-safe'); + +const program = require('commander'); +const spritesmith = require('spritesmith'); +const path = require('path'); +const fs = require('fs'); +const util = require('util'); + +const run = util.promisify(spritesmith.run); + +program + .option('--output-image ', 'where to put image') + .option('--output-metadata ', 'where to put JSON metadata') + .parse(process.argv); + +const files = []; + +for (const directory of program.args) { + for (const file of fs.readdirSync(directory)) { + files.push(path.join(directory, file)); + } +} + +function toPSID(s) { + return s.toLowerCase().replace(/[^a-z0-9]+/g, ''); +} + +(async () => { + const result = await run({ + src: files, + }); + + const sprites = Object.create(null); + for (const [filename, {x, y, width, height}] of Object.entries(result.coordinates)) { + const id = toPSID(path.parse(filename).name); + sprites[id] = {left: x, top: y}; + } + + fs.writeFileSync(program.outputImage, result.image, 'binary'); + fs.writeFileSync(program.outputMetadata, JSON.stringify(sprites, null, 4)); +})();