blob: b3f405c9eabb1df2a7cf58264cbc31349a969258 [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/** Provides client-side behavior for generated docs. */
#library('client-live-nav');
#import('dart:html');
#import('dart:json');
#import('../../../../../lib/compiler/implementation/source_file.dart');
// TODO(rnystrom): Use "package:" URL (#4968).
#import('../../classify.dart');
#import('../../markdown.dart', prefix: 'md');
// TODO(rnystrom): Use "package:" URL (#4968).
#source('dropdown.dart');
#source('search.dart');
#source('../dartdoc/nav.dart');
#source('client-shared.dart');
main() {
setup();
// Request the navigation data so we can build the HTML for it.
new HttpRequest.get('${prefix}nav.json', (request) {
var json = JSON.parse(request.responseText);
buildNavigation(json);
setupSearch(json);
});
}
/**
* Takes [libraries], a JSON array representing a set of libraries and builds
* the appropriate navigation DOM for it relative to the current library and
* type.
*/
buildNavigation(List libraries) {
final html = new StringBuffer();
for (Map libraryInfo in libraries) {
String libraryName = libraryInfo[NAME];
html.add('<h2><div class="icon-library"></div>');
if (currentLibrary == libraryName && currentType == null) {
html.add('<strong>${md.escapeHtml(libraryName)}</strong>');
} else {
final url = getLibraryUrl(libraryName);
html.add('<a href="$url">${md.escapeHtml(libraryName)}</a>');
}
html.add('</h2>');
// Only list the types for the current library.
if (currentLibrary == libraryName && libraryInfo.containsKey(TYPES)) {
buildLibraryNavigation(html, libraryInfo);
}
}
// Insert it into the DOM.
final navElement = document.query('.nav');
navElement.innerHTML = html.toString();
}
/** Writes the navigation for the types contained by [library] to [html]. */
buildLibraryNavigation(StringBuffer html, Map libraryInfo) {
// Show the exception types separately.
final types = [];
final exceptions = [];
for (Map typeInfo in libraryInfo[TYPES]) {
if (typeInfo[NAME].endsWith('Exception')) {
exceptions.add(typeInfo);
} else {
types.add(typeInfo);
}
}
if (types.length == 0 && exceptions.length == 0) return;
writeType(String icon, Map typeInfo) {
html.add('<li>');
if (currentType == typeInfo[NAME]) {
html.add(
'<div class="icon-$icon"></div><strong>${getTypeName(typeInfo)}</strong>');
} else {
html.add(
'''
<a href="${getTypeUrl(currentLibrary, typeInfo)}">
<div class="icon-$icon"></div>${getTypeName(typeInfo)}
</a>
''');
}
html.add('</li>');
}
html.add('<ul class="icon">');
types.forEach((typeInfo) =>
writeType(kindToString(typeInfo[KIND]), typeInfo));
exceptions.forEach((typeInfo) => writeType('exception', typeInfo));
html.add('</ul>');
}