Code files
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
node_modules
|
||||
*.log
|
||||
@@ -0,0 +1,6 @@
|
||||
var hsl = require('./')
|
||||
var hue = 133
|
||||
var saturation = 40
|
||||
var luminosity = 60
|
||||
var hex = hsl(hue, saturation, luminosity)
|
||||
console.log(hex) // #70c282
|
||||
@@ -0,0 +1,66 @@
|
||||
// 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
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
#! /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
|
||||
@@ -0,0 +1,31 @@
|
||||
# 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
|
||||
@@ -0,0 +1,74 @@
|
||||
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()
|
||||
})
|
||||
Reference in New Issue
Block a user