Add ability to specify sub categories in sidebar.json (#891)

This commit is contained in:
Will Brock 2018-08-06 21:58:48 -04:00 committed by Yangshun Tay
parent dd9d05c84d
commit 16087b4428
14 changed files with 534 additions and 87 deletions

View file

@ -33,6 +33,13 @@ const SupportedHeaderFields = new Set([
'custom_edit_url',
]);
let allSidebars;
if (fs.existsSync(`${CWD}/sidebars.json`)) {
allSidebars = require(`${CWD}/sidebars.json`);
} else {
allSidebars = {};
}
// Can have a custom docs path. Top level folder still needs to be in directory
// at the same level as `website`, not inside `website`.
// e.g., docs/whereDocsReallyExist
@ -42,27 +49,36 @@ const SupportedHeaderFields = new Set([
function getDocsPath() {
return siteConfig.customDocsPath ? siteConfig.customDocsPath : 'docs';
}
// returns map from id to object containing sidebar ordering info
function readSidebar() {
let allSidebars;
if (fs.existsSync(`${CWD}/sidebars.json`)) {
allSidebars = require(`${CWD}/sidebars.json`);
} else {
allSidebars = {};
}
Object.assign(allSidebars, versionFallback.sidebarData());
function readSidebar(sidebars = {}) {
Object.assign(sidebars, versionFallback.sidebarData());
const order = {};
Object.keys(allSidebars).forEach(sidebar => {
const categories = allSidebars[sidebar];
Object.keys(sidebars).forEach(sidebar => {
const categories = sidebars[sidebar];
let ids = [];
const categoryOrder = [];
const subCategoryOrder = [];
Object.keys(categories).forEach(category => {
ids = ids.concat(categories[category]);
for (let i = 0; i < categories[category].length; i++) {
categoryOrder.push(category);
if (Array.isArray(categories[category])) {
ids = ids.concat(categories[category]);
for (let i = 0; i < categories[category].length; i++) {
categoryOrder.push(category);
subCategoryOrder.push('');
}
} else {
Object.keys(categories[category]).forEach(subCategory => {
ids = ids.concat(categories[category][subCategory]);
for (let i = 0; i < categories[category][subCategory].length; i++) {
categoryOrder.push(category);
subCategoryOrder.push(subCategory);
}
});
}
});
@ -70,16 +86,22 @@ function readSidebar() {
const id = ids[i];
let previous;
let next;
if (i > 0) previous = ids[i - 1];
if (i < ids.length - 1) next = ids[i + 1];
order[id] = {
previous,
next,
sidebar,
category: categoryOrder[i],
sub_category: subCategoryOrder[i],
sort: i + 1,
};
}
});
return order;
}
@ -139,12 +161,14 @@ function processMetadata(file, refDir) {
metadata.id = (env.translation.enabled ? `${language}-` : '') + metadata.id;
metadata.language = env.translation.enabled ? language : 'en';
const order = readSidebar();
const order = readSidebar(allSidebars);
const id = metadata.localized_id;
if (order[id]) {
metadata.sidebar = order[id].sidebar;
metadata.category = order[id].category;
metadata.sub_category = order[id].sub_category;
metadata.sort = order[id].sort;
if (order[id].next) {
metadata.next_id = order[id].next;
@ -165,7 +189,7 @@ function processMetadata(file, refDir) {
function generateMetadataDocs() {
let order;
try {
order = readSidebar();
order = readSidebar(allSidebars);
} catch (e) {
console.error(e);
process.exit(1);
@ -248,6 +272,9 @@ function generateMetadataDocs() {
if (order[id]) {
metadata.sidebar = order[id].sidebar;
metadata.category = order[id].category;
metadata.sub_category = order[id].sub_category;
metadata.sort = order[id].sort;
if (order[id].next) {
metadata.next_id = order[id].next.replace(
`version-${metadata.version}-`,