<!DOCTYPE html>
<html lang="{{ DEFAULT_LANG }}">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="author" content="{{ AUTHOR }}">
  <meta name="description" content="{% block description %}Posts by {{ AUTHOR }}{% endblock %}">

  {% assets filters="pyscss,cssmin", output="css/style.%(version)s.min.css", "css/style.scss", "css/pygments.css" %}
  <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/{{ ASSET_URL }}">
  {% endassets %}
  <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">

  {% if FEED_ALL_ATOM %}
  <link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Full Atom Feed" />
  {% endif %}
  {% if FEED_ALL_RSS %}
  <link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Full RSS Feed" />
  {% endif %}

  {% block head %}
  <meta name="keywords" content="
    {%- if GLOBAL_KEYWORDS -%}
      {{ GLOBAL_KEYWORDS|join(', ') }}
      {%- if tags -%}{{', '}}{%- endif -%}
    {%- endif -%}
    {{tags|join(', ', attribute='0') }}">
  {% endblock %}

  <title>
    {% block title %}{{ SITENAME }}{% endblock %}
  </title>

  {% include "modules/analytics.html" %}
</head>

{% macro get_icon(link) %}
  {%- set class = 'fa-external-link-square' -%}

  {# Attempt to normalize link URLs #}
  {%- set temp = link|lower|replace('http://', '')|replace('https://', '')|replace('www.', '') -%}

  {# Choosing a specific link icon #}
  {%-  if temp.startswith('bitcoin:') %}{% set class = 'fa-btc' %}
  {% elif temp.startswith('irc:') %}{% set class = 'fa-comments' %}
  {% elif temp.startswith('mailto:') %}{% set class = 'fa-envelope' %}
  {% elif temp.startswith('skype:') %}{% set class = 'fa-skype' -%}

  {%- elif temp.endswith('.pdf') or
           temp.endswith('.txt') or
           temp.endswith('.doc') or
           temp.endswith('.docx') %}{% set class = 'fa-file-text' -%}

  {%- elif temp.startswith('bitbucket.org') %}{% set class = 'fa-bitbucket' %}
  {% elif temp.startswith('delicious.com') %}{% set class = 'fa-delicious' %}
  {% elif temp.startswith('deviantart.com') %}{% set class = 'fa-deviantart' %}
  {% elif temp.startswith('facebook.com') %}{% set class = 'fa-facebook' %}
  {% elif temp.startswith('flickr.com') %}{% set class = 'fa-flickr' %}
  {% elif temp.startswith('foursquare.com') %}{% set class = 'fa-foursquare' %}
  {% elif temp.startswith('github.com') %}{% set class = 'fa-github' %}
  {% elif temp.startswith('instagram.com') %}{% set class = 'fa-instagram' %}
  {% elif temp.startswith('last.fm') %}{% set class = 'fa-lastfm' %}
  {% elif temp.startswith('linkedin.com') %}{% set class = 'fa-linkedin' %}
  {% elif temp.startswith('news.ycombinator.com') %}{% set class = 'fa-hacker-news' %}
  {% elif temp.startswith('pinterest.com') %}{% set class = 'fa-pinterest' %}
  {% elif temp.startswith('plus.google.com') %}{% set class = 'fa-google-plus' %}
  {% elif temp.startswith('reddit.com') %}{% set class = 'fa-reddit' %}
  {% elif temp.startswith('spotify.com') %}{% set class = 'fa-spotify' %}
  {% elif temp.startswith('stackoverflow.com') %}{% set class = 'fa-stack-overflow' %}
  {% elif temp.startswith('steamcommunity.com') %}{% set class = 'fa-steam' %}
  {% elif temp.startswith('soundcloud.com') %}{% set class = 'fa-soundcloud' %}
  {% elif temp.startswith('twitch.tv') %}{% set class = 'fa-twitch' %}
  {% elif temp.startswith('twitter.com') %}{% set class = 'fa-twitter' %}
  {% elif temp.startswith('vimeo.com') %}{% set class = 'fa-vimeo-square' %}
  {% elif temp.startswith('vine.co') %}{% set class = 'fa-vine' %}
  {% elif temp.startswith('youtube.com') %}{% set class = 'fa-youtube' -%}

  {%- elif '.stackexchange.com' in temp %}{% set class = 'fa-stack-exchange' %}
  {% elif '.tumblr.com' in temp %}{% set class = 'fa-tumblr' %}
  {% endif -%}

  <i class="fa {{ class }} fa-lg"></i>
{%- endmacro -%}

{%- macro display_link(name, link, text) -%}
  {%- if MANGLE_EMAILS and link.startswith('mailto:') -%}
  <a data-email="{{ link|reverse }}"{% if not text %} data-title="{{ name }}"{% endif %} title="You need javascript enabled to view this email" class="email">{{ text }}{{ get_icon(link) }}</a>
  {%- else -%}
  <a href="{{ link }}"{% if not text %} title="{{ name }}"{% endif %}>{{ text }}{{ get_icon(link) }}</a>
  {%- endif -%}
{%- endmacro -%}

<body>
  <aside>
    <div id="user_meta">
      <a href="{{ SITEURL }}">
        {% if USER_LOGO_URL %}
        <img src="{{ USER_LOGO_URL }}" alt="logo" id="logo">
        {% endif %}
      </a>
      <h2><a href="{{ SITEURL }}" class="nohover">{{ SITENAME }}</a></h2>
      <p>{{ TAGLINE }}</p>
      <div class="social">
        {% for name, link in SOCIAL %}
          {{ display_link(name, link, "") }}
        {% endfor %}
      </div>
      <ul>
        {% for name, link in LINKS %}
        <li>{{ display_link(name, link, name) }}</li>
        {% endfor %}
      </ul>
    </div>
  </aside>

  <main id="main">
    <header>
      {% block header %}
      <p id="header">
      <a href="{{ SITEURL }}">Home</a>
      
      {% for p in pages|sort %}
      {% if p.url != "index.html" %}
      &#124; <a href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a>
      {% endif %}
      {% endfor %}
      {% if INDEX_SAVE_AS and INDEX_SAVE_AS != "index.html" %}
      &#124; <a href="{{ SITEURL }}/{{ INDEX_SAVE_AS }}">Blog</a>
      {% endif %}
      {% if FEED_ALL_ATOM %}
      &#124; <a href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}">Atom Feed</a>
      {% endif %}
      {% if FEED_ALL_RSS %}
      &#124; <a href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}">RSS Feed</a>
      {% endif %}
      </p>
      {% endblock header %}
      {% block subheader %}{% include "modules/blogsubheader.html" %}{% endblock subheader %}
    </header>

    {% block content %}
    {% endblock %}

    {% block footer %}
    {% endblock %}

    <div id="ending_message">
        <p>&copy; {{ AUTHOR }}. Built using <a href="http://getpelican.com">Pelican</a>. Theme is <a href="https://github.com/pR0Ps/pelican-subtle">subtle</a> by <a href="http://cmetcalfe.ca">Carey Metcalfe</a>. Based on <a href="https://github.com/giulivo/pelican-svbhack">svbhack</a> by Giulio Fidente.</p>
    </div>
  </main>

  {% block scripts %}
  <script type="text/javascript">
    window.addEventListener('load', function(){
    if (window.location.pathname != '/' && window.location.pathname != '/index.html'){
      window.scroll(0, document.getElementById('main').offsetTop);
    }})
  </script>

  {% if MANGLE_EMAILS %}
  <script type="text/javascript">
    window.addEventListener('load', function(){
      var e = document.querySelectorAll(".email");
      for (var i = 0; i < e.length; i++) {
        var email = e[i].getAttribute("data-email")
        var title = e[i].getAttribute("data-title")
        if (email){
          e[i].href = email.split("").reverse().join("");
          e[i].removeAttribute("data-email");
          e[i].removeAttribute("data-title");
          e[i].removeAttribute("class");
          if (title){
            e[i].setAttribute("title", title);
          }
          else{
            e[i].removeAttribute("title");
          }
        }
      }
    })
  </script>
  {% endif %}
  {% endblock scripts %}
</body>
</html>
