docusaurus/lib/server/readCategories.js
2017-07-07 10:28:29 -07:00

105 lines
2.7 KiB
JavaScript

/**
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
const CWD = process.cwd();
const Metadata = require('../core/metadata.js');
const fs = require('fs');
let languages;
if (fs.existsSync(CWD + '/languages.js')) {
languages = require(CWD + '/languages.js');
} else {
languages = [{
enabled: true,
name: 'English',
tag: 'en',
}];
}
function readCategories(layout) {
const enabledLanguages = [];
languages.filter(lang => lang.enabled).map(lang => {
enabledLanguages.push(lang.tag);
});
const allCategories = {};
for (let k = 0; k < enabledLanguages.length; ++k) {
const language = enabledLanguages[k];
const metadatas = Metadata.filter(metadata => {
return metadata.layout === layout &&
metadata.language === language;
});
// 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(
'`next: ' + metadata.next + '` in ' + metadata.id + " doesn't exist"
);
}
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) {
currentCategory && categories.push(currentCategory);
currentCategory = {
name: metadata.category,
links: [],
};
}
currentCategory.links.push(metadata);
metadata = articles[metadata.next];
}
categories.push(currentCategory);
allCategories[language] = categories;
}
fs.writeFileSync(
__dirname + '/../core/' + layout + 'Categories.js',
'/**\n' +
' * @generated\n' +
' */\n' +
'module.exports = ' +
JSON.stringify(allCategories, null, 2) +
';'
);
}
module.exports = readCategories;