arnaucube
arnaucube/commonroutesAppPublic Self-hosted repository
commonroutesApp/www/lib/ui-leaflet/generate-examples.js
www/lib/ui-leaflet/generate-examples.jsRaw
  1#!/usr/bin/env node
  2
  3'use strict';
  4
  5var fs = require('fs');
  6var path = require('path');
  7var mkdirp = require('mkdirp');
  8var jsdom = require('jsdom');
  9var Q = require('q');
 10
 11var onlyStandAlone = [
 12    "0117-basic-routing-show-hide-map-example.html"
 13];
 14
 15var isAnExample = function(filename) {
 16    if (filename === '0000-viewer.html') {
 17      return false;
 18    }
 19    return /[0-9][0-9][0-9][0-9].*\.html/.test(filename);
 20};
 21
 22var isJavascript = function(filename) {
 23    return /.*\.js/.test(filename);
 24};
 25
 26var deleteFileIfJavascript = function(filename) {
 27    var df = Q.defer();
 28    if (isJavascript(filename)) {
 29        fs.unlink(filename, function() {
 30            df.resolve();
 31        });
 32    } else {
 33        df.resolve();
 34    }
 35
 36    return df.promise;
 37};
 38
 39var cleanJavascriptFilesFromControllersDirectory = function(dir) {
 40    var df = Q.defer();
 41    fs.readdir(dir, function(err, list) {
 42        var l = [];
 43        var files = list.map(function(file) {
 44            return path.join(dir, file);
 45        });
 46        files.forEach(deleteFileIfJavascript);
 47        Q.allSettled(l).then(function(result) {
 48            df.resolve();
 49        });
 50    });
 51    return df.promise;
 52};
 53
 54var writeController = function(script, examplefile, controllers_directory) {
 55    var df = Q.defer();
 56    var scriptLines = script.split('\n');
 57    var outfilename;
 58    var outScript = [];
 59    for (var i = 0; i < scriptLines.length; i++) {
 60
 61        var line = scriptLines[i];
 62
 63        // Remove empty lines
 64        if (line.replace(/^\s+|\s+$/g, '') === '') {
 65            continue;
 66        }
 67
 68        // Remove the module initializacion line
 69        if (line.search('angular.module') !== -1) {
 70            continue;
 71        }
 72
 73        // Extract controller name
 74        if (line.search('app.controller') !== -1 && !outfilename) {
 75            var controller = line.match(/app.controller\((\'|\")([^'"]*)/);
 76            if (controller && controller.length > 2 && controller[2]) {
 77                outfilename = controller[2] + '.js';
 78            }
 79        }
 80
 81        outScript.push(line);
 82    }
 83
 84    if (outfilename) {
 85        outfilename = path.join(controllers_directory, outfilename);
 86        if (!fs.existsSync(outfilename)) {
 87            fs.writeFile(outfilename, outScript.join('\n'), function() {
 88                df.resolve();
 89            });
 90        } else {
 91            console.log('The controller name is duplicated: ' + outfilename)
 92            df.reject();
 93        }
 94    } else {
 95        console.log('Can\'t identify the controller name in the example ' + examplefile)
 96        df.reject();
 97    }
 98
 99    return df.promise;
100};
101
102var generateControllersFromExamples = function(examples_directory, controllers_directory) {
103    var df = Q.defer();
104    fs.readdir(examples_directory, function(err, list) {
105        var l = [];
106        list.forEach(function(filename) {
107            if (isAnExample(filename)) {
108                var html = fs.readFileSync(path.join(__dirname, 'examples', filename));
109                jsdom.env({
110                    html: html.toString(),
111                    done: function(err, window) {
112                        var scripts = window.document.getElementsByTagName('script');
113                        var last = scripts.length -1;
114                        var script = scripts[last].innerHTML;
115                        l.push(writeController(script, filename, controllers_directory));
116                    }
117                });
118            }
119        });
120
121        Q.allSettled(l).then(function() {
122            df.resolve();
123        });
124    });
125
126    return df.promise;
127};
128
129var extractId = function(filename) {
130    var arr = filename.replace('.html', '').split('-');
131    arr.splice(0,2);
132    return arr.join('-');
133};
134
135var extractTitle = function(filename) {
136    var html = fs.readFileSync(path.join(__dirname, 'examples', filename));
137    var title;
138    var arr = html.toString().split('\n');
139
140    for (var i = 0; i< arr.length; i++) {
141        var line = arr[i];
142
143        if (line.search('<h1>') !== -1) {
144            title = line.replace('<h1>', '').replace('</h1>', '').replace(/^ */, '');
145        }
146    }
147
148    return title;
149};
150
151var extractDescription = function(filename) {
152
153};
154
155var extractDate = function(filename) {
156    var stats = fs.statSync(filename);
157    return stats.mtime;
158};
159
160var generateExamplesJSONFile = function(examples_directory, json_file) {
161    var df = Q.defer();
162    var examples = {};
163    fs.readdir(examples_directory, function(err, list) {
164        list.forEach(function(filename) {
165            if (isAnExample(filename)) {
166                var section = filename.split('-')[1];
167                var id = extractId(filename);
168                var extUrl = filename;
169                var title = extractTitle(filename);
170                var description = extractDescription(filename);
171                var date = extractDate(path.join(examples_directory, filename));
172
173                if (!(section in examples)) {
174                    examples[section] = [];
175                }
176                examples[section].push({
177                    date: date,
178                    section: section,
179                    onlyStandAlone: onlyStandAlone.indexOf(extUrl) !== -1,
180                    id: '/' + section + '/' + id,
181                    extUrl: extUrl,
182                    title: title,
183                    description: description
184                });
185            }
186        });
187
188        fs.writeFile(json_file, JSON.stringify(examples, null, 4), function(err) {
189            df.resolve();
190        });
191    });
192
193    return df.promise;
194};
195
196var controllers_directory = path.join(__dirname, 'examples', 'js', 'controllers');
197mkdirp(controllers_directory, function(err) {
198    cleanJavascriptFilesFromControllersDirectory(controllers_directory).then(function() {
199        var examples_directory = path.join(__dirname, 'examples');
200        generateControllersFromExamples(examples_directory, controllers_directory).then(function() {
201            var json_file = path.join(__dirname, 'examples', 'json', 'examples.json');
202            generateExamplesJSONFile(examples_directory, json_file);
203        });
204    });
205});