mirror of
https://github.com/shoelace-style/webawesome.git
synced 2026-01-12 20:19:13 +00:00
- Sidebar, overview listings, breadcrumbs now based on actual parent-child relationships, rather than increasingly outdated heuristics - parent properties are now generated automatically from the URL structure, and need only be specified to override that default - Ability to group by page hierarchy in overview pages, where pages that have >= 2 children become categories Smaller improvements: - More flexible syntax for specifying the params of overview pages - [Overviews] Hide group heading if only one group is present - parentItem and parentUrl properties that can be used on any page - Alias a collection as the children of a page (useful for "virtual" parents like Layout) - Do not error if a page card icon is missing
81 lines
1.7 KiB
JavaScript
81 lines
1.7 KiB
JavaScript
/**
|
|
* Global data for all pages
|
|
*/
|
|
import { sort } from '../_utils/filters.js';
|
|
|
|
export default {
|
|
eleventyComputed: {
|
|
// Default parent. Can be overridden by explicitly setting parent in the data.
|
|
// parent can refer to either an ancestor page in the URL or another page in the same directory
|
|
parent(data) {
|
|
let { parent, page } = data;
|
|
|
|
if (parent) {
|
|
return parent;
|
|
}
|
|
|
|
return page.url.split('/').filter(Boolean).at(-2);
|
|
},
|
|
|
|
parentUrl(data) {
|
|
let { parent, page } = data;
|
|
return getParentUrl(page.url, parent);
|
|
},
|
|
|
|
parentItem(data) {
|
|
let { parentUrl } = data;
|
|
return data.collections.all.find(item => item.url === parentUrl);
|
|
},
|
|
|
|
children(data) {
|
|
let { collections, page, parentOf } = data;
|
|
|
|
if (parentOf) {
|
|
return collections[parentOf];
|
|
}
|
|
|
|
let collection = collections.all ?? [];
|
|
let url = page.url;
|
|
|
|
let ret = collection.filter(item => {
|
|
return item.data.parentUrl === url;
|
|
});
|
|
|
|
sort(ret);
|
|
|
|
return ret;
|
|
},
|
|
},
|
|
};
|
|
|
|
function getParentUrl(url, parent) {
|
|
let parts = url.split('/').filter(Boolean);
|
|
let ancestorIndex = parts.findLastIndex(part => part === parent);
|
|
let retParts = parts.slice();
|
|
|
|
if (ancestorIndex > -1) {
|
|
// parent is an ancestor
|
|
retParts.splice(ancestorIndex + 1);
|
|
} else {
|
|
// parent is a sibling in the same directory
|
|
retParts.splice(-1, 1, parent);
|
|
}
|
|
|
|
let ret = retParts.join('/');
|
|
|
|
if (url.startsWith('/')) {
|
|
ret = '/' + ret;
|
|
}
|
|
|
|
if (!retParts.at(-1).includes('.') && !ret.endsWith('/')) {
|
|
// If no extension, make sure to end with a slash
|
|
ret += '/';
|
|
}
|
|
|
|
if (ret === '/docs/') {
|
|
ret = '/';
|
|
}
|
|
|
|
return ret;
|
|
}
|