chapter 2: initial samples
This commit is contained in:
parent
33f5fefdec
commit
583e10b98e
12
Chapter02/communicating-with-sockets/client.js
Normal file
12
Chapter02/communicating-with-sockets/client.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const net = require('net');
|
||||||
|
|
||||||
|
const HOSTNAME = 'localhost';
|
||||||
|
const PORT = 3000;
|
||||||
|
|
||||||
|
const socket = net.connect(PORT, HOSTNAME);
|
||||||
|
|
||||||
|
socket.write('World');
|
||||||
|
|
||||||
|
socket.on('data', (data) => {
|
||||||
|
console.log(data.toString());
|
||||||
|
});
|
||||||
13
Chapter02/communicating-with-sockets/server.js
Normal file
13
Chapter02/communicating-with-sockets/server.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
const net = require('net');
|
||||||
|
|
||||||
|
const HOSTNAME = 'localhost';
|
||||||
|
const PORT = 3000;
|
||||||
|
|
||||||
|
net.createServer((socket) => {
|
||||||
|
console.log('Client connected.');
|
||||||
|
|
||||||
|
socket.on('data', name => {
|
||||||
|
socket.write(`Hello ${name}!`);
|
||||||
|
});
|
||||||
|
|
||||||
|
}).listen(PORT, HOSTNAME);
|
||||||
BIN
Chapter02/fetching-metadata/.DS_Store
vendored
Normal file
BIN
Chapter02/fetching-metadata/.DS_Store
vendored
Normal file
Binary file not shown.
6
Chapter02/fetching-metadata/chmod-octal.js
Normal file
6
Chapter02/fetching-metadata/chmod-octal.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const file = './file.txt';
|
||||||
|
|
||||||
|
fs.chmodSync("./file.txt", 0o664);
|
||||||
9
Chapter02/fetching-metadata/chmod.js
Normal file
9
Chapter02/fetching-metadata/chmod.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const file = './file.txt';
|
||||||
|
|
||||||
|
fs.chmodSync("./file.txt",
|
||||||
|
fs.constants.S_IRUSR | fs.constants.S_IWUSR |
|
||||||
|
fs.constants.S_IRGRP | fs.constants.S_IWGRP |
|
||||||
|
fs.constants.S_IROTH);
|
||||||
0
Chapter02/fetching-metadata/file.txt
Normal file
0
Chapter02/fetching-metadata/file.txt
Normal file
9
Chapter02/fetching-metadata/metadata.js
Normal file
9
Chapter02/fetching-metadata/metadata.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const file = process.argv[2];
|
||||||
|
|
||||||
|
function printMetadata(file) {
|
||||||
|
const fileStats = fs.statSync(file);
|
||||||
|
console.log(fileStats);
|
||||||
|
};
|
||||||
|
|
||||||
|
printMetadata(file);
|
||||||
13
Chapter02/fetching-metadata/metadata2.js
Normal file
13
Chapter02/fetching-metadata/metadata2.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const file = process.argv[2];
|
||||||
|
|
||||||
|
function printMetadata(file) {
|
||||||
|
try {
|
||||||
|
const fileStats = fs.statSync(file);
|
||||||
|
console.log(fileStats);
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Error reading file path:", file);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
printMetadata(file);
|
||||||
12
Chapter02/file-watching/file.txt
Normal file
12
Chapter02/file-watching/file.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
HELLO!
|
||||||
|
ls
|
||||||
|
Hello again;
|
||||||
|
gs
|
||||||
|
gsgds
|
||||||
|
gsdsdf
|
||||||
|
sddsf
|
||||||
|
sdfsd
|
||||||
|
sdda
|
||||||
|
dfsdf
|
||||||
|
dsad
|
||||||
|
sdasd
|
||||||
13
Chapter02/file-watching/package-lock.json
generated
Normal file
13
Chapter02/file-watching/package-lock.json
generated
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"name": "file-watching",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"moment": {
|
||||||
|
"version": "2.24.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
|
||||||
|
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
16
Chapter02/file-watching/package.json
Normal file
16
Chapter02/file-watching/package.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "file-watching",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "watch.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"moment": "^2.24.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {},
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
6
Chapter02/file-watching/watch.js
Normal file
6
Chapter02/file-watching/watch.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const file = './file.txt';
|
||||||
|
|
||||||
|
fs.watchFile(file, (current, previous) => {
|
||||||
|
return console.log(`${file} updated ${time}`)
|
||||||
|
});
|
||||||
8
Chapter02/file-watching/watch2.js
Normal file
8
Chapter02/file-watching/watch2.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const file = './file.txt';
|
||||||
|
const moment = require('moment');
|
||||||
|
|
||||||
|
fs.watch(file, (eventType, filename) => {
|
||||||
|
const time = moment().format('MMMM Do YYYY, h:mm:ss a');
|
||||||
|
return console.log(`${filename} updated ${time}`)
|
||||||
|
});
|
||||||
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "",
|
|
||||||
"dependencies": {
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "",
|
|
||||||
"dependencies": {
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "npm run lint",
|
|
||||||
"lint": "standard"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "",
|
|
||||||
"dependencies": {
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
4
Chapter02/interfacing-with-io/greeting.js
Normal file
4
Chapter02/interfacing-with-io/greeting.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
process.stdin.on('data', (data) => {
|
||||||
|
let name = data.toString().trim().toUpperCase();
|
||||||
|
process.stdout.write(`Hello ${name}!`);
|
||||||
|
});
|
||||||
8
Chapter02/interfacing-with-io/greeting2.js
Normal file
8
Chapter02/interfacing-with-io/greeting2.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
process.stdin.on('data', data => {
|
||||||
|
let name = data.toString().trim().toUpperCase();
|
||||||
|
if (name != '') {
|
||||||
|
process.stdout.write(`Hello ${name}!`);
|
||||||
|
} else {
|
||||||
|
process.stderr.write('Input was empty.');
|
||||||
|
}
|
||||||
|
});
|
||||||
@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
*.log
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
var hsl = require('./')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
// In our case, there's only one dependency
|
|
||||||
|
|
||||||
var toRgb = require('hsl-to-rgb-for-reals')
|
|
||||||
var debug = require('debug')('hsl-to-hex')
|
|
||||||
|
|
||||||
// Typically all dependencies should be declared at the top of the file.
|
|
||||||
|
|
||||||
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
||||||
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
||||||
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
||||||
// Let's write some utility functions to handle this logic:
|
|
||||||
|
|
||||||
function max (val, n) {
|
|
||||||
debug('ensuring ' + val + ' is no more than ' + n)
|
|
||||||
return (val > n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function min (val, n) {
|
|
||||||
debug('ensuring ' + val + ' is no less than ' + n)
|
|
||||||
return (val < n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function cycle (val) {
|
|
||||||
debug('resolving ' + val + ' within the 0-359 range')
|
|
||||||
|
|
||||||
// for safety:
|
|
||||||
val = max(val, 1e7)
|
|
||||||
val = min(val, -1e7)
|
|
||||||
// cycle value:
|
|
||||||
while (val < 0) { val += 360 }
|
|
||||||
while (val > 359) { val -= 360 }
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for the main piece, the `hsl` function:
|
|
||||||
|
|
||||||
function hsl (hue, saturation, luminosity) {
|
|
||||||
debug('calculating hex for hue: ' + hue + ' saturation: ' + saturation + ' luminosity: ' + luminosity)
|
|
||||||
|
|
||||||
// resolve degrees to 0 - 359 range
|
|
||||||
hue = cycle(hue)
|
|
||||||
|
|
||||||
// enforce constraints
|
|
||||||
saturation = min(max(saturation, 100), 0)
|
|
||||||
luminosity = min(max(luminosity, 100), 0)
|
|
||||||
|
|
||||||
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
||||||
saturation /= 100
|
|
||||||
luminosity /= 100
|
|
||||||
|
|
||||||
// let hsl-to-rgb-for-reals do the hard work
|
|
||||||
var rgb = toRgb(hue, saturation, luminosity)
|
|
||||||
|
|
||||||
// convert each value in the returned RGB array
|
|
||||||
// to a 2 character hex value, join the array into
|
|
||||||
// a string, prefixed with a hash
|
|
||||||
return '#' + rgb
|
|
||||||
.map(function (n) {
|
|
||||||
return (256 + n).toString(16).substr(-2)
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to make our code into a bona fide module we have to export it:
|
|
||||||
|
|
||||||
module.exports = hsl
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@davidmarkclements/hsl-to-hex",
|
|
||||||
"version": "1.0.1",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"check": "npm ls && npm test",
|
|
||||||
"test": "npm run lint && tap --cov test",
|
|
||||||
"lint": "standard",
|
|
||||||
"prepublish": "npm run check && ./publish-dep.sh"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "Convert HSL colors to RGB colors in hex format.",
|
|
||||||
"dependencies": {
|
|
||||||
"debug": "^2.2.0",
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8",
|
|
||||||
"tap": "^5.7.0"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"test": "test"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
|
|
||||||
# 400 - Missing hash and/or peer_id
|
|
||||||
# 403 - Not allowed
|
|
||||||
# 413 - Too big
|
|
||||||
# 200 - Ok!
|
|
||||||
|
|
||||||
|
|
||||||
if echo $npm_config_argv | grep -q "install"; then
|
|
||||||
echo "Running at install step, skipping"
|
|
||||||
else
|
|
||||||
if ipfs &>/dev/null; then
|
|
||||||
echo "## Publishing dependency"
|
|
||||||
|
|
||||||
mv node_modules .node_modules 2>/dev/null
|
|
||||||
|
|
||||||
HASH=$(ipfs add . -r | tail -n 1 | cut -d ' ' -f 2)
|
|
||||||
|
|
||||||
mv .node_modules node_modules 2>/dev/null
|
|
||||||
|
|
||||||
echo "Published as $HASH"
|
|
||||||
|
|
||||||
PEER=$(ipfs id --format '<id>')
|
|
||||||
|
|
||||||
if [ -f ~/.stay/nodes.json ]; then
|
|
||||||
cat ~/.stay/nodes.json | jq -rc '.[]' | while read host; do
|
|
||||||
address="$host/api/pin/add/$HASH/$PEER"
|
|
||||||
status=$(curl -X POST --silent $address)
|
|
||||||
case "$status" in
|
|
||||||
"400") echo "$host - Application Error: Missing the hash and/or peer_id"
|
|
||||||
;;
|
|
||||||
"403") echo "$host - You do not have access to pinning at this node"
|
|
||||||
;;
|
|
||||||
"413") echo "$host - The module was too big to pin!"
|
|
||||||
;;
|
|
||||||
"200") echo "$host - Pinned!"
|
|
||||||
;;
|
|
||||||
*) echo "Weird status code $status for $host"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
else
|
|
||||||
echo "You don't have any saved nodes in ~/.stay/nodes.json, skip pinning"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "## Could not publish dependency to IPFS, doing the good'ol 'fetch from npm registry' way"
|
|
||||||
echo "Either 'ipfs' doesn't exists in PATH or you haven't run 'ipfs daemon' before running the command"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
# hsl-to-hex
|
|
||||||
|
|
||||||
Convert HSL colors to RGB colors in hex format.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save @davidmarkclements/hsl-to-hex
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```
|
|
||||||
require('hsl-to-hex') => Function
|
|
||||||
hsl(hue, saturation, luminosity)` => String
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var hsl = require('hsl-to-hex')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
ISC
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
var hsl = require('../')
|
|
||||||
var test = require('tap').test
|
|
||||||
|
|
||||||
test('pure white', function (assert) {
|
|
||||||
var expected = '#ffffff'
|
|
||||||
var actual = hsl(0, 100, 100)
|
|
||||||
var it = 'max saturation and luminosity should return pure white'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('medium gray', function (assert) {
|
|
||||||
var expected = '#808080'
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '0% saturation, 50% luminosity should be medium gray'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - red', function (assert) {
|
|
||||||
var expected = '#ff0000'
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '0deg should be red'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - blue', function (assert) {
|
|
||||||
var expected = '#0000ff'
|
|
||||||
var actual = hsl(240, 100, 50)
|
|
||||||
var it = '240deg should be blue'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - cyan', function (assert) {
|
|
||||||
var expected = '#00ffff'
|
|
||||||
var actual = hsl(180, 100, 50)
|
|
||||||
var it = '180deg should be cyan'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree overflow', function (assert) {
|
|
||||||
var expected = hsl(1, 100, 50)
|
|
||||||
var actual = hsl(361, 100, 50)
|
|
||||||
var it = '361deg should be the same as 1deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree underflow', function (assert) {
|
|
||||||
var expected = hsl(-1, 100, 50)
|
|
||||||
var actual = hsl(359, 100, 50)
|
|
||||||
var it = '-1deg should be the same as 359deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('max constraint', function (assert) {
|
|
||||||
var expected = hsl(0, 101, 50)
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '101% should be the same as 100%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('min constraint', function (assert) {
|
|
||||||
var expected = hsl(0, -1, 50)
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '-1% should be the same as 0%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "stay-play",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "MIT"
|
|
||||||
}
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
*.log
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
var hsl = require('./')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
// In our case, there's only one dependency
|
|
||||||
|
|
||||||
var toRgb = require('hsl-to-rgb-for-reals')
|
|
||||||
|
|
||||||
// Typically all dependencies should be declared at the top of the file.
|
|
||||||
|
|
||||||
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
||||||
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
||||||
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
||||||
// Let's write some utility functions to handle this logic:
|
|
||||||
|
|
||||||
function max (val, n) {
|
|
||||||
return (val > n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function min (val, n) {
|
|
||||||
return (val < n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function cycle (val) {
|
|
||||||
// for safety:
|
|
||||||
val = max(val, 1e7)
|
|
||||||
val = min(val, -1e7)
|
|
||||||
// cycle value:
|
|
||||||
while (val < 0) { val += 360 }
|
|
||||||
while (val > 359) { val -= 360 }
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for the main piece, the `hsl` function:
|
|
||||||
|
|
||||||
function hsl (hue, saturation, luminosity) {
|
|
||||||
// resolve degrees to 0 - 359 range
|
|
||||||
hue = cycle(hue)
|
|
||||||
|
|
||||||
// enforce constraints
|
|
||||||
saturation = min(max(saturation, 100), 0)
|
|
||||||
luminosity = min(max(luminosity, 100), 0)
|
|
||||||
|
|
||||||
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
||||||
saturation /= 100
|
|
||||||
luminosity /= 100
|
|
||||||
|
|
||||||
// let hsl-to-rgb-for-reals do the hard work
|
|
||||||
var rgb = toRgb(hue, saturation, luminosity)
|
|
||||||
|
|
||||||
// convert each value in the returned RGB array
|
|
||||||
// to a 2 character hex value, join the array into
|
|
||||||
// a string, prefixed with a hash
|
|
||||||
return '#' + rgb
|
|
||||||
.map(function (n) {
|
|
||||||
return (256 + n).toString(16).substr(-2)
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to make our code into a bona fide module we have to export it:
|
|
||||||
|
|
||||||
module.exports = hsl
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@davidmarkclements/hsl-to-hex",
|
|
||||||
"version": "1.0.1",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "npm run lint && tap --cov test",
|
|
||||||
"lint": "standard"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "Convert HSL colors to RGB colors in hex format.",
|
|
||||||
"dependencies": {
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8",
|
|
||||||
"tap": "^5.7.0"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"test": "test"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
# hsl-to-hex
|
|
||||||
|
|
||||||
Convert HSL colors to RGB colors in hex format.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save @davidmarkclements/hsl-to-hex
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```
|
|
||||||
require('hsl-to-hex') => Function
|
|
||||||
hsl(hue, saturation, luminosity)` => String
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var hsl = require('hsl-to-hex')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
ISC
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
var hsl = require('../')
|
|
||||||
var test = require('tap').test
|
|
||||||
|
|
||||||
test('pure white', function (assert) {
|
|
||||||
var expected = '#ffffff'
|
|
||||||
var actual = hsl(0, 100, 100)
|
|
||||||
var it = 'max saturation and luminosity should return pure white'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('medium gray', function (assert) {
|
|
||||||
var expected = '#808080'
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '0% saturation, 50% luminosity should be medium gray'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - red', function (assert) {
|
|
||||||
var expected = '#ff0000'
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '0deg should be red'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - blue', function (assert) {
|
|
||||||
var expected = '#0000ff'
|
|
||||||
var actual = hsl(240, 100, 50)
|
|
||||||
var it = '240deg should be blue'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - cyan', function (assert) {
|
|
||||||
var expected = '#00ffff'
|
|
||||||
var actual = hsl(180, 100, 50)
|
|
||||||
var it = '180deg should be cyan'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree overflow', function (assert) {
|
|
||||||
var expected = hsl(1, 100, 50)
|
|
||||||
var actual = hsl(361, 100, 50)
|
|
||||||
var it = '361deg should be the same as 1deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree underflow', function (assert) {
|
|
||||||
var expected = hsl(-1, 100, 50)
|
|
||||||
var actual = hsl(359, 100, 50)
|
|
||||||
var it = '-1deg should be the same as 359deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('max constraint', function (assert) {
|
|
||||||
var expected = hsl(0, 101, 50)
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '101% should be the same as 100%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('min constraint', function (assert) {
|
|
||||||
var expected = hsl(0, -1, 50)
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '-1% should be the same as 0%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
*.log
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
var hsl = require('./')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
// In our case, there's only one dependency
|
|
||||||
|
|
||||||
var toRgb = require('hsl-to-rgb-for-reals')
|
|
||||||
var debug = require('debug')('hsl-to-hex')
|
|
||||||
|
|
||||||
// Typically all dependencies should be declared at the top of the file.
|
|
||||||
|
|
||||||
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
||||||
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
||||||
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
||||||
// Let's write some utility functions to handle this logic:
|
|
||||||
|
|
||||||
function max (val, n) {
|
|
||||||
debug('ensuring ' + val + ' is no more than ' + n)
|
|
||||||
return (val > n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function min (val, n) {
|
|
||||||
debug('ensuring ' + val + ' is no less than ' + n)
|
|
||||||
return (val < n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function cycle (val) {
|
|
||||||
debug('resolving ' + val + ' within the 0-359 range')
|
|
||||||
|
|
||||||
// for safety:
|
|
||||||
val = max(val, 1e7)
|
|
||||||
val = min(val, -1e7)
|
|
||||||
// cycle value:
|
|
||||||
while (val < 0) { val += 360 }
|
|
||||||
while (val > 359) { val -= 360 }
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for the main piece, the `hsl` function:
|
|
||||||
|
|
||||||
function hsl (hue, saturation, luminosity) {
|
|
||||||
debug('calculating hex for hue: ' + hue + ' saturation: ' + saturation + ' luminosity: ' + luminosity)
|
|
||||||
|
|
||||||
// resolve degrees to 0 - 359 range
|
|
||||||
hue = cycle(hue)
|
|
||||||
|
|
||||||
// enforce constraints
|
|
||||||
saturation = min(max(saturation, 100), 0)
|
|
||||||
luminosity = min(max(luminosity, 100), 0)
|
|
||||||
|
|
||||||
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
||||||
saturation /= 100
|
|
||||||
luminosity /= 100
|
|
||||||
|
|
||||||
// let hsl-to-rgb-for-reals do the hard work
|
|
||||||
var rgb = toRgb(hue, saturation, luminosity)
|
|
||||||
|
|
||||||
// convert each value in the returned RGB array
|
|
||||||
// to a 2 character hex value, join the array into
|
|
||||||
// a string, prefixed with a hash
|
|
||||||
return '#' + rgb
|
|
||||||
.map(function (n) {
|
|
||||||
return (256 + n).toString(16).substr(-2)
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to make our code into a bona fide module we have to export it:
|
|
||||||
|
|
||||||
module.exports = hsl
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@davidmarkclements/hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "npm run lint && tap --cov test",
|
|
||||||
"lint": "standard"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "Convert HSL colors to RGB colors in hex format.",
|
|
||||||
"dependencies": {
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8",
|
|
||||||
"tap": "^5.7.0"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"test": "test"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
# hsl-to-hex
|
|
||||||
|
|
||||||
Convert HSL colors to RGB colors in hex format.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save @davidmarkclements/hsl-to-hex
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```
|
|
||||||
require('hsl-to-hex') => Function
|
|
||||||
hsl(hue, saturation, luminosity)` => String
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var hsl = require('hsl-to-hex')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
ISC
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
var hsl = require('../')
|
|
||||||
var test = require('tap').test
|
|
||||||
|
|
||||||
test('pure white', function (assert) {
|
|
||||||
var expected = '#ffffff'
|
|
||||||
var actual = hsl(0, 100, 100)
|
|
||||||
var it = 'max saturation and luminosity should return pure white'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('medium gray', function (assert) {
|
|
||||||
var expected = '#808080'
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '0% saturation, 50% luminosity should be medium gray'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - red', function (assert) {
|
|
||||||
var expected = '#ff0000'
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '0deg should be red'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - blue', function (assert) {
|
|
||||||
var expected = '#0000ff'
|
|
||||||
var actual = hsl(240, 100, 50)
|
|
||||||
var it = '240deg should be blue'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - cyan', function (assert) {
|
|
||||||
var expected = '#00ffff'
|
|
||||||
var actual = hsl(180, 100, 50)
|
|
||||||
var it = '180deg should be cyan'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree overflow', function (assert) {
|
|
||||||
var expected = hsl(1, 100, 50)
|
|
||||||
var actual = hsl(361, 100, 50)
|
|
||||||
var it = '361deg should be the same as 1deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree underflow', function (assert) {
|
|
||||||
var expected = hsl(-1, 100, 50)
|
|
||||||
var actual = hsl(359, 100, 50)
|
|
||||||
var it = '-1deg should be the same as 359deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('max constraint', function (assert) {
|
|
||||||
var expected = hsl(0, 101, 50)
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '101% should be the same as 100%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('min constraint', function (assert) {
|
|
||||||
var expected = hsl(0, -1, 50)
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '-1% should be the same as 0%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
*.log
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
var hsl = require('./')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
// In our case, there's only one dependency
|
|
||||||
|
|
||||||
var toRgb = require('hsl-to-rgb-for-reals')
|
|
||||||
var debug = require('debug')('hsl-to-hex')
|
|
||||||
|
|
||||||
// Typically all dependencies should be declared at the top of the file.
|
|
||||||
|
|
||||||
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
||||||
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
||||||
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
||||||
// Let's write some utility functions to handle this logic:
|
|
||||||
|
|
||||||
function max (val, n) {
|
|
||||||
debug('ensuring ' + val + ' is no more than ' + n)
|
|
||||||
return (val > n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function min (val, n) {
|
|
||||||
debug('ensuring ' + val + ' is no less than ' + n)
|
|
||||||
return (val < n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function cycle (val) {
|
|
||||||
debug('resolving ' + val + ' within the 0-359 range')
|
|
||||||
|
|
||||||
// for safety:
|
|
||||||
val = max(val, 1e7)
|
|
||||||
val = min(val, -1e7)
|
|
||||||
// cycle value:
|
|
||||||
while (val < 0) { val += 360 }
|
|
||||||
while (val > 359) { val -= 360 }
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for the main piece, the `hsl` function:
|
|
||||||
|
|
||||||
function hsl (hue, saturation, luminosity) {
|
|
||||||
debug('calculating hex for hue: ' + hue + ' saturation: ' + saturation + ' luminosity: ' + luminosity)
|
|
||||||
|
|
||||||
// resolve degrees to 0 - 359 range
|
|
||||||
hue = cycle(hue)
|
|
||||||
|
|
||||||
// enforce constraints
|
|
||||||
saturation = min(max(saturation, 100), 0)
|
|
||||||
luminosity = min(max(luminosity, 100), 0)
|
|
||||||
|
|
||||||
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
||||||
saturation /= 100
|
|
||||||
luminosity /= 100
|
|
||||||
|
|
||||||
// let hsl-to-rgb-for-reals do the hard work
|
|
||||||
var rgb = toRgb(hue, saturation, luminosity)
|
|
||||||
|
|
||||||
// convert each value in the returned RGB array
|
|
||||||
// to a 2 character hex value, join the array into
|
|
||||||
// a string, prefixed with a hash
|
|
||||||
return '#' + rgb
|
|
||||||
.map(function (n) {
|
|
||||||
return (256 + n).toString(16).substr(-2)
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to make our code into a bona fide module we have to export it:
|
|
||||||
|
|
||||||
module.exports = hsl
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@davidmarkclements/hsl-to-hex",
|
|
||||||
"version": "1.0.1",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"prepublish": "npm ls && npm test",
|
|
||||||
"test": "npm run lint && tap --cov test",
|
|
||||||
"lint": "standard"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "Convert HSL colors to RGB colors in hex format.",
|
|
||||||
"dependencies": {
|
|
||||||
"debug": "^2.2.0",
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8",
|
|
||||||
"tap": "^5.7.0"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"test": "test"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
# hsl-to-hex
|
|
||||||
|
|
||||||
Convert HSL colors to RGB colors in hex format.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save @davidmarkclements/hsl-to-hex
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```
|
|
||||||
require('hsl-to-hex') => Function
|
|
||||||
hsl(hue, saturation, luminosity)` => String
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var hsl = require('hsl-to-hex')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
ISC
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
var hsl = require('../')
|
|
||||||
var test = require('tap').test
|
|
||||||
|
|
||||||
test('pure white', function (assert) {
|
|
||||||
var expected = '#ffffff'
|
|
||||||
var actual = hsl(0, 100, 100)
|
|
||||||
var it = 'max saturation and luminosity should return pure white'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('medium gray', function (assert) {
|
|
||||||
var expected = '#808080'
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '0% saturation, 50% luminosity should be medium gray'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - red', function (assert) {
|
|
||||||
var expected = '#ff0000'
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '0deg should be red'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - blue', function (assert) {
|
|
||||||
var expected = '#0000ff'
|
|
||||||
var actual = hsl(240, 100, 50)
|
|
||||||
var it = '240deg should be blue'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - cyan', function (assert) {
|
|
||||||
var expected = '#00ffff'
|
|
||||||
var actual = hsl(180, 100, 50)
|
|
||||||
var it = '180deg should be cyan'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree overflow', function (assert) {
|
|
||||||
var expected = hsl(1, 100, 50)
|
|
||||||
var actual = hsl(361, 100, 50)
|
|
||||||
var it = '361deg should be the same as 1deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree underflow', function (assert) {
|
|
||||||
var expected = hsl(-1, 100, 50)
|
|
||||||
var actual = hsl(359, 100, 50)
|
|
||||||
var it = '-1deg should be the same as 359deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('max constraint', function (assert) {
|
|
||||||
var expected = hsl(0, 101, 50)
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '101% should be the same as 100%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('min constraint', function (assert) {
|
|
||||||
var expected = hsl(0, -1, 50)
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '-1% should be the same as 0%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": ""
|
|
||||||
}
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
*.log
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": ""
|
|
||||||
}
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
*.log
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
var hsl = require('./')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
// In our case, there's only one dependency
|
|
||||||
|
|
||||||
var toRgb = require('hsl-to-rgb-for-reals')
|
|
||||||
var debug = require('debug')('hsl-to-hex')
|
|
||||||
|
|
||||||
// Typically all dependencies should be declared at the top of the file.
|
|
||||||
|
|
||||||
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
||||||
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
||||||
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
||||||
// Let's write some utility functions to handle this logic:
|
|
||||||
|
|
||||||
function max (val, n) {
|
|
||||||
debug('ensuring ' + val + ' is no more than ' + n)
|
|
||||||
return (val > n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function min (val, n) {
|
|
||||||
debug('ensuring ' + val + ' is no less than ' + n)
|
|
||||||
return (val < n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function cycle (val) {
|
|
||||||
debug('resolving ' + val + ' within the 0-359 range')
|
|
||||||
|
|
||||||
// for safety:
|
|
||||||
val = max(val, 1e7)
|
|
||||||
val = min(val, -1e7)
|
|
||||||
// cycle value:
|
|
||||||
while (val < 0) { val += 360 }
|
|
||||||
while (val > 359) { val -= 360 }
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for the main piece, the `hsl` function:
|
|
||||||
|
|
||||||
function hsl (hue, saturation, luminosity) {
|
|
||||||
debug('calculating hex for hue: ' + hue + ' saturation: ' + saturation + ' luminosity: ' + luminosity)
|
|
||||||
|
|
||||||
// resolve degrees to 0 - 359 range
|
|
||||||
hue = cycle(hue)
|
|
||||||
|
|
||||||
// enforce constraints
|
|
||||||
saturation = min(max(saturation, 100), 0)
|
|
||||||
luminosity = min(max(luminosity, 100), 0)
|
|
||||||
|
|
||||||
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
||||||
saturation /= 100
|
|
||||||
luminosity /= 100
|
|
||||||
|
|
||||||
// let hsl-to-rgb-for-reals do the hard work
|
|
||||||
var rgb = toRgb(hue, saturation, luminosity)
|
|
||||||
|
|
||||||
// convert each value in the returned RGB array
|
|
||||||
// to a 2 character hex value, join the array into
|
|
||||||
// a string, prefixed with a hash
|
|
||||||
return '#' + rgb
|
|
||||||
.map(function (n) {
|
|
||||||
return (256 + n).toString(16).substr(-2)
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to make our code into a bona fide module we have to export it:
|
|
||||||
|
|
||||||
module.exports = hsl
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@ncb/hsl-to-hex",
|
|
||||||
"version": "1.0.1",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"check": "npm ls && npm test",
|
|
||||||
"test": "npm run lint && tap --cov test",
|
|
||||||
"lint": "standard",
|
|
||||||
"prepublish": "npm run check && ./publish-dep.sh"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "Convert HSL colors to RGB colors in hex format.",
|
|
||||||
"dependencies": {
|
|
||||||
"debug": "^2.2.0",
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8",
|
|
||||||
"tap": "^5.7.0"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"test": "test"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
|
|
||||||
# 400 - Missing hash and/or peer_id
|
|
||||||
# 403 - Not allowed
|
|
||||||
# 413 - Too big
|
|
||||||
# 200 - Ok!
|
|
||||||
|
|
||||||
|
|
||||||
if echo $npm_config_argv | grep -q "install"; then
|
|
||||||
echo "Running at install step, skipping"
|
|
||||||
else
|
|
||||||
if ipfs &>/dev/null; then
|
|
||||||
echo "## Publishing dependency"
|
|
||||||
|
|
||||||
mv node_modules .node_modules 2>/dev/null
|
|
||||||
|
|
||||||
HASH=$(ipfs add . -r | tail -n 1 | cut -d ' ' -f 2)
|
|
||||||
|
|
||||||
mv .node_modules node_modules 2>/dev/null
|
|
||||||
|
|
||||||
echo "Published as $HASH"
|
|
||||||
|
|
||||||
PEER=$(ipfs id --format '<id>')
|
|
||||||
|
|
||||||
if [ -f ~/.stay/nodes.json ]; then
|
|
||||||
cat ~/.stay/nodes.json | jq -rc '.[]' | while read host; do
|
|
||||||
address="$host/api/pin/add/$HASH/$PEER"
|
|
||||||
status=$(curl -X POST --silent $address)
|
|
||||||
case "$status" in
|
|
||||||
"400") echo "$host - Application Error: Missing the hash and/or peer_id"
|
|
||||||
;;
|
|
||||||
"403") echo "$host - You do not have access to pinning at this node"
|
|
||||||
;;
|
|
||||||
"413") echo "$host - The module was too big to pin!"
|
|
||||||
;;
|
|
||||||
"200") echo "$host - Pinned!"
|
|
||||||
;;
|
|
||||||
*) echo "Weird status code $status for $host"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
else
|
|
||||||
echo "You don't have any saved nodes in ~/.stay/nodes.json, skip pinning"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "## Could not publish dependency to IPFS, doing the good'ol 'fetch from npm registry' way"
|
|
||||||
echo "Either 'ipfs' doesn't exists in PATH or you haven't run 'ipfs daemon' before running the command"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
# hsl-to-hex
|
|
||||||
|
|
||||||
Convert HSL colors to RGB colors in hex format.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save @davidmarkclements/hsl-to-hex
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```
|
|
||||||
require('hsl-to-hex') => Function
|
|
||||||
hsl(hue, saturation, luminosity)` => String
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var hsl = require('hsl-to-hex')
|
|
||||||
var hue = 133
|
|
||||||
var saturation = 40
|
|
||||||
var luminosity = 60
|
|
||||||
var hex = hsl(hue, saturation, luminosity)
|
|
||||||
console.log(hex) // #70c282
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
ISC
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
var hsl = require('../')
|
|
||||||
var test = require('tap').test
|
|
||||||
|
|
||||||
test('pure white', function (assert) {
|
|
||||||
var expected = '#ffffff'
|
|
||||||
var actual = hsl(0, 100, 100)
|
|
||||||
var it = 'max saturation and luminosity should return pure white'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('medium gray', function (assert) {
|
|
||||||
var expected = '#808080'
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '0% saturation, 50% luminosity should be medium gray'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - red', function (assert) {
|
|
||||||
var expected = '#ff0000'
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '0deg should be red'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - blue', function (assert) {
|
|
||||||
var expected = '#0000ff'
|
|
||||||
var actual = hsl(240, 100, 50)
|
|
||||||
var it = '240deg should be blue'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - cyan', function (assert) {
|
|
||||||
var expected = '#00ffff'
|
|
||||||
var actual = hsl(180, 100, 50)
|
|
||||||
var it = '180deg should be cyan'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree overflow', function (assert) {
|
|
||||||
var expected = hsl(1, 100, 50)
|
|
||||||
var actual = hsl(361, 100, 50)
|
|
||||||
var it = '361deg should be the same as 1deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree underflow', function (assert) {
|
|
||||||
var expected = hsl(-1, 100, 50)
|
|
||||||
var actual = hsl(359, 100, 50)
|
|
||||||
var it = '-1deg should be the same as 359deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('max constraint', function (assert) {
|
|
||||||
var expected = hsl(0, 101, 50)
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '101% should be the same as 100%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('min constraint', function (assert) {
|
|
||||||
var expected = hsl(0, -1, 50)
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '-1% should be the same as 0%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
BIN
Chapter02/working-with-files/.DS_Store
vendored
Normal file
BIN
Chapter02/working-with-files/.DS_Store
vendored
Normal file
Binary file not shown.
5
Chapter02/working-with-files/callback-hell.js
Normal file
5
Chapter02/working-with-files/callback-hell.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
first(args, function () {
|
||||||
|
second(args, function () {
|
||||||
|
third(args, function () {})
|
||||||
|
})
|
||||||
|
})
|
||||||
1
Chapter02/working-with-files/hello.txt
Normal file
1
Chapter02/working-with-files/hello.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
HELLO WORLD!
|
||||||
16
Chapter02/working-with-files/readWriteAsync.js
Normal file
16
Chapter02/working-with-files/readWriteAsync.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
const filepath = path.join(process.cwd(), 'hello.txt');
|
||||||
|
|
||||||
|
fs.readFile(filepath, 'utf8', function (err, contents) {
|
||||||
|
if (err) {
|
||||||
|
return console.log(err);
|
||||||
|
}
|
||||||
|
console.log("File Contents:", contents);
|
||||||
|
contents = contents.toUpperCase();
|
||||||
|
fs.writeFile(filepath, contents, function (err) {
|
||||||
|
if (err) throw err;
|
||||||
|
console.log("File updated.")
|
||||||
|
});
|
||||||
|
});
|
||||||
20
Chapter02/working-with-files/readWriteAsync2.js
Normal file
20
Chapter02/working-with-files/readWriteAsync2.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
const filepath = path.join(process.cwd(), 'hello.txt');
|
||||||
|
|
||||||
|
fs.readFile(filepath, 'utf8', function (err, contents) {
|
||||||
|
if (err) {
|
||||||
|
return console.log(err);
|
||||||
|
}
|
||||||
|
console.log("File Contents:", contents);
|
||||||
|
contents = contents.toUpperCase();
|
||||||
|
updateFile(filepath, contents);
|
||||||
|
});
|
||||||
|
|
||||||
|
function updateFile(filepath, contents) {
|
||||||
|
fs.writeFile(filepath, contents, function (err) {
|
||||||
|
if (err) throw err;
|
||||||
|
console.log("File updated.");
|
||||||
|
});
|
||||||
|
};
|
||||||
15
Chapter02/working-with-files/readWritePromise.js
Normal file
15
Chapter02/working-with-files/readWritePromise.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
const fs = require("fs").promises;
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const filepath = path.join(process.cwd(), 'hello.txt');
|
||||||
|
|
||||||
|
async function run() {
|
||||||
|
try {
|
||||||
|
const contents = await fs.readFile(filepath, 'utf8');
|
||||||
|
console.log("File Contents:", contents);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
run();
|
||||||
12
Chapter02/working-with-files/readWriteSync.js
Normal file
12
Chapter02/working-with-files/readWriteSync.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const filepath = path.join(process.cwd(), 'hello.txt');
|
||||||
|
|
||||||
|
let contents = fs.readFileSync(filepath, 'utf8');
|
||||||
|
console.log("File Contents:", contents);
|
||||||
|
|
||||||
|
contents = contents.toString().toUpperCase();
|
||||||
|
|
||||||
|
fs.writeFileSync(filepath, contents);
|
||||||
|
console.log("File updated.");
|
||||||
@ -1,59 +0,0 @@
|
|||||||
// In our case, there's only one dependency
|
|
||||||
|
|
||||||
var toRgb = require('hsl-to-rgb-for-reals')
|
|
||||||
|
|
||||||
// Typically all dependencies should be declared at the top of the file.
|
|
||||||
|
|
||||||
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
||||||
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
||||||
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
||||||
// Let's write some utility functions to handle this logic:
|
|
||||||
|
|
||||||
function max (val, n) {
|
|
||||||
return (val > n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function min (val, n) {
|
|
||||||
return (val < n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function cycle (val) {
|
|
||||||
// for safety:
|
|
||||||
val = max(val, 1e7)
|
|
||||||
val = min(val, -1e7)
|
|
||||||
// cycle value:
|
|
||||||
while (val < 0) { val += 360 }
|
|
||||||
while (val > 359) { val -= 360 }
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for the main piece, the `hsl` function:
|
|
||||||
|
|
||||||
function hsl (hue, saturation, luminosity) {
|
|
||||||
// resolve degrees to 0 - 359 range
|
|
||||||
hue = cycle(hue)
|
|
||||||
|
|
||||||
// enforce constraints
|
|
||||||
saturation = min(max(saturation, 100), 0)
|
|
||||||
luminosity = min(max(luminosity, 100), 0)
|
|
||||||
|
|
||||||
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
||||||
saturation /= 100
|
|
||||||
luminosity /= 100
|
|
||||||
|
|
||||||
// let hsl-to-rgb-for-reals do the hard work
|
|
||||||
var rgb = toRgb(hue, saturation, luminosity)
|
|
||||||
|
|
||||||
// convert each value in the returned RGB array
|
|
||||||
// to a 2 character hex value, join the array into
|
|
||||||
// a string, prefixed with a hash
|
|
||||||
return '#' + rgb
|
|
||||||
.map(function (n) {
|
|
||||||
return (256 + n).toString(16).substr(-2)
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to make our code into a bona fide module we have to export it:
|
|
||||||
|
|
||||||
module.exports = hsl
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "npm run lint && tap --cov test",
|
|
||||||
"lint": "standard"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "",
|
|
||||||
"dependencies": {
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8",
|
|
||||||
"tap": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
var hsl = require('../')
|
|
||||||
var test = require('tap').test
|
|
||||||
|
|
||||||
test('pure white', function (assert) {
|
|
||||||
var expected = '#ffffff'
|
|
||||||
var actual = hsl(0, 100, 100)
|
|
||||||
var it = 'max saturation and luminosity should return pure white'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('medium gray', function (assert) {
|
|
||||||
var expected = '#808080'
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '0% saturation, 50% luminosity should be medium gray'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - red', function (assert) {
|
|
||||||
var expected = '#ff0000'
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '0deg should be red'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - blue', function (assert) {
|
|
||||||
var expected = '#0000ff'
|
|
||||||
var actual = hsl(240, 100, 50)
|
|
||||||
var it = '240deg should be blue'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue - cyan', function (assert) {
|
|
||||||
var expected = '#00ffff'
|
|
||||||
var actual = hsl(180, 100, 50)
|
|
||||||
var it = '180deg should be cyan'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree overflow', function (assert) {
|
|
||||||
var expected = hsl(1, 100, 50)
|
|
||||||
var actual = hsl(361, 100, 50)
|
|
||||||
var it = '361deg should be the same as 1deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree underflow', function (assert) {
|
|
||||||
var expected = hsl(-1, 100, 50)
|
|
||||||
var actual = hsl(359, 100, 50)
|
|
||||||
var it = '-1deg should be the same as 359deg'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('max constraint', function (assert) {
|
|
||||||
var expected = hsl(0, 101, 50)
|
|
||||||
var actual = hsl(0, 100, 50)
|
|
||||||
var it = '101% should be the same as 100%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('min constraint', function (assert) {
|
|
||||||
var expected = hsl(0, -1, 50)
|
|
||||||
var actual = hsl(0, 0, 50)
|
|
||||||
var it = '-1% should be the same as 0%'
|
|
||||||
assert.is(actual, expected, it)
|
|
||||||
assert.end()
|
|
||||||
})
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
// In our case, there's only one dependency
|
|
||||||
|
|
||||||
var toRgb = require('hsl-to-rgb-for-reals')
|
|
||||||
|
|
||||||
// Typically all dependencies should be declared at the top of the file.
|
|
||||||
|
|
||||||
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
||||||
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
||||||
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
||||||
// Let's write some utility functions to handle this logic:
|
|
||||||
|
|
||||||
function max (val, n) {
|
|
||||||
return (val > n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function min (val, n) {
|
|
||||||
return (val < n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function cycle (val) {
|
|
||||||
// for safety:
|
|
||||||
val = max(val, 1e7)
|
|
||||||
val = min(val, -1e7)
|
|
||||||
// cycle value:
|
|
||||||
while (val < 0) { val += 360 }
|
|
||||||
while (val > 359) { val -= 360 }
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for the main piece, the `hsl` function:
|
|
||||||
|
|
||||||
function hsl (hue, saturation, luminosity) {
|
|
||||||
// resolve degrees to 0 - 359 range
|
|
||||||
hue = cycle(hue)
|
|
||||||
|
|
||||||
// enforce constraints
|
|
||||||
saturation = min(max(saturation, 100), 0)
|
|
||||||
luminosity = min(max(luminosity, 100), 0)
|
|
||||||
|
|
||||||
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
||||||
saturation /= 100
|
|
||||||
luminosity /= 100
|
|
||||||
|
|
||||||
// let hsl-to-rgb-for-reals do the hard work
|
|
||||||
var rgb = toRgb(hue, saturation, luminosity)
|
|
||||||
|
|
||||||
// convert each value in the returned RGB array
|
|
||||||
// to a 2 character hex value, join the array into
|
|
||||||
// a string, prefixed with a hash
|
|
||||||
return '#' + rgb
|
|
||||||
.map(function (n) {
|
|
||||||
return (256 + n).toString(16).substr(-2)
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to make our code into a bona fide module we have to export it:
|
|
||||||
|
|
||||||
module.exports = hsl
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "npm run lint",
|
|
||||||
"lint": "standard"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "",
|
|
||||||
"dependencies": {
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
// In our case, there's only one dependency
|
|
||||||
|
|
||||||
var toRgb = require('hsl-to-rgb-for-reals')
|
|
||||||
|
|
||||||
// Typically all dependencies should be declared at the top of the file.
|
|
||||||
|
|
||||||
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
||||||
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
||||||
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
||||||
// Let's write some utility functions to handle this logic:
|
|
||||||
|
|
||||||
function max (val, n) {
|
|
||||||
return (val > n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function min (val, n) {
|
|
||||||
return (val < n) ? n : val
|
|
||||||
}
|
|
||||||
|
|
||||||
function cycle (val) {
|
|
||||||
// for safety:
|
|
||||||
val = max(val, 1e7)
|
|
||||||
val = min(val, -1e7)
|
|
||||||
// cycle value:
|
|
||||||
while (val < 0) { val += 360 }
|
|
||||||
while (val > 359) { val -= 360 }
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for the main piece, the `hsl` function:
|
|
||||||
|
|
||||||
function hsl (hue, saturation, luminosity) {
|
|
||||||
// resolve degrees to 0 - 359 range
|
|
||||||
hue = cycle(hue)
|
|
||||||
|
|
||||||
// enforce constraints
|
|
||||||
saturation = min(max(saturation, 100), 0)
|
|
||||||
luminosity = min(max(luminosity, 100), 0)
|
|
||||||
|
|
||||||
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
||||||
saturation /= 100
|
|
||||||
luminosity /= 100
|
|
||||||
|
|
||||||
// let hsl-to-rgb-for-reals do the hard work
|
|
||||||
var rgb = toRgb(hue, saturation, luminosity)
|
|
||||||
|
|
||||||
// convert each value in the returned RGB array
|
|
||||||
// to a 2 character hex value, join the array into
|
|
||||||
// a string, prefixed with a hash
|
|
||||||
return '#' + rgb
|
|
||||||
.map(function (n) {
|
|
||||||
return (256 + n).toString(16).substr(-2)
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to make our code into a bona fide module we have to export it:
|
|
||||||
|
|
||||||
module.exports = hsl
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hsl-to-hex",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "npm run lint && tap --node-arg='--harmony-destructuring' --cov test",
|
|
||||||
"lint": "standard"
|
|
||||||
},
|
|
||||||
"author": "David Mark Clements",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/davidmarkclements/hsl-to-hex.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/davidmarkclements/hsl-to-hex/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/davidmarkclements/hsl-to-hex#readme",
|
|
||||||
"description": "",
|
|
||||||
"dependencies": {
|
|
||||||
"hsl-to-rgb-for-reals": "^1.1.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"standard": "^6.0.8",
|
|
||||||
"tap": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
const hsl = require('../')
|
|
||||||
const {test} = require('tap')
|
|
||||||
|
|
||||||
test('pure white', ({is, end}) => {
|
|
||||||
const expected = '#ffffff'
|
|
||||||
const actual = hsl(0, 100, 100)
|
|
||||||
const it = `
|
|
||||||
max saturation and luminosity should return pure white
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('medium gray', ({is, end}) => {
|
|
||||||
const expected = '#808080'
|
|
||||||
const actual = hsl(0, 0, 50)
|
|
||||||
const it = `
|
|
||||||
0% saturation, 50% luminosity should be medium gray
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('hue', ({is, end}) => {
|
|
||||||
{
|
|
||||||
const expected = '#ff0000'
|
|
||||||
const actual = hsl(0, 100, 50)
|
|
||||||
const it = `
|
|
||||||
0deg should be red
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const expected = '#0000ff'
|
|
||||||
const actual = hsl(240, 100, 50)
|
|
||||||
const it = `
|
|
||||||
240deg should be blue
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const expected = '#00ffff'
|
|
||||||
const actual = hsl(180, 100, 50)
|
|
||||||
const it = `
|
|
||||||
180deg should be cyan
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
}
|
|
||||||
end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('degree overflow/underflow', ({is, end}) => {
|
|
||||||
{
|
|
||||||
const expected = hsl(1, 100, 50)
|
|
||||||
const actual = hsl(361, 100, 50)
|
|
||||||
const it = `
|
|
||||||
361deg should be the same as 1deg
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const expected = hsl(-1, 100, 50)
|
|
||||||
const actual = hsl(359, 100, 50)
|
|
||||||
const it = `
|
|
||||||
-1deg should be the same as 359deg
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
}
|
|
||||||
end()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('max constraint', ({is, end}) => {
|
|
||||||
{
|
|
||||||
const expected = hsl(0, 101, 50)
|
|
||||||
const actual = hsl(0, 100, 50)
|
|
||||||
const it = `
|
|
||||||
101% should be the same as 100%
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const expected = hsl(0, -1, 50)
|
|
||||||
const actual = hsl(0, 0, 50)
|
|
||||||
const it = `
|
|
||||||
-1% should be the same as 0%
|
|
||||||
`
|
|
||||||
is(actual, expected, it)
|
|
||||||
}
|
|
||||||
end()
|
|
||||||
})
|
|
||||||
Loading…
x
Reference in New Issue
Block a user