docusaurus/lib/server/readMetadata.js
2017-07-07 10:28:29 -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;