Skip to content

Commit 3ab31a0

Browse files
committed
es5
1 parent 71a7702 commit 3ab31a0

3 files changed

Lines changed: 99 additions & 12 deletions

File tree

es5/jsdoc-parse.js

Lines changed: 92 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
'use strict';
22

3+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4+
35
var sortArray = require('sort-array');
46
var transform = require('./transform');
57
var a = require('array-tools');
8+
var t = require('typical');
69

710
exports.parse = parse;
811
exports.getStats = getStats;
12+
exports.groupBy = groupBy;
913

1014
function parse(jsdocExplainOutput, options) {
11-
options = options || {};
15+
options = new ParseOptions(options);
1216
var data = transform(jsdocExplainOutput);
1317

1418
data = data.filter(function (doclet) {
@@ -26,6 +30,12 @@ function parse(jsdocExplainOutput, options) {
2630

2731
if (options['sort-by'] && !a(options['sort-by']).contains('none')) {
2832
data = sort(data, options['sort-by']);
33+
} else if (!options['sort-by']) {
34+
data = sort(data, ['scope', 'category', 'kind', 'order']);
35+
}
36+
37+
if (options['group-by']) {
38+
data = groupBy(data, options['group-by']);
2939
}
3040

3141
return data;
@@ -44,14 +54,91 @@ function getStats(jsdocExplainOutput) {
4454
}
4555

4656
function sort(array, sortBy) {
47-
var order = {
48-
kind: ['class', 'constructor', 'mixin', 'member', 'namespace', 'constant', 'function', 'event', 'typedef', 'external'],
57+
var customSortOrders = {
58+
kind: ['class', 'constructor', 'mixin', 'member', 'namespace', 'enum', 'constant', 'function', 'event', 'typedef', 'external'],
4959
scope: ['global', 'instance', 'static', 'inner']
5060
};
5161

5262
if (!sortBy) {
5363
return array;
5464
} else {
55-
return sortArray(array, sortBy, order);
65+
return sortArray(array, sortBy, customSortOrders);
5666
}
57-
}
67+
}
68+
69+
function _addGroup(doclets, groupByFields) {
70+
return doclets.map(function (doclet) {
71+
doclet._group = groupByFields.map(function (field) {
72+
return t.isDefined(doclet[field]) ? doclet[field] : null;
73+
});
74+
return doclet;
75+
});
76+
}
77+
78+
function groupBy(doclets, groupByFields) {
79+
var commonSequence = require('common-sequence');
80+
81+
groupByFields = groupByFields.slice(0);
82+
83+
groupByFields.forEach(function (group) {
84+
var docletGroupValues = doclets.filter(function (doclet) {
85+
return doclet.kind !== 'constructor';
86+
}).map(function (d) {
87+
return d[group];
88+
});
89+
var groupValues = a.unique(docletGroupValues);
90+
if (groupValues.length <= 1) groupByFields = a.without(groupByFields, group);
91+
});
92+
93+
doclets = _addGroup(doclets, groupByFields);
94+
95+
var inserts = [];
96+
var prevGroup = [];
97+
doclets.forEach(function (doclet, index) {
98+
if (!deepEqual(doclet._group, prevGroup)) {
99+
var common = commonSequence(doclet._group, prevGroup);
100+
doclet._group.forEach(function (group, i) {
101+
if (group !== common[i] && group !== null) {
102+
inserts.push({
103+
index: index,
104+
group: group
105+
});
106+
}
107+
});
108+
}
109+
prevGroup = doclet._group;
110+
delete doclet._group;
111+
});
112+
113+
inserts.reverse().forEach(function (insert, i) {
114+
doclets.splice(insert.index, 0, { id: insert.group, kind: 'group', parentId: null });
115+
});
116+
117+
var currentGroup = null;
118+
doclets.forEach(function (d, index) {
119+
d.parentId = currentGroup;
120+
if (index === 0) {
121+
currentGroup = d.id;
122+
} else {
123+
if (d.kind === 'group') currentGroup = d.id;
124+
}
125+
});
126+
127+
return doclets;
128+
}
129+
130+
function deepEqual(a, b) {
131+
return JSON.stringify(a) === JSON.stringify(b);
132+
}
133+
134+
var ParseOptions = function ParseOptions(options) {
135+
_classCallCheck(this, ParseOptions);
136+
137+
options = options || {};
138+
139+
this['group-by'] = null;
140+
141+
this['sort-by'] = ['scope', 'category', 'kind', 'order'];
142+
143+
Object.assign(this, options);
144+
};

es5/transform.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ var testValue = require('test-value');
77
module.exports = transform;
88

99
function transform(data) {
10-
data = fixConstructorMemberLongnames(data);
10+
data = fixES6ConstructorMemberLongnames(data);
1111

1212
var json = data.filter(function (i) {
1313
return !i.undocumented && !/package|file/.test(i.kind);
@@ -19,7 +19,6 @@ function transform(data) {
1919

2020
json = json.map(function (doclet) {
2121
doclet = setID(doclet);
22-
doclet = setParentID(doclet);
2322

2423
doclet = removeQuotes(doclet);
2524
doclet = cleanProperties(doclet);
@@ -45,6 +44,7 @@ function transform(data) {
4544
});
4645

4746
json = removeEnumChildren(json);
47+
json = json.map(setParentID);
4848
json = json.map(removeUnwanted);
4949
json = json.map(sortIdentifier);
5050

@@ -102,14 +102,14 @@ function createConstructor(class_) {
102102
var replacements = [];
103103
class_ = o.clone(class_);
104104
var constructor = o.extract(class_, ['description', 'params', 'examples', 'returns', 'exceptions']);
105-
106105
if (class_.classdesc) {
107106
class_.description = class_.classdesc;
108107
delete class_.classdesc;
109108
}
110109
replacements.push(class_);
111110

112111
if (constructor.description || constructor.params && constructor.params.length) {
112+
constructor.id = class_.id;
113113
constructor.longname = class_.longname;
114114
constructor.name = class_.codeName || class_.name;
115115
constructor.kind = 'constructor';
@@ -161,7 +161,7 @@ function isES6Constructor(doclet) {
161161
}
162162

163163
function replaceID(id, oldID, newID) {
164-
return id.replace(new RegExp('\b' + oldID + '\b'), newID);
164+
return id.replace(new RegExp('' + oldID), newID);
165165
}
166166

167167
function updateIDReferences(doclet, newID) {
@@ -344,7 +344,7 @@ function removeMemberofFromModule(doclet) {
344344
return doclet;
345345
}
346346

347-
function fixConstructorMemberLongnames(data) {
347+
function fixES6ConstructorMemberLongnames(data) {
348348
data.forEach(function (i) {
349349
if (isES6Class(i)) {
350350
var es6constructor = getEs6Constructor(data, i);

test/group-by.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ var test = require('tape')
33
var jsdocParse = require('../')
44

55
test('groupBy', function (t) {
6-
const fixture = require('./fixture/deep-class')
6+
var fixture = require('./fixture/deep-class')
77
console.log(jsdocParse.groupBy(fixture, [ 'scope', 'category' ]))
88
t.end()
99
})
1010

1111
test.only('groupBy2', function (t) {
12-
const fixture = require('./fixture/deep-class')
12+
var fixture = require('./fixture/deep-class')
1313
console.log(jsdocParse.groupBy(fixture, [ 'scope' ]))
1414
t.end()
1515
})

0 commit comments

Comments
 (0)