diff --git a/lib/main.js b/lib/main.js index 2f0a6f27ac5bbc20e70a7e5beb958a5e2aeeabe0..e46a7b1885c57dd923d8b4635f473ec838bae9cf 100644 --- a/lib/main.js +++ b/lib/main.js @@ -25,6 +25,7 @@ var _ = require('lodash'); var async = require('async'); var ejs = require('ejs'); var logger = require('winston'); +var mkdirp = require('mkdirp'); var consts = require('./constants'); var Schema = require('./schema'); @@ -35,7 +36,7 @@ function writeFile(outputDir, fileName, data, cb) { // make sure output dir exists fs.stat(outputDir, function (err, stat) { if (err) { - fs.mkdir(outputDir, next); + mkdirp(outputDir, next); } else { next(); } @@ -64,15 +65,46 @@ function generateHtml(schema, cb) { _: _ }; - ejs.renderFile('./templates/schema.ejs', ctx, function (err, str) { + ejs.renderFile('./templates/html/schema.ejs', ctx, { debug: false }, function (err, str) { if (err) { cb(err); } else { - writeFile(outDir, baseName + '.html', str, cb); + writeFile(path.join(outDir, 'html'), baseName + '.html', str, cb); } }); } +/** + * + * @param {Schema} schema instance + * @param {Function} cb callback called on completion + * @param {String|Error} cb.error error (non-null if an error occurred) + */ +function generateMarkdown(schema, cb) { + // render each class in separate .md file + async.each(schema.getModel().classes, + function (cls, done) { + var ctx = { + clazz: cls, + model: schema.getModel(), + consts: consts, + prefixes: schema.getPrefixMap(), + _: _ + }; + ejs.renderFile('./templates/md/class.ejs', ctx, { debug: false }, function (err, str) { + if (err) { + done(err); + } else { + writeFile(path.join(outDir, 'md'), cls[consts.RDFS_LABEL] + '.md', str, done); + } + }); + }, + function (err) { + cb(err); + } + ); +} + // parse/process command line arguments var argv = require('optimist') @@ -108,14 +140,19 @@ Schema.load(schemaFile, function (err, schema) { generateHtml(schema, next); } + function toMarkdown(next) { + // generate Markdown + generateMarkdown(schema, next); + } + function toJsonLd(next) { // serialize RDF to JSON-LD schema.toJsonLD(function (err, doc) { - writeFile(outDir, baseName + '.json', JSON.stringify(doc, null, 2), next); + writeFile(path.join(outDir, 'json'), baseName + '.json', JSON.stringify(doc, null, 2), next); }); } - async.series([ toHtml, toJsonLd ], function (err) { + async.series([ toHtml, toMarkdown, toJsonLd ], function (err) { if (err) { logger.error(err); } else { diff --git a/package.json b/package.json index f55073ebba7b59400fd6fd255346a72d788ff71d..d5b4e50bede0715b33c4a3d50934d0f1795eda24 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "winston": "^2.2.0", "lodash": "^4.5.0", "async": "^2.0.1", + "mkdirp": "^0.5.1", "ejs": "^2.4.2" }, "engines": { diff --git a/templates/class.ejs b/templates/html/class.ejs similarity index 100% rename from templates/class.ejs rename to templates/html/class.ejs diff --git a/templates/schema.ejs b/templates/html/schema.ejs similarity index 95% rename from templates/schema.ejs rename to templates/html/schema.ejs index 3262d6c9961d3f08bbfc7856f88a106b0397ab4c..911e297bb3cf5d17f311ad0130c5676f697bce68 100644 --- a/templates/schema.ejs +++ b/templates/html/schema.ejs @@ -28,12 +28,12 @@ <link rel="icon" href="https://wwwimages2.adobe.com/include/img/favicon.ico" type="image/x-icon"> <link rel="shortcut icon" href="https://wwwimages2.adobe.com/include/img/favicon.ico" type="image/x-icon"> -<link rel="stylesheet" href="../public/css/adobe.css" type="text/css" /> +<link rel="stylesheet" href="../../public/css/adobe.css" type="text/css" /> <link rel="stylesheet" type="text/css" href="../public//css/aceui-reimagine.min.css"/> -<link rel="stylesheet" href="../public/css/thirdparty-new.css" type="text/css" /> -<link rel="stylesheet" href="../public/css/customized.css" type="text/css" /> -<link rel="stylesheet" type="text/css" href="../public/css/icons.min.css"/> -<link rel="stylesheet" href="../public/css/clientlib-all.css" type="text/css" /> +<link rel="stylesheet" href="../../public/css/thirdparty-new.css" type="text/css" /> +<link rel="stylesheet" href="../../public/css/customized.css" type="text/css" /> +<link rel="stylesheet" type="text/css" href="../../public/css/icons.min.css"/> +<link rel="stylesheet" href="../../public/css/clientlib-all.css" type="text/css" /> </head> <body class="Lobby globalnav__external__no-touch" data-personalization-json="/content/udp/en/products/contentapi/docs/getting-started.loggedin.json" data-seed-personalization="" data-seed-themes="" data-seed-modal="" data-seed-details="" data-seed-messages="" data-seed-deeplink=""><div data-country="US" data-language="en" data-locale="en_US" id="globalnav__header" class="globalnav__js__header globalnav__feature-flag--dc"> diff --git a/templates/md/class.ejs b/templates/md/class.ejs new file mode 100644 index 0000000000000000000000000000000000000000..e3fc15b634f405b2bcb03fcb54d0b26b4913e7c5 --- /dev/null +++ b/templates/md/class.ejs @@ -0,0 +1,35 @@ +<% +/************************************************************************* + * + * ADOBE CONFIDENTIAL + * ___________________ + * + * Copyright 2016 Adobe Systems Incorporated + * All Rights Reserved. + * + * NOTICE: All information contained herein is, and remains + * the property of Adobe Systems Incorporated and its suppliers, + * if any. The intellectual and technical concepts contained + * herein are proprietary to Adobe Systems Incorporated and its + * suppliers and are protected by trade secret or copyright law. + * Dissemination of this information or reproduction of this material + * is strictly forbidden unless prior written permission is obtained + * from Adobe Systems Incorporated. + **************************************************************************/ +%> +<% +function escape(s) { + return s.replace(/\n/g, '<br>'); +} +%> +*<%- clazz[consts.RDFS_LABEL] %>* + +<%- clazz[consts.RDFS_COMMENT] %> + +<% if (clazz[consts.SKOS_NOTE]) { %> +Note: <%- clazz[consts.SKOS_NOTE] %> + +<% } %> +|Name|JSON Name|Type|Description|Note|Example Value| +|--- |--- |--- |--- |--- |--- |<% _.forEach(clazz.properties, function (prop) { %> +| <%- prefixes.shrink(prop["@id"]) %> | <%- prop[consts.META_JSONNAME] %> | <%- model.datatypes[prop[consts.RDFS_RANGE]][consts.RDFS_LABEL] %> | <%- escape(prop[consts.RDFS_COMMENT]) %> | <%- escape(prop[consts.SKOS_NOTE]) %> | <%- escape(prop[consts.SKOS_EXAMPLE]) %> | <% }); %>