11'use strict' ;
22
3+ function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
4+
35var sortArray = require ( 'sort-array' ) ;
46var transform = require ( './transform' ) ;
57var a = require ( 'array-tools' ) ;
8+ var t = require ( 'typical' ) ;
69
710exports . parse = parse ;
811exports . getStats = getStats ;
12+ exports . groupBy = groupBy ;
913
1014function 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
4656function 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+ } ;
0 commit comments