mirror of
https://github.com/facebook/docusaurus.git
synced 2025-04-30 10:48:05 +02:00
181 lines
4.6 KiB
JavaScript
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;
|