Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(891)

Unified Diff: utils/dartdoc/client-live-nav.dart

Issue 9256002: Add a mode to dartdoc to generate the navigation on the client. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Respond to review. Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « utils/dartdoc/classify.dart ('k') | utils/dartdoc/client-shared.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: utils/dartdoc/client-live-nav.dart
diff --git a/utils/dartdoc/client-live-nav.dart b/utils/dartdoc/client-live-nav.dart
new file mode 100644
index 0000000000000000000000000000000000000000..06592bcda115bb3f8129d519c210e1c7e397aa23
--- /dev/null
+++ b/utils/dartdoc/client-live-nav.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2011, 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('../../frog/lang.dart', prefix: 'frog');
+#import('classify.dart');
+#import('markdown.dart', prefix: 'md');
+
+#source('client-shared.dart');
+
+// The names of the library and type that this page documents.
+String currentLibrary = null;
+String currentType = null;
+
+// What we need to prefix relative URLs with to get them to work.
+String prefix = '';
+
+main() {
+ window.on.contentLoaded.add((e) {
+ // Figure out where we are.
+ final body = document.query('body');
+ currentLibrary = body.dataAttributes['library'];
+ currentType = body.dataAttributes['type'];
+ prefix = (currentType != null) ? '../' : '';
+
+ enableCodeBlocks();
+
+ // Request the navigation data so we can build the HTML for it.
+ new XMLHttpRequest.getTEMPNAME('${prefix}nav.json', (request) {
+ buildNavigation(JSON.parse(request.responseText));
+ });
+ });
+}
+
+/** Turns [name] into something that's safe to use as a file name. */
+String sanitize(String name) => name.replaceAll(':', '_').replaceAll('/', '_');
+
+/**
+ * Takes [libraries], a JSON object representing a set of libraries and builds
+ * the appropriate navigation DOM for it relative to the current library and
+ * type.
+ */
+buildNavigation(libraries) {
+ final libraryNames = libraries.getKeys();
+ libraryNames.sort((a, b) => a.compareTo(b));
+
+ final html = new StringBuffer();
+ for (final libraryName in libraryNames) {
+ final saneLibrary = sanitize(libraryName);
+ html.add('<h2><div class="icon-library"></div>');
+ if (currentLibrary == libraryName && currentType == null) {
+ html.add('<strong>$saneLibrary</strong>');
+ } else {
+ final url = '$prefix$saneLibrary.html';
+ html.add('<a href="$url">$saneLibrary</a>');
+ }
+ html.add('</h2>');
+
+ // Only list the types for the current library.
+ if (currentLibrary == libraryName) {
+ buildLibraryNavigation(html, libraries[libraryName]);
+ }
+ }
+
+ // 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, library) {
+ // Show the exception types separately.
+ final types = [];
+ final exceptions = [];
+
+ for (final type in library) {
+ if (type['name'].endsWith('Exception')) {
+ exceptions.add(type);
+ } else {
+ types.add(type);
+ }
+ }
+
+ if (types.length == 0 && exceptions.length == 0) return;
+
+ writeType(String icon, type) {
+ html.add('<li>');
+ if (currentType == type['name']) {
+ html.add(
+ '<div class="icon-$icon"></div><strong>${type["name"]}</strong>');
+ } else {
+ html.add(
+ '''
+ <a href="$prefix${type["url"]}">
+ <div class="icon-$icon"></div>${type["name"]}
+ </a>
+ ''');
+ }
+ html.add('</li>');
+ }
+
+ html.add('<ul>');
+ types.forEach((type) => writeType(type['kind'], type));
+ exceptions.forEach((type) => writeType('exception', type));
+ html.add('</ul>');
+}
« no previous file with comments | « utils/dartdoc/classify.dart ('k') | utils/dartdoc/client-shared.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698