@@ -409,6 +409,107 @@ function buildNav(members) {
409409 return nav ;
410410}
411411
412+ function buildMemberSearch ( items , itemHeading , itemsSeen , linktoFn ) {
413+ let search = [ ] ;
414+
415+ if ( items . length ) {
416+ let itemsSearch = [ ] ;
417+
418+ items . forEach ( item => {
419+ var methods = find ( { kind : "function" , memberof : item . longname } )
420+ var members = find ( { kind : "member" , memberof : item . longname } )
421+ var hasMethods = ! ! ( methods . length || members . length ) ;
422+ let displayName ;
423+
424+ if ( ! hasOwnProp . call ( item , 'longname' ) ) {
425+ itemsSearch . push ( { name : item . name , url : linktoFn ( '' , item . name ) } ) ;
426+ }
427+ else if ( ! hasOwnProp . call ( itemsSeen , item . longname ) ) {
428+ if ( env . conf . templates . default . useLongnameInNav ) {
429+ displayName = item . longname ;
430+ } else {
431+ displayName = item . name ;
432+ }
433+
434+ itemsSearch . push ( {
435+ name : displayName ,
436+ url : linktoFn ( item . longname , displayName . replace ( / \b ( m o d u l e | e v e n t ) : / g, '' ) )
437+ } ) ;
438+
439+ if ( hasMethods ) {
440+ methods . forEach ( meth => {
441+ itemsSearch . push ( {
442+ name : meth . longname ,
443+ url : linktoFn ( meth . longname , meth . name )
444+ } ) ;
445+ } ) ;
446+ members . forEach ( meth => {
447+ itemsSearch . push ( {
448+ name : meth . longname ,
449+ url : linktoFn ( meth . longname , meth . name )
450+ } ) ;
451+ } ) ;
452+ }
453+ }
454+ } ) ;
455+
456+ if ( itemsSearch . length ) {
457+ search . push ( ...itemsSearch ) ;
458+ }
459+ }
460+
461+ return search ;
462+ }
463+
464+ /**
465+ * Create the search bar in sidebar.
466+ * @param {object } members The members that will be used to create the sidebar.
467+ * @param {array<object> } members.classes
468+ * @param {array<object> } members.externals
469+ * @param {array<object> } members.globals
470+ * @param {array<object> } members.mixins
471+ * @param {array<object> } members.modules
472+ * @param {array<object> } members.namespaces
473+ * @param {array<object> } members.tutorials
474+ * @param {array<object> } members.events
475+ * @param {array<object> } members.interfaces
476+ * @return {string } The HTML for the navigation sidebar.
477+ */
478+ function buildSearch ( members ) {
479+ let globalNav ;
480+ let search = [ { name : "Home" , url : '<a href="index.html">Home</a>' } ] ;
481+ const seen = { } ;
482+ const seenTutorials = { } ;
483+
484+ search . push ( ...buildMemberSearch ( members . modules , 'Modules' , { } , linkto ) ) ;
485+ search . push ( ...buildMemberSearch ( members . externals , 'Externals' , seen , linktoExternal ) ) ;
486+ search . push ( ...buildMemberSearch ( members . namespaces , 'Namespaces' , seen , linkto ) ) ;
487+ search . push ( ...buildMemberSearch ( members . classes , 'Classes' , seen , linkto ) ) ;
488+ search . push ( ...buildMemberSearch ( members . interfaces , 'Interfaces' , seen , linkto ) ) ;
489+ search . push ( ...buildMemberSearch ( members . events , 'Events' , seen , linkto ) ) ;
490+ search . push ( ...buildMemberSearch ( members . mixins , 'Mixins' , seen , linkto ) ) ;
491+ search . push ( ...buildMemberSearch ( members . tutorials , 'Tutorials' , seenTutorials , linktoTutorial ) ) ;
492+
493+ if ( members . globals . length ) {
494+ globalNav = [ ] ;
495+
496+ members . globals . forEach ( ( { kind, longname, name} ) => {
497+ if ( kind !== 'typedef' && ! hasOwnProp . call ( seen , longname ) ) {
498+ globalNav . push ( { name : name , url : linkto ( longname , name ) } ) ;
499+ }
500+ } ) ;
501+
502+ if ( ! globalNav . length ) {
503+ search . push ( { name : "Global" , url : linkto ( 'global' , 'Global' ) } ) ;
504+ }
505+ else {
506+ search . push ( ...globalNav ) ;
507+ }
508+ }
509+
510+ return search ;
511+ }
512+
412513function prettifyReadme ( readme ) {
413514 let prettifiedReadme = readme ;
414515 prettifiedReadme = prettifiedReadme . replace ( / c l a s s = " p r e t t y p r i n t / g, "class=\"prettyprint linenums" ) ;
@@ -625,7 +726,9 @@ exports.publish = (taffyData, opts, tutorials) => {
625726
626727 // once for all
627728 view . nav = buildNav ( members ) ;
628- attachModuleSymbols ( find ( { longname : { left : 'module:' } } ) , members . modules ) ;
729+ attachModuleSymbols ( find ( { longname : { left : 'module:' } } ) , members . modules ) ;
730+ view . search = buildSearch ( members ) ;
731+ fs . writeFileSync ( path . join ( outdir , "search.json" ) , JSON . stringify ( view . search ) ) ;
629732
630733 // generate the pretty-printed source files first so other pages can link to them
631734 if ( outputSourceFiles ) {
0 commit comments