Initial revision
authorjustdave@bugzilla.org
Tue, 05 Sep 2006 03:39:04 +0000
changeset 0 7607a87be3d5131452c783ad1333caeba01dad0c
child 1 32f216963501162ecca81eea35635a7fe28facbe
child 1217 f82be475911182f7b3f568716d36c86cde995a7f
push id1
push userhg
push dateTue, 07 Apr 2015 21:00:21 +0000
Initial revision
README
bin/build
bin/build-exclusive.pl
bin/build.bat
etc/ttree.cfg
etc/ttree.dep
lib/639.csv
lib/breadcrumbs.tmpl
lib/config.tmpl
lib/perl/MozillaOrg/Template/Plugin/MetaExtractor.pm
lib/sidebar.tmpl
lib/sitemap.xml
lib/wrapper.tmpl
src/css/base/template.css
src/css/rustico/content.css
src/css/rustico/template.css
src/favicon.ico
src/images/template/breadcrumbs-background.png
src/images/template/feature-back.png
src/images/template/header-background.png
src/images/template/menu_back.gif
src/images/template/menu_br.gif
src/images/template/menu_tr.gif
src/index.html
src/robots.txt
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,41 @@
+Directory Structure
+-------------------
+Contained in CVS:
+bin - contains the build scripts
+etc - Template Toolkit configuration
+lib - various include files for the templates and the site map used to generate
+      the navigation menus
+src - the actual site content
+
+Generated:
+dest - the output of the build script (the finished website docroot)
+
+Build Requirements
+------------------
+* expat library
+* Perl modules:
+  * Template Toolkit
+  * XML::XPath
+
+Building the Site
+-----------------
+To build manually:
+* cd into the directory containing this README file
+* run "bin/build"
+* The "dest" directory will be created if it doesn't exist, and the tree will be
+  built there.
+
+To build from a cron job:
+* Same as above, but run "bin/build-exclusive.pl" instead, which does locking
+  to ensure build jobs don't overlap.
+
+HTML files will be processed by Template Toolkit.  This means you can use Template
+Toolkit directives in your pages for creative content or site-wide variables that
+you define in one of the config files.  See http://www.template-toolkit.org/ for
+documentation.
+
+The main site look (banner, navigation, etc) is in lib/wrapper.tmpl
+
+Configuration Files
+-------------------
+Most config files are self-documenting.  Read the comments in the files.
new file mode 100755
--- /dev/null
+++ b/bin/build
@@ -0,0 +1,2 @@
+# cvs -q update -d -P
+ttree -f etc/ttree.cfg $@
new file mode 100755
--- /dev/null
+++ b/bin/build-exclusive.pl
@@ -0,0 +1,59 @@
+#!/usr/bin/perl -w
+
+# Builds the website, acquiring a lock first so builds don't collide with
+# each other.  Run this from the website root directory.  Pass command line
+# options to the build script by first putting "--" on the command line,
+# i.e. "build-exclusive.pl -- -v foo.html" runs "bin/build -v foo.html".
+
+use strict;
+
+# The number of seconds to wait before trying again if another build is going.
+# Set this with the --wait command line option.
+my $WAIT = 15;
+
+# The maximum amount of time in seconds to wait for a lock before dying.
+# Set this with the --maxwait command line option.
+#
+# If this script is being run periodically by cron, set this low (ideally less
+# than the interval between cron runs; f.e. 30 seconds for a run that happens
+# every minute) to prevent processes from building up.
+#
+# If this script gets run by CVS upon commit, set this high (f.e. 450 seconds,
+# i.e. 15 minutes) so that multiple simultaneous commits all go through
+# one after the other even if some of them have to wait a while.
+#
+my $MAX_WAIT = 30;
+
+# Get any options passed on the command line, like --wait and --maxwait.
+use Getopt::Long;
+my $result = GetOptions ("wait=i"    => \$WAIT,
+                         "maxwait=i" => \$MAX_WAIT);
+
+# Use Proc::PID::File to handle the locking.
+use Proc::PID::File;
+my $LOCK_OPTS = {
+    dir   => "/tmp",
+    name  => "mofoorg-build",
+    debug => 0
+};
+
+# Try to get a lock.
+my $started = time();
+my $waited = 0;
+while (Proc::PID::File->running($LOCK_OPTS) && ((time()-$started)<=$MAX_WAIT)) {
+    print STDERR "Couldn't get build lock; waiting another $WAIT seconds...\n";
+    $waited = 1;
+    sleep $WAIT ;
+}
+
+# Die if we couldn't get a lock.
+if (Proc::PID::File->running($LOCK_OPTS)) {
+    die "Couldn't get build lock.";
+}
+elsif ($waited) {
+    print STDERR "Got build lock after " . (time() - $started) . " seconds.\n";
+}
+
+# Build the website.
+#print STDERR "Building site.\n";
+system("bin/build", @ARGV);
new file mode 100755
--- /dev/null
+++ b/bin/build.bat
@@ -0,0 +1,1 @@
+ttree -f etc/ttree.cfg %*
new file mode 100644
--- /dev/null
+++ b/etc/ttree.cfg
@@ -0,0 +1,95 @@
+#------------------------------------------------------------------------
+#
+# For more information on the contents of this configuration file, see
+# 
+#     perldoc ttree
+#     ttree -h
+#
+#------------------------------------------------------------------------
+
+# This file gets passed to ttree in bin/build via the -f flag.
+
+# print summary of what's going on 
+#verbose 
+
+# recurse into any sub-directories and process files
+recurse
+
+# regexen of things that aren't templates and should be ignored
+ignore = \b(CVS|RCS)\b
+ignore = ^#
+ignore = ~$
+ignore = \.xml$
+ignore = \.xsl$
+# I should be able to do ^\.cvsignore$, but that doesn't work for some reason.
+ignore = \.cvsignore$
+ignore = Makefile$
+
+# ditto for things that should be copied rather than processed.
+copy = \.png$ 
+copy = \.ico$ 
+copy = \.gif$ 
+copy = \.jpg$ 
+copy = \.js$ 
+copy = \.css$ 
+copy = \.htaccess$
+copy = \.txt$
+
+# by default, everything not ignored or copied is accepted; add 'accept'
+# lines if you want to filter further. e.g.
+#
+#    accept = \.html$
+#    accept = \.tt2$
+
+accept = \.html$
+accept = \.tmpl$
+
+# options to rewrite files suffixes (htm => html, tt2 => html)
+#
+#    suffix htm=html
+#    suffix tt2=html
+
+# options to define dependencies between templates
+#
+    #depend *=sidebar
+#    depend index.html=mainpage,sidebar
+#    depend menu=menuitem,menubar
+# 
+
+#------------------------------------------------------------------------
+# The following options usually relate to a particular project so 
+# you'll probably want to put them in a separate configuration file 
+# in the directory specified by the 'cfg' option and then invoke tree 
+# using '-f' to tell it which configuration you want to use.
+# However, there's nothing to stop you from adding default 'src',
+# 'dest' or 'lib' options in the .ttreerc.  The 'src' and 'dest' options
+# can be re-defined in another configuration file, but be aware that 'lib' 
+# options accumulate so any 'lib' options defined in the .ttreerc will
+# be applied every time you run ttree.
+#------------------------------------------------------------------------
+# # directory containing source page templates
+# src = /path/to/your/source/page/templates
+#
+# # directory where output files should be written
+# dest = /path/to/your/html/output/directory
+# 
+# # additional directories of library templates
+# lib = /first/path/to/your/library/templates
+# lib = /second/path/to/your/library/templates
+
+src = src
+lib = lib
+dest = dest
+
+# depend_file = etc/ttree.dep
+# depend *=sidebar.tmpl
+
+wrapper = wrapper.tmpl
+
+pre_process = config.tmpl
+pre_process = breadcrumbs.tmpl
+trim
+
+perl5lib = lib/perl
+plugin_base = MozillaOrg::Template::Plugin
+
new file mode 100644
--- /dev/null
+++ b/etc/ttree.dep
@@ -0,0 +1,1 @@
+* : sidebar.tmpl
new file mode 100644
--- /dev/null
+++ b/lib/639.csv
@@ -0,0 +1,139 @@
+aa  Afar
+ab  Abkhazian
+af  Afrikaans
+am  Amharic
+ar  Arabic
+as  Assamese
+ay  Aymara
+az  Azerbaijani
+ba  Bashkir
+be  Byelorussian
+bg  Bulgarian
+bh  Bihari
+bi  Bislama
+bn  Bengali; Bangla
+bo  Tibetan
+br  Breton
+ca  Catalan
+co  Corsican
+cs  Czech
+cy  Welsh
+da  Danish
+de  German
+dz  Bhutani
+el  Greek
+en  English
+eo  Esperanto
+es  Spanish
+et  Estonian
+eu  Basque
+fa  Persian
+fi  Finnish
+fj  Fiji
+fo  Faroese
+fr  French
+fy  Frisian
+ga  Irish
+gd  Scots Gaelic
+gl  Galician
+gn  Guarani
+gu  Gujarati
+ha  Hausa
+he  Hebrew
+hi  Hindi
+hr  Croatian
+hu  Hungarian
+hy  Armenian
+ia  Interlingua
+id  Indonesian
+ie  Interlingue
+ik  Inupiak
+is  Icelandic
+it  Italian
+iu  Inuktitut
+ja  Japanese
+jw  Javanese
+ka  Georgian
+kk  Kazakh
+kl  Greenlandic
+km  Cambodian
+kn  Kannada
+ko  Korean
+ks  Kashmiri
+ku  Kurdish
+ky  Kirghiz
+la  Latin
+ln  Lingala
+lo  Laothian
+lt  Lithuanian
+lv  Latvian, Lettish
+mg  Malagasy
+mi  Maori
+mk  Macedonian
+ml  Malayalam
+mn  Mongolian
+mo  Moldavian
+mr  Marathi
+ms  Malay
+mt  Maltese
+my  Burmese
+na  Nauru
+ne  Nepali
+nl  Dutch
+no  Norwegian
+oc  Occitan
+om  (Afan) Oromo
+or  Oriya
+pa  Punjabi
+pl  Polish
+ps  Pashto, Pushto
+pt  Portuguese
+qu  Quechua
+rm  Rhaeto-Romance
+rn  Kirundi
+ro  Romanian
+ru  Russian
+rw  Kinyarwanda
+sa  Sanskrit
+sd  Sindhi
+sg  Sangho
+sh  Serbo-Croatian
+si  Sinhalese
+sk  Slovak
+sl  Slovenian
+sm  Samoan
+sn  Shona
+so  Somali
+sq  Albanian
+sr  Serbian
+ss  Siswati
+st  Sesotho
+su  Sundanese
+sv  Swedish
+sw  Swahili
+ta  Tamil
+te  Telugu
+tg  Tajik
+th  Thai
+ti  Tigrinya
+tk  Turkmen
+tl  Tagalog
+tn  Setswana
+to  Tonga
+tr  Turkish
+ts  Tsonga
+tt  Tatar
+tw  Twi
+ug  Uighur
+uk  Ukrainian
+ur  Urdu
+uz  Uzbek
+vi  Vietnamese
+vo  Volapuk
+wo  Wolof
+xh  Xhosa
+yi  Yiddish
+yo  Yoruba
+za  Zhuang
+zh  Chinese
+zu  Zulu
new file mode 100644
--- /dev/null
+++ b/lib/breadcrumbs.tmpl
@@ -0,0 +1,38 @@
+[%
+   # Load the sitemap once per build and cache it for reuse on each page.
+   IF !global.cached.xpath;
+     USE xpath = XML.XPath("lib/sitemap.xml");
+     global.cached.xpath = xpath;
+   END;
+
+   BLOCK breadcrumbs;
+     my_id = "${template.name}"|replace('/index.html|.html','')|replace('^.+/','');
+     nodes = [global.cached.xpath.findnodes("//page[@id='$my_id']")];
+
+     PROCESS crumb crumbs=[] node=nodes.0;
+
+     u = "";
+     FOREACH crumb IN crumbs.reverse;
+       IF loop.first;
+         "<a href=\"/\">Home</a> ";
+       END;
+
+       " &#187; ";
+
+       IF loop.last;
+         "<span>$crumb.title</span>";
+       ELSE;
+         u = "$u/$crumb.id";
+         "<a href=\"$u\">$crumb.title</a>";
+       END;
+     END;
+   END;
+
+   BLOCK crumb;
+     IF node && node.getName() == "page";
+       crumbs.push({ title => node.getAttribute("title"),
+                     id    => node.getAttribute("id") });
+       PROCESS crumb node=node.getParentNode();
+     END;
+   END;
+%]
new file mode 100644
--- /dev/null
+++ b/lib/config.tmpl
@@ -0,0 +1,5 @@
+[% true = 1 %]
+[% false = 0 %]
+
+[%# Default values for page variables. %]
+[% page.stylesheets = [] %]
new file mode 100644
--- /dev/null
+++ b/lib/perl/MozillaOrg/Template/Plugin/MetaExtractor.pm
@@ -0,0 +1,235 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+
+package MozillaOrg::Template::Plugin::MetaExtractor;
+
+# Output Data Format:
+#
+# document
+#   .doctype
+#   .head
+#   .content
+#   .title
+#   .lang (ISO lang code)
+#   .dir (ltr|rtl)
+#   .format (html|xhtml)
+#   .meta
+#     .[name] = [value]
+#   .links
+#     .[linktype] = [array of links]
+#
+#  link
+#    .rel
+#    .href
+#    .title
+#    .hreflang
+#    .type
+#
+
+
+use strict;
+
+use base qw(Template::Plugin);
+
+sub load {
+    my ($class, $context) = @_;
+    return $class;
+}
+
+sub new {
+    my ($class, $context) = @_;
+    return bless { _CONTEXT => $context, basePath => '' }, $class;
+}
+
+### URI Processing Functions ###########################################
+
+sub setBasePathFromRoot {
+  my ($self, $basePath) = @_;
+
+  $self->{basePath} = $basePath;
+}
+
+sub getRelativePath {
+  my ($self, $pathFromRoot) = @_;
+
+  my @basePath = split /\//, $self->{basePath};
+  my @relPath  = split /\//, $pathFromRoot;
+
+  my $pathNode;
+  while ($pathNode = @basePath) {
+    if ($pathNode eq $relPath[0]) {
+      shift @relPath;
+      shift @basePath;
+    }
+    else {
+      last;
+    }
+  }
+  foreach $pathNode (@basePath) {
+    if (@basePath > 1) {
+      unshift @relPath, '..';
+      shift @basePath;
+    }
+  }
+  $_ = join '/', @relPath;
+  s/(index)?\.[a-zA-Z\-.]+$//;
+  return $_;
+}
+
+### Config #############################################################
+
+  my $defaultlang = 'en';
+  my $defaultdir  = 'ltr';
+
+### Debug PRINTER ######################################################
+
+sub PrintMeta { # for debugging
+  my %document = %{$_[0]};
+  print "DEBUGPRINT\n";
+  my ($key, $link, $attr);
+  foreach $key (keys %document) {
+    print "$key:\n$document{$key}\n";
+  }
+  foreach $key (keys %{$document{meta}}) {
+    print "  $key:\n$document{meta}->{$key}\n";
+  }
+  foreach $key (keys %{$document{links}}) {
+    print "$key:\n";
+    foreach $link (@{$document{links}->{$key}}) {
+      print "  link:\n";
+      foreach $attr (keys %$link) {
+        print "    $attr: $link->{$attr}\n";
+      }
+    }
+  }
+}
+
+### Regex SHORTHANDS ###################################################
+
+  # match any number of attrs
+  my $attrs = q#(?:\s+\w+=(?:"[^"]*"|'[^']*'))*#;
+
+  # match an attribute value (in quotes) and remember as $2
+  my $attrval = q#(["'])\s*([\s\S]*?)\s*\1#;
+
+### Extraction MAIN ####################################################
+
+sub extract {
+  my ($self, $content) = @_;
+
+  my %document;
+  #print $content;
+  if ($content =~ s#([\s\S]*?)<head$attrs>([\s\S]*)<title>\s*([^<]*?)\s*</title>([\s\S]*?)</head\s*>##i) {
+                   # prolog                                   title               head
+    my $prolog = $1;
+    my $title = $3;
+    my $head = $2 . $4;
+    $head =~ s/<\?wrapper ignore\??>[\s\S]*?<\?wrapper end-ignore\??>//;
+
+    $document{head} = $head;
+
+    ($document{doctype}, $document{format},
+     $document{lang}, $document{dir}) = ParseProlog($prolog);
+
+    ($document{meta}, $document{links}) = ParseHead($head);
+
+    $document{title} = "Mozilla Foundation: " . $title;
+  }
+
+  $content =~ s#(?:<body$attrs>|</body\s*>|</html\s*>)##g;
+  $document{content} = $content;
+  return \%document;
+}
+
+### Parse PROLOG #######################################################
+
+sub ParseProlog {
+  local $_ = $_[0];
+  my ($doctype, $format);
+  my $lang = $defaultlang;
+  my $dir  = $defaultdir;
+  if (s#[\s\S]*?(<!DOCTYPE .+?"-//W3C//DTD (HTML|XHTML).+?"[\s\S]*?>)##) {
+    $doctype = $1;
+    $format = $2;
+  }
+  if (m#<html($attrs)>#i) {
+    my $htmlAttrs = $1;
+    if ($htmlAttrs =~ m#lang=$attrval#i) {
+	  $lang = $2;
+      if ($htmlAttrs =~ m#dir=$attrval#i) {
+        $dir = $2;
+      }
+    }
+  }
+  return ($doctype, $format, $lang, $dir);
+}
+
+### Parse HEAD #########################################################
+
+sub ParseHead {
+  my $head = $_[0];
+  my %meta;
+  my %links;
+
+  my @bits = split(/</, $head);
+  foreach $_ (@bits) {
+    if (m#meta($attrs)/?>#i) {
+      $_ = $1;
+      if (m#name=$attrval#i) {
+        my $name = $2;
+        if (m#content=$attrval#i) {
+          $meta{$name} = $2;
+        }
+      }
+    }
+    elsif (m#^link($attrs)/?>#si) { #parse link
+      $_ = $1;
+      if (m#rel=$attrval#) {
+        my $relStr = $2;
+        unless ($relStr =~ m#stylesheet|script|icon#i) {
+          my %link;
+          $link{rel} = $relStr;
+          if (m#href=$attrval#i) {
+            $link{href} = $2;
+          }
+          if (m#hreflang=$attrval#i) {
+            $link{hreflang} = $2;
+          }
+          if (m#type=$attrval#i) {
+            $link{type} = $2;
+          }
+          if (m#title=$attrval#i) {
+            $link{title} = $2;
+          }
+          $relStr =~ s/^\s*(.*\S)\s*$/$1/;
+          my @relations = split(/\s+/,$relStr);
+          my $rel;
+          foreach $rel (@relations) {
+            # normalize values
+            $rel = lc $rel;
+            $rel = 'prev' if ($rel eq 'previous');
+            $rel = 'toc' if ($rel eq 'contents');
+            push (@{$links{$rel}}, \%link);
+          }
+        }
+      }
+    }
+  }
+  return (\%meta, \%links);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Bugzilla::Template::Plugin::Hook
+
+=head1 DESCRIPTION
+
+Template Toolkit plugin to process hooks added into templates by extensions.
+
+=head1 SEE ALSO
+
+L<Template::Plugin>,
+L<http://bugzilla.mozilla.org/show_bug.cgi?id=229658>
new file mode 100644
--- /dev/null
+++ b/lib/sidebar.tmpl
@@ -0,0 +1,39 @@
+[% USE site = XML::Simple( 
+       'sitemap.xml'
+       ForceArray = ['page']
+       KeyAttr = ['' ]
+   )
+%]
+
+[%  INCLUDE explore node=site;
+    BLOCK explore;
+      node == site ?  "<ul \id=\"nav\">" : "\n<ul>";
+      "\n";
+      FOREACH page IN node.page;
+        # add page id to current path to get page path
+        page.path = "$path/$page.id";
+
+        # add suffix for a section (/index.html) or page (.html)
+        suffix    = page.page ? '/index.html' : '.html';
+        page.url  = "${page.path}${suffix}";
+
+        # add complete URL to sitemap lookup table
+        site.url2page.${page.url} = page;
+
+        # print some debugging info
+        # "page: $page.id\n  path: $page.path\n   url: $page.url\n" | stderr;
+        "\t<li><a href=\"/en$page.path\">$page.title</a>";
+
+        u = "/${template.name}";
+        # process and child nodes
+        INCLUDE explore node=page path=page.path 
+           IF page.page AND (u.match("^/en$page.path"));
+
+        "</li>\n";
+      END;
+      "</ul>\n";
+    END
+%]
+</ul>
+
+[%- # vim: set expandtab tabstop=2 shiftwidth=2 textwidth=76 autoindent: -%]
new file mode 100644
--- /dev/null
+++ b/lib/sitemap.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+non-ASCII characters must be DOUBLE-escaped;
+you can use Hixie's converter to get the entity codes
+http://www.damowmow.com/portal/ (use the "Indentify" field)
+-->
+
+<site title="Mozilla Foundation" url="http://mozillafoundation.org">
+  <page title="About Us" id="about">
+    <page title="Board" id="board" />
+    <page title="Contact" id="contact" />
+    <!-- <page title="FAQ" id="faq" /> -->
+    <page title="History" id="history" />
+    <page title="Mission" id="mission" />
+    <page title="Staff" id="staff" />
+    <page title="Sponsors" id="sponsors" />
+  </page>
+
+  <page title="Events" id="events" />
+
+  <page title="Governance" id="governance" />
+    <!-- <page title="Governance Process" id="process" /> -->
+
+  <page title="Grants" id="grants">
+    <page title="How to Apply" id="applying" />
+    <page title="Grants Made" id="made" />
+  </page>
+
+  <page title="Projects" id="projects" />
+  
+  <page title="Public Records" id="public-records" />
+
+  <page title="News" id="news" />
+
+  <page title="Media/Press" id="press">
+    <page title="Media Releases" id="releases" />
+
+    <page title="Resources" id="resources">
+      <page title="Bios" id="bios" />
+      <page title="Logos" id="logos" />
+      <page title="Photos" id="photos" />
+    </page>
+  </page>
+</site>
new file mode 100644
--- /dev/null
+++ b/lib/wrapper.tmpl
@@ -0,0 +1,157 @@
+[%- USE MetaExtractor -%]
+[%- DEFAULT sidebar = "sidebar.tmpl"-%]
+[%-# Can't use DEFAULT for wrap, since DEFAULT overwrites a false value. -%]
+[%- wrap = wrap.defined ? wrap : true -%]
+[%- IF wrap -%]
+[%- document = MetaExtractor.extract(content) -%]
+[%-# English Strings -%]
+[%- 
+    strings.listsep       = ", "
+    strings.listand       = ", and "
+
+    strings.Home          = "Home"
+    strings.About         = "About"
+    strings.Community     = "Community"
+    strings.Download      = "Download"
+    strings.Contribute    = "Contribute"
+    strings.Next          = "Next"
+    strings.Previous      = "Previous"
+    strings.ToC           = "Table of Contents"
+    strings.WrittenBy     = "Written by"
+    strings.MaintainedBy  = "Maintained by"
+    strings.Contributors  = "Contributing Writers"
+    strings.TranslationBy = "Translation by"
+    strings.LicenseIs     = "This page is licensed under the"
+    strings.History       = "Document History"
+    strings.Edit          = "Edit"
+-%]
+[%- document.doctype %]
+<html [% IF document.lang %]lang="[% document.lang %]"[%END%]
+      [% IF document.dir %]dir="[% document.dir %]"[%END%]>
+  <head>
+    <title>[% document.title %]</title>
+    <link rel="stylesheet" type="text/css" href="/css/base/template.css" media="screen">
+    <link rel="stylesheet" type="text/css" href="/css/rustico/template.css" title="Cavendish" media="screen">
+    <link rel="stylesheet" type="text/css" href="/css/rustico/content.css" title="Cavendish" media="screen">
+    [%- document.head %]
+  </head>
+  <body id="mozilla-com">
+    <div id="header"><div></div></div>
+    <div id="breadcrumbs">
+      [% PROCESS breadcrumbs %]
+    </div>
+    <div id="content">
+      <div id="side">
+        [% INCLUDE $sidebar %]
+      </div>
+      <div id="mainContent">
+        [% IF document.links.next || document.links.prev || document.links.toc -%]
+        <ul id="tNavTop">
+          [% IF document.links.prev -%]
+          <li><a href="[% document.links.prev.0.href %]" rel="prev">[% strings.Previous %]: [% document.links.prev.0.title %]</a>
+          [%- END -%]
+          [%- IF document.links.next -%]
+          <li><a href="[% document.links.next.0.href %]" rel="next">[% strings.Next %]: [% document.links.next.0.title %]</a>
+          [%- END -%]
+          [%- IF document.links.toc -%]
+          <li><a href="[% document.links.toc.0.href %]" rel="toc">[% strings.ToC %]</a>
+          [%- END %]
+        </ul>
+        [%- END -%]
+
+        [%- document.content -%]
+
+        <address>
+        [%- IF document.links.author %]
+          [% strings.WrittenBy %] <a href="[% document.links.author.0.href %]">[% document.links.author.0.title %]</a>
+          [%- SET lastIndex = document.links.author.size - 1 -%]
+          [%- IF lastIndex > 0 -%]
+            [%- SET almostLastIndex = lastIndex - 1 -%]
+            [%- FOREACH i = [ 1 .. almostLastIndex ] -%]
+              [%- strings.listsep -%]
+              <a href="[% document.links.author.$i.href %]">[% document.links.author.$i.title %]</a>
+              [%- SET i = i + 1 -%]
+            [%- END -%]
+              [%- strings.listand -%]
+              <a href="[% document.links.author.$lastIndex.href %]">[% document.links.author.$lastIndex.title %]</a>
+          [%- END -%]
+        [%- END -%]
+        [% IF document.links.maintainer %]
+          <br>
+          [% strings.MaintainedBy %] <a href="[% document.links.maintainer.0.href %]">[% document.links.maintainer.0.title %]</a>
+          [%- SET lastIndex = document.links.maintainer.size - 1 -%]
+          [%- IF lastIndex > 0 -%]
+            [%- SET almostLastIndex = lastIndex - 1 -%]
+            [%- FOREACH i = [ 1 .. almostLastIndex ] -%]
+              [%- strings.listsep -%]
+              <a href="[% document.links.maintainer.$i.href %]">[% document.links.maintainer.$i.title %]</a>
+              [%- SET i = i + 1 -%]
+            [%- END -%]
+              [%- strings.listand -%]
+              <a href="[% document.links.maintainer.$lastIndex.href %]">[% document.links.maintainer.$lastIndex.title %]</a>
+          [%- END -%]
+        [%- END -%]
+        [%- IF document.links.contributor %]
+          <br>
+          [% strings.Contributors %] <a href="[% document.links.contributor.0.href %]">[% document.links.contributor.0.title %]</a>
+          [%- SET lastIndex = document.links.contributor.size - 1 -%]
+          [%- IF lastIndex > 0 -%]
+            [%- SET almostLastIndex = lastIndex - 1 -%]
+            [%- FOREACH i = [ 1 .. almostLastIndex ] -%]
+              [%- strings.listsep -%]
+              <a href="[% document.links.contributor.$i.href %]">[% document.links.contributor.$i.title %]</a>
+              [%- SET i = i + 1 -%]
+            [%- END -%]
+              [%- strings.listand -%]
+              <a href="[% document.links.contributor.$lastIndex.href %]">[% document.links.contributor.$lastIndex.title %]</a>
+          [%- END -%]
+        [%- END -%]
+        [% IF document.links.translator %]
+          <br>
+          [% strings.TranslationBy %] <a href="[% document.links.translator.0.href %]">[% document.links.translator.0.title %]</a>
+          [%- SET lastIndex = document.links.translator.size - 1 -%]
+          [%- IF lastIndex > 0 -%]
+            [%- SET almostLastIndex = lastIndex - 1 -%]
+            [%- FOREACH i = [ 1 .. almostLastIndex ] -%]
+              [%- strings.listsep -%]
+              <a href="[% document.links.translator.$i.href %]">[% document.links.translator.$i.title %]</a>
+              [%- SET i = i + 1 -%]
+            [%- END -%]
+              [%- strings.listand -%]
+              <a href="[% document.links.translator.$lastIndex.href %]">[% document.links.translator.$lastIndex.title %]</a>
+          [%- END -%]
+        [%- END %]
+        </address>
+        
+        [%- IF document.links.next || document.links.prev || document.links.toc -%]
+        <ul id="tNavBottom">
+          [% IF document.links.prev -%]
+          <li><a href="[% document.links.prev.0.href %]" rel="prev">[% strings.previous %]: [% document.links.prev.0.title %]</a>
+          [%- END -%]
+          [%- IF document.links.next -%]
+          <li><a href="[% document.links.next.0.href %]" rel="next">[% strings.next %]: [% document.links.next.0.title %]</a>
+          [%- END -%]
+          [%- IF document.links.toc -%]
+          <li><a href="[% document.links.toc.0.href %]" rel="toc">[% strings.toc %]: [% document.links.toc.0.title %]</a>
+          [%- END -%]
+        </ul>
+        [%- END %]
+      </div>
+    </div>
+    
+    <div class="footer">
+      [% IF document.links.license -%]
+      <p class="tLicense">[% strings.LicenseIs %]
+        <a href="[% document.links.license.0.href %]">[% document.links.license.0.title %]</a>.</p>
+      [%- END %]
+      [%- sourcefile = template.name;
+        sourcefile = sourcefile|replace('\+','%2b');
+        sourcefile = sourcefile|replace('\=','%3d');
+        sourcefile = sourcefile|replace('\&','%26'); -%]
+    </div>
+
+  </body>
+</html>
+[%- ELSE -%]
+[% content %]
+[%- END -%]
new file mode 100644
--- /dev/null
+++ b/src/css/base/template.css
@@ -0,0 +1,95 @@
+/* mozilla.org MezzoTan DevMo Template Styles
+ *
+ */
+
+/* Link Navigation */
+
+	#tNavTop,
+	#tNavBottom {
+		list-style: none;
+		text-align: right;
+	}
+	#tNavTop > li,
+	#tNavBottom > li {
+		display: block;
+	}
+	#tNavTop:before,
+	#tNavBottom:after {
+	  clear: both;
+	}
+	
+	#tNavTop a[rel="prev"],
+	#tNavBottom a[rel="prev"] {
+		float: left;
+		text-align: left;
+	}
+		
+	#tNavTop a[rel="toc"] {
+	  display: block;
+	  text-align: center;
+	}
+	
+	#tNavTop a[rel="next"],
+	#tNavBottom a[rel="next"] {
+		float: right;
+	}
+
+/* Footer */
+
+	.tLicense {
+		font-size: smaller;
+	}
+
+	#mBody {
+		clear: both;
+		padding: 0 0 1em 0;
+	}
+
+	#side {
+		float: left;
+		width: 23%;
+		margin-bottom: 1em;
+		margin-top: 1em;
+	}
+
+	#mainContent {
+		float: right;
+		width: 74%;
+		margin-bottom: 3em;
+	}
+	.nomenu #mainContent {
+		float: none;
+		width: 100%;
+	}
+	.bodyleft {
+		float: right !important;
+		width: 74% !important;
+	}
+	#mainContent.right {
+		float: left;
+		width: 62%;
+		margin-bottom: 2em;
+	}
+	
+	#side.right {
+		float: right;
+		width: 35%;
+		margin-bottom: 2em;
+		margin-top: 0;
+	}
+
+/* Sidebar */
+
+	#getcd {
+		margin: 1em 0 0 45px;
+	}
+
+/*accessibility tweaks*/
+	.skipLink {
+		position: absolute;
+		left: -999px;
+		width: 990px;
+	}
+	hr.hide {
+		display: none;
+	}
new file mode 100644
--- /dev/null
+++ b/src/css/rustico/content.css
@@ -0,0 +1,562 @@
+/* mozilla.org Rustico Theme Content Styles
+ * Design by silverorange
+ * Markup Reference classes organized by fantasai
+ */
+
+/* Suggested order:
+ * display
+ * list-style
+ * position
+ * float
+ * clear
+ * width
+ * height
+ * margin
+ * padding
+ * border
+ * background
+ * color
+ * font
+ * text-decoration
+ * text-align
+ * vertical-align
+ * white-space
+ * other text
+ * content
+ *
+ */
+
+/* TOC:
+   Body
+   Random HTML Styles
+     Forms
+   General Structure
+   Navigation
+   Quotations
+   Comments and Other Asides
+   Emphasis
+   Computers - General
+   Code
+   Examples and Figures
+   Q and A (FAQ)
+   Tables
+   Meta
+*/
+
+/* Random HTML Styles */
+
+	hr {
+		height: 1px;
+		background-color: #000;
+		color: #000;
+		margin: 2em 0;
+	}
+
+	.hide { display: none; }
+
+	ul.spaced li, ol.spaced li {
+		margin-bottom: 0.5em;
+	}
+
+/* General Structure */
+    body, td, th, input { /* redundant rules for bad browsers  */
+            font-family: verdana, sans-serif;
+            font-size: x-small;
+            voice-family: "\"}\"";
+            voice-family: inherit;
+            font-size: small;
+    }
+
+	h1, h2, h3, h4, h5, h6 {
+		margin: 1em 0 0.2em 0;
+		border-bottom: 1px solid #ccc;
+		font-family: arial, verdana, sans-serif;
+	}
+	li h1, li h2, li h3, li h4, li h5, li h6 {
+		border: none;
+	}
+
+	#header h1 { border: 0; }
+
+	h1 { font-size: 160%; font-weight: normal; }
+	h2 { font-size: 150%; font-weight: normal; }
+	h3 { font-size: 120%; }
+	h4 { font-size: 100%; }
+	h5 { font-size: 90%; }
+	h6 { font-size: 90%; border: 0; }
+	
+/* Navigation */
+
+        :link { color: #039; }
+        :visited { color: #636; }
+        :link:hover, :visited:hover { color: #333; }
+        :link:active, :link:active { color: #000; }
+
+/* Quotations */
+
+
+/* Comments and other Asides */
+	#main-feature {
+		margin-top: -24px;
+		background: #EFF3F7 url("/images/template/feature-back.png") bottom repeat-x;
+	}
+	
+	#main-feature h2 {
+		margin: 10px 0 0 0;
+		border: none;
+	}
+	
+	#main-feature p.product-intro {
+		margin: 0 0 10px 0;
+		line-height: 145%;
+		color: #414D66;
+	}
+	
+	#main-feature .feature-contents {
+		padding: 15px 50px 65px 50px;
+		position: relative; /* this is required to absolutely position contained elements */
+		background: url("/images/home/feature-sun.png") bottom right no-repeat;
+	}
+	
+	#main-feature .feature-contents { height: 250px; }
+	body>#main-feature .feature-contents { height: auto; min-height: 260px; }
+
+	#main-feature .brief-feature { height: auto !important; min-height: 10px !important; }
+	* html #main-feature .brief-feature { padding-bottom: 5px !important }
+	
+	/* this hack is required for IE6 */
+	/* Hides from IE-mac \*/
+	* html #main-feature { height: 1%;}
+	/* End hide from IE-mac */
+	
+	#main-feature a.download-link {
+		display: block;
+		padding: 0 0 12px 0;
+		margin-bottom: 0.2em;
+		text-decoration: none;
+		color: #256504;
+		width: 285px;
+		margin-left: -8px;
+	}
+	
+	#main-feature a.download-firefox {
+		background: url("/images/template/download-firefox.png") 0 100% no-repeat;
+	}
+	
+	#main-feature a.download-thunderbird {
+		background: url("/images/template/download-thunderbird.png") 0 100% no-repeat;
+	}
+
+	#main-feature .brief-feature a.download-firefox {
+		background: url("/images/template/download-firefox-white.png") 0 100% no-repeat;
+		margin-right: 40px;
+		margin-left: 0;
+	}
+	
+	#main-feature a.download-link span {
+		display: block;
+		padding: 9px 10px 0 58px;
+		min-height: 43px;
+	} * html #main-feature a.download-link span { height: 43px; }
+	
+	#main-feature a.download-firefox span {
+		background: url("/images/template/download-firefox.png") 0 0 no-repeat;
+	}
+	
+	#main-feature a.download-thunderbird span {
+		background: url("/images/template/download-thunderbird.png") 0 0 no-repeat;
+	}
+
+	#main-feature .brief-feature a.download-firefox span {
+		background: url("/images/template/download-firefox-white.png") 0 0 no-repeat;
+	}
+
+	
+	#main-feature a.download-link strong {
+		font: 140% sans-serif;
+		letter-spacing: -0.02em;
+		text-decoration: underline;
+		color: #256504;
+	}
+	
+	#main-feature a.download-link em {
+		font-style: normal;
+		color: #367D10;
+		letter-spacing: 0;
+		display: block;
+		padding-top: 3px;
+		font-size: 85%;
+	}
+	
+	#main-feature a.download-link:hover, #main-feature a.download-link:hover span, #main-feature a.download-link:hover strong {
+		color: #143802;
+		cursor: pointer; /* need for IE6 */
+		background-position: 100% 100%;
+	}
+	
+	#main-feature a.download-link:hover span {
+		background-position: 100% 0;
+	}
+	
+	#main-feature .download-info {
+		font-size: 85%;
+		color: #666;
+		padding: 0;
+	}
+	
+	#main-feature .download-other {
+		font-size: 85%;
+		color: #515F78;
+		padding-left: 8px;
+	}
+
+	.brief-feature .home-download {
+		float: right;
+	}
+	
+	#main-feature .product-image {
+		float: right;
+		margin-left: 1.5em;
+		margin-top: 1em;
+	}
+	
+	#main-feature h2, #main-feature h3, #main-feature h4 {
+		border: none;
+	}
+	
+	.note {
+		color: #666;
+		font-style: normal;
+	}
+	
+	.first {
+		margin-top: 0;
+	}
+	
+	.remark {
+		color: #666;
+	}
+	
+	.sidenote {
+		border: #666;
+	}
+
+	.key-point:before {
+		line-height: 0.1;
+		font-size: 1px;
+		background: transparent url("/images/box/key-point_tr.gif") no-repeat top right;
+		margin: -15px -15px 0 -15px;
+		height: 15px;
+		display: block;
+		border: none;
+		content: url("/images/box/key-point_tl.gif");
+	}
+	.key-point {
+		background: #e4ecec url("/images/box/key-point_back.gif") right repeat-y;
+		padding: 15px;
+		margin-bottom: 1em;
+	} * html .key-point { height: 1px; }
+	.key-point:after {
+		display: block;
+		clear: both;
+		padding-top: 15px;
+		line-height: 0.1;
+		font-size: 1px;
+		content:  url("/images/box/key-point_bl.gif");
+		margin: -15px;
+		height: 8px;
+		background: transparent url("/images/box/key-point_br.gif") scroll no-repeat bottom right ;
+	}
+	
+	.key-point h2, .key-point h3, .key-point h4, .key-point h5 {
+		border: none;
+		margin-top: 0;
+		color: #4C5C5C;
+	}
+	
+	.news dt {
+		font-weight: normal;
+		color: #666;
+	}
+	.news dt a {
+		font-weight: bold;
+	}
+	
+	ul.compact {
+		margin-left: 0;
+		padding-left: 20px;
+	}
+			
+/* Emphasis */
+
+/* Computers - General */
+
+	kbd {
+		margin: 0.1em;
+		padding: 0.1em;
+		border: 1px #ccc;
+	}
+
+	kbd.command,
+	code.command {
+		color: #6B5839;
+	}
+
+/* Code */
+
+	pre.code {
+		background: #EEECF6;
+	}
+	
+	code > em,
+	code > strong,
+	pre.code > em,
+	pre.code > strong {
+		font-style: normal;
+	}
+
+/* Examples and Figures */
+
+	div.example {
+		border-color: #554FA0;
+	}
+	div.example:before {
+		color: #666;
+	}
+
+/* Q and A (FAQ) */
+
+ol.faq li a {
+	text-decoration: none;
+	border-bottom: 1px dotted #6C98EE;
+}
+
+ol.faq li a:hover {
+	border-color: #039;
+}
+
+	
+/* Tables */
+	table {
+		border-collapse: collapse;
+		border: none;
+		margin: 1em 0;
+	}
+	
+	th {
+		background: #ddd;
+		padding: 5px;
+		text-align: left;
+	}
+	
+	tr.table-title th {
+		font: 130% sans-serif;
+		font-weight: normal;
+		background: #666;
+		color: #fff;
+		border-top: 1px solid #666;
+		padding: 0.5em 10px;
+		text-align: center;
+	}
+
+	td {
+		border-top: 1px solid #ddd;
+		font-size: 85%;
+		padding: 5px;
+		text-align: left;
+	}
+
+	table.data thead th {
+		background: #e4ecec;
+		empty-cells: hide;
+	}
+
+	table.data th,
+	table.data td {
+		border: 1px solid #ccc;
+		font-size: 100%;
+		line-height: 130%;
+	}
+	
+	tr.odd {
+		background: #F5F5F5;
+	}
+
+/* Meta */
+
+	address {
+		color: #666;
+	}
+
+/* Product Specific CSS */
+
+	.productlist img.product-logo {
+		float: left;
+		margin: 0 10px 1em 0;
+	}
+	
+	.productlist h3 {
+		border: none;
+		clear: left;
+	}
+
+	.productlist p {
+		margin: 0.2em 0 2em 0;
+	}
+
+	.key-point h1, .key-point h3 {
+		margin: 0;
+	}
+	
+	#product-desc h2 {
+		text-indent: -700em;
+		height: 25px;
+		line-height: 2px;
+		font-size: 2px;
+	}
+	
+	#product-desc p {
+		padding-left: 170px;
+	}
+	
+	#product-desc ul, #key-desc {
+		padding-left: 190px;
+		margin-bottom: 0;		
+	}
+	
+	#product-side, #key-side {
+		margin-left: 65%;
+	}
+	
+	#product-side ul, #key-side ul {
+		margin-left: 0;
+		padding-bottom: 0;
+		padding-left: 20px;
+	}
+	
+	#product-side li, #key-side {
+		padding-bottom: 0.2em;
+	}
+	
+	#product-desc, #key-desc {
+		padding: 40px 0 25px 0;
+		color: #4C5C5C;
+		width: 60%;
+		float: left;
+		line-height: 140%;
+	}
+	
+	#key-desc {
+		padding: 0;
+	}
+	
+	#key-side {
+		color: #4C5C5C;
+	}
+	
+	.product-firefox {
+		background: url("/images/product-firefox-screen.png") no-repeat;
+	}
+	.product-thunderbird {
+		background: url("/images/product-thunderbird-screen.png") no-repeat;
+	}
+	
+	#product-side .download h3 {
+		color: #1D9101;
+		font-weight: bold;
+		margin: 0;
+		font-size: 140%;
+	}
+
+	.download h3 :link,
+	.download h3 :visited,
+	.download h3 :link:active, .download h3 :visited:active {
+		color: #1D9101;
+	}
+	
+	.download h3 :link:hover, .download h3 :visited:hover {
+		color: #156B01;
+	}
+	
+	.download li {
+		padding: 0;
+		margin: 0;
+	}
+	.download ul {
+		margin-top: 0;
+		margin-bottom: 0;
+		padding-bottom: 0;
+	}
+	.other {
+		padding-top: 3px;
+	}
+	.other a:link, .other a:visited { color: #515F78; }
+	.other a:hover { color: #000; }
+	
+	.configParent {
+		display: block;
+		font-size: 85%;
+	}
+
+
+/* Lists */
+
+dl {
+	margin-top: 0;
+}
+
+dt {
+	font-weight: bold;
+}
+
+dd {
+	margin: 0.2em 0 1em 1em;
+}
+
+/* Simple Logo Boxes */
+
+.firefox-logo, .thunderbird-logo {
+	padding-left: 72px;
+	min-height: 70px;
+	margin-bottom: 1em;
+	display: block; /* so this can be used for links */
+}
+
+* html .firefox-logo, * html .thunderbird-logo { height: 70px; } /* min-height for IE */
+
+.firefox-logo h2, .firefox-logo h3, .firefox-logo h4, .thunderbird-logo h2, .thunderbird-logo h3, .thunderbird-logo h4 {
+	border-bottom: none;
+}
+
+.firefox-logo {
+	background: url("/images/firefox-logo-64x64.png") no-repeat;
+}
+
+.thunderbird-logo {
+	background: url("/images/thunderbird-logo-64x64.png") no-repeat;
+}
+
+
+/* Firefox Page Styles */
+
+.product-thumb {
+	display: block;
+	margin: 15px 0 5px 0;
+	height: 70px;
+	border: 1px solid #666;
+	text-decoration: none;
+	opacity: 0.4;
+}
+
+.product-thumb:hover {
+	opacity: 1;
+}
+
+.thumb-firefox-tabs { background: url("/images/firefox-tabbedbrowsing-thumb.png") 0 0 no-repeat; }
+.thumb-firefox-live { background: url("/images/firefox-livebookmarks-thumb.png") 0 0 no-repeat; }
+.thumb-firefox-search { background: url("/images/firefox-searchbar-thumb.png") 100% 0 no-repeat; }
+
+.firefox-awards {
+	margin-top: 1em;
+	text-align: center;
+}
new file mode 100644
--- /dev/null
+++ b/src/css/rustico/template.css
@@ -0,0 +1,287 @@
+body {
+	margin: 0 0 1em 0;
+	padding: 0; /* need for Opera */
+	background: #fff;
+	color: #333;
+	min-width: 610px;
+}
+
+form { margin: 0; }
+img { border: 0; }
+
+
+/* Core site element widths */
+
+/*#header, #breadcrumbs, #content, #footer {
+	max-width: 1000px;
+	margin: 0 auto;
+}*/
+
+#header { padding: 0 50px; }
+#header ul { right: 0; } 
+* html #header ul { right: 50px; } 
+#breadcrumbs { padding: 0 50px; }
+#content { padding: 0 50px; }
+#footer { padding: 0 20px; margin: 0 50px; }
+
+#header div, #content, #breadcrumbs div, #footer, #main-feature .feature-contents {
+	max-width: 900px; margin: 0 auto;
+}
+
+#header div { position: relative; }
+
+/* header */
+
+#header {
+	height: 38px;
+	position: relative;
+	border-bottom: 1px solid #A1A6B1;
+	background: #33415D url("/images/template/header-background.png") top repeat-x;
+	z-index: 1;
+}
+
+#header h1 { margin: 0;	}
+
+#header h1 img {
+	font-weight: bold;
+	color: #7f7c45;
+}
+
+#header ul {
+	padding: 0;
+	margin: 0;
+	list-style: none;
+	border-left: 1px solid #576178;
+	border-right: 1px solid #1f2635;
+	position: absolute;
+	top: 0;
+}
+
+#header li {
+	float: left;
+	padding: 0;
+	margin: 0;
+}
+
+#header ul a:link, #header ul a:visited {
+	display: block;
+	float: left;
+	padding: 10px 15px;
+	text-decoration: none;
+	border-right: 1px solid #576178;
+	border-left: 1px solid #1f2635;
+	color: #dee0e5;
+	height: 36px;
+	voice-family: "\"}\"";
+	voice-family: inherit;
+	height: 16px;
+} #ignored {}
+
+#header ul li a:hover {
+	background: #475470;
+	color: #fff;
+	text-decoration: underline;
+}
+
+
+/* breadcrumbs */
+
+#breadcrumbs {
+	background: #F7F8F8 url("/images/template/breadcrumbs-background.png") bottom repeat-x;
+	padding-top: 4px;
+	padding-bottom: 30px;
+	font-size: 85%;
+	color: #999;
+}
+
+#breadcrumbs a:link,
+#breadcrumbs a:visited {
+	color: #666;
+}
+
+#breadcrumbs a:hover,
+#breadcrumbs a:active {
+	color: #333;
+}
+
+
+/* content */
+
+#content {
+	background: #fff;
+}
+
+/* Sidebar */
+
+#nav:before {
+	line-height: 0.1;
+	font-size: 1px;
+	background: transparent url("/images/template/menu_tr.gif") no-repeat top right;
+	margin: 0;
+	height: 9px;
+	display: block;
+	border-bottom: 1px solid #ddd;
+	content: url("/images/box/key-point_tl.gif");
+}
+#nav {
+	background: #E0E9E9 url("/images/template/menu_back.gif") right repeat-y;
+}
+#nav:after {
+	display: block;
+	padding-top: 0;
+	line-height: 0.1;
+	font-size: 1px;
+	content:  url("/images/box/key-point_bl.gif");
+	margin: 0 0 0 0;
+	height: 8px;
+	background: transparent url("/images/template/menu_br.gif") scroll no-repeat bottom right ;
+	border-top: 1px solid #fff;
+}
+
+#nav, #nav ul {
+	margin: 0;
+	padding: 0;
+	list-style: none;
+}
+#nav {
+	margin-bottom: 1em;
+}	
+#nav li {
+	display: inline;
+	padding: 0;
+	margin: 0;
+}
+
+#nav li span { /* used for un-linked menu items */
+	display: block;
+	padding: 6px 10px;
+	font-weight: bold;
+	color: #666;
+}
+#nav li span#configParent, #nav li span #configuration {
+	display: inline;
+	font-weight: normal;
+	padding: 0;
+}
+	
+#nav li a {
+	display: block;
+	padding: 8px 10px;
+  font-weight: bold;
+	text-decoration: none;
+	background: #EDF2F2;
+	border-bottom: 1px solid #ddd;
+	border-top: 1px solid #fff;
+	border-right: 1px solid #ddd;
+}
+#nav li a:hover {
+	background: #E0E9E9;
+}
+	
+#nav li li span { /* used for un-linked menu items */
+	padding: 4px 8px 4px 20px;
+}
+
+#nav li li a {
+	padding: 6px 8px 6px 20px;
+  font-weight: normal;
+}
+	
+#nav li li li a {
+	padding: 6px 8px 6px 30px;
+  font-weight: normal;
+}
+	
+#oN {
+	background-color: #E0E9E9;
+}
+#oN:hover {
+	background-color: #C6DCDC;
+}
+
+
+/* footer */
+
+#footer {
+	clear: both;
+	margin-top: 3em;
+	margin-bottom: 1em;
+	color: #888;
+	padding: 25px 50px;	
+	text-align: center;
+}
+
+#footer-contents {
+	padding: 0;
+	border-top: 1px solid #C9D0E0;
+}
+
+#footer ul#footer-menu {
+	position: relative;
+	top: -0.8em;
+	margin: 0 1em 0 1em;
+	padding: 0;
+	list-style-type: none;
+}
+
+#footer ul#footer-menu li {
+	display: inline;
+	background: #fff;
+	margin: 0 1em;
+}
+
+#footer ul#footer-menu li a {
+	margin: 0 1em;
+	white-space: nowrap;
+}
+
+#footer p {
+	margin: 0.3em;
+	clear: both;
+}
+
+#footer .site-tools {
+	display: none;
+}
+
+.small-print {
+	font-size: 85%;
+	color: #888;
+}
+
+.small-print a:link,
+.small-print a:visited {
+	color: #888;
+}
+
+.small-print a:hover,
+.small-print a:active {
+	color: #333;
+}
+
+#locales {
+	margin: 0 auto 1.5em auto;
+	width: 610px;
+	line-height: 160%;
+}
+
+#locales p {
+	display: inline;
+	margin: 0;
+	padding: 0 0.3em 0 0;
+}
+
+#locales ul {
+	display: inline;
+	margin: 0;
+	padding: 0;
+}
+
+#locales li {
+	padding: 0 0.3em 0 0;
+	display: inline;
+}
+
+#locales li a {
+	white-space: nowrap;
+}
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..769c636340e11f9d2a0b7eb6a84d574dd9563f0c
GIT binary patch
literal 580
zc$@)50=xZ*P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz)=5M`RCwBA
z{Qv(y10?_;fS8au@87>?@9gaSt*os4-<6T^zln*-e<1(Y>eZ{a-@A8D7MlS80mJ}u
z0SKQtbH>fs*!aH-1H=C_K)ecw?*efe5W7I}s#U9Y!PLVrKmdV>nKNfT1{(H16si$K
zmjm&CV+al6D=8`c7X*o+82}JK4A3z64>JJB_`e(E3S)?2<zN>X{|^lf1sei(+1<Me
zFarPr2&}oIqvIC?)OL^o?-&p^!wh-{#k-;2f_VoZfS{%bLi}zFF<>UtAY{W<LBj?n
zz6$CsfB=HI;P*^44eyZn#$YcBg1rF~2L~`P&;bI75#$0;v@zVf$It;Z4d`qJS0Dzu
zh@l)BQx!mb7Roj*FK2kaXAgtR*|Q9LfP8=e0=od{pY0$UI-sVXf!f>w#jt?wfcn3@
zy!=0d5|Evi_8%aC7~Z{m#}1AKK|~<_M{=g1px}QcP=ErR57Iaj7$e5OumVLr$n^jL
z1djz!sJcLHd57c@W2lWFi_p^m2m=HVoB>kgf@C|$pqa*ykjAAMgaHBwo)>`0c=vmt
z+g3yQpuk*x7A(#H^u|wInF%0(FiZq_r2`t3pnwGh6fWCA7$ATcDb3CR0R{jJCzQv)
SYsoAC0000<MNUMnLSTYrIq9PS
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e5ab6ac97c6d0c60da2ff85a280b4522a2c95596
GIT binary patch
literal 992
zc$^hc4@{J07(c-B;zlrzSXOh%Xlm9pmL*vUco0_#)F>p3F<25Kg@zDojTl2I3b#;+
z0Bs`XTuzfDQDNX&1G>~n^S<xyzJK=}-@p6*-JkEf?>i2--g|y~o@ej7XTSINKELnE
zO5RCHekR#qFr-+EEgyiM0W!y!1Zv}`2^<o}%J!8PuC1+wLZM(VsH&<4Lf2PTR#sP6
zmzS3#kw`2S3x~tHt}BWXjYj=`|I*Tu+wJ!Gd<?_DFf589K@b>*xm+%f$3uEN9Lv%)
zjiM+7K^TU^PFN5GQIu3wfgp!0%U-XS1Hp2T0}2KMk}T<(PSLc$3n3+h69nRROOhlA
zJVjF|il~Yj0CR!h5(OTo7>4Bqf%K9jNWevUovt_#6m`ZskU@%)$TAE~(G1J*JTHkN
zMbWY(k)%fg3MAR*;}yWGC@2yKhGQ`76nGxc1%h$lI05Ex3}ac2zzGyVXqs|BklT&u
zy2kr_1cAF;PA3clWs0IA2&#la2!gO22bKubc}P+V#{oGUIEFJU3$`Oll0V>g!p?A5
z)52k1;5G1hP4oK$Zp0l5DLgOG6s4#t%drl~LEyNL_qCp`8w0jI(Og{FVlbG@@k}rb
zjXVu5*B`a+FI@k~^jv0UrWxN<0(^a7wd9xYvR`=k;g@7h+T(;ZvGJTK+hVkCu{3Y3
z?yW-q9It{7Lnx}2HrX0v`p7S#d%IgOcj}07_C09x+=6$^`^SGj?z=T|-(0bna9zyZ
zzvn!s-5p-bOPa_TZ76SOEv%ZZ7=8Ct_~c^ed>WqfSCVZY*95z=Zdk_;o|wC_?Th})
zr?v%d6K`wO=QFLh@9b#%$!sq=vgummOE09GZX*2&O}kDE51U$$?E1%E-|%Elu0EK0
zxO;KJ`SBZPuz9Ee-y2EWvG?M?JC8@~@WRM_TSs<!<f-<IZ;P@X<{jOW_Ivt)w%V?V
zt}{Q^)>l_T8TJAXTU>IXV}5Jpfaww!v0Z;Nb>oBfM|FQsG6yG;ONaWtn*Q{)XNT_%
zGz<+NI*%nT#L9!w)&5u8r$3YLka>w`V<*vEqA5^$mPu_BP9Li&YrnbKXlu<ky385f
zZ<Y1(J&imXMQbbG-}vG`=f*!;Cl5lq5A|uk?!>O%O%XdTzT7L8T-_eFT*Emuv(O*;
zTE4ttx~@k)zFL&u$Iack;@e*Pih7{$(u_KoT#=TS<?qiUC}ZN5b=8Z;=I8y3$2#rC
rsj2Q+`)|g{&RP5S#;KK3cqW!KY4{}igZ@oDaNA%lEU{cEsOkD2_GE?H
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5bd2c94616ce1e804cb675386f8f7e0c19146abd
GIT binary patch
literal 2744
zc%1E3eN0<b6hDt|fu$Ii(Yb^*n<k4<8F7CtVhX|r$wmN)U&-deV(k9eG-5KyrWI#a
zGd81!X#7a{NYuoz1gHO?#zbMT78q`_&5hC)+EPke=)Ld0M?aw6ciWA(_g*0;{<)jH
zcl*vgAHVZE=bnC4U$=i#{-gN-u&K7Ds*&zG0Pa{`CjHfNt^FL`9(uFpmA3&39+4gn
zzWiEGg;{S@9IOE7zi=wn@EQF!9Ia_Q2+;O8fcXP}NP_P30PpMu@E-x#`vpMpiBDe}
z+6Ryc^#_`&sZAo0=>E1p5Ef?xf`3W8<0B3~nF$E)px_M&zC~dnEC!Ldh{d6)@W?b8
zwufy_Y;~Y97an)vt26kTo4@YnZ_SaLUjDX^OwE&NKXC;F=K`4x3Z9TKWDgHdqs#X2
zhyx8zhp#x0&4sN_H0r`OCmNr@f4TXIS$y5Y|Lx%?z5ER?f6GU1&hh{F$enp&_Y-G8
za4e9yMZq5y=a+;aUcNeur~JfC5iSWKEC#W-y1KfuvJ#KSW3gB?8jVCE%gf86C<=l=
z2;q4iV~h}@`ND(sV6k<H+fz@s#+Jsq7ZU&Xg1)B;-vY=PtgWhOI(fU<b=1fKH#mC1
znww{6dCmykn9IofMptC?oian^TxM3$-t7kS%LnQsRPBuQbx5l9@9sfV@lc7uJV8&+
zj8pS{hnpk^zvRkf_qlx1!Mt>M4KmmFRJYVg=4F?<kqkj|S(S$>?$kXYsZPpl275l1
zF!M`N<QJLgGrjkl?w3pllu#_$W93xzv@*xFJdU$G&KA?x4|2m#3OcFLsA-j3k1Gal
zN0Lx6BgLP)A+mnVpW+$xER;=+2(=$+XUWBLDQhMqk#;$4fzIg}Iraj%Y%`O2<b1Ry
zF}0>t22Lvx?R>R0zsT6}<M)!_B^6dX1>-|ng=OwtMn?Cuv=G)VsStK4z{L`cZm>Mu
z7tf*Tp)D!8cAaO?FvwC9byV4=B#Jd({CO!<?_;W_NH)@*L<&eU*4Xb-LEdK(NILi|
zP1}2{@|r=rztSnwUy#$u%6wRTD_UYIi7IxfBdyMFD}@@YTdJW`38$<lQmiO>rLL5|
zK2Mu(@2<ODV%gePp0i$g*V^FETxAqhH}gnuFzY`|-u4?MnW?gMbvmfRaZT3)F-Sv!
zr9rRCwcpaECR)>P+evP%7uZpU$&*dl>izjFXid6_Kekb)!Sy-N9&e@~rMr1En^<k{
zN<)G*V(Z47ZjeJXOVMcQ4Vv9->a|6)H=I#utHi76%6X2a9cKe7w4ExQD7{PBy^Am@
xyHI(D$~BK{nmVc@diPJ~NK^Db5TL122=-rhY&+&J{7(AUtgWuAx>$Ln{a*o<gysMM
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4327861bb6845ea279f1fb7ed9e3e652839c7bef
GIT binary patch
literal 3026
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0afde1efd3a690417b9afe239a57303f2284bed9
GIT binary patch
literal 94
zc${<hbhEHb<X})?Si}GV|NsBLaP#JamoI?~1{hHM$->CMz`~#d;(*jLFe`iPQrYv)
m)H1bZdaB3vPomd)#WbhASed0Zdzbe2Qy;Hi+AxiQ!5RR&&>|cF
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d88a5a84fbcf53c18bdebf772c820a7daf31dd0c
GIT binary patch
literal 384
zc${<hbhEHbyui-EaD)K_{{R1f=jqey4<1~*fB*cA8|SWHfAI3<{TDAT-MV$^(xnp@
zE*w99{@A&5N6((U^W@2;n>TMgcyRUBtru_JJbn4{{l||#fBgcQz<>iN{$ycfU=U}}
z0dYWfGO+%ApxBp^IWJ??x}4Yh3Utnw<le7X_rB)+{{ssOJanY`Pb?`qnPWBo!io~F
zwNdMDtSLMFwrY0Ap>iL++2>zusXCjt`~HU=HGb=FzyGnP&c4RsM?+&%b4zPmdq-zi
zcTaC$|AdK?Y?uWnPoFV!*6cZR=gnWRaM9u=OP6VK3NK&1X6?H58#Zp*yk+aQ?K_lM
zxWsnu+kfETp~FXx9y@;GWCaViDC4OM7cX7Da`oEv8#iwiF|n}mo@3;B{N(Ag=PzEq
zdj00@yZ0YHe)|07>$mSee*XIX=kLG&49r|I9vc=MY~~QwiaD`i;o)`xWv@9N8y6kz
amN3q`b7JG-<Nchn9t#o_8%_!^SOWl4bk>mo
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0ceb90eea5ffadb22fb99afefc3d6e6f12258748
GIT binary patch
literal 107
zc${<hbhEHb<Y3@p*vtR||NsBLaP#JamoM+XcyZ^+lWTYHzI^}w{?n%)zkYr5;lsC|
zKY#!E15^W6%b@s^g^_`Qmq7=_0hz(TBC%oX<cJ+c`g5MX3p&`~yKn-Fli4w?9eFGa
F)&K*YGqC^w
new file mode 100644
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+  <head>
+    <title>SeaMonkey Project</title>
+  </head>
+
+    <div id="mBody">
+      <h1>Heading 1</h1>
+      <p class="first">First para</p>
+      <p>Ordinary paragraph</p>
+      
+      <h2>Heading 2</h2>
+      <p class="first">First paragraph</p>
+      <p>Ordinary paragraph</p>
+      
+      <h3>Heading 3</h3>
+      <p class="first">First paragraph</p>
+      <p>Ordinary paragraph</p>
+      
+    </div>
+
+    <div id="footer">
+      <p>(CC) Some Rights Reserved (Insert proper Create Commons Deed
+      linkage here)</p>
+    </div>
+  </body>
+</html>
+[%- # vim: set expandtab tabstop=2 shiftwidth=2 textwidth=76 autoindent: -%]
new file mode 100644
--- /dev/null
+++ b/src/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: