docusaurus/lib/server/readMetadata.js
2017-07-10 16:38:35 -07:00

181 lines
4.6 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 path = require("path");
const fs = require("fs");
const os = require("os");
let languages;
if (fs.existsSync(CWD + "/languages.js")) {
languages = require(CWD + "/languages.js");
} else {
languages = [
{
enabled: true,
name: "English",
tag: "en"
}
];
}
const glob = require("glob");
function splitHeader(content) {
const lines = content.split(os.EOL);
let i = 1;
for (; i < lines.length - 1; ++i) {
if (lines[i] === "---") {
break;
}
}
return {
header: lines.slice(1, i + 1).join("\n"),
content: lines.slice(i + 1).join("\n")
};
}
// Extract markdown metadata header
function extractMetadata(content) {
const metadata = {};
const both = splitHeader(content);
const lines = both.header.split("\n");
for (let i = 0; i < lines.length - 1; ++i) {
const keyvalue = lines[i].split(":");
const key = keyvalue[0].trim();
let value = keyvalue.slice(1).join(":").trim();
// Handle the case where you have "Community #10"
try {
value = JSON.parse(value);
} catch (e) {}
metadata[key] = value;
}
return { metadata, rawContent: both.content };
}
function processMetadata(file) {
const result = extractMetadata(fs.readFileSync(file, "utf8"));
const regexSubFolder = /docs\/(.*)\/.*/;
let language = "en";
const match = regexSubFolder.exec(file);
if (match) {
language = match[1];
}
const metadata = result.metadata;
const rawContent = result.rawContent;
metadata.source = path.basename(file);
// in permalink replace /en/ language with localized folder
metadata.permalink = metadata.permalink.replace(
/\/en\//g,
"/" + language + "/"
);
// change ids previous, next
metadata.localized_id = metadata.id;
metadata.id = language + "-" + metadata.id;
if (metadata.previous) {
metadata.previous_id = metadata.previous;
metadata.previous = language + "-" + metadata.previous;
}
if (metadata.next) {
metadata.next_id = metadata.next;
metadata.next = language + "-" + metadata.next;
}
metadata.language = language;
return { metadata, rawContent: rawContent };
}
function generateDocsMetadata() {
const regexSubFolder = /docs\/(.*)\/.*/;
const enabledLanguages = [];
languages.filter(lang => lang.enabled).map(lang => {
enabledLanguages.push(lang.tag);
});
const metadatas = [];
const files = glob.sync(CWD + "/../docs/**");
files.forEach(file => {
let language = "en";
const match = regexSubFolder.exec(file);
if (match) {
language = match[1];
}
if (enabledLanguages.indexOf(language) === -1) {
return;
}
const extension = path.extname(file);
if (extension === ".md" || extension === ".markdown") {
const res = processMetadata(file);
const metadata = res.metadata;
metadatas.push(metadata);
}
});
fs.writeFileSync(
__dirname + "/../core/metadata.js",
"/**\n" +
" * @generated\n" +
" */\n" +
"module.exports = " +
JSON.stringify(metadatas, null, 2) +
";"
);
}
function generateBlogMetadata() {
const metadatas = [];
let files = glob.sync(CWD + "/../blog/**/*.*");
files.sort().reverse().forEach(file => {
// 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)
.replace("-", "/")
.replace("-", "/")
.replace("-", "/")
// react-middleware is broken with files that contains multiple .
// like react-0.14.js
.replace(/\./g, "-")
.replace(/\-md$/, ".html");
const result = extractMetadata(fs.readFileSync(file, { encoding: "utf8" }));
const rawContent = result.rawContent;
const metadata = Object.assign(
{ path: filePath, content: rawContent },
result.metadata
);
metadata.id = metadata.title;
metadatas.push(metadata);
});
fs.writeFileSync(
__dirname + "/../core/MetadataBlog.js",
"/**\n" +
" * @generated\n" +
" */\n" +
"module.exports = " +
JSON.stringify(metadatas, null, 2) +
";"
);
}
module.exports.extractMetadata = extractMetadata;
module.exports.processMetadata = processMetadata;
module.exports.generateDocsMetadata = generateDocsMetadata;
module.exports.generateBlogMetadata = generateBlogMetadata;