========
 Themes
========

Sigal themes are created using the `Jinja2`_ templating system.

.. _Jinja2: http://jinja.pocoo.org/docs/

Bundled themes
~~~~~~~~~~~~~~

Sigal comes with three themes, located in the ``sigal/themes`` folder:

**colorbox**:
    `source <http://www.jacklmoore.com/colorbox>`__, `demo
    <http://saimon.org/sigal-demo/colorbox/>`__. This theme uses a Swipe plugin
    to browse pictures on touch devices.

**galleria**:
    `source <http://galleria.io/>`__, `demo
    <http://saimon.org/sigal-demo/galleria/>`__. This theme is based on the
    classic theme, pictures can be browsed with left/right keys, fullscreen
    support is available with the `f` key, and a map can be shown with the `m`
    key if the ``show_map`` setting is True. The ``leaflet_provider`` setting
    can be used to customize the tile provider (using `Leaflet-providers
    <https://github.com/leaflet-extras/leaflet-providers#providers>`_).

**photoswipe**:
    `source <http://photoswipe.com/>`__, `demo
    <http://saimon.org/sigal-demo/photoswipe/>`__.

The ``themes`` folder also includes a ``default`` theme. This theme cannot be
used on its own, instead, it contains Jinja2 templates that are used by the
bundled themes to enable functionality such as the feeds and ZIP gallery
plugins, as well as settings such as Google Analytics.

Creating a theme
~~~~~~~~~~~~~~~~

Sigal requires the following two templates in order to generate a gallery.
These templates must be located in ``THEME_DIR/templates``:

- ``album_list.html``: Generates the album list, if you have multiple albums
- ``album.html``: Generates each individual album page

Themes may also include static content such as CSS and JavaScript by placing
this content in the ``THEME_DIR/static`` folder. You can then access this
content in your template by using the ``theme.url`` variable.

Custom themes may also include the templates available in the ``default``
theme.

Variables
~~~~~~~~~

You can use the following variables in your template:

``album``
    The current album that is rendered in the HTML file, represented by an
    :class:`~sigal.gallery.Album` object.  ``album.medias`` contains the list
    of all medias in the album (represented by the
    :class:`~sigal.gallery.Image` and :class:`~sigal.gallery.Video` objects,
    inherited from :class:`~sigal.gallery.Media`).

``index_title``
    Name of the index. This is either the directory name or the title specified
    in the ``index.md`` of the ``source`` directory.

``settings``
    The entire dictionary from ``sigal.conf.py``.

``sigal_link``
    URL to the Sigal homepage.

``theme.name``, ``theme.url``
    Name and url of the currently used theme.

Filters
~~~~~~~

You can define custom jinja filters for your template by creating a ``filters.py`` script
at the root of your template directory.

This script will then be imported and all defined functions will be available as jinja filters
with the same names in your templates.

Documentation of sigal's main classes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. autoclass:: sigal.gallery.Album
   :members:
   :undoc-members:
   :inherited-members:

.. autoclass:: sigal.gallery.Media
   :members:
   :undoc-members:

.. autoclass:: sigal.gallery.Image
   :members:
   :undoc-members:
   :inherited-members:

.. autoclass:: sigal.gallery.Video
   :members:
   :undoc-members:
   :inherited-members:

.. _simple-exif-data:

Simpler EXIF data output
~~~~~~~~~~~~~~~~~~~~~~~~

Because the tags in the ``media.raw_exif`` dictionary are a little bit
cumbersome to use, some common tags are extracted and formatted for easy use in
templates. If available, you can use:

``media.exif.iso``
    The ISO speed rating.

``media.exif.focal``
    The focal length, formatted as a decimal number.

``media.exif.exposure``
    The exposure time formatted as a fractional number, e.g. "1/500".

``media.exif.fstop``
    The aperture value given as an F-number and formatted as a decimal.

``media.exif.datetime``
    The time the image was *taken*. It is formatted with the
    ``datetime_format`` setting, which is ``%c`` by default.
    See Python's `datetime documentation`_ for a list of all possible values.

``media.exif.dateobj``
    The time the image was *taken*. It is a datetime object, that can be
    formatted with ``strftime``:

    .. code-block:: jinja

        {% if media.exif.dateobj %}
            {{ media.exif.dateobj.strftime('%A, %d. %B %Y') }}
        {% endif %}

    This will output something like "Monday, 25. June 2013", depending on your
    locale.

``media.exif.gps``
    If not None, the dict contains two keys ``lat`` and ``lon`` denoting the
    GPS coordinates of the location where the image was taken. ``lat`` will
    always be referenced to the north pole whereas ``lon`` will be referenced to
    east to the prime meridan. To provide a link on an OpenStreetMap you could
    write a template like this:

    .. code-block:: jinja

        {% if media.exif.gps %}
            <a href="https://www.openstreetmap.org/?mlat={{
                media.exif.gps.lat }}&mlon={{
                media.exif.gps.lon }}#map=18/{{
                media.exif.gps.lat }}/{{
                media.exif.gps.lon }}">Go to location (OpenStreetMap)</a>
        {% endif %}


.. _datetime documentation: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
