chore: index page plugin

This commit is contained in:
Roman Hotsiy
2023-10-02 23:19:25 +08:00
committed by mDuo13
parent c5e0e07cf3
commit 0e181b3790
2 changed files with 60 additions and 0 deletions

57
content/@theme/plugin.js Normal file
View File

@@ -0,0 +1,57 @@
// TODO: export function from root package
import { readSharedData } from '@redocly/portal/dist/server/utils/shared-data.js';
const INDEX_PAGE_INFO_DATA_KEY = 'index-page-items';
export default function indexPagesPlugin() {
/** @type {import("@redocly/portal/dist/server/plugins/types").PluginInstance } */
const pluginInstance = {
// hook that gets executed after all routes were created
async afterRoutesCreated(contentProvider, actions) {
// get all the routes that are ind pages
const indexRoutes = actions.getAllRoutes().filter(route => route.metadata?.indexPage);
for (const route of indexRoutes) {
// this uses some internals, we will expose them in nicer way in the future releases
const sidebarId = actions.routesSharedData.get(route.slug)?.['sidebar']; // TODO: implement a helper function for this
const sidebar = await readSharedData(sidebarId, actions.outdir);
const item = findItemDeep(sidebar.items, route.fsPath);
const childrenPaths =(item.items || []).map(item => item.fsPath).filter(Boolean);
const childRoutes = childrenPaths.map(fsPath => actions.getRouteByFsPath(fsPath));
const childRoutesData = await Promise.all(
childRoutes.map(async route => {
const {
parsed: { data },
} = contentProvider.loadContent(route.fsPath, 'frontmatter');
return {
...data,
slug: route.slug,
title: await route.getNavText(),
};
})
);
const sharedDataId = await actions.createSharedData(route.slug + '_' + INDEX_PAGE_INFO_DATA_KEY, childRoutesData);
actions.addRouteSharedData(route.slug, INDEX_PAGE_INFO_DATA_KEY, sharedDataId)
}
},
};
return pluginInstance;
}
function findItemDeep(items, fsPath) {
for (const item of items) {
if (item.fsPath === fsPath) {
return item;
}
if (item.items) {
const found = findItemDeep(item.items, fsPath);
if (found) {
return found;
}
}
}
}

View File

@@ -0,0 +1,3 @@
html.light pre code {
color: var(--code-block-controls-text-color) !important;
}