@11ty/eleventy
Version:
A simpler static site generator.
137 lines (114 loc) • 2.95 kB
JavaScript
class Sortable {
constructor() {
this.isSortAscending = true;
this.isSortNumeric = false;
this.items = [];
this._dirty = true;
this.sortFunctionStringMap = {
"A-Z": "sortFunctionAscending",
"Z-A": "sortFunctionDescending",
"0-9": "sortFunctionNumericAscending",
"9-0": "sortFunctionNumericDescending",
};
}
get length() {
return this.items.length;
}
add(item) {
this._dirty = true;
this.items.push(item);
}
sort(sortFunction) {
if (!sortFunction) {
sortFunction = this.getSortFunction();
} else if (typeof sortFunction === "string") {
let key = sortFunction;
let name;
if (key in this.sortFunctionStringMap) {
name = this.sortFunctionStringMap[key];
}
if (Sortable[name]) {
sortFunction = Sortable[name];
} else {
throw new Error(
`Invalid String argument for sort(). Received \`${key}\`. Valid values: ${Object.keys(
this.sortFunctionStringMap,
)}`,
);
}
}
return this.items.slice().sort(sortFunction);
}
sortAscending() {
return this.sort(this.getSortFunctionAscending());
}
sortDescending() {
return this.sort(this.getSortFunctionDescending());
}
setSortDescending(isDescending = true) {
this.isSortAscending = !isDescending;
}
setSortAscending(isAscending = true) {
this.isSortAscending = isAscending;
}
setSortNumeric(isNumeric) {
this.isSortNumeric = isNumeric;
}
/* Sort functions */
static sortFunctionNumericAscending(a, b) {
return a - b;
}
static sortFunctionNumericDescending(a, b) {
return b - a;
}
static sortFunctionAscending(a, b) {
if (a > b) {
return 1;
} else if (a < b) {
return -1;
}
return 0;
}
static sortFunctionDescending(a, b) {
return Sortable.sortFunctionAscending(b, a);
}
static sortFunctionAlphabeticAscending(a, b) {
return Sortable.sortFunctionAscending(a, b);
}
static sortFunctionAlphabeticDescending(a, b) {
return Sortable.sortFunctionAscending(b, a);
}
static sortFunctionDate(mapA, mapB) {
return Sortable.sortFunctionNumericAscending(mapA.date.getTime(), mapB.date.getTime());
}
static sortFunctionDateInputPath(mapA, mapB) {
let sortDate = Sortable.sortFunctionNumericAscending(mapA.date.getTime(), mapB.date.getTime());
if (sortDate === 0) {
return Sortable.sortFunctionAlphabeticAscending(mapA.inputPath, mapB.inputPath);
}
return sortDate;
}
/* End sort functions */
getSortFunction() {
if (this.isSortAscending) {
return this.getSortFunctionAscending();
} else {
return this.getSortFunctionDescending();
}
}
getSortFunctionAscending() {
if (this.isSortNumeric) {
return Sortable.sortFunctionNumericAscending;
} else {
return Sortable.sortFunctionAlphabeticAscending;
}
}
getSortFunctionDescending() {
if (this.isSortNumeric) {
return Sortable.sortFunctionNumericDescending;
} else {
return Sortable.sortFunctionAlphabeticDescending;
}
}
}
export default Sortable;