| Index: utils/apidoc/mdn/postProcess.dart
|
| diff --git a/utils/apidoc/mdn/postProcess.dart b/utils/apidoc/mdn/postProcess.dart
|
| index feab977a78564c318115145c00876eb1e5793d14..687d00ca2071c35bd38cc9ede958a927ec35506e 100644
|
| --- a/utils/apidoc/mdn/postProcess.dart
|
| +++ b/utils/apidoc/mdn/postProcess.dart
|
| @@ -1,81 +1,94 @@
|
| -#library("dump");
|
| +#library("postProcess");
|
|
|
| #import("../../../frog/lib/node/node.dart");
|
| #import("dart:json");
|
|
|
| -Map database;
|
| -Map allProps;
|
| -Set matchedTypes;
|
| +// TODO(jacobr): this file conflates pretty printing of the JSON database with
|
| +// filtering the database to select the best matches per file.
|
| +// Separate out the two tasks as quick and dirty coding is correct for pretty
|
| +// printing but more carefully documented code is required for the code
|
| +// filtering the database.
|
| +Map<String, List> database;
|
| +Map<String, Map> allProps;
|
| +Set<String> matchedTypes;
|
|
|
| String orEmpty(String str) {
|
| return str == null ? "" : str;
|
| }
|
|
|
| -/** Returns whether the type has any property matching the specified name. */
|
| +/** Returns whether the type has any member matching the specified name. */
|
| bool hasAny(String type, String prop) {
|
| - Map data = allProps[type];
|
| + final data = allProps[type];
|
| return data['properties'].containsKey(prop) ||
|
| data['methods'].containsKey(prop) ||
|
| data['constants'].containsKey(prop);
|
| }
|
|
|
| List<String> sortStringCollection(Collection<String> collection) {
|
| - List<String> out = new List<String>();
|
| + final out = <String>[];
|
| out.addAll(collection);
|
| out.sort((String a, String b) => a.compareTo(b));
|
| return out;
|
| }
|
|
|
| -/** Switch from a List of members to a Map of members. */
|
| +/**
|
| + * Return the members from an [entry] as Map of member names to member
|
| + * objects.
|
| + */
|
| Map getMembersMap(Map entry) {
|
| - List rawMembers = entry["members"];
|
| - Map members = new Map<String, Object>();
|
| - for (Map entry in rawMembers) {
|
| + List<Map> rawMembers = entry["members"];
|
| + final members = {};
|
| + for (final entry in rawMembers) {
|
| members[entry['name']] = entry;
|
| }
|
| return members;
|
| }
|
|
|
| -/**
|
| - * Add all missing members to the string output and return the number of
|
| - * missing members.
|
| - */
|
| -int addMissingHelper(StringBuffer sb, String type, Map members,
|
| - String propType) {
|
| +int addMissing(StringBuffer sb, String type, Map members) {
|
| int total = 0;
|
| - Map expected = allProps[type][propType];
|
| - if (expected == null) return total;
|
| - for(String name in sortStringCollection(expected.getKeys())) {
|
| - if (!members.containsKey(name)) {
|
| - total++;
|
| - sb.add("""
|
| - <tr class="missing">
|
| - <td>$name</td>
|
| - <td></td>
|
| - <td>Could not find documentation for $propType</td>
|
| - </tr>
|
| -""");
|
| + /**
|
| + * Add all missing members to the string output and return the number of
|
| + * missing members.
|
| + */
|
| + void addMissingHelper(String propType) {
|
| + Map expected = allProps[type][propType];
|
| + if (expected != null) {
|
| + for(final name in sortStringCollection(expected.getKeys())) {
|
| + if (!members.containsKey(name)) {
|
| + total++;
|
| + sb.add("""
|
| + <tr class="missing">
|
| + <td>$name</td>
|
| + <td></td>
|
| + <td>Could not find documentation for $propType</td>
|
| + </tr>
|
| + """);
|
| + }
|
| + }
|
| }
|
| }
|
| - return total;
|
| -}
|
|
|
| -int addMissing(StringBuffer sb, String type, Map members) {
|
| - int total = 0;
|
| - total += addMissingHelper(sb, type, members, 'properties');
|
| - total += addMissingHelper(sb, type, members, 'methods');
|
| - total += addMissingHelper(sb, type, members, 'constants');
|
| + addMissingHelper('properties');
|
| + addMissingHelper('methods');
|
| + addMissingHelper('constants');
|
| return total;
|
| }
|
|
|
| /**
|
| - * Score an entry using heuristics to determine how well a entry
|
| - * matches the expected list of matching members.
|
| - * We could be much less naive and penalize spurious methods, prefer entries
|
| - * with class level comments, etc.
|
| + * Score entries using similarity heuristics calculated from the observed and
|
| + * expected list of members. We could be much less naive and penalize spurious
|
| + * methods, prefer entries with class level comments, etc. This method is
|
| + * needed becase we extract entries for each of the top search results for
|
| + * each class name and rely on these scores to determine which entry was
|
| + * best. Typically all scores but one will be zero. Multiple pages have
|
| + * non-zero scores when MDN has multiple pages on the same class or pages on
|
| + * similar classes (e.g. HTMLElement and Element), or pages on Mozilla
|
| + * specific classes that are similar to DOM classes (Console).
|
| */
|
| num scoreEntry(Map entry, String type) {
|
| num score = 0;
|
| + // TODO(jacobr): consider removing skipped entries completely instead of
|
| + // just giving them lower scores.
|
| if (!entry.containsKey('skipped')) {
|
| score++;
|
| }
|
| @@ -99,13 +112,13 @@ Map pickBestEntry(List entries, String type) {
|
| Map bestEntry;
|
| for (Map entry in entries) {
|
| if (entry != null) {
|
| - num score = scoreEntry(entry, type);
|
| - if (score > bestScore) {
|
| - bestScore = score;
|
| - bestEntry = entry;
|
| + num score = scoreEntry(entry, type);
|
| + if (score > bestScore) {
|
| + bestScore = score;
|
| + bestEntry = entry;
|
| + }
|
| }
|
| }
|
| - }
|
| return bestEntry;
|
| }
|
|
|
| @@ -130,6 +143,8 @@ void main() {
|
| // Main documentation file.
|
| final sb = new StringBuffer();
|
|
|
| + // TODO(jacobr): switch to using a real template system instead of string
|
| + // interpolation combined with StringBuffers.
|
| sb.add("""
|
| <html>
|
| <head>
|
| @@ -137,7 +152,8 @@ void main() {
|
| body {
|
| background-color: #eee;
|
| margin: 10px;
|
| - font: 14px/1.428 "Lucida Grande", "Lucida Sans Unicode", Lucida, Arial, Helvetica, sans-serif;
|
| + font: 14px/1.428 "Lucida Grande", "Lucida Sans Unicode", Lucida,
|
| + Arial, Helvetica, sans-serif;
|
| }
|
|
|
| .debug {
|
| @@ -220,8 +236,14 @@ void main() {
|
| <li id="$type">
|
| <a target="_blank" href="http://www.google.com/cse?cx=017193972565947830266%3Awpqsk6dy6ee&ie=UTF-8&q=$type">
|
| $type
|
| - </a> -- Title: ${entry == null ? "???" : entry["title"]} -- Issue: ${entry == null ? "???" : entry['cause']}
|
| - -- <a target="_blank" href="${entry == null ? "???" : entry["srcUrl"]}">scraped url</a>
|
| + </a>
|
| + --
|
| + Title: ${entry == null ? "???" : entry["title"]} -- Issue:
|
| + ${entry == null ? "???" : entry['cause']}
|
| + --
|
| + <a target="_blank" href="${entry == null ? "???" : entry["srcUrl"]}">
|
| + scraped url
|
| + </a>
|
| </li>""");
|
| continue;
|
| }
|
| @@ -231,8 +253,8 @@ void main() {
|
| StringBuffer sbMembers = new StringBuffer();
|
| StringBuffer sbExamples = new StringBuffer();
|
| if (entry.containsKey("members")) {
|
| - Map members = getMembersMap(entry);
|
| - sbMembers.add("""
|
| + Map members = getMembersMap(entry);
|
| + sbMembers.add("""
|
| <div class="members">
|
| <h3><span class="debug">[dart]</span> Members</h3>
|
| <table>
|
| @@ -254,15 +276,15 @@ void main() {
|
|
|
| final sbMember = new StringBuffer();
|
|
|
| - if (memberData.containsKey('url')) {
|
| - sbMember.add("""
|
| + if (memberData.containsKey('url')) {
|
| + sbMember.add("""
|
| <td><a href="${memberData['url']}">$name</a></td>
|
| """);
|
| - } else {
|
| - sbMember.add("""
|
| + } else {
|
| + sbMember.add("""
|
| <td>$name</td>
|
| """);
|
| - }
|
| + }
|
| sbMember.add("""
|
| <td>${memberData['help']}</td>
|
| <td>
|
| @@ -285,14 +307,16 @@ void main() {
|
| """);
|
| }
|
| for (String sectionName in
|
| - ["summary", "constructor", "compatibility", "specification", "seeAlso"])
|
| - if (entry.containsKey(sectionName)) {
|
| - sbSections.add("""
|
| + ["summary", "constructor", "compatibility", "specification",
|
| + "seeAlso"]) {
|
| + if (entry.containsKey(sectionName)) {
|
| + sbSections.add("""
|
| <div class="$sectionName">
|
| <h3><span class="debug">[Dart]</span> $sectionName</h3>
|
| ${entry[sectionName]}
|
| </div>
|
| """);
|
| + }
|
| }
|
| if (entry.containsKey("links")) {
|
| sbSections.add("""
|
| @@ -305,12 +329,12 @@ void main() {
|
| sbSections.add("""
|
| <li><a href="${link['href']}">${link['title']}</a></li>
|
| """);
|
| - }
|
| + }
|
| sbSections.add("""
|
| </ul>
|
| </div>
|
| """);
|
| - }
|
| + }
|
| if (entry.containsKey("examples")) {
|
| for (String example in entry["examples"]) {
|
| sbExamples.add("""
|
| @@ -324,9 +348,9 @@ void main() {
|
|
|
| String title = entry['title'];
|
| if (title != type) {
|
| - title = '<h4>Dart type: $type</h4><h2>${title}</h2>';
|
| + title = '<h4>Dart type: $type</h4><h2>$title</h2>';
|
| } else {
|
| - title = '<h2>${title}</h2>';
|
| + title = '<h2>$title</h2>';
|
| }
|
| sb.add("""
|
| <div class='type' id="$type">
|
| @@ -340,7 +364,7 @@ $sbMembers
|
| sbAllExamples.add("""
|
| <div class='type' id="$type">
|
| <a href='${entry['srcUrl']}'>$title</a>
|
| - ${sbExamples.toString()}
|
| + $sbExamples
|
| </div>
|
| """);
|
| }
|
| @@ -363,11 +387,22 @@ $sbMembers
|
| sb.add("""
|
| <div id="#dart_summary">
|
| <h2>Summary</h2>
|
| - <h3>Generated docs for ${numGen} classes out of a possible ${allProps.getKeys().length}</h3>
|
| + <h3>
|
| + Generated docs for $numGen classes out of a possible
|
| + ${allProps.getKeys().length}
|
| + </h3>
|
| <h3>Found documentation for $numFoundMethods methods listed in WebKit</h3>
|
| - <h3>Found documentation for $numExtraMethods methods not listed in WebKit</h3>
|
| - <h3>Unable to find documentation for $numMissingMethods methods not present in WebKit</h3>
|
| - <h3>Skipped generating documentation for $numSkipped classes due to no plausible matching files</h3>
|
| + <h3>
|
| + Found documentation for $numExtraMethods methods not listed in WebKit
|
| + </h3>
|
| + <h3>
|
| + Unable to find documentation for $numMissingMethods methods present in
|
| + WebKit
|
| + </h3>
|
| + <h3>
|
| + Skipped generating documentation for $numSkipped classes due to no
|
| + plausible matching files
|
| + </h3>
|
| <ul>
|
| $sbSkipped
|
| </ul>
|
| @@ -387,7 +422,8 @@ $sbSkipped
|
| body {
|
| background-color: #eee;
|
| margin: 10px;
|
| - font: 14px/1.428 "Lucida Grande", "Lucida Sans Unicode", Lucida, Arial, Helvetica, sans-serif;
|
| + font: 14px/1.428 "Lucida Grande", "Lucida Sans Unicode", Lucida, Arial,
|
| + Helvetica, sans-serif;
|
| }
|
|
|
| .debug {
|
| @@ -428,7 +464,8 @@ $sbAllExamples
|
| body {
|
| background-color: #eee;
|
| margin: 10px;
|
| - font: 14px/1.428 "Lucida Grande", "Lucida Sans Unicode", Lucida, Arial, Helvetica, sans-serif;
|
| + font: 14px/1.428 "Lucida Grande", "Lucida Sans Unicode", Lucida,
|
| + Arial, Helvetica, sans-serif;
|
| }
|
|
|
| .debug {
|
| @@ -451,11 +488,15 @@ $sbAllExamples
|
| </head>
|
| <body>
|
| <h1>Methods marked as obsolete</h1>
|
| - <table>
|
| - <tbody>
|
| - <tr>
|
| - <th>Type</th><th>Name</th><th>Description</th><th>IDL</th><th>Status</th>
|
| - </tr>
|
| + <table>
|
| + <tbody>
|
| + <tr>
|
| + <th>Type</th>
|
| + <th>Name</th>
|
| + <th>Description</th>
|
| + <th>IDL</th>
|
| + <th>Status</th>
|
| + </tr>
|
| $sbObsolete
|
| </tbody>
|
| </table>
|
| @@ -463,5 +504,6 @@ $sbObsolete
|
| </html>
|
| """);
|
|
|
| - fs.writeFileSync("output/database.filtered.json", JSON.stringify(filteredDb));
|
| + fs.writeFileSync("output/database.filtered.json",
|
| + JSON.stringify(filteredDb));
|
| }
|
|
|