logo

abstract class

docCompiler::HtmlGenerator

sys::Obj
  fandoc::HtmlDocWriter
    docCompiler::HtmlGenerator
   1  //
   2  // Copyright (c) 2007, Brian Frank and Andy Frank
   3  // Licensed under the Academic Free License version 3.0
   4  //
   5  // History:
   6  //   5 May 07  Brian Frank  Creation
   7  //
   8  
   9  using compiler
  10  using fandoc
  11  
  12  **
  13  ** HtmlGenerator is the base class for HTML generation which
  14  ** handles all the navigation and URI concerns
  15  **
  16  abstract class HtmlGenerator : HtmlDocWriter
  17  {
  18  
  19  //////////////////////////////////////////////////////////////////////////
  20  // Constructor
  21  //////////////////////////////////////////////////////////////////////////
  22  
  23    new make(DocCompiler compiler, Location loc, OutStream out)
  24      : super(out)
  25    {
  26      this.compiler = compiler
  27      this.loc = loc
  28    }
  29  
  30  //////////////////////////////////////////////////////////////////////////
  31  // Generator
  32  //////////////////////////////////////////////////////////////////////////
  33  
  34    Void generate()
  35    {
  36      out.print("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n")
  37      out.print(" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n")
  38      out.print("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n")
  39      out.print("<head>\n")
  40      out.print("  <title>$title</title>\n")
  41      out.print("  <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>\n")
  42      out.print("  <link rel='stylesheet' type='text/css' href='${pathToRoot}doc.css'/>\n")
  43      out.print("  <script type='text/javascript' src='${pathToRoot}doc.js'></script>\n")
  44      //out.print("  <script type='text/javascript' src='${pathToRoot}searchIndex.js'></script>\n")
  45      out.print("</head>\n")
  46      out.print("<body>\n")
  47  
  48      out.print("<div class='header'>\n")
  49      out.print("<div class='content'>\n")
  50      out.print("<a href='http://www.fandev.org/'><img src='${pathToRoot}logo.png' alt='logo'/></a>\n")
  51      out.print("<ul>\n")
  52      out.print("<li><a href='http://www.fandev.org/'>Home</a></li>\n")
  53      out.print("<li class='active'><a href='${pathToRoot}index.html'>Doc</a></li>\n")
  54      out.print("<li><a href='http://www.fandev.org/discussion'>Discuss</a></li>\n")
  55      out.print("</ul>")
  56      out.print("</div>\n")
  57      out.print("</div>\n")
  58  
  59      out.print("<div class='subHeader'>\n")
  60      out.print("<div class='content'>\n")
  61      header
  62  //    searchBox
  63      out.print("</div>\n")
  64      out.print("</div>\n")
  65  
  66      out.print("<div class='main'>\n")
  67      out.print("<div class='content'>\n")
  68      out.print("<div class='column1'>\n")
  69      content
  70      out.print("</div>\n")
  71      out.print("<div class='column2'>\n")
  72      sidebar
  73      out.print("</div>\n")
  74      out.print("</div>\n")
  75      out.print("</div>\n")
  76  
  77      out.print("<div class='footer'>\n")
  78      out.print("<div class='content'>\n")
  79      copyright
  80      out.print("</div>\n")
  81      out.print("</div>\n")
  82  
  83      out.print("</body>\n")
  84      out.print("</html>\n")
  85      out.close
  86    }
  87  
  88  //////////////////////////////////////////////////////////////////////////
  89  // Hooks
  90  //////////////////////////////////////////////////////////////////////////
  91  
  92    **
  93    ** Return the title for this document.
  94    **
  95    virtual Str title()
  96    {
  97      return "Fandoc"
  98    }
  99  
 100    **
 101    ** Returnt the relative path to the document root.
 102    **
 103    virtual Str pathToRoot()
 104    {
 105      return "../"
 106    }
 107  
 108    **
 109    ** Generate the header section of the document.
 110    **
 111    virtual Void header()
 112    {
 113    }
 114  
 115    **
 116    ** Generate the content section of the document.
 117    **
 118    virtual Void content()
 119    {
 120    }
 121  
 122    **
 123    ** Generate the copyright section of the document.
 124    **
 125    virtual Void copyright()
 126    {
 127      out.print("<p>\n")
 128      out.print("Copyright &#169; 2007, Brian Frank and Andy Frank<br/>\n");
 129      out.print("Licensed under the Academic Free License version 3.0<br/>\n");
 130      out.print("</p>\n")
 131  
 132      out.print("<p>\n")
 133      if (compiler.pod != null)
 134        out.print("$compiler.pod.name $compiler.pod.version\n");
 135      out.print("[$DateTime.now.toLocale]\n");
 136      out.print("</p>\n")
 137    }
 138  
 139    **
 140    ** Generate the sidebar section of the document.
 141    **
 142    virtual Void sidebar()
 143    {
 144    }
 145  
 146    **
 147    ** Generate the search box.
 148    **
 149    Void searchBox()
 150    {
 151      out.print("<div class='fandocSearch'>\n")
 152      out.print("<form action='' onsubmit='return false;'>\n")
 153      out.print("  <div>\n")
 154      out.print("    <input type='text' id='fandocSearchBox' value='Search...' class='hint'\n")
 155      out.print("     onkeyup='SearchBox.search(event);'\n");
 156      out.print("     onfocus='SearchBox.onfocus();' onblur='SearchBox.onblur();' />\n")
 157      out.print("  </div>\n")
 158      out.print("  <div id='fandocSearchResults'></div>\n")
 159      out.print("</form>\n")
 160      out.print("</div>\n")
 161    }
 162  
 163  //////////////////////////////////////////////////////////////////////////
 164  // HtmlDocWriter
 165  //////////////////////////////////////////////////////////////////////////
 166  
 167    override Void elemStart(DocElem elem)
 168    {
 169      if (elem.id === DocNodeId.link)
 170      {
 171        link := elem as Link
 172        if (!link.uri.endsWith(".html"))
 173        {
 174          link.uri = compiler.uriMapper.map(link.uri, loc).toStr
 175          link.isCode = compiler.uriMapper.targetIsCode
 176        }
 177      }
 178  
 179      super.elemStart(elem)
 180    }
 181  
 182  //////////////////////////////////////////////////////////////////////////
 183  // Filters
 184  //////////////////////////////////////////////////////////////////////////
 185  
 186    static Bool showType(Type t)
 187    {
 188      v := t.isPublic
 189      v &= !t.isSynthetic
 190      v &= t == Test.type || !t.fits(Test.type)
 191      return v
 192    }
 193  
 194    static Bool showSlot(Type t, Slot s)
 195    {
 196  // TODO - inherited slots
 197  //    return !s.isSynthetic
 198      return !s.isSynthetic && t == s.parent
 199    }
 200  
 201    static Bool showByDefault(Type t, Slot s)
 202    {
 203      v := s.isPublic || s.isProtected
 204      v &= t == Obj.type || s.parent != Obj.type
 205      v &= t == s.parent
 206      return v
 207    }
 208  
 209    static Bool isInnherited(Type t, Slot s)
 210    {
 211      return t != s.parent
 212    }
 213  
 214  //////////////////////////////////////////////////////////////////////////
 215  // Fields
 216  //////////////////////////////////////////////////////////////////////////
 217  
 218    DocCompiler compiler
 219    Location loc
 220    Str docHome := "Doc Home"
 221  }