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});