-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore(site): fix site sorters, make them generalized
- Loading branch information
Showing
6 changed files
with
43 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,31 +1,47 @@ | ||
module.exports = (config) => { | ||
/** Generic sort njk filter */ | ||
const createSortFilter = (comparer) => (values) => { | ||
if (!Array.isArray(values)) { | ||
console.error(`Unexpected values for sort filter: ${values}`); | ||
return values; | ||
} | ||
return [...values].sort(comparer); | ||
}; | ||
|
||
// Utils | ||
/** Resolve date from item */ | ||
const resolveDate = (item) => new Date(item.date).getTime(); | ||
/** Resolve date from item without fileUpdateDate fallback */ | ||
const resolveMetaDate = (item) => item.data.date ? new Date(item.date).getTime() : Number.POSITIVE_INFINITY; | ||
|
||
/** Comparer composer */ | ||
const compose = (...cmps) => (a, b) => cmps.reduce((res, cmp) => res || cmp(a, b), 0); | ||
|
||
/** Name metadata comparer */ | ||
const nameComparer = (a, b) => a.data.name.localeCompare(b.data.name); | ||
/** Order metadata comparer */ | ||
const orderComparer = (a, b) => (a.data.order || 0) - (b.data.order || 0); | ||
/** Date metadata comparer */ | ||
const dateComparer = (a, b) => resolveDate(a) - resolveDate(b); | ||
/** Date metadata comparer (will not use file creation date) */ | ||
const dateComparerStrict = (a, b) => resolveMetaDate(a) - resolveMetaDate(b); | ||
const metaDateComparer = (a, b) => resolveMetaDate(a) - resolveMetaDate(b); | ||
|
||
/** Order metadata comparer */ | ||
const orderComparer = (a, b) => (a.data.order ?? 0) - (b.data.order ?? 0); | ||
|
||
config.addFilter('sortByName', createSortFilter(nameComparer)); | ||
config.addFilter('sortByNameAndOrder', createSortFilter(compose(orderComparer, nameComparer))); | ||
config.addFilter('sortByDate', createSortFilter(dateComparer)); | ||
config.addFilter('sortByDateStrict', createSortFilter(dateComparerStrict)); | ||
/** Abstract string comparer */ | ||
const stringComparer = (field) => (a, b) => { | ||
const aField = a.data[field] || ''; | ||
const bField = b.data[field] || ''; | ||
return aField.localeCompare(bField, 'en'); | ||
}; | ||
|
||
/** Build comparer for field */ | ||
const buildComparer = (field) => { | ||
switch (field) { | ||
case 'date': | ||
return dateComparer; | ||
case 'meta-date': | ||
return metaDateComparer; | ||
case 'order': | ||
return orderComparer; | ||
default: | ||
return stringComparer(field); | ||
} | ||
}; | ||
|
||
/** Comparer composer */ | ||
const compose = (...comparers) => (a, b) => comparers.reduce((res, cmp) => res || cmp(a, b), 0); | ||
|
||
config.addFilter('sortBy', (values, ...fields) => { | ||
if (!Array.isArray(values)) { | ||
console.error(`Unexpected values for sort filter: ${values}`); | ||
return values; | ||
} | ||
const comparers = fields.map(buildComparer); | ||
return [...values].sort(compose(...comparers)); | ||
}); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters