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