| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | /*=========================================================================  Program:   CMake - Cross-Platform Makefile Generator  Module:    $RCSfile$  Language:  C++  Date:      $Date$  Version:   $Revision$  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.     This software is distributed WITHOUT ANY WARRANTY; without even      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      PURPOSE.  See the above copyright notices for more information.=========================================================================*/#include "cmDocumentationFormatterHTML.h"//----------------------------------------------------------------------------static bool cmDocumentationIsHyperlinkChar(char c){  // This is not a complete list but works for CMake documentation.  return ((c >= 'A' && c <= 'Z') ||          (c >= 'a' && c <= 'z') ||          (c >= '0' && c <= '9') ||          c == '-' || c == '.' || c == '/' || c == '~' || c == '@' ||          c == ':' || c == '_' || c == '&' || c == '?' || c == '=');}//----------------------------------------------------------------------------static void cmDocumentationPrintHTMLChar(std::ostream& os, char c){  // Use an escape sequence if necessary.  static cmDocumentationEntry escapes[] =  {    {"<", "<", 0},    {">", ">", 0},    {"&", "&", 0},    {"\n", "<br>", 0},    {0,0,0}  };  for(const cmDocumentationEntry* op = escapes; op->name; ++op)    {    if(op->name[0] == c)      {      os << op->brief;      return;      }    }  // No escape sequence is needed.  os << c;}//----------------------------------------------------------------------------const char* cmDocumentationPrintHTMLLink(std::ostream& os, const char* begin){  // Look for the end of the link.  const char* end = begin;  while(cmDocumentationIsHyperlinkChar(*end))    {    ++end;    }  // Print the hyperlink itself.  os << "<a href=\"";  for(const char* c = begin; c != end; ++c)    {    cmDocumentationPrintHTMLChar(os, *c);    }  os << "\">";  // The name of the hyperlink is the text itself.  for(const char* c = begin; c != end; ++c)    {    cmDocumentationPrintHTMLChar(os, *c);    }  os << "</a>";  // Return the position at which to continue scanning the input  // string.  return end;}cmDocumentationFormatterHTML::cmDocumentationFormatterHTML():cmDocumentationFormatter(){}void cmDocumentationFormatterHTML::PrintSection(std::ostream& os,                                           const cmDocumentationEntry* section,                                           const char* name){  if(name)    {    os << "<h2>" << name << "</h2>\n";    }  if(!section) { return; }  for(const cmDocumentationEntry* op = section; op->brief;)    {    if(op->name)      {      os << "<ul>\n";      for(;op->name;++op)        {        os << "  <li>\n";        if(op->name[0])          {          os << "    <b><code>";          this->PrintHTMLEscapes(os, op->name);          os << "</code></b>: ";          }        this->PrintHTMLEscapes(os, op->brief);        if(op->full)          {          os << "<br>\n    ";          this->PrintFormatted(os, op->full);          }        os << "\n";        os << "  </li>\n";        }      os << "</ul>\n";      }    else      {      this->PrintFormatted(os, op->brief);      os << "\n";      ++op;      }    }}void cmDocumentationFormatterHTML::PrintPreformatted(std::ostream& os,                                                      const char* text){  os << "<pre>";  this->PrintHTMLEscapes(os, text);  os << "</pre>\n    ";}void cmDocumentationFormatterHTML::PrintParagraph(std::ostream& os,                                                   const char* text){  os << "<p>";  this->PrintHTMLEscapes(os, text);}//----------------------------------------------------------------------------void cmDocumentationFormatterHTML::PrintHeader(const char* /*name*/,                                                std::ostream& os){  os << "<html><body>\n";}//----------------------------------------------------------------------------void cmDocumentationFormatterHTML::PrintFooter(std::ostream& os){  os << "</body></html>\n";}//----------------------------------------------------------------------------void cmDocumentationFormatterHTML::PrintHTMLEscapes(std::ostream& os,                                                     const char* text){  // Hyperlink prefixes.  static const char* hyperlinks[] = {"http://", "ftp://", "mailto:", 0};  // Print each character.  for(const char* p = text; *p;)    {    // Handle hyperlinks specially to make them active.    bool found_hyperlink = false;    for(const char** h = hyperlinks; !found_hyperlink && *h; ++h)      {      if(strncmp(p, *h, strlen(*h)) == 0)        {        p = cmDocumentationPrintHTMLLink(os, p);        found_hyperlink = true;        }      }    // Print other characters normally.    if(!found_hyperlink)      {      cmDocumentationPrintHTMLChar(os, *p++);      }    }}
 |