docusaurus/lib/server/readMetadata.js

182 lines
4.6 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");
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-07-10 19:38:35 -04:00
const glob = require("glob");
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"));
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);
// in permalink replace /en/ language with localized folder
metadata.permalink = metadata.permalink.replace(
/\/en\//g,
2017-07-10 19:38:35 -04:00
"/" + language + "/"
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;
2017-07-07 13:28:29 -04:00
if (metadata.previous) {
metadata.previous_id = metadata.previous;
2017-07-10 19:38:35 -04:00
metadata.previous = language + "-" + metadata.previous;
2017-07-07 13:28:29 -04:00
}
if (metadata.next) {
metadata.next_id = metadata.next;
2017-07-10 19:38:35 -04:00
metadata.next = language + "-" + metadata.next;
2017-07-07 13:28:29 -04:00
}
metadata.language = language;
2017-07-10 19:38:35 -04:00
return { metadata, rawContent: rawContent };
2017-07-07 13:28:29 -04:00
}
function generateDocsMetadata() {
const regexSubFolder = /docs\/(.*)\/.*/;
const enabledLanguages = [];
languages.filter(lang => lang.enabled).map(lang => {
enabledLanguages.push(lang.tag);
});
const metadatas = [];
2017-07-10 19:38:35 -04:00
const files = glob.sync(CWD + "/../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);
const metadata = res.metadata;
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-10 19:38:35 -04:00
let files = glob.sync(CWD + "/../blog/**/*.*");
2017-07-07 13:28:29 -04:00
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)
2017-07-10 19:38:35 -04:00
.replace("-", "/")
.replace("-", "/")
.replace("-", "/")
2017-07-07 13:28:29 -04:00
// react-middleware is broken with files that contains multiple .
// like react-0.14.js
2017-07-10 19:38:35 -04:00
.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 = extractMetadata;
module.exports.processMetadata = processMetadata;
module.exports.generateDocsMetadata = generateDocsMetadata;
module.exports.generateBlogMetadata = generateBlogMetadata;