Пример #1
0
 /**
  * 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(' &#xbb; <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;
 }