Up tonight, I take the advice of John Evans to rework my hard fork of the dart-sdk to use a saner command-line option in
dart-doc
. Specifically, it makes sense to include an option to enable / disable the inclusion of core Dart API documentation in the output. I do not want it in Hipster MVC, and already have any references to core types pointing to api.dartlang.org.The problem with my current solution is that it whitelists the files that I want documented and assumes that everything else is located on api.dartlang.org. It works when I can use the string "hipster" to include only libraries in my Hipster MVC package. If I wanted to add another library without the name "Hipster" embedded in it, then I would be out of luck. Besides, I am not really interested in only including certain libraries. I really want to enable / disable the inclusion of core documentation.
After much thought, I settle on a command line switch
--no-dart-api
. This seems to capture what I want and conform to the standard dartdoc
options (e.g. --node-code
). If this switch is not provided, then core documentation will be generated—just like it does in upstream. If it is provided....I set a boolean instance variable accordingly:
// ... switch (arg) { case '--no-code': includeSource = false; break; case '--no-dart-api': includeDartApi = false; break; // ... } // ...The value of
includeDartApi
is passed into the DartDoc
class. In there, I filter the list of libraries that will be documented:// ... // Sort the libraries by name (not key). _sortedLibraries = world. libraries. getValues(). filter(_includeLibrary); // ...That
_includeLibrary()
filter method can then make use of the includeDartApi
instance variable: bool _includeLibrary(Library library) {
// Exclude main.dart that might be index of library
if (library.name == 'main') return false;
if (includeDartApi) return true;
if (library.isDartApi) return false;
return true;
}
If includeDartApi
is true, then all documentation should be generated. If false, evaluation moves down to library.isDartApi
. That isDartApi
method is new to the Library
. In there, I use a Set
to describe the entire list of libraries that are considered part of the Dart API:/** Represents a Dart library. */ class Library extends Element { // ... static SetThe nice thing aboutget dartApiLibraries() => new Set.from([ 'core', 'dart:core', 'coreimpl', 'dart:coreimpl', 'dart:isolate', 'html', 'dart:html', 'io', 'json', 'uri' ]); bool get isDartApi() => Library.dartApiLibraries.contains(this.name); }
Set
is that it give me the contains()
method, which I use in isDartApi
to decide if the current library is one of the Dart API libraries.Easy-peasy and I have
dartdoc
again generating only documentation for my 6 Hispter MVC libraries:dart ~/src/dart-sdk/lib/dartdoc/dartdoc.dart \ --title='Hipster MVC Documentation' \ --description='API documentation for the very excellent MVC library...' \ main.dart Documented 6 libraries, 16 types, and 75 members.With that working fairly well, I take a little time to actually document Hipster MVC, starting with the router. The dartdoc format is markdown:
class HipsterRouter { /// The router exposes named events on which listeners can wait. For example, /// if the router has a "page" route, the event will be available on the /// 'route:page' event: /// HipsterRouter app = new MyRouter(); /// app. /// on['route:page']. /// add((num) { /// print("Routed to page: $num"); /// }); RouterEvents on; // ... }The result is some very pretty documentation on HipsterRouter. Looking that good, I may not be able to resist documenting the heck out of Hipster MVC.
Day #340
No comments:
Post a Comment