docusaurus/lib/server/readCategories.js
Yangshun Tay e8e3f42685
ESLintify Part 1 (#837)
* ESLint-ify

* Allow empty try/catch

* Escape regexp
2018-07-08 09:13:18 -07:00

110 lines
3 KiB
JavaScript

/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const fs = require('fs');
const Metadata = require('../core/metadata.js');
const CWD = process.cwd();
let languages;
if (fs.existsSync(CWD + '/languages.js')) {
languages = require(CWD + '/languages.js');
} else {
languages = [
{
enabled: true,
name: 'English',
tag: 'en',
},
];
}
// returns data broken up into categories for a sidebar
function readCategories(sidebar) {
const enabledLanguages = languages
.filter(lang => lang.enabled)
.map(lang => lang.tag);
const allCategories = {};
for (let k = 0; k < enabledLanguages.length; ++k) {
const language = enabledLanguages[k];
const metadatas = [];
Object.keys(Metadata).forEach(id => {
const metadata = Metadata[id];
if (metadata.sidebar === sidebar && metadata.language === language) {
metadatas.push(metadata);
}
});
// Build a hashmap of article_id -> metadata
const articles = {};
for (let i = 0; i < metadatas.length; ++i) {
const metadata = metadatas[i];
articles[metadata.id] = metadata;
}
// Build a hashmap of article_id -> previous_id
const previous = {};
for (let i = 0; i < metadatas.length; ++i) {
const metadata = metadatas[i];
if (metadata.next) {
if (!articles[metadata.next]) {
throw new Error(
metadata.version
? `Improper sidebars file for version ${
metadata.version
}, document with id '${
metadata.next
}' not found. Make sure that all documents with ids specified in this version's sidebar file exist and that no ids are repeated.`
: `Improper sidebars.json file, document with id '${
metadata.next
}' not found. Make sure that documents with the ids specified in sidebars.json exist and that no ids are repeated.`
);
}
previous[articles[metadata.next].id] = metadata.id;
}
}
// Find the first element which doesn't have any previous
let first = null;
for (let i = 0; i < metadatas.length; ++i) {
const metadata = metadatas[i];
if (!previous[metadata.id]) {
first = metadata;
break;
}
}
const categories = [];
let currentCategory = null;
let metadata = first;
let i = 0;
while (metadata && i++ < 1000) {
if (!currentCategory || metadata.category !== currentCategory.name) {
if (currentCategory) {
categories.push(currentCategory);
}
currentCategory = {
name: metadata.category,
links: [],
};
}
currentCategory.links.push(metadata);
metadata = articles[metadata.next];
}
categories.push(currentCategory);
allCategories[language] = categories;
}
return allCategories;
}
module.exports = readCategories;