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;
+
+ " » ";
+
+ 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 0000000000000000000000000000000000000000..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 0000000000000000000000000000000000000000..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 0000000000000000000000000000000000000000..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 0000000000000000000000000000000000000000..4327861bb6845ea279f1fb7ed9e3e652839c7bef
GIT binary patch
literal 3026
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
new file mode 100644
index 0000000000000000000000000000000000000000..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 0000000000000000000000000000000000000000..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 0000000000000000000000000000000000000000..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: