logo

abstract class

docCompiler::HtmlGenerator

sys::Obj
  fandoc::HtmlDocWriter
    docCompiler::HtmlGenerator
//
// Copyright (c) 2007, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   5 May 07  Brian Frank  Creation
//

using compiler
using fandoc

**
** HtmlGenerator is the base class for HTML generation which
** handles all the navigation and URI concerns
**
abstract class HtmlGenerator : HtmlDocWriter
{

//////////////////////////////////////////////////////////////////////////
// Constructor
//////////////////////////////////////////////////////////////////////////

  new make(DocCompiler compiler, Location loc, OutStream out)
    : super(out)
  {
    this.compiler = compiler
    this.loc = loc
  }

//////////////////////////////////////////////////////////////////////////
// Generator
//////////////////////////////////////////////////////////////////////////

  Void generate()
  {
    out.print("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n")
    out.print(" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n")
    out.print("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n")
    out.print("<head>\n")
    out.print("  <title>$title</title>\n")
    out.print("  <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>\n")
    out.print("  <link rel='stylesheet' type='text/css' href='${pathToRoot}doc.css'/>\n")
    out.print("  <script type='text/javascript' src='${pathToRoot}doc.js'></script>\n")
    //out.print("  <script type='text/javascript' src='${pathToRoot}searchIndex.js'></script>\n")
    out.print("</head>\n")
    out.print("<body>\n")

    out.print("<div class='header'>\n")
    out.print("<div class='content'>\n")
    out.print("<a href='http://www.fandev.org/'><img src='${pathToRoot}logo.png' alt='logo'/></a>\n")
    out.print("<ul>\n")
    out.print("<li><a href='http://www.fandev.org/'>Home</a></li>\n")
    out.print("<li class='active'><a href='${pathToRoot}index.html'>Doc</a></li>\n")
    out.print("<li><a href='http://www.fandev.org/sidewalk/topic/'>Discuss</a></li>\n")
    out.print("</ul>")
    out.print("</div>\n")
    out.print("</div>\n")

    out.print("<div class='subHeader'>\n")
    out.print("<div class='content'>\n")
    header
//    searchBox
    out.print("</div>\n")
    out.print("</div>\n")

    out.print("<div class='main'>\n")
    out.print("<div class='content'>\n")
    out.print("<div class='column1'>\n")
    content
    out.print("</div>\n")
    out.print("<div class='column2'>\n")
    sidebar
    out.print("</div>\n")
    out.print("</div>\n")
    out.print("</div>\n")

    out.print("<div class='footer'>\n")
    out.print("<div class='content'>\n")
    footer
    out.print("</div>\n")
    out.print("</div>\n")

    out.print("</body>\n")
    out.print("</html>\n")
    out.close
  }

//////////////////////////////////////////////////////////////////////////
// Hooks
//////////////////////////////////////////////////////////////////////////

  **
  ** Return the title for this document.
  **
  virtual Str title()
  {
    return "Fandoc"
  }

  **
  ** Returnt the relative path to the document root.
  **
  virtual Str pathToRoot()
  {
    return "../"
  }

  **
  ** Generate the header section of the document.
  **
  virtual Void header()
  {
  }

  **
  ** Generate the content section of the document.
  **
  virtual Void content()
  {
  }

  **
  ** Generate the footer section of the document.
  **
  virtual Void footer()
  {
    out.print("<p>\n")
    if (compiler.pod != null)
      out.print("$compiler.pod.name $compiler.pod.version\n");
    out.print("[$DateTime.now.toLocale]\n");
    out.print("</p>\n")
  }

  **
  ** Generate the sidebar section of the document.
  **
  virtual Void sidebar()
  {
  }

  **
  ** Generate the search box.
  **
  Void searchBox()
  {
    out.print("<div class='fandocSearch'>\n")
    out.print("<form action='' onsubmit='return false;'>\n")
    out.print("  <div>\n")
    out.print("    <input type='text' id='fandocSearchBox' value='Search...' class='hint'\n")
    out.print("     onkeyup='SearchBox.search(event);'\n");
    out.print("     onfocus='SearchBox.onfocus();' onblur='SearchBox.onblur();' />\n")
    out.print("  </div>\n")
    out.print("  <div id='fandocSearchResults'></div>\n")
    out.print("</form>\n")
    out.print("</div>\n")
  }

//////////////////////////////////////////////////////////////////////////
// HtmlDocWriter
//////////////////////////////////////////////////////////////////////////

  override Void elemStart(DocElem elem)
  {
    if (elem.id === DocNodeId.link)
    {
      link := elem as Link
      if (!link.uri.endsWith(".html"))
      {
        link.uri = compiler.uriMapper.map(link.uri, loc).toStr
        link.isCode = compiler.uriMapper.targetIsCode
      }
    }

    super.elemStart(elem)
  }

//////////////////////////////////////////////////////////////////////////
// Filters
//////////////////////////////////////////////////////////////////////////

  static Bool showType(Type t)
  {
    v := t.isPublic
    v &= !t.isSynthetic
    v &= t == Test# || !t.fits(Test#)
    return v
  }

  static Bool showSlot(Type t, Slot s)
  {
// TODO - inherited slots
//    return !s.isSynthetic
    return !s.isSynthetic && t == s.parent
  }

  static Bool showByDefault(Type t, Slot s)
  {
    v := s.isPublic || s.isProtected
    v &= t == Obj# || s.parent != Obj#
    v &= t == s.parent
    return v
  }

//////////////////////////////////////////////////////////////////////////
// Fields
//////////////////////////////////////////////////////////////////////////

  DocCompiler compiler
  Location loc
  Str docHome := "Doc Home"
}