{% comment %}
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to you 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.
{% endcomment %}
<article>
  <h2>
    <a href="{{ site.baseurl }}{{ post.url }}">
      {{ post.title }}
    </a>
  </h2>
  <span class="post-category">
    <span class="label">
      {{ post.categories | array_to_sentence_string }}
    </span>
  </span>
  <div class="post-meta">
    <span class="post-date">
      {{ post.date | date_to_string }}
    </span>
    {% capture homepage %}http://people.apache.org/~{{ post.author }}{% endcapture %}
    {% capture avatar %}http://people.apache.org/~{{ post.author }}/{{ post.author }}.jpg{% endcapture %}
    {% for c in site.data.contributors %}
      {% if c.apacheId == post.author %}
        {% if c.homepage %}
          {% assign homepage = c.homepage %}
        {% else %}
          {% capture homepage %}http://github.com/{{ c.githubId }}{% endcapture %}
        {% endif %}
        {% if c.avatar %}
          {% assign avatar = c.avatar %}
        {% else %}
          {% capture avatar %}http://github.com/{{ c.githubId }}.png{% endcapture %}
        {% endif %}
      {% endif %}
    {% endfor %}
    <a href="{{ homepage }}" class="post-author">
      <img src="{{ avatar }}"
           class="avatar" alt="{{ post.author }} avatar"
           width="24" height="24">
      {{ post.author }}
    </a>
  </div>
  <div class="post-content">
    {{ post.content }}
    {% if post.categories contains 'release' %}
        {% if post.component == 'avatica-go' %}
        <p>See the <a href="{{ site.baseurl }}/docs/go_history.html#{{ post.tag }}">release notes</a>;
            <a href="{{ site.baseurl }}/downloads/avatica-go.html#source-releases">download</a> the release.</p>
        {% else %}
        <p>See the <a href="{{ site.baseurl }}/docs/history.html#{{ post.tag }}">release notes</a>;
            <a href="{{ site.baseurl }}/downloads/avatica.html#source-releases">download</a> the release.</p>
        {% endif %}
    {% endif %}
  </div>
</article>
