docusaurus/lib/server/readMetadata.js

253 lines
6.1 KiB
JavaScript
Raw Normal View History

2017-07-07 13:28:29 -04:00
/**
* 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.
*/
2017-07-10 19:38:35 -04:00
const CWD = process.cwd();
2017-07-07 13:28:29 -04:00
2017-07-10 19:38:35 -04:00
const path = require("path");
const fs = require("fs");
const os = require("os");
const glob = require("glob");
2017-07-31 19:19:02 -04:00
const siteConfig = require(CWD + "/siteConfig.js");
2017-07-07 13:28:29 -04:00
let languages;
2017-07-10 19:38:35 -04:00
if (fs.existsSync(CWD + "/languages.js")) {
languages = require(CWD + "/languages.js");
2017-07-07 13:28:29 -04:00
} else {
2017-07-10 19:38:35 -04:00
languages = [
{
enabled: true,
name: "English",
tag: "en"
}
];
2017-07-07 13:28:29 -04:00
}
2017-08-02 18:13:10 -04:00
function readSidebar() {
const allSidebars = require(CWD + "/sidebar.json");
const order = {};
Object.keys(allSidebars).forEach(sidebar => {
const categories = allSidebars[sidebar];
let ids = [];
let categoryOrder = [];
Object.keys(categories).forEach(category => {
ids = ids.concat(categories[category]);
for (let i = 0; i < categories[category].length; i++) {
categoryOrder.push(category);
}
});
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
let previous, next;
if (i > 0) previous = ids[i - 1];
if (i < ids.length - 1) next = ids[i + 1];
order[id] = {
previous: previous,
next: next,
sidebar: sidebar,
category: categoryOrder[i]
};
}
});
return order;
}
2017-07-07 13:28:29 -04:00
function splitHeader(content) {
const lines = content.split(os.EOL);
let i = 1;
for (; i < lines.length - 1; ++i) {
2017-07-10 19:38:35 -04:00
if (lines[i] === "---") {
2017-07-07 13:28:29 -04:00
break;
}
}
return {
2017-07-10 19:38:35 -04:00
header: lines.slice(1, i + 1).join("\n"),
content: lines.slice(i + 1).join("\n")
2017-07-07 13:28:29 -04:00
};
}
// Extract markdown metadata header
function extractMetadata(content) {
const metadata = {};
const both = splitHeader(content);
2017-07-10 19:38:35 -04:00
const lines = both.header.split("\n");
2017-07-07 13:28:29 -04:00
for (let i = 0; i < lines.length - 1; ++i) {
2017-07-10 19:38:35 -04:00
const keyvalue = lines[i].split(":");
2017-07-07 13:28:29 -04:00
const key = keyvalue[0].trim();
2017-07-10 19:38:35 -04:00
let value = keyvalue.slice(1).join(":").trim();
2017-07-07 13:28:29 -04:00
// Handle the case where you have "Community #10"
try {
value = JSON.parse(value);
} catch (e) {}
metadata[key] = value;
}
2017-07-10 19:38:35 -04:00
return { metadata, rawContent: both.content };
2017-07-07 13:28:29 -04:00
}
function processMetadata(file) {
2017-07-10 19:38:35 -04:00
const result = extractMetadata(fs.readFileSync(file, "utf8"));
if (!result.metadata || !result.rawContent) {
return null;
}
2017-07-07 13:28:29 -04:00
const regexSubFolder = /docs\/(.*)\/.*/;
2017-07-10 19:38:35 -04:00
let language = "en";
2017-07-07 13:28:29 -04:00
const match = regexSubFolder.exec(file);
if (match) {
language = match[1];
}
const metadata = result.metadata;
const rawContent = result.rawContent;
metadata.source = path.basename(file);
2017-07-31 19:19:02 -04:00
if (languages.length === 1 && !siteConfig.useEnglishUrl) {
metadata.permalink = "docs/" + metadata.id + ".html";
} else {
metadata.permalink = "docs/" + language + "/" + metadata.id + ".html";
}
2017-07-07 13:28:29 -04:00
// change ids previous, next
metadata.localized_id = metadata.id;
2017-07-10 19:38:35 -04:00
metadata.id = language + "-" + metadata.id;
metadata.language = language;
2017-08-02 18:13:10 -04:00
const order = readSidebar();
const id = metadata.localized_id;
metadata.sidebar = order[id].sidebar;
metadata.category = order[id].category;
if (order[id].next) {
metadata.next_id = order[id].next;
metadata.next = language + "-" + order[id].next;
2017-07-07 13:28:29 -04:00
}
if (order[id].previous) {
metadata.previous_id = order[id].previous;
metadata.previous = language + "-" + order[id].previous;
2017-07-07 13:28:29 -04:00
}
2017-07-10 19:38:35 -04:00
return { metadata, rawContent: rawContent };
2017-07-07 13:28:29 -04:00
}
function generateDocsMetadata() {
2017-08-02 18:13:10 -04:00
const order = readSidebar();
2017-07-31 19:19:02 -04:00
const regexSubFolder = /translated_docs\/(.*)\/.*/;
2017-07-07 13:28:29 -04:00
const enabledLanguages = [];
languages.filter(lang => lang.enabled).map(lang => {
enabledLanguages.push(lang.tag);
});
const metadatas = [];
2017-07-31 19:19:02 -04:00
/* metadata for english files */
let files = glob.sync(CWD + "/../docs/**");
files.forEach(file => {
let language = "en";
const extension = path.extname(file);
if (extension === ".md" || extension === ".markdown") {
const res = processMetadata(file);
if (!res) {
return;
}
let metadata = res.metadata;
metadatas.push(metadata);
}
});
/* metadata for non-english docs */
files = glob.sync(CWD + "/translated_docs/**");
2017-07-07 13:28:29 -04:00
files.forEach(file => {
2017-07-10 19:38:35 -04:00
let language = "en";
2017-07-07 13:28:29 -04:00
const match = regexSubFolder.exec(file);
if (match) {
language = match[1];
}
if (enabledLanguages.indexOf(language) === -1) {
return;
}
const extension = path.extname(file);
2017-07-10 19:38:35 -04:00
if (extension === ".md" || extension === ".markdown") {
2017-07-07 13:28:29 -04:00
const res = processMetadata(file);
if (!res) {
return;
}
let metadata = res.metadata;
2017-07-07 13:28:29 -04:00
metadatas.push(metadata);
}
});
fs.writeFileSync(
2017-07-10 19:38:35 -04:00
__dirname + "/../core/metadata.js",
"/**\n" +
" * @generated\n" +
" */\n" +
"module.exports = " +
2017-07-07 13:28:29 -04:00
JSON.stringify(metadatas, null, 2) +
2017-07-10 19:38:35 -04:00
";"
2017-07-07 13:28:29 -04:00
);
}
function generateBlogMetadata() {
const metadatas = [];
2017-07-31 19:19:02 -04:00
let files = glob.sync(CWD + "/blog/**/*.*");
2017-07-07 13:28:29 -04:00
files.sort().reverse().forEach(file => {
2017-07-31 19:19:02 -04:00
const extension = path.extname(file);
if (extension !== ".md" && extension !== ".markdown") {
return;
}
2017-07-07 13:28:29 -04:00
// Transform
// 2015-08-13-blog-post-name-0.5.md
// into
// 2015/08/13/blog-post-name-0-5.html
const filePath = path
.basename(file)
2017-07-10 19:38:35 -04:00
.replace("-", "/")
.replace("-", "/")
.replace("-", "/")
.replace(/\./g, "-")
.replace(/\-md$/, ".html");
const result = extractMetadata(fs.readFileSync(file, { encoding: "utf8" }));
2017-07-07 13:28:29 -04:00
const rawContent = result.rawContent;
const metadata = Object.assign(
2017-07-10 19:38:35 -04:00
{ path: filePath, content: rawContent },
2017-07-07 13:28:29 -04:00
result.metadata
);
metadata.id = metadata.title;
metadatas.push(metadata);
});
fs.writeFileSync(
2017-07-10 19:38:35 -04:00
__dirname + "/../core/MetadataBlog.js",
"/**\n" +
" * @generated\n" +
" */\n" +
"module.exports = " +
2017-07-07 13:28:29 -04:00
JSON.stringify(metadatas, null, 2) +
2017-07-10 19:38:35 -04:00
";"
2017-07-07 13:28:29 -04:00
);
}
module.exports = {
extractMetadata,
processMetadata,
generateDocsMetadata,
generateBlogMetadata
};