Browse Source

Initial revision

Unknown 18 years ago
commit
87a3a35730

+ 41 - 0
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.

+ 2 - 0
bin/build

@@ -0,0 +1,2 @@
+# cvs -q update -d -P
+ttree -f etc/ttree.cfg $@

+ 59 - 0
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);

+ 1 - 0
bin/build.bat

@@ -0,0 +1 @@
+ttree -f etc/ttree.cfg %*

+ 95 - 0
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
+

+ 1 - 0
etc/ttree.dep

@@ -0,0 +1 @@
+* : sidebar.tmpl

+ 139 - 0
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

+ 38 - 0
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;
+%]

+ 5 - 0
lib/config.tmpl

@@ -0,0 +1,5 @@
+[% true = 1 %]
+[% false = 0 %]
+
+[%# Default values for page variables. %]
+[% page.stylesheets = [] %]

+ 235 - 0
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>

+ 39 - 0
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: -%]

+ 45 - 0
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>

+ 157 - 0
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 -%]

+ 95 - 0
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;
+	}

+ 562 - 0
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;
+}

+ 287 - 0
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;
+}

BIN
src/favicon.ico


BIN
src/images/template/breadcrumbs-background.png


BIN
src/images/template/feature-back.png


BIN
src/images/template/header-background.png


BIN
src/images/template/menu_back.gif


BIN
src/images/template/menu_br.gif


BIN
src/images/template/menu_tr.gif


+ 28 - 0
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: -%]

+ 2 - 0
src/robots.txt

@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: