From bba2956be5e49381004dd337f1cd766840159f1d Mon Sep 17 00:00:00 2001 From: mistic100 Date: Fri, 30 Dec 2022 18:54:03 +0100 Subject: [PATCH] Version 2.0.0 --- browser.js | 400 ++++++++++++++++++++++++------------------------- browser.js.map | 2 +- package.json | 2 +- 3 files changed, 201 insertions(+), 203 deletions(-) diff --git a/browser.js b/browser.js index 63a7871..45525ef 100644 --- a/browser.js +++ b/browser.js @@ -1,16 +1,15 @@ /*! - * squareicon (v1.0.3) - * @copyright 2018-2019 Damien "Mistic" Sorel + * squareicon (v2.0.0) + * @copyright 2018-2022 Damien "Mistic" Sorel * @licence MIT */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('md5'), require('randomcolor')) : - typeof define === 'function' && define.amd ? define(['md5', 'randomcolor'], factory) : - (global = global || self, global.squareicon = factory(global.md5, global.randomColor)); -}(this, (function (md5, randomcolor) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('randomcolor')) : + typeof define === 'function' && define.amd ? define(['randomcolor'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.squareicon = factory(global.randomColor)); +})(this, (function (require$$1) { 'use strict'; - md5 = md5 && md5.hasOwnProperty('default') ? md5['default'] : md5; - randomcolor = randomcolor && randomcolor.hasOwnProperty('default') ? randomcolor['default'] : randomcolor; + var canvas = {}; /** * Create a new Canvas object @@ -19,67 +18,76 @@ * @param {number} height * @returns {HTMLElement} */ - var createCanvas = function createCanvas(width, height) { - return Object.assign(document.createElement('canvas'), { - width: width, - height: height - }); - }; - var canvas = { - createCanvas: createCanvas + canvas.createCanvas = function(width, height) { + return Object.assign(document.createElement('canvas'), { width, height }); }; - var createCanvas$1 = canvas.createCanvas; - var MAX_COLORS = 2; - var MAX_PIXELS = 16; - var MAX_SIZE = 2048; - var MAX_PADDING_RATIO = 3; - var DEFAULT = { - id: null, - hasher: md5, - colors: 2, - pixels: 8, - size: 128, - padding: 0, - symmetry: 'none', - scheme: 'standard', - background: 'transparent' + const { createCanvas } = canvas; + const randomColor = require$$1; + + const MAX_COLORS = 2; + const MAX_PIXELS = 16; + const MAX_SIZE = 2048; + const MAX_PADDING_RATIO = 3; + + const DEFAULT = { + id : null, + hasher : defaultHasher, + colors : 2, + pixels : 8, + size : 128, + padding : 0, + symmetry : 'none', + scheme : 'standard', + background: 'transparent', }; + + /** + * Default hash implementation using node:crypto or Web Crypto API + * @param {string} val + * @returns {Promise} + */ + async function defaultHasher(val) { + if (window.crypto?.subtle) { + const data = new TextEncoder().encode(val); + const result = await crypto.subtle.digest('sha-1', data); + return Array.from(new Uint8Array(result)) + .map((b) => b.toString(16).padStart(2, '0')) + .join(''); + } + else { + throw Error('No hasher available, please configure the "hasher" option.'); + } + } + /** * Generates a random HEX string of specific length * @param {number} length * @returns {string} */ - function unsecureRandom(length) { - var out = ''; - - while (out.length < length) { - out += Math.random().toString(16).substr(2); - } - - return out.substr(0, length); + let out = ''; + while (out.length < length) out += Math.random().toString(16).substring(2); + return out.substring(0, length); } + /** * Loops a string and applies MD5 until a specific length * @param {function} hasher * @param {string} str * @param {number} length - * @returns {string} + * @returns {Promise} */ - - - function loopHash(hasher, str, length) { - var out = ''; - var i = 0; - - while (out.length < length) { - out += hasher(str + (++i > 1 ? i : '')); - } - - return out.substr(0, length); + async function loopHash(hasher, str, length) { + let out = ''; + let i = 0; + while (out.length < length) { + out += await hasher(str + (++i > 1 ? i : '')); + } + return out.substring(0, length); } + /** * Bounds a number * @param {number} val @@ -87,71 +95,67 @@ * @param {number} max * @returns {number} */ - - function minMax(val, min, max) { - return Math.max(min, Math.min(val, max)); + return Math.max(min, Math.min(val, max)); } + /** * Parse an hexadecimal string * @param {string} str * @returns {number} */ - - function hexdec(str) { - return parseInt(str, 16); + return parseInt(str, 16); } + /** * Returns the minimim id length * @param {number} pixels * @param {number} colors * @returns {number} */ - - function getMinIdLength(pixels, colors) { - // 24 bits by color + 1 or 2 bits by pixel (given MAX_COLORS = 2) - return (colors * 24 + colors * pixels * pixels) / 4; + // 24 bits by color + 1 or 2 bits by pixel (given MAX_COLORS = 2) + return (colors * 24 + colors * pixels * pixels) / 4; } + /** * Cleanups options * @param {object|string} options - * @returns {object} + * @returns {Promise} */ + async function getOptions(options) { + if (typeof options === 'string') { + options = { id: options }; + } + options = Object.assign({}, DEFAULT, options); - function getOptions(options) { - if (typeof options === 'string') { - options = { - id: options - }; - } - - options = Object.assign({}, DEFAULT, options); - options.colors = minMax(options.colors, 1, MAX_COLORS); - options.pixels = minMax(options.pixels, 2, MAX_PIXELS); - options.size = minMax(options.size, options.pixels, MAX_SIZE); - options.padding = minMax(options.padding, 0, Math.floor(options.size / MAX_PADDING_RATIO)); - options.size = Math.round((options.size - options.padding * 2) / options.pixels) * options.pixels; - var minIdLength = getMinIdLength(options.pixels, options.colors); - - if (!options.id) { - options.id = unsecureRandom(minIdLength); - } else { - options.id = loopHash(options.hasher, options.id, minIdLength); - } - - if (['none', 'horizontal', 'vertical', 'central'].indexOf(options.symmetry) === -1) { - options.symmetry = 'none'; - } - - if (['raw', 'standard', 'bright', 'light', 'dark'].indexOf(options.scheme) === -1) { - options.scheme = 'standard'; - } - - return options; + options.colors = minMax(options.colors, 1, MAX_COLORS); + options.pixels = minMax(options.pixels, 2, MAX_PIXELS); + options.size = minMax(options.size, options.pixels, MAX_SIZE); + options.padding = minMax(options.padding, 0, Math.floor(options.size / MAX_PADDING_RATIO)); + options.size = Math.round((options.size - options.padding * 2) / options.pixels) * options.pixels; + + if (['none', 'horizontal', 'vertical', 'central'].indexOf(options.symmetry) === -1) { + options.symmetry = 'none'; + } + + if (['raw', 'standard', 'bright', 'light', 'dark'].indexOf(options.scheme) === -1) { + options.scheme = 'standard'; + } + + const minIdLength = getMinIdLength(options.pixels, options.colors); + if (!options.id) { + options.id = unsecureRandom(minIdLength); + } + else { + options.id = await loopHash(options.hasher, options.id, minIdLength); + } + + return options; } + /** * Performs render on a new canvas * @param {string[]} colors @@ -160,177 +164,171 @@ * @param {object} options * @returns {Canvas} */ - - function render(colors, sq, sqc, options) { - var l = 0, - c = 0; - var ps = options.size / options.pixels; - var pad = options.padding; - var cs = options.size + 2 * options.padding; - var canvas = createCanvas$1(cs, cs); - var ctx = canvas.getContext('2d'); - ctx.fillStyle = options.background; - ctx.beginPath(); - ctx.rect(0, 0, cs, cs); - ctx.fill(); - - for (var i = 0; i < options.pixels * options.pixels; i++) { - if (sq[i]) { - ctx.fillStyle = sqc[i] ? colors[0] : colors[1]; - ctx.beginPath(); - ctx.rect(pad + c * ps, pad + l * ps, ps, ps); - ctx.fill(); - } - - c++; - - if (c === options.pixels) { - c = 0; - l++; + let l = 0, c = 0; + let ps = options.size / options.pixels; + let pad = options.padding; + let cs = options.size + 2 * options.padding; + + const canvas = createCanvas(cs, cs); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = options.background; + ctx.beginPath(); + ctx.rect(0, 0, cs, cs); + ctx.fill(); + + for (let i = 0; i < options.pixels * options.pixels; i++) { + if (sq[i]) { + ctx.fillStyle = sqc[i] ? colors[0] : colors[1]; + ctx.beginPath(); + ctx.rect(pad + c * ps, pad + l * ps, ps, ps); + ctx.fill(); + } + + c++; + if (c === options.pixels) { + c = 0; + l++; + } } - } - return canvas; + return canvas; } + /** * Returns the buffer or dataURL from a canvas * @param {Canvas} canvas * @param {Function} [callback] * @returns {String|Buffer|void} */ - - function finalize(canvas, callback) { - if (typeof callback === 'function') { - if (canvas.toBuffer) { - canvas.toBuffer(callback); - } else { - callback(null, canvas.toDataURL()); + if (typeof callback === 'function') { + if (canvas.toBuffer) { + canvas.toBuffer(callback); + } + else { + callback(null, canvas.toDataURL()); + } } - } else { - if (canvas.toBuffer) { - return canvas.toBuffer(); - } else { - return canvas.toDataURL(); + else { + if (canvas.toBuffer) { + return canvas.toBuffer(); + } + else { + return canvas.toDataURL(); + } } - } } + /** * Read the four bits of each char in the string * @param {string} str * @returns {boolean[]} */ - - function readbits(str) { - var bits = []; - - for (var i = 0; i < str.length; i++) { - var tmp = hexdec(str.substr(i, 1)); - Array.prototype.push.apply(bits, [(tmp & 8) !== 0, (tmp & 4) !== 0, (tmp & 2) !== 0, (tmp & 1) !== 0]); - } - - return bits; + let bits = []; + for (let i = 0; i < str.length; i++) { + let tmp = hexdec(str.substring(i, i + 1)); + Array.prototype.push.apply(bits, [(tmp & 8) !== 0, (tmp & 4) !== 0, (tmp & 2) !== 0, (tmp & 1) !== 0]); + } + return bits; } + /** * Applies a vertical symmetry * @param {Array} squares * @param {number} pixels */ - - function verticalSymmetry(squares, pixels) { - for (var i = 0; i < pixels; i++) { - var tmp = squares.slice(i * pixels, Math.floor((i + 0.5) * pixels)); - squares.splice.apply(squares, [Math.ceil((i + 0.5) * pixels), tmp.length].concat(tmp.reverse())); - } + for (let i = 0; i < pixels; i++) { + let tmp = squares.slice(i * pixels, Math.floor((i + 0.5) * pixels)); + squares.splice(Math.ceil((i + 0.5) * pixels), tmp.length, ...tmp.reverse()); + } } + /** * Applies an horizontal symmetry * @param {Array} squares * @param {number} pixels */ - - function horizontalSymmetry(squares, pixels) { - for (var i = 0; i < Math.floor(pixels / 2); i++) { - var tmp = squares.slice(i * pixels, (i + 1) * pixels); - squares.splice.apply(squares, [(pixels - 1 - i) * pixels, tmp.length].concat(tmp)); - } + for (let i = 0; i < Math.floor(pixels / 2); i++) { + let tmp = squares.slice(i * pixels, (i + 1) * pixels); + squares.splice((pixels - 1 - i) * pixels, tmp.length, ...tmp); + } } + /** * Returns a color for a 6 chars string * @param {string} str * @param {string} scheme * @returns {string} */ - - function readcolor(str, scheme) { - if (scheme === 'raw') { - return '#' + str; - } else { - return randomcolor({ - seed: str, - luminosity: scheme, - format: 'hex' - }); - } + if (scheme === 'raw' || !randomColor) { + return '#' + str; + } + else { + return randomColor({ + seed : str, + luminosity: scheme, + format : 'hex', + }); + } } + /** * Creates an array with the same value * @param {*} value * @param {number} length * @returns {Array} */ - - function filledarray(value, length) { - var out = []; - - while (out.length < length) { - out.push(value); - } - - return out; + let out = []; + while (out.length < length) out.push(value); + return out; } + /** * Generates a squareison * @param {object} options * @param {Function} [callback] - * @returns {String|Buffer|void} + * @returns {Promise} */ + async function squareicon(options, callback) { + options = await getOptions(options); + const colorBytes = 6; + const pixelsBytes = options.pixels * options.pixels / 4; + let idx = 0; - function squareicon(options, callback) { - options = getOptions(options); - var colorBytes = 6; - var pixelsBytes = options.pixels * options.pixels / 4; - var idx = 0; - var colors = []; + const colors = []; + for (let i = 0; i < options.colors; i++) { + colors.push(readcolor(options.id.substr(idx, colorBytes), options.scheme)); + idx += colorBytes; + } + + const squares = readbits(options.id.substr(idx, pixelsBytes)); + idx += pixelsBytes; - for (var i = 0; i < options.colors; i++) { - colors.push(readcolor(options.id.substr(idx, colorBytes), options.scheme)); - idx += colorBytes; - } + const squareColors = options.colors === 2 ? + readbits(options.id.substr(idx, pixelsBytes)) : + filledarray(true, pixelsBytes); - var squares = readbits(options.id.substr(idx, pixelsBytes)); - idx += pixelsBytes; - var squareColors = options.colors === 2 ? readbits(options.id.substr(idx, pixelsBytes)) : filledarray(true, pixelsBytes); + if (options.symmetry === 'vertical' || options.symmetry === 'central') { + verticalSymmetry(squares, options.pixels); + verticalSymmetry(squareColors, options.pixels); + } - if (options.symmetry === 'vertical' || options.symmetry === 'central') { - verticalSymmetry(squares, options.pixels); - verticalSymmetry(squareColors, options.pixels); - } + if (options.symmetry === 'horizontal' || options.symmetry === 'central') { + horizontalSymmetry(squares, options.pixels); + horizontalSymmetry(squareColors, options.pixels); + } - if (options.symmetry === 'horizontal' || options.symmetry === 'central') { - horizontalSymmetry(squares, options.pixels); - horizontalSymmetry(squareColors, options.pixels); - } + const canvas = render(colors, squares, squareColors, options); - var canvas = render(colors, squares, squareColors, options); - return finalize(canvas, callback); + return finalize(canvas, callback); } var squareicon_1 = squareicon; @@ -338,5 +336,5 @@ return squareicon_1; -}))); +})); //# sourceMappingURL=browser.js.map diff --git a/browser.js.map b/browser.js.map index 8ce33cc..437e153 100644 --- a/browser.js.map +++ b/browser.js.map @@ -1 +1 @@ -{"version":3,"file":"browser.js","sources":["canvas.js","index.js"],"sourcesContent":["/**\n * Create a new Canvas object\n * From node-canvas browser.js\n * @param {number} width\n * @param {number} height\n * @returns {HTMLElement}\n */\nexports.createCanvas = function(width, height) {\n return Object.assign(document.createElement('canvas'), { width, height });\n};\n","const { createCanvas } = require('canvas');\nconst md5 = require('md5');\nconst randomColor = require('randomcolor');\n\nconst MAX_COLORS = 2;\nconst MAX_PIXELS = 16;\nconst MAX_SIZE = 2048;\nconst MAX_PADDING_RATIO = 3;\n\nconst DEFAULT = {\n id : null,\n hasher : md5,\n colors : 2,\n pixels : 8,\n size : 128,\n padding : 0,\n symmetry : 'none',\n scheme : 'standard',\n background: 'transparent',\n};\n\n/**\n * Generates a random HEX string of specific length\n * @param {number} length\n * @returns {string}\n */\nfunction unsecureRandom(length) {\n let out = '';\n while (out.length < length) out += Math.random().toString(16).substr(2);\n return out.substr(0, length);\n}\n\n/**\n * Loops a string and applies MD5 until a specific length\n * @param {function} hasher\n * @param {string} str\n * @param {number} length\n * @returns {string}\n */\nfunction loopHash(hasher, str, length) {\n let out = '';\n let i = 0;\n while (out.length < length) out += hasher(str + (++i > 1 ? i : ''));\n return out.substr(0, length);\n}\n\n/**\n * Bounds a number\n * @param {number} val\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\nfunction minMax(val, min, max) {\n return Math.max(min, Math.min(val, max));\n}\n\n/**\n * Parse an hexadecimal string\n * @param {string} str\n * @returns {number}\n */\nfunction hexdec(str) {\n return parseInt(str, 16);\n}\n\n/**\n * Returns the minimim id length\n * @param {number} pixels\n * @param {number} colors\n * @returns {number}\n */\nfunction getMinIdLength(pixels, colors) {\n // 24 bits by color + 1 or 2 bits by pixel (given MAX_COLORS = 2)\n return (colors * 24 + colors * pixels * pixels) / 4;\n}\n\n/**\n * Cleanups options\n * @param {object|string} options\n * @returns {object}\n */\nfunction getOptions(options) {\n if (typeof options === 'string') {\n options = { id: options };\n }\n\n options = Object.assign({}, DEFAULT, options);\n\n options.colors = minMax(options.colors, 1, MAX_COLORS);\n options.pixels = minMax(options.pixels, 2, MAX_PIXELS);\n options.size = minMax(options.size, options.pixels, MAX_SIZE);\n options.padding = minMax(options.padding, 0, Math.floor(options.size / MAX_PADDING_RATIO));\n options.size = Math.round((options.size - options.padding * 2) / options.pixels) * options.pixels;\n\n const minIdLength = getMinIdLength(options.pixels, options.colors);\n\n if (!options.id) {\n options.id = unsecureRandom(minIdLength);\n }\n else {\n options.id = loopHash(options.hasher, options.id, minIdLength);\n }\n\n if (['none', 'horizontal', 'vertical', 'central'].indexOf(options.symmetry) === -1) {\n options.symmetry = 'none';\n }\n\n if (['raw', 'standard', 'bright', 'light', 'dark'].indexOf(options.scheme) === -1) {\n options.scheme = 'standard';\n }\n\n return options;\n}\n\n/**\n * Performs render on a new canvas\n * @param {string[]} colors\n * @param {boolean[]} sq\n * @param {boolean[]} sqc\n * @param {object} options\n * @returns {Canvas}\n */\nfunction render(colors, sq, sqc, options) {\n let l = 0, c = 0;\n let ps = options.size / options.pixels;\n let pad = options.padding;\n let cs = options.size + 2 * options.padding;\n\n const canvas = createCanvas(cs, cs);\n const ctx = canvas.getContext('2d');\n\n ctx.fillStyle = options.background;\n ctx.beginPath();\n ctx.rect(0, 0, cs, cs);\n ctx.fill();\n\n for (let i = 0; i < options.pixels * options.pixels; i++) {\n if (sq[i]) {\n ctx.fillStyle = sqc[i] ? colors[0] : colors[1];\n ctx.beginPath();\n ctx.rect(pad + c * ps, pad + l * ps, ps, ps);\n ctx.fill();\n }\n\n c++;\n if (c === options.pixels) {\n c = 0;\n l++;\n }\n }\n\n return canvas;\n}\n\n/**\n * Returns the buffer or dataURL from a canvas\n * @param {Canvas} canvas\n * @param {Function} [callback]\n * @returns {String|Buffer|void}\n */\nfunction finalize(canvas, callback) {\n if (typeof callback === 'function') {\n if (canvas.toBuffer) {\n canvas.toBuffer(callback);\n }\n else {\n callback(null, canvas.toDataURL());\n }\n }\n else {\n if (canvas.toBuffer) {\n return canvas.toBuffer();\n }\n else {\n return canvas.toDataURL();\n }\n }\n}\n\n/**\n * Read the four bits of each char in the string\n * @param {string} str\n * @returns {boolean[]}\n */\nfunction readbits(str) {\n let bits = [];\n for (let i = 0; i < str.length; i++) {\n let tmp = hexdec(str.substr(i, 1));\n Array.prototype.push.apply(bits, [(tmp & 8) !== 0, (tmp & 4) !== 0, (tmp & 2) !== 0, (tmp & 1) !== 0]);\n }\n return bits;\n}\n\n/**\n * Applies a vertical symmetry\n * @param {Array} squares\n * @param {number} pixels\n */\nfunction verticalSymmetry(squares, pixels) {\n for (let i = 0; i < pixels; i++) {\n let tmp = squares.slice(i * pixels, Math.floor((i + 0.5) * pixels));\n squares.splice(Math.ceil((i + 0.5) * pixels), tmp.length, ...tmp.reverse());\n }\n}\n\n/**\n * Applies an horizontal symmetry\n * @param {Array} squares\n * @param {number} pixels\n */\nfunction horizontalSymmetry(squares, pixels) {\n for (let i = 0; i < Math.floor(pixels / 2); i++) {\n let tmp = squares.slice(i * pixels, (i + 1) * pixels);\n squares.splice((pixels - 1 - i) * pixels, tmp.length, ...tmp);\n }\n}\n\n/**\n * Returns a color for a 6 chars string\n * @param {string} str\n * @param {string} scheme\n * @returns {string}\n */\nfunction readcolor(str, scheme) {\n if (scheme === 'raw') {\n return '#' + str;\n }\n else {\n return randomColor({\n seed : str,\n luminosity: scheme,\n format : 'hex',\n });\n }\n}\n\n/**\n * Creates an array with the same value\n * @param {*} value\n * @param {number} length\n * @returns {Array}\n */\nfunction filledarray(value, length) {\n let out = [];\n while (out.length < length) {\n out.push(value);\n }\n return out;\n}\n\n/**\n * Generates a squareison\n * @param {object} options\n * @param {Function} [callback]\n * @returns {String|Buffer|void}\n */\nfunction squareicon(options, callback) {\n options = getOptions(options);\n\n const colorBytes = 6;\n const pixelsBytes = options.pixels * options.pixels / 4;\n let idx = 0;\n\n const colors = [];\n for (let i = 0; i < options.colors; i++) {\n colors.push(readcolor(options.id.substr(idx, colorBytes), options.scheme));\n idx += colorBytes;\n }\n\n const squares = readbits(options.id.substr(idx, pixelsBytes));\n idx += pixelsBytes;\n\n const squareColors = options.colors === 2 ?\n readbits(options.id.substr(idx, pixelsBytes)) :\n filledarray(true, pixelsBytes);\n\n if (options.symmetry === 'vertical' || options.symmetry === 'central') {\n verticalSymmetry(squares, options.pixels);\n verticalSymmetry(squareColors, options.pixels);\n }\n\n if (options.symmetry === 'horizontal' || options.symmetry === 'central') {\n horizontalSymmetry(squares, options.pixels);\n horizontalSymmetry(squareColors, options.pixels);\n }\n\n const canvas = render(colors, squares, squareColors, options);\n\n return finalize(canvas, callback);\n}\n\nmodule.exports = squareicon;\nsquareicon.DEFAULT = DEFAULT;\n"],"names":["width","height","Object","assign","document","createElement","MAX_COLORS","MAX_PIXELS","MAX_SIZE","MAX_PADDING_RATIO","DEFAULT","id","hasher","md5","colors","pixels","size","padding","symmetry","scheme","background","unsecureRandom","length","out","Math","random","toString","substr","loopHash","str","i","minMax","val","min","max","hexdec","parseInt","getMinIdLength","getOptions","options","floor","round","minIdLength","indexOf","render","sq","sqc","l","c","ps","pad","cs","canvas","createCanvas","ctx","getContext","fillStyle","beginPath","rect","fill","finalize","callback","toBuffer","toDataURL","readbits","bits","tmp","Array","prototype","push","apply","verticalSymmetry","squares","slice","splice","ceil","reverse","horizontalSymmetry","readcolor","randomColor","seed","luminosity","format","filledarray","value","squareicon","colorBytes","pixelsBytes","idx","squareColors"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser.js","sources":["canvas.js","index.js"],"sourcesContent":["/**\n * Create a new Canvas object\n * From node-canvas browser.js\n * @param {number} width\n * @param {number} height\n * @returns {HTMLElement}\n */\nexports.createCanvas = function(width, height) {\n return Object.assign(document.createElement('canvas'), { width, height });\n};\n","const { createCanvas } = require('canvas');\nconst { createHash } = require('crypto');\nconst randomColor = require('randomcolor');\n\nconst MAX_COLORS = 2;\nconst MAX_PIXELS = 16;\nconst MAX_SIZE = 2048;\nconst MAX_PADDING_RATIO = 3;\n\nconst DEFAULT = {\n id : null,\n hasher : defaultHasher,\n colors : 2,\n pixels : 8,\n size : 128,\n padding : 0,\n symmetry : 'none',\n scheme : 'standard',\n background: 'transparent',\n};\n\n/**\n * Default hash implementation using node:crypto or Web Crypto API\n * @param {string} val\n * @returns {Promise}\n */\nasync function defaultHasher(val) {\n if (createHash) {\n return createHash('sha1').update(val).digest('hex');\n }\n else if (window.crypto?.subtle) {\n const data = new TextEncoder().encode(val);\n const result = await crypto.subtle.digest('sha-1', data);\n return Array.from(new Uint8Array(result))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n else {\n throw Error('No hasher available, please configure the \"hasher\" option.');\n }\n}\n\n/**\n * Generates a random HEX string of specific length\n * @param {number} length\n * @returns {string}\n */\nfunction unsecureRandom(length) {\n let out = '';\n while (out.length < length) out += Math.random().toString(16).substring(2);\n return out.substring(0, length);\n}\n\n/**\n * Loops a string and applies MD5 until a specific length\n * @param {function} hasher\n * @param {string} str\n * @param {number} length\n * @returns {Promise}\n */\nasync function loopHash(hasher, str, length) {\n let out = '';\n let i = 0;\n while (out.length < length) {\n out += await hasher(str + (++i > 1 ? i : ''));\n }\n return out.substring(0, length);\n}\n\n/**\n * Bounds a number\n * @param {number} val\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\nfunction minMax(val, min, max) {\n return Math.max(min, Math.min(val, max));\n}\n\n/**\n * Parse an hexadecimal string\n * @param {string} str\n * @returns {number}\n */\nfunction hexdec(str) {\n return parseInt(str, 16);\n}\n\n/**\n * Returns the minimim id length\n * @param {number} pixels\n * @param {number} colors\n * @returns {number}\n */\nfunction getMinIdLength(pixels, colors) {\n // 24 bits by color + 1 or 2 bits by pixel (given MAX_COLORS = 2)\n return (colors * 24 + colors * pixels * pixels) / 4;\n}\n\n/**\n * Cleanups options\n * @param {object|string} options\n * @returns {Promise}\n */\nasync function getOptions(options) {\n if (typeof options === 'string') {\n options = { id: options };\n }\n\n options = Object.assign({}, DEFAULT, options);\n\n options.colors = minMax(options.colors, 1, MAX_COLORS);\n options.pixels = minMax(options.pixels, 2, MAX_PIXELS);\n options.size = minMax(options.size, options.pixels, MAX_SIZE);\n options.padding = minMax(options.padding, 0, Math.floor(options.size / MAX_PADDING_RATIO));\n options.size = Math.round((options.size - options.padding * 2) / options.pixels) * options.pixels;\n\n if (['none', 'horizontal', 'vertical', 'central'].indexOf(options.symmetry) === -1) {\n options.symmetry = 'none';\n }\n\n if (['raw', 'standard', 'bright', 'light', 'dark'].indexOf(options.scheme) === -1) {\n options.scheme = 'standard';\n }\n\n const minIdLength = getMinIdLength(options.pixels, options.colors);\n if (!options.id) {\n options.id = unsecureRandom(minIdLength);\n }\n else {\n options.id = await loopHash(options.hasher, options.id, minIdLength);\n }\n\n return options;\n}\n\n/**\n * Performs render on a new canvas\n * @param {string[]} colors\n * @param {boolean[]} sq\n * @param {boolean[]} sqc\n * @param {object} options\n * @returns {Canvas}\n */\nfunction render(colors, sq, sqc, options) {\n let l = 0, c = 0;\n let ps = options.size / options.pixels;\n let pad = options.padding;\n let cs = options.size + 2 * options.padding;\n\n const canvas = createCanvas(cs, cs);\n const ctx = canvas.getContext('2d');\n\n ctx.fillStyle = options.background;\n ctx.beginPath();\n ctx.rect(0, 0, cs, cs);\n ctx.fill();\n\n for (let i = 0; i < options.pixels * options.pixels; i++) {\n if (sq[i]) {\n ctx.fillStyle = sqc[i] ? colors[0] : colors[1];\n ctx.beginPath();\n ctx.rect(pad + c * ps, pad + l * ps, ps, ps);\n ctx.fill();\n }\n\n c++;\n if (c === options.pixels) {\n c = 0;\n l++;\n }\n }\n\n return canvas;\n}\n\n/**\n * Returns the buffer or dataURL from a canvas\n * @param {Canvas} canvas\n * @param {Function} [callback]\n * @returns {String|Buffer|void}\n */\nfunction finalize(canvas, callback) {\n if (typeof callback === 'function') {\n if (canvas.toBuffer) {\n canvas.toBuffer(callback);\n }\n else {\n callback(null, canvas.toDataURL());\n }\n }\n else {\n if (canvas.toBuffer) {\n return canvas.toBuffer();\n }\n else {\n return canvas.toDataURL();\n }\n }\n}\n\n/**\n * Read the four bits of each char in the string\n * @param {string} str\n * @returns {boolean[]}\n */\nfunction readbits(str) {\n let bits = [];\n for (let i = 0; i < str.length; i++) {\n let tmp = hexdec(str.substring(i, i + 1));\n Array.prototype.push.apply(bits, [(tmp & 8) !== 0, (tmp & 4) !== 0, (tmp & 2) !== 0, (tmp & 1) !== 0]);\n }\n return bits;\n}\n\n/**\n * Applies a vertical symmetry\n * @param {Array} squares\n * @param {number} pixels\n */\nfunction verticalSymmetry(squares, pixels) {\n for (let i = 0; i < pixels; i++) {\n let tmp = squares.slice(i * pixels, Math.floor((i + 0.5) * pixels));\n squares.splice(Math.ceil((i + 0.5) * pixels), tmp.length, ...tmp.reverse());\n }\n}\n\n/**\n * Applies an horizontal symmetry\n * @param {Array} squares\n * @param {number} pixels\n */\nfunction horizontalSymmetry(squares, pixels) {\n for (let i = 0; i < Math.floor(pixels / 2); i++) {\n let tmp = squares.slice(i * pixels, (i + 1) * pixels);\n squares.splice((pixels - 1 - i) * pixels, tmp.length, ...tmp);\n }\n}\n\n/**\n * Returns a color for a 6 chars string\n * @param {string} str\n * @param {string} scheme\n * @returns {string}\n */\nfunction readcolor(str, scheme) {\n if (scheme === 'raw' || !randomColor) {\n return '#' + str;\n }\n else {\n return randomColor({\n seed : str,\n luminosity: scheme,\n format : 'hex',\n });\n }\n}\n\n/**\n * Creates an array with the same value\n * @param {*} value\n * @param {number} length\n * @returns {Array}\n */\nfunction filledarray(value, length) {\n let out = [];\n while (out.length < length) out.push(value);\n return out;\n}\n\n/**\n * Generates a squareison\n * @param {object} options\n * @param {Function} [callback]\n * @returns {Promise}\n */\nasync function squareicon(options, callback) {\n options = await getOptions(options);\n\n const colorBytes = 6;\n const pixelsBytes = options.pixels * options.pixels / 4;\n let idx = 0;\n\n const colors = [];\n for (let i = 0; i < options.colors; i++) {\n colors.push(readcolor(options.id.substr(idx, colorBytes), options.scheme));\n idx += colorBytes;\n }\n\n const squares = readbits(options.id.substr(idx, pixelsBytes));\n idx += pixelsBytes;\n\n const squareColors = options.colors === 2 ?\n readbits(options.id.substr(idx, pixelsBytes)) :\n filledarray(true, pixelsBytes);\n\n if (options.symmetry === 'vertical' || options.symmetry === 'central') {\n verticalSymmetry(squares, options.pixels);\n verticalSymmetry(squareColors, options.pixels);\n }\n\n if (options.symmetry === 'horizontal' || options.symmetry === 'central') {\n horizontalSymmetry(squares, options.pixels);\n horizontalSymmetry(squareColors, options.pixels);\n }\n\n const canvas = render(colors, squares, squareColors, options);\n\n return finalize(canvas, callback);\n}\n\nmodule.exports = squareicon;\nsquareicon.DEFAULT = DEFAULT;\n"],"names":["require$$0"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 021d39b..4d44a04 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "squareicon", - "version": "1.0.3", + "version": "2.0.0", "description": "identicons with squares", "license": "MIT", "author": {