mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-04-09 22:39:39 +08:00
This commit refactors how the search index is built. The docsSearch service is now defined by a provider, which returns a different implementation of the service depending upon whether the current browser supports WebWorkers or now. * **WebWorker supported**: The index is then built and stored in a new worker. The service posts and receives messages to and from this worker to make queries on the search index. * **WebWorker no supported**: The index is built locally but with a 500ms delay so that the initial page can render before the browser is blocked as the index is built. Also the way that the current app is identified has been modified so we can slim down the js data files (pages-data.js) to again improve startup time. Closes #9204 Closes #9203
240 lines
6.2 KiB
JavaScript
240 lines
6.2 KiB
JavaScript
"use strict";
|
|
|
|
var _ = require('lodash');
|
|
var path = require('canonical-path');
|
|
|
|
var AREA_NAMES = {
|
|
api: 'API',
|
|
guide: 'Developer Guide',
|
|
misc: 'Miscellaneous',
|
|
tutorial: 'Tutorial',
|
|
error: 'Error Reference'
|
|
};
|
|
|
|
function getNavGroup(pages, area, pageSorter, pageMapper) {
|
|
|
|
var navItems = _(pages)
|
|
// We don't want the child to include the index page as this is already catered for
|
|
.omit(function(page) { return page.id === 'index'; })
|
|
|
|
// Apply the supplied sorting function
|
|
.sortBy(pageSorter)
|
|
|
|
// Apply the supplied mapping function
|
|
.map(pageMapper)
|
|
|
|
.value();
|
|
|
|
return {
|
|
name: area.name,
|
|
type: 'group',
|
|
href: area.id,
|
|
navItems: navItems
|
|
};
|
|
}
|
|
|
|
|
|
/**
|
|
* @dgProcessor generatePagesDataProcessor
|
|
* @description
|
|
* This processor will create a new doc that will be rendered as a JavaScript file
|
|
* containing meta information about the pages and navigation
|
|
*/
|
|
module.exports = function generatePagesDataProcessor(log) {
|
|
|
|
|
|
var navGroupMappers = {
|
|
api: function(areaPages, area) {
|
|
var navGroups = _(areaPages)
|
|
.filter('module') // We are not interested in docs that are not in a module
|
|
|
|
.groupBy('module')
|
|
|
|
.map(function(modulePages, moduleName) {
|
|
log.debug('moduleName: ' + moduleName);
|
|
var navItems = [];
|
|
var modulePage;
|
|
|
|
_(modulePages)
|
|
|
|
.groupBy('docType')
|
|
|
|
.tap(function(docTypes) {
|
|
log.debug(moduleName, _.keys(docTypes));
|
|
// Extract the module page from the collection
|
|
modulePage = docTypes.module[0];
|
|
delete docTypes.module;
|
|
})
|
|
|
|
.tap(function(docTypes) {
|
|
if ( docTypes.input ) {
|
|
docTypes.directive = docTypes.directive || [];
|
|
// Combine input docTypes into directive docTypes
|
|
docTypes.directive = docTypes.directive.concat(docTypes.input);
|
|
delete docTypes.input;
|
|
}
|
|
})
|
|
|
|
.forEach(function(sectionPages, sectionName) {
|
|
|
|
sectionPages = _.sortBy(sectionPages, 'name');
|
|
|
|
if ( sectionPages.length > 0 ) {
|
|
// Push a navItem for this section
|
|
navItems.push({
|
|
name: sectionName,
|
|
type: 'section',
|
|
href: path.dirname(sectionPages[0].path)
|
|
});
|
|
|
|
// Push the rest of the sectionPages for this section
|
|
_.forEach(sectionPages, function(sectionPage) {
|
|
|
|
navItems.push({
|
|
name: sectionPage.name,
|
|
href: sectionPage.path,
|
|
type: sectionPage.docType
|
|
});
|
|
|
|
});
|
|
}
|
|
});
|
|
return {
|
|
name: moduleName,
|
|
href: modulePage.path,
|
|
type: 'group',
|
|
navItems: navItems
|
|
};
|
|
})
|
|
.value();
|
|
return navGroups;
|
|
},
|
|
tutorial: function(pages, area) {
|
|
return [getNavGroup(pages, area, 'step', function(page) {
|
|
return {
|
|
name: page.name,
|
|
step: page.step,
|
|
href: page.path,
|
|
type: 'tutorial'
|
|
};
|
|
})];
|
|
},
|
|
error: function(pages, area) {
|
|
return [getNavGroup(pages, area, 'path', function(page) {
|
|
return {
|
|
name: page.name,
|
|
href: page.path,
|
|
type: page.docType === 'errorNamespace' ? 'section' : 'error'
|
|
};
|
|
})];
|
|
},
|
|
pages: function(pages, area) {
|
|
return [getNavGroup(
|
|
pages,
|
|
area,
|
|
function(page) {
|
|
return page.sortOrder || page.path;
|
|
},
|
|
function(page) {
|
|
return {
|
|
name: page.name,
|
|
href: page.path,
|
|
type: 'page'
|
|
};
|
|
}
|
|
)];
|
|
}
|
|
};
|
|
|
|
return {
|
|
$runAfter: ['paths-computed', 'generateKeywordsProcessor'],
|
|
$runBefore: ['rendering-docs'],
|
|
$process: function(docs) {
|
|
|
|
// We are only interested in docs that are in an area
|
|
var pages = _.filter(docs, function(doc) {
|
|
return doc.area;
|
|
});
|
|
|
|
// We are only interested in pages that are not landing pages
|
|
var navPages = _.filter(pages, function(page) {
|
|
return page.docType != 'componentGroup';
|
|
});
|
|
|
|
// Generate an object collection of pages that is grouped by area e.g.
|
|
// - area "api"
|
|
// - group "ng"
|
|
// - section "directive"
|
|
// - ngApp
|
|
// - ngBind
|
|
// - section "global"
|
|
// - angular.element
|
|
// - angular.bootstrap
|
|
// - section "service"
|
|
// - $compile
|
|
// - group "ngRoute"
|
|
// - section "directive"
|
|
// - ngView
|
|
// - section "service"
|
|
// - $route
|
|
//
|
|
var areas = {};
|
|
_(navPages)
|
|
.groupBy('area')
|
|
.forEach(function(pages, areaId) {
|
|
var area = {
|
|
id: areaId,
|
|
name: AREA_NAMES[areaId]
|
|
};
|
|
areas[areaId] = area;
|
|
|
|
var navGroupMapper = navGroupMappers[area.id] || navGroupMappers['pages'];
|
|
area.navGroups = navGroupMapper(pages, area);
|
|
});
|
|
|
|
docs.push({
|
|
docType: 'nav-data',
|
|
id: 'nav-data',
|
|
template: 'nav-data.template.js',
|
|
outputPath: 'js/nav-data.js',
|
|
areas: areas
|
|
});
|
|
|
|
|
|
|
|
var searchData = _(pages)
|
|
.filter(function(page) {
|
|
return page.searchTerms;
|
|
})
|
|
.map(function(page) {
|
|
return _.extend({ path: page.path }, page.searchTerms);
|
|
})
|
|
.value();
|
|
|
|
docs.push({
|
|
docType: 'json-doc',
|
|
id: 'search-data-json',
|
|
template: 'json-doc.template.json',
|
|
outputPath: 'js/search-data.json',
|
|
data: searchData
|
|
});
|
|
|
|
// Extract a list of basic page information for mapping paths to partials and for client side searching
|
|
var pageData = _(docs)
|
|
.map(function(doc) {
|
|
return _.pick(doc, ['name', 'area', 'path']);
|
|
})
|
|
.indexBy('path')
|
|
.value();
|
|
|
|
docs.push({
|
|
docType: 'pages-data',
|
|
id: 'pages-data',
|
|
template: 'pages-data.template.js',
|
|
outputPath: 'js/pages-data.js',
|
|
pages: pageData
|
|
});
|
|
}
|
|
};
|
|
};
|