<!--

Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

-->

{% extends "layout.html" %}
{% set title = 'Download' %}
{% set url = 'https://media.readthedocs.org/%s/couchdb/%s/couchdb.%s' %}
{% if git_branch == 'master' %}
  {% set rtd_ver = 'latest' %}
{% else %}
  {% set rtd_ver = git_branch %}
{% endif %}

{% block body %}
<h1>Download Apache CouchDB™ {{ release }} Documentation</h1>

<p>To download an archive containing all the documents for this version of
CouchDB in one of various formats, follow one of links in this table</p>

<table class="docutils">
  <tr>
     <td>PDF (A4 paper size)</td>
     <td><a href="{{ url|format('pdf', rtd_ver, 'pdf') }}">Download</a> (~1 MB)</td>
  </tr>
  <tr>
     <td>HTML</td>
     <td><a href="{{ url|format('htmlzip', rtd_ver, 'zip') }}">Download</a> (~5 MB)</td>
  </tr>
  <tr>
    <td>EPUB</td>
    <td><a href="{{ url|format('epub', rtd_ver, 'epub') }}">Download</a> (~1 MB)</td>
  </tr>
</table>

<p>These archives contain all the content of the documentation.</p>

{% endblock %}
