/** * 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;