/** * Generate class documentation for a given class and write it to the * given output stream * * @param text.doclet.ClassDoc doc * @param io.streams.OutputStream * @return io.streams.OutputStream */ protected function writeDoc(ClassDoc $doc, OutputStream $stream) { $this->writeHeader($doc->name(), $stream); $base = str_repeat('../', substr_count($doc->qualifiedName(), '.')); // Summary $stream->write('<h4><a href="' . $base . 'index.html">Overview</a>'); $stream->write(' » <a href="summary.html">' . $doc->containingPackage()->name() . '</a></h4>'); $stream->write('<h1>' . ucfirst($doc->classType()) . ' ' . $doc->name() . '</h1>'); $stream->write('<dl>'); if ($doc->isInterface()) { $implementations = $this->classesImplementing($doc); if (!empty($implementations)) { $stream->write('<dt>All known implementing classes:</dt><dd>'); for ($i = 0, $s = sizeof($implementations); $i < $s; $i++) { $stream->write($this->typeLink($implementations[$i]->qualifiedName(), $base)); $i < $s - 1 && $stream->write(', '); } $stream->write('</dd>'); } } else { $implemented = $this->allInterfacesImplementedBy($doc); if (!empty($implemented)) { $stream->write('<dt>All implemented interfaces:</dt><dd>'); for ($i = 0, $s = sizeof($implemented); $i < $s; $i++) { $stream->write($this->typeLink($implemented[$i]->qualifiedName(), $base)); $i < $s - 1 && $stream->write(', '); } $stream->write('</dd>'); } $subclasses = $this->directSubclassesOf($doc); if (!empty($subclasses)) { $stream->write('<dt>Direct known subclasses:</dt><dd>'); for ($i = 0, $s = sizeof($subclasses); $i < $s; $i++) { $stream->write($this->typeLink($subclasses[$i]->qualifiedName(), $base)); $i < $s - 1 && $stream->write(', '); } $stream->write('</dd>'); } } $stream->write('</dl>'); $stream->write('<hr/>'); // Signature $stream->write('<code>'); $stream->write(implode(' ', array_keys($doc->getModifiers())) . ' ' . $doc->classType() . ' ' . $doc->name()); if (!$doc->isInterface()) { $doc->superclass && $stream->write(' extends ' . $this->typeLink($doc->superclass->qualifiedName(), $base)); $implemented = $this->interfacesImplementedBy($doc); if (!empty($implemented)) { $stream->write(' implements '); for ($i = 0, $s = sizeof($implemented); $i < $s; $i++) { $stream->write($this->typeLink($implemented[$i]->qualifiedName(), $base)); $i < $s - 1 && $stream->write(', '); } } } $stream->write('</code>'); $this->writeMarkup($doc->commentText(), $stream); // Class tags $stream->write('<dl>'); $this->writeTags('See also', $doc->tags('see'), $base, $stream); $this->writeTags('Verified by', $doc->tags('test'), $base, $stream); $stream->write('</dl>'); $stream->write('<hr/>'); // Field summary $stream->write('<fieldset><legend>Fields Summary</legend><ul>'); foreach ($doc->fields as $field) { $v = $field->constantValue(); $stream->write('<li><code>'); $stream->write($this->isStatic($field) ? 'static ' : ''); $stream->write($field->name() . ($v ? ' = ' . $v : '')); $stream->write('</code><p>' . $this->firstSentence($field->commentText()) . '</p></li>'); } $stream->write('</ul></fieldset>'); // Method summary $stream->write('<fieldset><legend>Method Summary</legend><ul>'); foreach ($doc->methods as $method) { $stream->write('<li><code>'); $stream->write($this->isStatic($method) ? 'static ' : ''); $this->writeSignature($method, $base, $stream); $stream->write('</code><p>' . $this->firstSentence($method->commentText()) . '</p></li>'); } $stream->write('</ul></fieldset>'); // Method details foreach ($doc->methods as $method) { $stream->write('<a name="' . $method->name() . '"><h3>' . $method->name() . '</h3></a>'); $stream->write('<code>' . implode(' ', array_keys($method->getModifiers())) . ' '); $this->writeSignature($method, $base, $stream); $stream->write('</code><div class="dfn">'); $this->writeMarkup($method->commentText(), $stream); $stream->write('<dl>'); $this->writeTags('Parameters', $method->tags('param'), $base, $stream); $this->writeTags('Returns', $method->tags('return'), $base, $stream); $this->writeTags('Throws', $method->tags('throws'), $base, $stream); $this->writeTags('See also', $method->tags('see'), $base, $stream); $stream->write('</dl>'); $stream->write('</div>'); $stream->write('<hr/>'); } $this->writeFooter($stream); return $stream; }