blob: 15ba236f2523726ade095dfe69018d1ba4ab8dfc [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
'use strict';
var fs = require('fs');
var path = require('path');
var yaml = require('js-yaml');
var optimist = require('optimist');
var chalk = require('chalk');
var util = require('./util');
// constants
var VERBOSE_BY_DEFAULT = false;
// globals
var verbose = VERBOSE_BY_DEFAULT;
// helpers
function augmentEntry (originalEntry, prefix) {
var augmentedEntry = {};
// skip entries that have no URI
if (!originalEntry.url) {
return originalEntry;
}
// get the path to the file to which this entry points
var filePath = path.join(prefix, originalEntry.url).replace('.html', '.md');
// skip entries that don't point to a valid file
if (!fs.existsSync(filePath)) {
console.warn(chalk.red('WARNING! Possible 404 in ToC: "' + filePath + '"; create the file to fix'));
return originalEntry;
}
// read in the referenced file and get its front matter
var fileContents = fs.readFileSync(filePath).toString();
var frontMatterString = util.getFrontMatterString(fileContents);
var frontMatter = yaml.load(frontMatterString);
augmentedEntry.name = decideOnName(originalEntry, frontMatter);
augmentedEntry.url = originalEntry.url;
if (frontMatter.description) {
augmentedEntry.description = frontMatter.description;
}
return augmentedEntry;
}
function decideOnName (originalEntry, frontMatter) {
// raise a warning for old-style ToC entry names
if (originalEntry.name && verbose === true) {
console.warn("'name' property will be ignored");
}
// error out if there is no name
if (!frontMatter.toc_title && !frontMatter.title) {
throw Error("can't find out name for ToC entry");
}
// use entry's name, and if it's not defined use the front matter name
return frontMatter.toc_title || frontMatter.title;
}
// public API
function augmentToc (originalToc, prefix) {
var augmentedToc = [];
if (typeof prefix === 'undefined') {
throw new Error('missing prefix for ToC');
}
// go through all original entries
for (var i = 0; i < originalToc.length; i++) {
var originalEntry = originalToc[i];
var augmentedEntry = {};
// recurse for entries with children, replacing their children with
// their augmented equivalents
if (originalEntry.children) {
if (typeof originalEntry.name === 'undefined') {
throw new Error('entries with children must have a name');
}
augmentedEntry.name = originalEntry.name;
augmentedEntry.children = augmentToc(originalEntry.children, prefix);
// replace regular entries with their augmented equivalents
} else {
augmentedEntry = augmentEntry(originalEntry, prefix);
}
augmentedToc.push(augmentedEntry);
}
return augmentedToc;
}
function augmentString (srcTocString, prefix) {
var srcToc = yaml.load(srcTocString);
var augmentedToc = augmentToc(srcToc, prefix);
var augmentedTocString = yaml.dump(augmentedToc, { indent: 4 });
return augmentedTocString;
}
function main () {
// get args
var argv = optimist
.usage('Usage: $0 [options]')
.demand('srcToc').describe('srcToc', 'the source ToC for the given directory')
.demand('srcRoot').describe('srcRoot', 'the directory containing files described by the ToC')
.boolean('verbose').describe('verbose', 'if true, print more helpful information').default('verbose', VERBOSE_BY_DEFAULT)
.alias('v', 'verbose')
.argv;
var srcTocPath = argv.srcToc;
var srcRootPath = argv.srcRoot;
// set globals
verbose = argv.verbose;
// get augmented ToC
var srcTocString = fs.readFileSync(srcTocPath);
var augmentedTocString = augmentString(srcTocString, srcRootPath);
console.log(util.generatedBy(__filename));
console.log(augmentedTocString);
}
if (require.main === module) {
main();
}
module.exports = {
augmentToc: augmentToc,
augmentString: augmentString
};