-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
191 lines (135 loc) · 3.53 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
'use strict';
/* global module, require, __dirname */
var isEmptyObject = require('is-empty-object');
var JSONStream = require('JSONStream');
var assign = require('object-assign');
var traverse = require('traverse');
var pretty = require('pretty');
var mkdirp = require('mkdirp');
var marked = require('marked');
var path = require('path');
var fs = require('fs');
/**
* Takes the pug-doc stream
* and generates a pretty html file.
*/
function PugDocHTML(options){
if(typeof options === 'undefined'){
throw new Error('Pug doc html requires a settings object.');
}
if(typeof options.output === 'undefined'){
throw new Error('Pug doc html requires settings.output to be set.');
}
// options
options = assign({
input: null,
output: null
}, options);
var isInit = true;
// create output stream
mkdirp.sync(path.dirname(options.output));
var output = fs.createWriteStream(options.output);
output.on('close', function(){
stream.emit('complete');
}.bind(this));
// read template html file
var template = fs.createReadStream(__dirname +'/template.html');
var templateHtml;
template.on('data', function(data){
// break template file up in 2 parts
templateHtml = data.toString().split('PUG_DOC_DATA');
// add first part of template html
output.write(templateHtml[0]);
});
/**
* Create js object to be placed inside html file
*/
function createSnippet(obj){
var line = [];
// add trailing comma for all items but the first
if(!isInit){
line.push(',');
}
obj = JSON.parse(JSON.stringify(obj));
// create pretty html
obj.output = pretty(obj.output);
obj.name = obj.meta.name;
obj.description = obj.meta.description;
// traverse all arguments
// and indent according to level
var spaces;
var arg;
var rest = '';
traverse(obj.meta).forEach(function(x){
// check for empty object
if(isEmptyObject(x)){
return;
}
if(this.key === 'name'){
return;
}
if(this.key === 'description'){
return;
}
if(typeof this.key === 'undefined'){
return;
}
// set indentation
spaces = new Array(this.level).join('\t');
arg = [];
arg.push(spaces);
arg.push('* ');
arg.push(this.key);
if(typeof x !== 'object'){
arg.push(': ');
arg.push(x);
}
rest += arg.join('') +'\n';
});
obj.rest = marked(rest);
if(isInit){
isInit = false;
}
line.push(JSON.stringify(obj));
return line.join('');
}
/**
* Output stream
*/
var stream = JSONStream.parse('*');
stream.on('data', function(data){
// create code snippet
var snippet = createSnippet(data);
// push lines
output.write(snippet);
});
stream.on('end', function(){
output.end(templateHtml[1]);
});
/**
* Input from file
*/
if(typeof options.input !== 'undefined'){
// read input json
var input = fs.createReadStream(__dirname +'/'+ options.input);
var json = '';
input.on('data', function(data){
json += data;
}.bind(this));
input.on('end', function() {
json = JSON.parse(json.toString());
var snippet;
json.forEach(function(obj){
// create code snippet
snippet = createSnippet(obj);
// append json data to template
output.write(snippet);
});
// end stream
stream.push(null);
stream.end();
});
}
return stream;
}
module.exports = PugDocHTML;