@c -*- coding: utf-8; mode: texinfo; -*-
@node Website work
@chapter Website work

@menu
* Introduction to website work::
* Uploading and security::
* Debugging website and docs locally::
* Translating the website::
@end menu


@node Introduction to website work
@section Introduction to website work

The website is @emph{not} written directly in HTML;
instead it is autogenerated along with the documentation through a
sophisticated setup, using Texinfo source files.  Texinfo is the
standard for documentation of GNU software and allows generating
output in HTML, PDF, and Info formats, which drastically reduces
maintenance effort and ensures that the website content is
consistent with the rest of the documentation.  This makes the
environment for improving the website rather different from common
web development.

If you have not contributed to LilyPond before, a good starting
point might be incremental changes to the CSS file, to be found at
@uref{http://lilypond.org/css/lilypond-website.css} or in the
LilyPond source code at @file{./Documentation/css/lilypond-website.css}.

Large scale structural changes tend to require familiarity with
the project in general, a track record in working on LilyPond
documentation as well as a prospect of long-term commitment.

The Texinfo source file for generating HTML are to be found in

@example
Documentation/web.texi
Documentation/web/*.texi
@end example

Unless otherwise specified, follow the instructions and policies
given in @ref{Documentation work}.  That chapter also contains a
quick introduction to Texinfo; consulting an external Texinfo
manual should be not necessary.

@subheading Exceptions to the documentation policies

@itemize

@item
Sectioning: the website only uses chapters and sections; no
subsections or subsubsections.

@item
@@ref@{@}s to other manuals (@@ruser, @@rlearning, etc): you can't
link to any pieces of automatically generated documentation, like
the IR or certain NR appendices.

@item
The bibliography in Community->Publications is generated automatically
from @file{.bib} files; formatting is done automatically by
@file{texi-web.bst}.

@item
@dots{}

@item
For anything not listed here, just follow the same style as the
existing website texinfo files.

@end itemize


@node Uploading and security
@section Uploading and security

@subheading Overall idea

To reduce the CPU burden on the shared host (as well as some
security concerns), we do not compile all of LilyPond.  The
website build process runs @code{texi2html}, but all media files
(be they graphical @code{lilypond} output, photos of people, or
pdfs) are copied from the @code{$LILYPOND_WEB_MEDIA_GIT}
repository.

All scripts and makefiles used for the website build are run from
a @qq{trusted} copy.  Any modification to those files in git needs
a human to review the changes (after they have been made in git)
before they are used on the server.


@subheading Building the website (quick local)

Initial setup: make sure that you have the environment variables
@code{$LILYPOND_GIT}, @code{$LILYPOND_BUILD_DIR} and
@code{$LILYPOND_WEB_MEDIA_GIT} set up correctly.  For more
information, see @ref{Environment variables}.

Once that is done,

@example
cd $LILYPOND_BUILD_DIR
make website
@end example

The website is in @file{out-website/website/index.html}.


@subheading Building the website (exactly as on the server)

@subsubheading Setting up (exactly as on the server)

Initial setup: you still need @code{$LILYPOND_GIT} and
@code{$LILYPOND_WEB_MEDIA_GIT}.

Once that's done, create:

@example
mkdir -p $HOME/lilypond/
mkdir -p $HOME/lilypond/bin/
mkdir -p $HOME/lilypond/cron/
mkdir -p $HOME/lilypond/trusted-scripts/
@end example

The add these files to @file{$HOME/lilypond/bin/}:

Update git repositories:

@smallexample
@verbatim
### update-git.sh
#!/bin/sh
cd $LILYPOND_GIT
git fetch origin
git merge origin/master
cd $LILYPOND_WEB_MEDIA_GIT
git fetch origin
git merge origin/master
@end verbatim
@end smallexample

Check for any updates to trusted scripts / files:

@smallexample
@verbatim
### check-git.sh
#!/bin/sh
DEST=$HOME/lilypond/trusted-scripts
diff -u $DEST/website.make \
  $LILYPOND_GIT/make/website.make
diff -u $DEST/lilypond-texi2html.init \
  $LILYPOND_GIT/Documentation/lilypond-texi2html.init
diff -u $DEST/extract_texi_filenames.py \
  $LILYPOND_GIT/scripts/build/extract_texi_filenames.py
diff -u $DEST/create-version-itexi.py \
  $LILYPOND_GIT/scripts/build/create-version-itexi.py
diff -u $DEST/create-weblinks-itexi.py \
  $LILYPOND_GIT/scripts/build/create-weblinks-itexi.py
diff -u $DEST/mass-link.py \
  $LILYPOND_GIT/scripts/build/mass-link.py
diff -u $DEST/website_post.py \
  $LILYPOND_GIT/scripts/build/website_post.py
diff -u $DEST/bib2texi.py \
  $LILYPOND_GIT/scripts/build/bib2texi.py
diff -u $DEST/langdefs.py \
  $LILYPOND_GIT/python/langdefs.py
diff -u $DEST/lilypond.org.htaccess \
  $LILYPOND_GIT/Documentation/web/server/lilypond.org.htaccess
diff -u $DEST/website-dir.htaccess \
  $LILYPOND_GIT/Documentation/web/server/website-dir.htaccess
@end verbatim
@end smallexample

If the changes look ok, make them trusted:

@smallexample
@verbatim
### copy-from-git.sh
#!/bin/sh
DEST=$HOME/lilypond/trusted-scripts
cp $LILYPOND_GIT/make/website.make \
  $DEST/website.make
cp $LILYPOND_GIT/Documentation/lilypond-texi2html.init \
  $DEST/lilypond-texi2html.init
cp $LILYPOND_GIT/scripts/build/extract_texi_filenames.py \
  $DEST/extract_texi_filenames.py
cp $LILYPOND_GIT/scripts/build/create-version-itexi.py \
  $DEST/create-version-itexi.py
cp $LILYPOND_GIT/scripts/build/create-weblinks-itexi.py \
  $DEST/create-weblinks-itexi.py
cp $LILYPOND_GIT/scripts/build/mass-link.py \
  $DEST/mass-link.py
cp $LILYPOND_GIT/scripts/build/website_post.py \
  $DEST/website_post.py
cp $LILYPOND_GIT/scripts/build/bib2texi.py \
  $DEST/bib2texi.py
cp $LILYPOND_GIT/python/langdefs.py \
  $DEST/langdefs.py
cp $LILYPOND_GIT/Documentation/web/server/lilypond.org.htaccess \
  $DEST/lilypond.org.htaccess
cp $LILYPOND_GIT/Documentation/web/server/website-dir.htaccess \
  $DEST/website-dir.htaccess
@end verbatim
@end smallexample

Build the website:

@smallexample
@verbatim
### make-website.sh
#!/bin/sh
DEST=$HOME/web/
BUILD=$HOME/lilypond/build-website
mkdir -p $BUILD
cd $BUILD
cp $HOME/lilypond/trusted-scripts/website.make .

make -f website.make WEBSITE_ONLY_BUILD=1 website
rsync -raO $BUILD/out-website/website/ $DEST/website/
cp $BUILD/out-website/pictures $DEST
cp $BUILD/out-website/.htaccess $DEST
@end verbatim
@end smallexample

Then in the @file{cronjob/} directory, put the cronjob to automate
the trusted portions:

@warning{@code{cron} will not inherit environment variables from
your main setup, so you must re-define any variables inside your
@code{crontab}.}

@smallexample
@verbatim
# website-rebuild.cron
LILYPOND_GIT=   ... fill this in
LILYPOND_WEB_MEDIA_GIT=   ... fill this in

11 * * * * $HOME/lilypond/trusted-scripts/update-git.sh >/dev/null 2>&1
22 * * * * $HOME/lilypond/trusted-scripts/make-website.sh >/dev/null 2>&1
@end verbatim
@end smallexample

As the final stage of the setup, run your @code{copy-from-git.sh}
script, assuming that you trust the current state of scripts in
lilypond git.

@subsubheading Normal maintenance

When there is a change to the build scripts and/or website
makefile, log in to the server (or your own home machine if you're
testing this there), and do

@example
update-git.sh
check-git.sh
@end example

After reviewing the changes carefully, you can update the trusted
scripts with @code{copy-from-git.sh}.


@subsubheading Building the website (exactly as on the server)

Run @code{make-website.sh}; the final version ends up in
@file{$HOME/web/}.

On the actual server, the website is generated hourly by user
@code{graham} the host @code{lilypond.org}.  You can set up the
cronjob by doing:

@example
crontab $HOME/lilypond/website-rebuild.cron
@end example


@subheading Initial setup for new users on actual serve

You should symlink your own @file{~/lilypond/} to
@file{~graham/lilypond/}

If this directory does not exist, make it.  Git master should go
in @file{~/lilypond/lilypond-git/} but make sure you enable:

@example
git config core.filemode false
@end example

If you have created any files in @file{~graham/lilypond/} then
please run:

@example
chgrp lilypond ~graham/lilypond/ -R
chmod 775 ~graham/lilypond/ -R
@end example



@subsubheading Additional information

Some information about the website is stored in
@file{~graham/lilypond/*.txt}; this information should not be
shared with people without trusted access to the server.


@node Debugging website and docs locally
@section Debugging website and docs locally

@itemize
@item
Install Apache (you can use version 2, but keep in mind that the server
hosting lilypond.org runs version 1.3).  These instructions
assume that you also enable @code{mod_userdir}, and use
@code{$HOME/public_html} as DocumentRoot (i.e. the root directory of
the web server).

@item
Build the online docs and website:

@example
make WEB_TARGETS="offline online" doc
make website
@end example

This will make all the language variants of the website.  To save
a little time, just the English version can be made with the
command @code{make WEB_LANGS='' website} or the English and (for
example) the French with @code{make WEB_LANGS='fr' website}.

@item
Choose the web directory where to copy the built stuff.
If you already have other web projects in your DocumentRoot and don't
need to test the @file{.htaccess} file, you can copy to
@code{~/public_html/lilypond.org}.  Otherwise you'd better copy
to @code{~/public_html}.
It's highly recommended to have your build dir and web dir on the
same partition.

@item
Add the directory for the online documentation:

@example
mkdir -p ~/public_html/doc/v2.19/
@end example

You may want to add also the stable documentation in
@code{~/public_html/doc/v2.18/}, extracting the contents of the html
directory present in the tarball available in @rweb{All}. Just in case
you want to test the redirects to the stable documentation.

@item
Copy the files with rsync:

@example
rsync -av --delete out-website/website ~/public_html/
cp out-website/.htaccess ~/public_html
rsync -av --delete out-www/online-root/ ~/public_html/doc/v2.19/
@end example

@end itemize


@node Translating the website
@section Translating the website

As it has much more audience, the website should be translated before
the documentation; see @ref{Translating the documentation}.

In addition to the normal documentation translation practices,
there are a few additional things to note:

@itemize

@item
Build the website with:

@example
make website
@end example

@noindent
however, please note that this command is not designed for being
run multiple times.  If you see unexpected output (mainly the page
footers getting all messed up), then delete your
@file{out-website} directory and run @code{make website} again.

@item
Some of the translation infrastructure is defined in python files;
you must look at the @code{### translation data} sections in:

@example
scripts/build/create-weblinks-itexi.py
scripts/build/website_post.py
@end example

@item
Translations are not included by default in @code{make website}.
To test your translation, edit the @code{WEB_LANGUAGES =} line in
@file{python/langdefs.py}.  You will need to copy this updated
script to @code{$LILYPOND_BUILD_DIR/python/out}.

Do not submit a patch to add your language to this file unless
@code{make website} completes with fewer than 5 warnings.

@item
Links to manuals are done with macros like
@code{@@manualDevelLearningSplit}.  To get translated links, you
must change that to @code{@@manualDevelLearningSplit-es} (for
es/Spanish translations, for example).

@end itemize

