SOURCE CODE: UizeSite.Build.BuildIndexPages
VIEW REFERENCE

/*______________
|       ______  |   U I Z E    J A V A S C R I P T    F R A M E W O R K
|     /      /  |   ---------------------------------------------------
|    /    O /   |    MODULE : UizeSite.Build.BuildIndexPages Namespace
|   /    / /    |
|  /    / /  /| |    ONLINE : http://www.uize.com
| /____/ /__/_| | COPYRIGHT : (c)2009-2012 UIZE
|          /___ |   LICENSE : Available under MIT License or GNU General Public License
|_______________|             http://www.uize.com/license.html
*/

/* Module Meta Data
  type: Namespace
  importance: 1
  codeCompleteness: 100
  testCompleteness: 100
  docCompleteness: 100
*/

/*?
  Introduction
    The =UizeSite.Build.BuildIndexPages= package provides a method for building index pages for examples, tools, and JavaScript modules for the UIZE Web site.

    *DEVELOPERS:* `Chris van Rensburg`
*/

Uize.module ({
  name:'UizeSite.Build.BuildIndexPages',
  required:[
    'Uize.Wsh',
    'Uize.Build.Util',
    'Uize.Template',
    'Uize.String',
    'Uize.String.Lines',
    'Uize.Json',
    'Uize.Data',
    'Uize.Array.Sort',
    'Uize.Data.PathsTree',
    'UizeSite.Build.Util'
  ],
  builder:function () {
    /*** Variables for Scruncher Optimization ***/
      var
        _package = function () {},
        _getFirstTitleSegment = UizeSite.Build.Util.getFirstTitleSegment
      ;

    /*** Utility Functions ***/
      function _buildIndexPage (_indexPageTemplatePath,_filesToIndex) {
        Uize.Build.Util.processJstFile (_indexPageTemplatePath,{files:_filesToIndex});
      }

    /*** Public Static Methods ***/
      _package.perform = function (_params) {
        var _moduleReferenceFiles = Uize.Build.Util.getHtmlFilesInfo ('reference',_getFirstTitleSegment);

        /*** build index files for modules, explainers, and widgets ***/
          _buildIndexPage (
            'javascript-explainers.html.jst',
            Uize.Build.Util.getHtmlFilesInfo ('explainers',_getFirstTitleSegment)
          );
          _buildIndexPage ('javascript-modules-index.html.jst',_moduleReferenceFiles);
          _buildIndexPage (
            'javascript-widgets.html.jst',
            Uize.Build.Util.getHtmlFilesInfo ('widgets',_getFirstTitleSegment)
          );

        /*** build the UizeSite.ModulesTree module ***/
          /*** build modules tree structure from list of module names ***/
            var _modulesTree = Uize.Data.PathsTree.fromList (Uize.map (_moduleReferenceFiles,'value.title'),'.');

          /*** write the modules tree module file ***/
            Uize.Build.Util.writeDataModule (env.moduleFolderPath,'UizeSite.ModulesTree',_modulesTree);

        /*** build the examples module and index pages ***/
          var _examples = Uize.Build.Util.getHtmlFilesInfo ('examples',_getFirstTitleSegment);

          /*** build the UizeSite.Examples module ***/
            Uize.Build.Util.writeDataModule (env.moduleFolderPath,'UizeSite.Examples',_examples);

          /*** build the examples by module page ***/
            Uize.Build.Util.processJstFile ('javascript-examples-by-module.html.jst');

          /*** build map of examples by keyword ***/
            var _examplesByKeyword = {'':_examples};
            for (
              var _exampleNo = -1, _examplesLength = _examples.length, _example;
              ++_exampleNo < _examplesLength;
            ) {
              var _keywordsStr = (_example = _examples [_exampleNo]).keywords;
              if (_keywordsStr) {
                var _keywords = _keywordsStr.split (' ');
                for (var _keywordNo = -1, _keywordsLength = _keywords.length; ++_keywordNo < _keywordsLength;) {
                  var _keyword = _keywords [_keywordNo];
                  Uize.String.startsWith (_keyword,'Uize') ||
                    (_examplesByKeyword [_keyword] || (_examplesByKeyword [_keyword] = [])).push (_example)
                  ;
                }
              }
            }

          /*** build examples index pages for each keyword ***/
            var _indexPageTemplate = Uize.Build.Util.compileJstFile ('javascript-examples.html.jst');
            for (var _keyword in _examplesByKeyword)
              Uize.Wsh.writeFile ({
                path:'javascript-' + _keyword + (_keyword && '-') + 'examples.html',
                text:_indexPageTemplate ({files:_examplesByKeyword [_keyword],keyword:_keyword})
              })
            ;

          /*** build the UizeSite.ExamplesInfoForSiteMap module ***/
            Uize.Build.Util.writeDataModule (
              env.moduleFolderPath,'UizeSite.ExamplesInfoForSiteMap',
              {
                keywords:Uize.keys (_examplesByKeyword).slice (1).sort (), // slice removes the '' keyword
                tools:
                  Uize.map (
                    _examplesByKeyword.tool,
                    function (_value) {return Uize.Data.filter (_value,['title','path'])}
                  )
              }
            );

        /*** build the news index pages ***/
          var
            _newsItems = Uize.Array.Sort.sortBy (
              Uize.Build.Util.getHtmlFilesInfo ('news',_getFirstTitleSegment),
              'value.title',
              -1
            ),
            _newsIndexPageTemplate = Uize.Build.Util.compileJstFile ('news.html.jst')
          ;

          /*** build the latest news files ***/
            var _latestNews = _newsItems.slice (0,50);

            /*** build the latest news HTML page ***/
              Uize.Wsh.writeFile ({
                path:'latest-news.html',
                text:_newsIndexPageTemplate ({files:_latestNews})
              });

            /*** build the latest news RSS file ***/
              Uize.Build.Util.processJstFile (
                'latest-news.rss.jst',
                {
                  items:Uize.map (
                    _latestNews,
                    function (_value) {
                      return {
                        title:_value.title.replace (/^\d\d\d\d-\d\d-\d\d\s*-\s*/,''),
                        date:_value.title.slice (0,10),
                        link:'http://www.uize.com/' + _value.path,
                        description:_value.description
                      }
                    }
                  )
                }
              );

          /*** build the home page, to update the news pod ***/
            Uize.Build.Util.processJstFile ('index.html.jst',{latestNews:_latestNews});

          /*** build map of news items by year ***/
            var _newsItemsByYear = {};
            for (
              var _newsItemNo = -1, _newsItemsLength = _newsItems.length, _newsItem, _year;
              ++_newsItemNo < _newsItemsLength;
            ) {
              var _year = (_newsItem = _newsItems [_newsItemNo]).title.slice (0,4);
              (_newsItemsByYear [_year] || (_newsItemsByYear [_year] = [])).push (_newsItem);
            }

          /*** build news index pages for each year ***/
            for (var _year in _newsItemsByYear)
              Uize.Wsh.writeFile ({
                path:'news-' + _year + '.html',
                text:_newsIndexPageTemplate ({files:_newsItemsByYear [_year],year:_year})
              })
            ;

        /*** build the directory page ***/
          Uize.Build.Util.processJstFile ('directory.html.jst');
      };

    return _package;
  }
});