|
|
#!/usr/bin/env node
'use strict';
var fs = require('fs'); var path = require('path'); var mkdirp = require('mkdirp'); var jsdom = require('jsdom'); var Q = require('q');
var onlyStandAlone = [ "0117-basic-routing-show-hide-map-example.html" ];
var isAnExample = function(filename) { if (filename === '0000-viewer.html') { return false; } return /[0-9][0-9][0-9][0-9].*\.html/.test(filename); };
var isJavascript = function(filename) { return /.*\.js/.test(filename); };
var deleteFileIfJavascript = function(filename) { var df = Q.defer(); if (isJavascript(filename)) { fs.unlink(filename, function() { df.resolve(); }); } else { df.resolve(); }
return df.promise; };
var cleanJavascriptFilesFromControllersDirectory = function(dir) { var df = Q.defer(); fs.readdir(dir, function(err, list) { var l = []; var files = list.map(function(file) { return path.join(dir, file); }); files.forEach(deleteFileIfJavascript); Q.allSettled(l).then(function(result) { df.resolve(); }); }); return df.promise; };
var writeController = function(script, examplefile, controllers_directory) { var df = Q.defer(); var scriptLines = script.split('\n'); var outfilename; var outScript = []; for (var i = 0; i < scriptLines.length; i++) {
var line = scriptLines[i];
// Remove empty lines
if (line.replace(/^\s+|\s+$/g, '') === '') { continue; }
// Remove the module initializacion line
if (line.search('angular.module') !== -1) { continue; }
// Extract controller name
if (line.search('app.controller') !== -1 && !outfilename) { var controller = line.match(/app.controller\((\'|\")([^'"]*)/); if (controller && controller.length > 2 && controller[2]) { outfilename = controller[2] + '.js'; } }
outScript.push(line); }
if (outfilename) { outfilename = path.join(controllers_directory, outfilename); if (!fs.existsSync(outfilename)) { fs.writeFile(outfilename, outScript.join('\n'), function() { df.resolve(); }); } else { console.log('The controller name is duplicated: ' + outfilename) df.reject(); } } else { console.log('Can\'t identify the controller name in the example ' + examplefile) df.reject(); }
return df.promise; };
var generateControllersFromExamples = function(examples_directory, controllers_directory) { var df = Q.defer(); fs.readdir(examples_directory, function(err, list) { var l = []; list.forEach(function(filename) { if (isAnExample(filename)) { var html = fs.readFileSync(path.join(__dirname, 'examples', filename)); jsdom.env({ html: html.toString(), done: function(err, window) { var scripts = window.document.getElementsByTagName('script'); var last = scripts.length -1; var script = scripts[last].innerHTML; l.push(writeController(script, filename, controllers_directory)); } }); } });
Q.allSettled(l).then(function() { df.resolve(); }); });
return df.promise; };
var extractId = function(filename) { var arr = filename.replace('.html', '').split('-'); arr.splice(0,2); return arr.join('-'); };
var extractTitle = function(filename) { var html = fs.readFileSync(path.join(__dirname, 'examples', filename)); var title; var arr = html.toString().split('\n');
for (var i = 0; i< arr.length; i++) { var line = arr[i];
if (line.search('<h1>') !== -1) { title = line.replace('<h1>', '').replace('</h1>', '').replace(/^ */, ''); } }
return title; };
var extractDescription = function(filename) {
};
var extractDate = function(filename) { var stats = fs.statSync(filename); return stats.mtime; };
var generateExamplesJSONFile = function(examples_directory, json_file) { var df = Q.defer(); var examples = {}; fs.readdir(examples_directory, function(err, list) { list.forEach(function(filename) { if (isAnExample(filename)) { var section = filename.split('-')[1]; var id = extractId(filename); var extUrl = filename; var title = extractTitle(filename); var description = extractDescription(filename); var date = extractDate(path.join(examples_directory, filename));
if (!(section in examples)) { examples[section] = []; } examples[section].push({ date: date, section: section, onlyStandAlone: onlyStandAlone.indexOf(extUrl) !== -1, id: '/' + section + '/' + id, extUrl: extUrl, title: title, description: description }); } });
fs.writeFile(json_file, JSON.stringify(examples, null, 4), function(err) { df.resolve(); }); });
return df.promise; };
var controllers_directory = path.join(__dirname, 'examples', 'js', 'controllers'); mkdirp(controllers_directory, function(err) { cleanJavascriptFilesFromControllersDirectory(controllers_directory).then(function() { var examples_directory = path.join(__dirname, 'examples'); generateControllersFromExamples(examples_directory, controllers_directory).then(function() { var json_file = path.join(__dirname, 'examples', 'json', 'examples.json'); generateExamplesJSONFile(examples_directory, json_file); }); }); });
|