Updated tools, proper linting, build README
This commit is contained in:
@ -7,8 +7,8 @@ Here's what you can do to help:
|
|||||||
- [Open issues](https://github.com/Chalarangelo/30-seconds-of-code/issues/new) for things you want to see added or modified.
|
- [Open issues](https://github.com/Chalarangelo/30-seconds-of-code/issues/new) for things you want to see added or modified.
|
||||||
- Be part of the discussion by helping out with [existing issues](https://github.com/Chalarangelo/30-seconds-of-code/issues) or talking on our [gitter channel](https://gitter.im/30-seconds-of-code/Lobby).
|
- Be part of the discussion by helping out with [existing issues](https://github.com/Chalarangelo/30-seconds-of-code/issues) or talking on our [gitter channel](https://gitter.im/30-seconds-of-code/Lobby).
|
||||||
- Submit [pull requests](https://github.com/Chalarangelo/30-seconds-of-code/pulls) with snippets you have created (see below for guidelines).
|
- Submit [pull requests](https://github.com/Chalarangelo/30-seconds-of-code/pulls) with snippets you have created (see below for guidelines).
|
||||||
- Fix typos in existing snippets or run `npm run linter "snippet-name.md"` on unlinted snippets (yes, this is something we actually want help with).
|
|
||||||
- Tag untagged snippets by running `npm run tagger` and adding the appropriate tag next to the script name in `tag_database`.
|
- Tag untagged snippets by running `npm run tagger` and adding the appropriate tag next to the script name in `tag_database`.
|
||||||
|
- Fix typos in existing snippets or run `npm run linter` to lint unlinted snippets (yes, this is something we actually want help with, as this can take quite a while to run).
|
||||||
|
|
||||||
### Snippet submission and Pull request guidelines
|
### Snippet submission and Pull request guidelines
|
||||||
|
|
||||||
|
|||||||
18
README.md
18
README.md
@ -122,7 +122,7 @@ const arrayConcat = (arr, ...args) => arr.concat(...args);
|
|||||||
Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values not contained in `b`.
|
Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values not contained in `b`.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }
|
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };
|
||||||
// difference([1,2,3], [1,2]) -> [3]
|
// difference([1,2,3], [1,2]) -> [3]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has
|
|||||||
Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values contained in `b`.
|
Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values contained in `b`.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); }
|
const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); };
|
||||||
// intersection([1,2,3], [4,3,2]) -> [2,3]
|
// intersection([1,2,3], [4,3,2]) -> [2,3]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.ha
|
|||||||
Create a `Set` with all values of `a` and `b` and convert to an array.
|
Create a `Set` with all values of `a` and `b` and convert to an array.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const union = (a, b) => Array.from(new Set([...a, ...b]))
|
const union = (a, b) => Array.from(new Set([...a, ...b]));
|
||||||
// union([1,2,3], [4,3,2]) -> [1,2,3,4]
|
// union([1,2,3], [4,3,2]) -> [1,2,3,4]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ Returns the remaining elements.
|
|||||||
const dropElements = (arr, func) => {
|
const dropElements = (arr, func) => {
|
||||||
while (arr.length > 0 && !func(arr[0])) arr.shift();
|
while (arr.length > 0 && !func(arr[0])) arr.shift();
|
||||||
return arr;
|
return arr;
|
||||||
}
|
};
|
||||||
// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4]
|
// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -506,7 +506,7 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
|
|||||||
? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
|
? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
|
||||||
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
|
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
|
||||||
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
|
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
|
||||||
}
|
};
|
||||||
// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
|
// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
|
||||||
// elementIsVisibleInViewport(el) -> false (not fully visible)
|
// elementIsVisibleInViewport(el) -> false (not fully visible)
|
||||||
// elementIsVisibleInViewport(el, true) -> true (partially visible)
|
// elementIsVisibleInViewport(el, true) -> true (partially visible)
|
||||||
@ -795,7 +795,7 @@ const standardDeviation = (arr, usePopulation = false) => {
|
|||||||
arr.reduce((acc, val) => acc.concat(Math.pow(val - mean, 2)), [])
|
arr.reduce((acc, val) => acc.concat(Math.pow(val - mean, 2)), [])
|
||||||
.reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
|
.reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
|
// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
|
||||||
// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)
|
// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)
|
||||||
```
|
```
|
||||||
@ -1041,10 +1041,10 @@ If digit is found in teens pattern, use teens ordinal.
|
|||||||
```js
|
```js
|
||||||
const toOrdinalSuffix = num => {
|
const toOrdinalSuffix = num => {
|
||||||
const int = parseInt(num), digits = [(int % 10), (int % 100)],
|
const int = parseInt(num), digits = [(int % 10), (int % 100)],
|
||||||
ordinals = ["st", "nd", "rd", "th"], oPattern = [1,2,3,4],
|
ordinals = ['st', 'nd', 'rd', 'th'], oPattern = [1, 2, 3, 4],
|
||||||
tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]
|
tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19];
|
||||||
return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3];
|
return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3];
|
||||||
}
|
};
|
||||||
// toOrdinalSuffix("123") -> "123rd"
|
// toOrdinalSuffix("123") -> "123rd"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -1,31 +1,44 @@
|
|||||||
var fs = require('fs-extra');
|
/*
|
||||||
var cp = require('child_process');
|
This is the linter script that lints snippets.
|
||||||
var path = require('path');
|
Run using `npm run linter`.
|
||||||
|
*/
|
||||||
|
// Load modules
|
||||||
|
const fs = require('fs-extra'), cp = require('child_process'), path = require('path');
|
||||||
|
// Set variables for paths
|
||||||
var snippetsPath = './snippets';
|
var snippetsPath = './snippets';
|
||||||
var snippetFilename = '';
|
// Read files, lint each one individually and update
|
||||||
|
|
||||||
console.time('Linter');
|
|
||||||
|
|
||||||
if(process.argv.length < 3){
|
|
||||||
console.log('Please specify the filename of a snippet to be linted.');
|
|
||||||
console.log('Example usage: npm run lint "snippet-file.md"');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
snippetFilename = process.argv[2];
|
|
||||||
let snippetData = fs.readFileSync(path.join(snippetsPath,snippetFilename),'utf8');
|
|
||||||
try {
|
try {
|
||||||
|
let snippetFilenames = fs.readdirSync(snippetsPath);
|
||||||
|
snippetFilenames.sort((a, b) => {
|
||||||
|
a = a.toLowerCase();
|
||||||
|
b = b.toLowerCase();
|
||||||
|
if (a < b) return -1;
|
||||||
|
if (a > b) return 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
// Read each file, get its code, write it to a temporary file, pass it through
|
||||||
|
// semistandard, get the output from the file, update the original file.
|
||||||
|
for(let snippet of snippetFilenames){
|
||||||
|
// Start a timer for the file
|
||||||
|
console.time(`Linter (${snippet})`);
|
||||||
|
// Synchronously read data from the snippet, get the code, write it to a temporary file
|
||||||
|
let snippetData = fs.readFileSync(path.join(snippetsPath,snippet),'utf8');
|
||||||
let originalCode = snippetData.slice(snippetData.indexOf('```js')+5,snippetData.lastIndexOf('```'));
|
let originalCode = snippetData.slice(snippetData.indexOf('```js')+5,snippetData.lastIndexOf('```'));
|
||||||
fs.writeFileSync('currentSnippet.js',`${originalCode}`);
|
fs.writeFileSync(`${snippet}.temp.js`,`${originalCode}`);
|
||||||
cp.exec('semistandard "currentSnippet.js" --fix',{},(error, stdOut, stdErr) => {
|
// Run semistandard asynchronously (only way this manages to run), get linted code
|
||||||
let lintedCode = fs.readFileSync('currentSnippet.js','utf8');
|
// and write back to the original snippet file. Remove temporary file
|
||||||
fs.writeFile(path.join(snippetsPath,snippetFilename), `${snippetData.slice(0, snippetData.indexOf('```js')+5)+lintedCode+'```\n'}`);
|
cp.exec(`semistandard "${snippet}.temp.js" --fix`,{},(error, stdOut, stdErr) => {
|
||||||
console.timeEnd('Linter');
|
let lintedCode = fs.readFileSync(`${snippet}.temp.js`,'utf8');
|
||||||
|
fs.writeFile(path.join(snippetsPath,snippet), `${snippetData.slice(0, snippetData.indexOf('```js')+5)+lintedCode+'```\n'}`);
|
||||||
|
fs.unlink(`${snippet}.temp.js`);
|
||||||
|
// Log a success message
|
||||||
|
console.log(`${chalk.red('SUCCESS!')} Linted snippet: ${snippet}`);
|
||||||
|
// Log the time taken for the file
|
||||||
|
console.timeEnd(`Linter (${snippet})`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (err){
|
}
|
||||||
console.log('Error during snippet loading: '+err);
|
catch (err){ // Handle errors (hopefully not!)
|
||||||
|
console.log(`${chalk.red('ERROR!')} During linting: ${err}`);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@ -3,6 +3,6 @@
|
|||||||
Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values not contained in `b`.
|
Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values not contained in `b`.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }
|
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };
|
||||||
// difference([1,2,3], [1,2]) -> [3]
|
// difference([1,2,3], [1,2]) -> [3]
|
||||||
```
|
```
|
||||||
|
|||||||
@ -3,6 +3,6 @@
|
|||||||
Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values contained in `b`.
|
Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values contained in `b`.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); }
|
const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); };
|
||||||
// intersection([1,2,3], [4,3,2]) -> [2,3]
|
// intersection([1,2,3], [4,3,2]) -> [2,3]
|
||||||
```
|
```
|
||||||
|
|||||||
@ -3,6 +3,6 @@
|
|||||||
Create a `Set` with all values of `a` and `b` and convert to an array.
|
Create a `Set` with all values of `a` and `b` and convert to an array.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const union = (a, b) => Array.from(new Set([...a, ...b]))
|
const union = (a, b) => Array.from(new Set([...a, ...b]));
|
||||||
// union([1,2,3], [4,3,2]) -> [1,2,3,4]
|
// union([1,2,3], [4,3,2]) -> [1,2,3,4]
|
||||||
```
|
```
|
||||||
|
|||||||
@ -7,6 +7,6 @@ Returns the remaining elements.
|
|||||||
const dropElements = (arr, func) => {
|
const dropElements = (arr, func) => {
|
||||||
while (arr.length > 0 && !func(arr[0])) arr.shift();
|
while (arr.length > 0 && !func(arr[0])) arr.shift();
|
||||||
return arr;
|
return arr;
|
||||||
}
|
};
|
||||||
// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4]
|
// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4]
|
||||||
```
|
```
|
||||||
|
|||||||
@ -12,7 +12,7 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
|
|||||||
? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
|
? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
|
||||||
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
|
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
|
||||||
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
|
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
|
||||||
}
|
};
|
||||||
// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
|
// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
|
||||||
// elementIsVisibleInViewport(el) -> false (not fully visible)
|
// elementIsVisibleInViewport(el) -> false (not fully visible)
|
||||||
// elementIsVisibleInViewport(el, true) -> true (partially visible)
|
// elementIsVisibleInViewport(el, true) -> true (partially visible)
|
||||||
|
|||||||
@ -7,9 +7,9 @@ If digit is found in teens pattern, use teens ordinal.
|
|||||||
```js
|
```js
|
||||||
const toOrdinalSuffix = num => {
|
const toOrdinalSuffix = num => {
|
||||||
const int = parseInt(num), digits = [(int % 10), (int % 100)],
|
const int = parseInt(num), digits = [(int % 10), (int % 100)],
|
||||||
ordinals = ["st", "nd", "rd", "th"], oPattern = [1,2,3,4],
|
ordinals = ['st', 'nd', 'rd', 'th'], oPattern = [1, 2, 3, 4],
|
||||||
tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]
|
tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19];
|
||||||
return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3];
|
return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3];
|
||||||
}
|
};
|
||||||
// toOrdinalSuffix("123") -> "123rd"
|
// toOrdinalSuffix("123") -> "123rd"
|
||||||
```
|
```
|
||||||
|
|||||||
@ -11,7 +11,7 @@ const standardDeviation = (arr, usePopulation = false) => {
|
|||||||
arr.reduce((acc, val) => acc.concat(Math.pow(val - mean, 2)), [])
|
arr.reduce((acc, val) => acc.concat(Math.pow(val - mean, 2)), [])
|
||||||
.reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
|
.reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
|
// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
|
||||||
// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)
|
// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user