Regen all docs. (#700)

* Stop recursing if discovery == {}

* Generate docs with 'make docs'.
diff --git a/docs/dyn/commentanalyzer_v1alpha1.comments.html b/docs/dyn/commentanalyzer_v1alpha1.comments.html
new file mode 100644
index 0000000..4093e26
--- /dev/null
+++ b/docs/dyn/commentanalyzer_v1alpha1.comments.html
@@ -0,0 +1,347 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="commentanalyzer_v1alpha1.html">Perspective Comment Analyzer API</a> . <a href="commentanalyzer_v1alpha1.comments.html">comments</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="#analyze">analyze(body, x__xgafv=None)</a></code></p>
+<p class="firstline">Analyzes the provided text and returns scores for requested attributes.</p>
+<p class="toc_element">
+  <code><a href="#suggestscore">suggestscore(body, x__xgafv=None)</a></code></p>
+<p class="firstline">Suggest comment scores as training data.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="analyze">analyze(body, x__xgafv=None)</code>
+  <pre>Analyzes the provided text and returns scores for requested attributes.
+
+Args:
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # The comment analysis request message.
+    "comment": { # Represents a body of text. # The comment to analyze.
+      "text": "A String", # UTF-8 encoded text.
+      "type": "A String", # Type of the text field.
+    },
+    "doNotStore": True or False, # Do not store the comment or context sent in this request. By default, the
+        # service may store comments/context for debugging purposes.
+    "languages": [ # The language(s) of the comment and context (if none are specified, the
+        # language is automatically detected). If multiple languages are specified,
+        # the text is checked in all of them that are supported. Both ISO and BCP-47
+        # language codes are accepted.
+        # Current Language Restrictions:
+        #  * Only English text ("en") is supported.
+        # If none of the languages specified by the caller are supported, an
+        # `UNIMPLEMENTED` error is returned.
+      "A String",
+    ],
+    "sessionId": "A String", # Session ID. Used to join related RPCs into a single session. For example,
+        # an interactive tool that calls both the AnalyzeComment and
+        # SuggestCommentScore RPCs should set all invocations of both RPCs to the
+        # same Session ID, typically a random 64-bit integer.
+    "context": { # Context is typically something that a Comment is referencing or replying to # The context of the comment.
+        # (such as an article, or previous comment).
+        # Note: Populate only ONE OF the following fields. The oneof syntax cannot be
+        # used because that would require nesting entries inside another message and
+        # breaking backwards compatibility. The server will return an error if more
+        # than one of the following fields is present.
+      "articleAndParentComment": { # A type of context specific to a comment left on a single-threaded comment # Information about the source for which the original comment was made, and
+          # any parent comment info.
+          # message board, where comments are either a top level comment or the child of
+          # a top level comment.
+        "article": { # Represents a body of text. # The source content about which the comment was made (article text, article
+            # summary, video transcript, etc).
+          "text": "A String", # UTF-8 encoded text.
+          "type": "A String", # Type of the text field.
+        },
+        "parentComment": { # Represents a body of text. # Refers to text that is a direct parent of the source comment, such as in a
+            # one-deep threaded message board. This field will only be present for
+            # comments that are replies to other comments and will not be populated for
+            # direct comments on the article_text.
+          "text": "A String", # UTF-8 encoded text.
+          "type": "A String", # Type of the text field.
+        },
+      },
+      "entries": [ # A list of messages. For example, a linear comments section or forum thread.
+        { # Represents a body of text.
+          "text": "A String", # UTF-8 encoded text.
+          "type": "A String", # Type of the text field.
+        },
+      ],
+    },
+    "clientToken": "A String", # Opaque token that is echoed from the request to the response.
+    "requestedAttributes": { # Specification of requested attributes. The AttributeParameters serve as
+        # configuration for each associated attribute. The map keys are attribute
+        # names. The following attributes are available:
+        # "ATTACK_ON_AUTHOR" - Attack on author of original article or post.
+        # "ATTACK_ON_COMMENTER" - Attack on fellow commenter.
+        # "ATTACK_ON_PUBLISHER" - Attack on publisher of article/post.
+        # "INCOHERENT" - Difficult to understand, nonsensical.
+        # "INFLAMMATORY" - Intending to provoke or inflame.
+        # "OBSCENE" - Obscene, such as cursing.
+        # "OFF_TOPIC" - Not related to the original topic.
+        # "SPAM" - Commercial/advertising spam content.
+        # "UNSUBSTANTIAL" - Trivial.
+      "a_key": { # Configurable parameters for attribute scoring.
+        "scoreThreshold": 3.14, # Don't return scores for this attribute that are below this threshold. If
+            # unset, a default threshold will be applied. A FloatValue wrapper is used to
+            # distinguish between 0 vs. default/unset.
+        "scoreType": "A String", # What type of scores to return. If unset, defaults to probability scores.
+      },
+    },
+    "spanAnnotations": True or False, # An advisory parameter that will return span annotations if the model
+        # is capable of providing scores with sub-comment resolution. This will
+        # likely increase the size of the returned message.
+    "communityId": "A String", # Optional identifier associating this AnalyzeCommentRequest with a
+        # particular client's community. Different communities may have different
+        # norms and rules. Specifying this value enables us to explore building
+        # community-specific models for clients.
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The comment analysis response message.
+    "languages": [ # The language(s) used by CommentAnalyzer service to choose which Model to
+        # use when analyzing the comment. Might better be called
+        # "effective_languages". The logic used to make the choice is as follows:
+        #   if Request.languages.empty()
+        #     effective_languages = detected_languages
+        #   else
+        #     effective_languages = Request.languages
+      "A String",
+    ],
+    "detectedLanguages": [ # Contains the languages detected from the text content, sorted in order of
+        # likelihood.
+      "A String",
+    ],
+    "attributeScores": { # Scores for the requested attributes. The map keys are attribute names (same
+        # as the requested_attribute field in AnalyzeCommentRequest, for example
+        # "ATTACK_ON_AUTHOR", "INFLAMMATORY", etc).
+      "a_key": { # This holds score values for a single attribute. It contains both per-span
+          # scores as well as an overall summary score..
+        "summaryScore": { # Analysis scores are described by a value and a ScoreType. # Overall score for comment as a whole.
+          "type": "A String", # The type of the above value.
+          "value": 3.14, # Score value. Semantics described by type below.
+        },
+        "spanScores": [ # Per-span scores.
+          { # This is a single score for a given span of text.
+            "begin": 42, # "begin" and "end" describe the span of the original text that the attribute
+                # score applies to. The values are the UTF-16 codepoint range. "end" is
+                # exclusive. For example, with the text "Hi there", the begin/end pair (0,2)
+                # describes the text "Hi".
+                #
+                # If "begin" and "end" are unset, the score applies to the full text.
+            "score": { # Analysis scores are described by a value and a ScoreType. # The score value.
+              "type": "A String", # The type of the above value.
+              "value": 3.14, # Score value. Semantics described by type below.
+            },
+            "end": 42,
+          },
+        ],
+      },
+    },
+    "clientToken": "A String", # Same token from the original AnalyzeCommentRequest.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="suggestscore">suggestscore(body, x__xgafv=None)</code>
+  <pre>Suggest comment scores as training data.
+
+Args:
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # The comment score suggestion request message.
+    "comment": { # Represents a body of text. # The comment being scored.
+      "text": "A String", # UTF-8 encoded text.
+      "type": "A String", # Type of the text field.
+    },
+    "languages": [ # The language(s) of the comment and context (if none are specified, the
+        # language is automatically detected). If multiple languages are specified,
+        # the text is checked in all of them that are supported. Both ISO and BCP-47
+        # language codes are accepted.
+        # Current Language Restrictions:
+        #  * Only English text ("en") is supported.
+        # If none of the languages specified by the caller are supported, an
+        # `UNIMPLEMENTED` error is returned.
+      "A String",
+    ],
+    "sessionId": "A String", # Session ID. Used to join related RPCs into a single session. For example,
+        # an interactive tool that calls both the AnalyzeComment and
+        # SuggestCommentScore RPCs should set all invocations of both RPCs to the
+        # same Session ID, typically a random 64-bit integer.
+    "context": { # Context is typically something that a Comment is referencing or replying to # The context of the comment.
+        # (such as an article, or previous comment).
+        # Note: Populate only ONE OF the following fields. The oneof syntax cannot be
+        # used because that would require nesting entries inside another message and
+        # breaking backwards compatibility. The server will return an error if more
+        # than one of the following fields is present.
+      "articleAndParentComment": { # A type of context specific to a comment left on a single-threaded comment # Information about the source for which the original comment was made, and
+          # any parent comment info.
+          # message board, where comments are either a top level comment or the child of
+          # a top level comment.
+        "article": { # Represents a body of text. # The source content about which the comment was made (article text, article
+            # summary, video transcript, etc).
+          "text": "A String", # UTF-8 encoded text.
+          "type": "A String", # Type of the text field.
+        },
+        "parentComment": { # Represents a body of text. # Refers to text that is a direct parent of the source comment, such as in a
+            # one-deep threaded message board. This field will only be present for
+            # comments that are replies to other comments and will not be populated for
+            # direct comments on the article_text.
+          "text": "A String", # UTF-8 encoded text.
+          "type": "A String", # Type of the text field.
+        },
+      },
+      "entries": [ # A list of messages. For example, a linear comments section or forum thread.
+        { # Represents a body of text.
+          "text": "A String", # UTF-8 encoded text.
+          "type": "A String", # Type of the text field.
+        },
+      ],
+    },
+    "clientToken": "A String", # Opaque token that is echoed from the request to the response.
+    "communityId": "A String", # Optional identifier associating this comment score suggestion with a
+        # particular sub-community. Different communities may have different norms
+        # and rules. Specifying this value enables training community-specific
+        # models.
+    "attributeScores": { # Attribute scores for the comment. The map keys are attribute names, same as
+        # the requested_attribute field in AnalyzeCommentRequest (for example
+        # "ATTACK_ON_AUTHOR", "INFLAMMATORY", etc.). This field has the same type as
+        # the `attribute_scores` field in AnalyzeCommentResponse.
+        # 
+        # To specify an overall attribute score for the entire comment as a whole,
+        # use the `summary_score` field of the mapped AttributeScores object. To
+        # specify scores on specific subparts of the comment, use the `span_scores`
+        # field. All SpanScore objects must have begin and end fields set.
+        # 
+        # All Score objects must be explicitly set (for binary classification, use
+        # the score values 0 and 1). If Score objects don't include a ScoreType,
+        # `PROBABILITY` is assumed.
+        # 
+        # `attribute_scores` must not be empty. The mapped AttributeScores objects
+        # also must not be empty. An `INVALID_ARGUMENT` error is returned for all
+        # malformed requests.
+      "a_key": { # This holds score values for a single attribute. It contains both per-span
+          # scores as well as an overall summary score..
+        "summaryScore": { # Analysis scores are described by a value and a ScoreType. # Overall score for comment as a whole.
+          "type": "A String", # The type of the above value.
+          "value": 3.14, # Score value. Semantics described by type below.
+        },
+        "spanScores": [ # Per-span scores.
+          { # This is a single score for a given span of text.
+            "begin": 42, # "begin" and "end" describe the span of the original text that the attribute
+                # score applies to. The values are the UTF-16 codepoint range. "end" is
+                # exclusive. For example, with the text "Hi there", the begin/end pair (0,2)
+                # describes the text "Hi".
+                #
+                # If "begin" and "end" are unset, the score applies to the full text.
+            "score": { # Analysis scores are described by a value and a ScoreType. # The score value.
+              "type": "A String", # The type of the above value.
+              "value": 3.14, # Score value. Semantics described by type below.
+            },
+            "end": 42,
+          },
+        ],
+      },
+    },
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The comment score suggestion response message.
+    "requestedLanguages": [ # The list of languages provided in the request.
+      "A String",
+    ],
+    "detectedLanguages": [ # The list of languages detected from the comment text.
+      "A String",
+    ],
+    "clientToken": "A String", # Same token from the original SuggestCommentScoreRequest.
+  }</pre>
+</div>
+
+</body></html>
\ No newline at end of file