@ckirby/mr-lister
Advanced tools
Comparing version 2.4.0 to 2.5.0
{ | ||
"name": "@ckirby/mr-lister", | ||
"version": "2.4.0", | ||
"version": "2.5.0", | ||
"description": "format lists of numbers, letters, or arbitrary items", | ||
@@ -5,0 +5,0 @@ "main": "./src/index", |
@@ -34,6 +34,6 @@ const re = require('block-re'); | ||
// get a list of the individual items | ||
let items = matchAll(match, item).map(({ index, 0: item }) => ({ index, item })); | ||
let items = matchAll(match, item).map((x) => ({ index: x.index, item: x[0] })); | ||
// get a list of all the integers the range refers to | ||
let list = stringList(range); | ||
let list = stringList(range).slice(); | ||
return { index, items, match, label, list }; | ||
@@ -40,0 +40,0 @@ } |
@@ -31,3 +31,7 @@ | ||
// is numeric range | ||
arr = consolidateRanges(Array.from(list).map((a) => parseInt(a, 10))); | ||
arr = consolidateRanges( | ||
Array.from(list).map((a) => parseInt(a, 10)), | ||
'–', | ||
list | ||
); | ||
} else { // test if alphabetic range | ||
@@ -34,0 +38,0 @@ isRange = list.every((x) => /^[a-z]$/i.test(x)); |
function stringList(str, { sort = true, unique = true } = {}) { | ||
let numbers = []; | ||
let groups = []; | ||
// allow dash, en-dash, or em-dash between ranges | ||
@@ -23,18 +23,36 @@ // allow a dot after the first number in a range | ||
while (num <= endNum) { | ||
numbers.push(num); | ||
num++; | ||
groups.push(Array(endNum - num + 1).fill(num).map((n, i) => n + i)); | ||
} | ||
// sort range groups by their start value | ||
let sortedGroups = groups.slice().sort(([ a ], [ b ]) => a - b); | ||
let needsSort = false; | ||
let needsUnique = false; | ||
for (const [ i, range ] of sortedGroups.slice(1).entries()) { | ||
let prev = sortedGroups[i][sortedGroups[i].length - 1]; | ||
let curr = range[0]; | ||
needsSort = needsSort || curr < prev; | ||
needsUnique = needsUnique || curr <= prev; | ||
if (needsSort && needsUnique) { | ||
break; | ||
} | ||
if (unique) { | ||
} | ||
let numbers = [].concat(...(sort ? sortedGroups : groups)); | ||
if (groups.length > 1) { | ||
if (unique && needsUnique) { | ||
needsUnique = false; | ||
numbers = [ ...new Set(numbers) ]; | ||
} | ||
if (sort && needsSort) { | ||
needsSort = false; | ||
numbers.sort((a, b) => a - b); | ||
} | ||
} | ||
if (sort) { | ||
numbers.sort((a, b) => a - b); | ||
} | ||
return numbers; | ||
return Object.assign(numbers, { needsSort, needsUnique }); | ||
} | ||
module.exports = stringList; |
@@ -40,5 +40,12 @@ /* | ||
function consolidateRanges(inputArray, delimiter = '–') { | ||
function consolidateRanges(inputArray, delimiter = '–', { needsSort = true, needsUnique = true } = {}) { | ||
let arr = inputArray.slice(); | ||
if (needsUnique) { | ||
arr = unique(arr); | ||
} | ||
if (needsSort) { | ||
arr.sort((a, b) => a - b); | ||
} | ||
return consolidate( | ||
unique(inputArray).sort((a, b) => a - b), | ||
arr, | ||
delimiter, | ||
@@ -45,0 +52,0 @@ (x) => x |
8140
238