{% 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 %}
    {% capture discard %}
      {% for c in site.data.contributors %}
        {% if c.apacheId == post.author %}
          {% if c.homepage %}
            {% assign homepage = c.homepage %}
          {% else %}
            {% capture homepage %}https://github.com/{{ c.githubId }}{% endcapture %}
          {% endif %}
          {% if c.avatar %}
            {% assign avatar = c.avatar %}
          {% else %}
            {% capture avatar %}https://github.com/{{ c.githubId }}.png{% endcapture %}
          {% endif %}
        {% endif %}
      {% endfor %}
    {% endcapture %}{% assign discard = nil %}
    <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' %}
    <p>See the <a href="{{ site.baseurl }}/docs/history.html#{{ post.tag }}">release notes</a>;
      <a href="{{ site.baseurl }}/downloads#source-releases">download</a> the release.</p>
    {% endif %}
  </div>
</article>
