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

Unified Diff: tools/dom/docs/lib/docs.dart

Issue 12035057: First half of the new HTML json docs. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Added documentation in the right places. Created 7 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
Index: tools/dom/docs/lib/docs.dart
diff --git a/tools/dom/docs/lib/docs.dart b/tools/dom/docs/lib/docs.dart
new file mode 100644
index 0000000000000000000000000000000000000000..d509d59000a90c375de1a8e87400d9c40c03e773
--- /dev/null
+++ b/tools/dom/docs/lib/docs.dart
@@ -0,0 +1,153 @@
+/**
+ * A library for extracting the documentation from the various HTML libraries
+ * ([dart:html], [dart:svg], [dart:web_audio], [dart:indexed_db]) and saving
+ * those documentation comments to a JSON file.
+ */
+
+library docs;
+
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+import '../../../../sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart';
blois 2013/01/24 02:28:24 Sorta nice to import this as 'json'.
Andrei Mouravski 2013/01/24 19:28:51 Why? There's no namespace collision, and this keep
+import '../../../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart';
+import '../../../../utils/apidoc/lib/metadata.dart';
+import 'dart:async';
+import 'dart:io';
+
+/// The various HTML libraries.
+final List<String> HTML_LIBRARY_NAMES = ['dart:html',
blois 2013/01/24 02:28:24 indentation is weird- either use 2 spaces or line
Andrei Mouravski 2013/01/24 19:28:51 Done.
+ 'dart:svg',
+ 'dart:web_audio',
+ 'dart:indexed_db'];
+/**
+ * Converts the libraries in [HTML_LIBRARY_NAMES] to a json file at [jsonPath]
+ * given the library path at [libPath].
+ *
+ * The json output looks like:
+ * {
+ * $library_name: {
+ * $interface_name: {
+ * comment: "$comment"
+ * members: {
+ * $member: "$comment",
+ * ...
+ * }
+ * },
+ * ...
+ * },
+ * ...
+ * }
+ *
+ * Returns `true` if any errors were encountered, `false` otherwise.
+ */
+bool convert(Path libPath, Path jsonPath) {
+ var anyErrors = false;
+
+ var paths = <Path>[];
+ for (var libraryName in HTML_LIBRARY_NAMES) {
+ paths.add(new Path(libraryName));
+ }
+
+ final compilation = new Compilation.library(paths, libPath, null,
+ <String>['--preserve-comments']);
blois 2013/01/24 02:28:24 Array can probably just be: ['--preserve-comments'
Andrei Mouravski 2013/01/24 19:28:51 Done.
+
+ var convertedJson = _generateJsonFromLibraries(compilation);
+
+ anyErrors = anyErrors || _exportJsonToFile(jsonPath, convertedJson);
blois 2013/01/24 02:28:24 where is anyErrors set before here? How are compil
Johnni Winther 2013/01/24 09:10:09 Currently, compilation error not reported. Shortly
Andrei Mouravski 2013/01/24 19:28:51 TODO added.
Andrei Mouravski 2013/01/24 19:28:51 TODO added.
+
+ return anyErrors;
+}
+
+bool _exportJsonToFile(Path jsonPath, Map convertedJson) {
blois 2013/01/24 02:28:24 Nit- order of params. exportJsonToFile should prob
Andrei Mouravski 2013/01/24 19:28:51 Done.
+ final jsonFile = new File.fromPath(jsonPath);
+ var writeJson = prettySerialize(convertedJson);
+
+ var outputStream = jsonFile.openOutputStream();
+ outputStream.writeString(writeJson);
+
+ return false;
+}
+
+Map _generateJsonFromLibraries(Compilation compilation) {
+ var convertedJson = {};
+
+ // Sort the libraries by name (not key).
+ var sortedLibraries = new List<LibraryMirror>.from(
+ compilation.mirrors.libraries.values.where(
+ (e) => HTML_LIBRARY_NAMES.indexOf(e.uri.toString()) >= 0))
+ ..sort((x, y) =>
+ x.uri.toString().toUpperCase().compareTo(
+ y.uri.toString().toUpperCase()));
+
+ for (LibraryMirror libMirror in sortedLibraries) {
+ print('Extracting documentation from ${libMirror.displayName}.');
+
+ var libraryJson = {};
+ var sortedClasses = _sortAndFilterMirrors(
+ libMirror.classes.values.toList());
+
+ for (ClassMirror classMirror in sortedClasses) {
+ var classJson = {};
+ var sortedMembers = _sortAndFilterMirrors(
+ classMirror.members.values.toList());
+
+ var membersJson = {};
+ for (var memberMirror in sortedMembers) {
+ var memberDomName = domNames(memberMirror)[0];
+ var memberComment = computeComment(memberMirror);
+ if (memberComment != null) {
+ membersJson.putIfAbsent(memberDomName, () => memberComment);
+ }
+ }
+
+ if (computeComment(classMirror) != null) {
Johnni Winther 2013/01/24 09:10:09 Store the comment in a variable instead of calling
Andrei Mouravski 2013/01/24 19:28:51 Done.
+ classJson.putIfAbsent('comment', () =>
+ computeComment(classMirror));
+ }
+ if (!membersJson.isEmpty) {
+ classJson.putIfAbsent('members', () =>
+ membersJson);
+ }
+
+ if (!classJson.isEmpty) {
+ libraryJson.putIfAbsent(domNames(classMirror)[0], () =>
+ classJson);
+ }
+ }
+
+ if (!libraryJson.isEmpty) {
+ convertedJson.putIfAbsent(libMirror.displayName, () =>
+ libraryJson);
+ }
+ }
+
+ return convertedJson;
+}
+
+List<DeclarationMirror> _sortAndFilterMirrors(List<DeclarationMirror> mirrors) {
+ return mirrors.where((DeclarationMirror c) =>
blois 2013/01/24 02:28:24 kudos for getting this all into one line. but was
Andrei Mouravski 2013/01/24 19:28:51 Done.
+ !domNames(c).isEmpty &&
+ !c.displayName.startsWith('_') &&
+ (findMetadata(c.metadata, 'DocsEditable') != null))
+ .toList()
+ ..sort((x, y) =>
+ domNames(x)[0].toUpperCase().compareTo(
+ domNames(y)[0].toUpperCase()));
+}
+
+/// Given the class mirror, returns the names found or an empty list.
+List<String> domNames(DeclarationMirror mirror) {
+ var domNameMetadata = findMetadata(mirror.metadata, 'DomName');
+
+ if (domNameMetadata != null) {
+ var domNames = <String>[];
+ var tags = deprecatedFutureValue(domNameMetadata.getField('name'));
+ for (var s in tags.reflectee.split(',')) {
+ domNames.add(s.trim());
+ }
+
+ if (domNames.length == 1 && domNames[0] == 'none') return <String>[];
+ return domNames;
+ } else {
+ return <String>[];
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698