| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 | /* eslint-disable indent, no-nested-ternary, space-infix-ops *//**    @overview Builds a tree-like JSON string from the doclet data.    @version 0.0.3    @example        ./jsdoc scratch/jsdoc_test.js -t templates/haruki -d console -q format=xml*/const xml = require('js2xmlparser');const hasOwnProp = Object.prototype.hasOwnProperty;function graft(parentNode, childNodes, parentLongname) {    childNodes    .filter(({memberof}) => memberof === parentLongname)    .forEach(element => {        let i;        let len;        let thisClass;        let thisEvent;        let thisFunction;        let thisMixin;        let thisNamespace;        if (element.kind === 'namespace') {            if (!parentNode.namespaces) {                parentNode.namespaces = [];            }            thisNamespace = {                'name': element.name,                'description': element.description || '',                'access': element.access || '',                'virtual': Boolean(element.virtual)            };            parentNode.namespaces.push(thisNamespace);            graft(thisNamespace, childNodes, element.longname);        }        else if (element.kind === 'mixin') {            if (!parentNode.mixins) {                parentNode.mixins = [];            }            thisMixin = {                'name': element.name,                'description': element.description || '',                'access': element.access || '',                'virtual': Boolean(element.virtual)            };            parentNode.mixins.push(thisMixin);            graft(thisMixin, childNodes, element.longname);        }        else if (element.kind === 'function') {            if (!parentNode.functions) {                parentNode.functions = [];            }            thisFunction = {                'name': element.name,                'access': element.access || '',                'virtual': Boolean(element.virtual),                'description': element.description || '',                'parameters': [],                'examples': []            };            parentNode.functions.push(thisFunction);            if (element.returns) {                thisFunction.returns = {                    'type': element.returns[0].type? (element.returns[0].type.names.length === 1? element.returns[0].type.names[0] : element.returns[0].type.names) : '',                    'description': element.returns[0].description || ''                };            }            if (element.examples) {                for (i = 0, len = element.examples.length; i < len; i++) {                    thisFunction.examples.push(element.examples[i]);                }            }            if (element.params) {                for (i = 0, len = element.params.length; i < len; i++) {                    thisFunction.parameters.push({                        'name': element.params[i].name,                        'type': element.params[i].type? (element.params[i].type.names.length === 1? element.params[i].type.names[0] : element.params[i].type.names) : '',                        'description': element.params[i].description || '',                        'default': hasOwnProp.call(element.params[i], 'defaultvalue') ? element.params[i].defaultvalue : '',                        'optional': typeof element.params[i].optional === 'boolean'? element.params[i].optional : '',                        'nullable': typeof element.params[i].nullable === 'boolean'? element.params[i].nullable : ''                    });                }            }        }        else if (element.kind === 'member') {            if (!parentNode.properties) {                parentNode.properties = [];            }            parentNode.properties.push({                'name': element.name,                'access': element.access || '',                'virtual': Boolean(element.virtual),                'description': element.description || '',                'type': element.type? (element.type.length === 1? element.type[0] : element.type) : ''            });        }        else if (element.kind === 'event') {            if (!parentNode.events) {                parentNode.events = [];            }            thisEvent = {                'name': element.name,                'access': element.access || '',                'virtual': Boolean(element.virtual),                'description': element.description || '',                'parameters': [],                'examples': []            };            parentNode.events.push(thisEvent);            if (element.returns) {                thisEvent.returns = {                    'type': element.returns.type ? (element.returns.type.names.length === 1 ? element.returns.type.names[0] : element.returns.type.names) : '',                    'description': element.returns.description || ''                };            }            if (element.examples) {                for (i = 0, len = element.examples.length; i < len; i++) {                    thisEvent.examples.push(element.examples[i]);                }            }            if (element.params) {                for (i = 0, len = element.params.length; i < len; i++) {                    thisEvent.parameters.push({                        'name': element.params[i].name,                        'type': element.params[i].type? (element.params[i].type.names.length === 1? element.params[i].type.names[0] : element.params[i].type.names) : '',                        'description': element.params[i].description || '',                        'default': hasOwnProp.call(element.params[i], 'defaultvalue') ? element.params[i].defaultvalue : '',                        'optional': typeof element.params[i].optional === 'boolean'? element.params[i].optional : '',                        'nullable': typeof element.params[i].nullable === 'boolean'? element.params[i].nullable : ''                    });                }            }        }        else if (element.kind === 'class') {            if (!parentNode.classes) {                parentNode.classes = [];            }            thisClass = {                'name': element.name,                'description': element.classdesc || '',                'extends': element.augments || [],                'access': element.access || '',                'virtual': Boolean(element.virtual),                'fires': element.fires || '',                'constructor': {                    'name': element.name,                    'description': element.description || '',                    'parameters': [                    ],                    'examples': []                }            };            parentNode.classes.push(thisClass);            if (element.examples) {                for (i = 0, len = element.examples.length; i < len; i++) {                    thisClass.constructor.examples.push(element.examples[i]);                }            }            if (element.params) {                for (i = 0, len = element.params.length; i < len; i++) {                    thisClass.constructor.parameters.push({                        'name': element.params[i].name,                        'type': element.params[i].type? (element.params[i].type.names.length === 1? element.params[i].type.names[0] : element.params[i].type.names) : '',                        'description': element.params[i].description || '',                        'default': hasOwnProp.call(element.params[i], 'defaultvalue') ? element.params[i].defaultvalue : '',                        'optional': typeof element.params[i].optional === 'boolean'? element.params[i].optional : '',                        'nullable': typeof element.params[i].nullable === 'boolean'? element.params[i].nullable : ''                    });                }            }            graft(thisClass, childNodes, element.longname);       }    });}/**    @param {TAFFY} data    @param {object} opts */exports.publish = (data, {destination, query}) => {    let docs;    const root = {};    data({undocumented: true}).remove();    docs = data().get(); // <-- an array of Doclet objects    graft(root, docs);    if (destination === 'console') {        if (query && query.format === 'xml') {            console.log( xml.parse('jsdoc', root) );        }        else {            console.log( require('jsdoc/util/dumper').dump(root) );        }    }    else {        console.log('This template only supports output to the console. Use the option "-d console" when you run JSDoc.');    }};
 |