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

<head>
  {% if SERVER_LESS %}
  <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/style.css">
  {% else %}
  <link rel="stylesheet/less" type="text/css" href="{{ SITEURL }}/theme/css/style.less">
  <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/2.2.0/less.min.js" type="text/javascript"></script>
  {% endif %}

  <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/pygments.css">
  <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">

  <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 %}">

  {% if GOOGLE_PLUS_URL %}
  <link rel="author" href="{{ GOOGLE_PLUS_URL }}?rel=author">
  {% endif %}

  {% 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>

<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>
      <ul>
        {% for name, link in SOCIAL %}

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

        {% set class = 'fa-external-link-square' %}

        {% if MANGLE_EMAILS and temp.startswith('mailto:') %}
        <li><a data-email="{{ link|reverse }}" title="You need javascript enabled to view this email" href="#" class="email" target="_blank">{{ name }}<i class="fa fa-envelope fa-lg"></i></a></li>
        {% else %}

        {# 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 %}

        <li><a href="{{ link }}" target="_blank">{{ name }}<i class="fa {{ class }} fa-lg"></i></a></li>
        {% endif %}
        {% endfor %}
      </ul>
      <ul>
        {% for name, link in LINKS %}
        <li><a href="{{ link }}" target="_blank">{{ name }}<i class="fa fa-external-link-square fa-lg"></i></a></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" target="_blank">Pelican</a>. Theme is <a href="https://github.com/pR0Ps/pelican-subtle" target="_blank">subtle</a> by <a href="http://cmetcalfe.ca" target="_blank">Carey Metcalfe</a>. Based on <a href="https://github.com/giulivo/pelican-svbhack" target="_blank">svbhack</a> by Giulio Fidente.</p>
    </div>
  </main>

  {% block scripts %}
  {% if SCROLL_TO_CONTENT %}
  <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>
  {% endif %}

  {% 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")
        if (email){
          e[i].href = email.split("").reverse().join("");
          e[i].removeAttribute("data-email");
          e[i].removeAttribute("title");
          e[i].removeAttribute("class");
        }
      }
    })
  </script>
  {% endif %}
  {% endblock scripts %}
</body>
</html>
