Full Code of gfidente/pelican-svbhack for AI

master 60a7f3fe0e1a cached
21 files
27.2 KB
8.5k tokens
1 requests
Download .txt
Repository: gfidente/pelican-svbhack
Branch: master
Commit: 60a7f3fe0e1a
Files: 21
Total size: 27.2 KB

Directory structure:
gitextract_1ip4l591/

├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── static/
│   └── css/
│       ├── pygments.css
│       ├── style.css
│       └── style.less
└── templates/
    ├── archives.html
    ├── article.html
    ├── author.html
    ├── authors.html
    ├── base.html
    ├── categories.html
    ├── category.html
    ├── index.html
    ├── modules/
    │   ├── analytics.html
    │   ├── idl.html
    │   └── pagination.html
    ├── page.html
    ├── tag.html
    └── tags.html

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*~


================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2012 William Ting
Copyright (c) 2013 Giulio Fidente

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: Makefile
================================================
# Install using:
#
#   pip install pygments
#
# built in styles: ['monokai', 'manni', 'rrt', 'perldoc', 'borland', 'colorful',
# 'default', 'murphy', 'vs', 'trac', 'tango', 'fruity', 'autumn', 'bw', 'emacs',
# 'vim', 'pastie', 'friendly', 'native']

STYLE = default

pygments:
	pygmentize -S ${STYLE} -f html > ./static/css/pygments.css


================================================
FILE: README.md
================================================
# SVBHACK

pelican-svbhack is a responsive theme for [Pelican](http://getpelican.com), it is my hack of a svbtle-like theme.

## DEMO

You can see the [theme in action](http://www.gfidente.com/).

![theme screenshot](https://raw.github.com/gfidente/pelican-svbhack/master/screenshot.png)

## FEATURES

- responsive
- syntax highlighting for pre blocks
- supports google analytics and [matomo](https://matomo.org/)
- custom list of links
- supports the [readtime](https://github.com/getpelican/pelican-plugins/tree/master/readtime) plugin

## KNOWN ISSUES

- no IE testing
- no custom menu

## INSTALL

Clone the [repository](https://github.com/gfidente/pelican-svbhack), edit your `pelicanconf.py` and modify the `THEME` variable to make it point to the downloaded theme location.

## PELICANCONF.PY

Supports a number of common global variables but patches are welcomed if you need better support.

- `GOOGLE_ANALYTICS` to use Google Analytics, set this var to your UA-XYZ code

- `MATOMO_URL` to use Matomo, set this var to your server, e.g. "analytics.example.com" (no protocol prefix)

- `MATOMO_SITE_ID` to use Matomo, set this var to your site ID, e.g. "1"

- `USER_LOGO_URL` to replace the logo placeholder, put your logo in content/images/your_logo.png and make this var point to `SITEURL + '/static/images/your_logo.png'`

- `ROUND_USER_LOGO` set this to `True` to crop your logo to a circle and add a black border

- `HIDE_USER_LOGO` set this to `True` to hide the placeholder without adding your logo

- `USE_GENERIC_FONT_FAMILIES` set this to `True` to use generic font families and avoid using Google Fonts

- `DISQUS_SITENAME` set this to your Disqus sitename to enable disqus comments in articles

- `TAGLINE` some text rendered right below the logo

- `INTERNET_DEFENSE_LEAGUE` set this to `True` if you want to enable the [Internet Defense League](http://internetdefenseleague.org) code

When developing locally, you may want to set the following variable: `SITEURL = http://localhost:8000`

## MODIFICATIONS

- Accent color can be changed by editing `@accent` in `./static/css/style.less`.
- A different Pygmentize theme can be used by editing `./Makefile` and running `make pygments`.

## AUTHOR

pelican-svbhack is authored by Giulio Fidente.

## LICENSE

Released under MIT License, full details in `LICENSE` file.


================================================
FILE: static/css/pygments.css
================================================
.hll { background-color: #ffffcc }
.c { color: #408080; font-style: italic } /* Comment */
.err { border: 1px solid #FF0000 } /* Error */
.k { color: #008000; font-weight: bold } /* Keyword */
.o { color: #666666 } /* Operator */
.cm { color: #408080; font-style: italic } /* Comment.Multiline */
.cp { color: #BC7A00 } /* Comment.Preproc */
.c1 { color: #408080; font-style: italic } /* Comment.Single */
.cs { color: #408080; font-style: italic } /* Comment.Special */
.gd { color: #A00000 } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.gr { color: #FF0000 } /* Generic.Error */
.gh { color: #000080; font-weight: bold } /* Generic.Heading */
.gi { color: #00A000 } /* Generic.Inserted */
.go { color: #888888 } /* Generic.Output */
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.gt { color: #0044DD } /* Generic.Traceback */
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.kp { color: #008000 } /* Keyword.Pseudo */
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.kt { color: #B00040 } /* Keyword.Type */
.m { color: #666666 } /* Literal.Number */
.s { color: #BA2121 } /* Literal.String */
.na { color: #7D9029 } /* Name.Attribute */
.nb { color: #008000 } /* Name.Builtin */
.nc { color: #0000FF; font-weight: bold } /* Name.Class */
.no { color: #880000 } /* Name.Constant */
.nd { color: #AA22FF } /* Name.Decorator */
.ni { color: #999999; font-weight: bold } /* Name.Entity */
.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.nf { color: #0000FF } /* Name.Function */
.nl { color: #A0A000 } /* Name.Label */
.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.nt { color: #008000; font-weight: bold } /* Name.Tag */
.nv { color: #19177C } /* Name.Variable */
.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.w { color: #bbbbbb } /* Text.Whitespace */
.mf { color: #666666 } /* Literal.Number.Float */
.mh { color: #666666 } /* Literal.Number.Hex */
.mi { color: #666666 } /* Literal.Number.Integer */
.mo { color: #666666 } /* Literal.Number.Oct */
.sb { color: #BA2121 } /* Literal.String.Backtick */
.sc { color: #BA2121 } /* Literal.String.Char */
.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.s2 { color: #BA2121 } /* Literal.String.Double */
.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.sh { color: #BA2121 } /* Literal.String.Heredoc */
.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.sx { color: #008000 } /* Literal.String.Other */
.sr { color: #BB6688 } /* Literal.String.Regex */
.s1 { color: #BA2121 } /* Literal.String.Single */
.ss { color: #19177C } /* Literal.String.Symbol */
.bp { color: #008000 } /* Name.Builtin.Pseudo */
.vc { color: #19177C } /* Name.Variable.Class */
.vg { color: #19177C } /* Name.Variable.Global */
.vi { color: #19177C } /* Name.Variable.Instance */
.il { color: #666666 } /* Literal.Number.Integer.Long */


================================================
FILE: static/css/style.css
================================================
body {
  margin: 0;
  padding: 0;
  background-color: #ffffff;
  color: #4d4d4d;
  font-family: 'PT Sans', sans-serif;
  font-size: 18px;
}
a {
  color: #000000;
  text-decoration: none;
}
hr {
  color: #eeeeee;
  background-color: #eeeeee;
  height: 1px;
  border: none;
}
img {
  max-width: 100%;
}
table {
  border-collapse: collapse;
}
th,
td {
  padding: 4px;
  border-width: thin;
  border-style: solid;
}
.round-img {
  border-radius: 50%;
  padding: 2px;
  border: 10px solid;
}
aside div#user_meta {
  padding: 40px;
  text-align: center;
}
aside div#user_meta h2 {
  margin: 15px 0 5px 0;
}
aside div#user_meta p {
  margin: 0 0 15px 0;
  font-size: .8rem;
}
aside div#user_meta ul {
  margin: 40px 0 0 0;
  padding-left: 0;
  font-size: .9rem;
  list-style-type: none;
}
aside div#user_meta ul li {
  display: inline;
  line-height: 3em;
}
aside div#user_meta ul li a {
  padding: 5px 15px 5px 15px;
  border: 3px solid #eeeeee;
  border-radius: 15px;
  -moz-border-radius: 15px;
  -webkit-border-radius: 15px;
  color: #999999;
}
main header {
  padding: 40px;
  border-top: #eeeeee 1px solid;
  border-bottom: #eeeeee 1px solid;
}
main header p {
  font-weight: bold;
  font-size: .6rem;
  text-transform: uppercase;
}
main article {
  max-width: 640px;
  padding: 40px;
}
main article div.article_text {
  line-height: 1.375em;
}
main article div.article_text a {
  text-decoration: underline;
}
main article div.article_text code {
  margin: 2px;
  padding: 0;
  color: #000000;
  font-size: .8rem;
  font-family: 'PT Mono', monospace;
  background: #eeeeee;
}
main article div.article_text pre {
  margin: 22px 2px 22px 2px;
  padding: 2px;
  color: #000000;
  border-left: 3px solid #0e94ec;
  font-size: .8rem;
  font-family: 'PT Mono', monospace;
  background: #eeeeee;
  line-height: 1.125em;
  overflow-x: auto;
}
main article div.article_text blockquote {
  margin: 22px 2px 22px 2px;
  padding-left: 40px;
  color: #999999;
  font-style: italic;
}
main article div.article_text div.quoteblock {
  border-left: 5px solid #eeeeee;
  color: #999999;
  margin-bottom: 1.5em;
  margin-left: 1em;
  margin-right: 10%;
  margin-top: 1em;
  padding-left: 1em;
}
main article div.article_text div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}
main article div.article_text div.imageblock {
  margin: 5px;
  border: 1px solid #eeeeee;
  padding: 5px;
}
main article div.article_text figure {
  margin: 5px;
  border: 1px solid #eeeeee;
  padding: 5px;
}
main article div.article_text figcaption {
  text-align: center;
}
main article div.article_text h1 a.headerlink,
main article div.article_text h2 a.headerlink,
main article div.article_text h3 a.headerlink,
main article div.article_text h4 a.headerlink {
  visibility: hidden;
}
main article div.article_text h1:hover a.headerlink,
main article div.article_text h2:hover a.headerlink,
main article div.article_text h3:hover a.headerlink,
main article div.article_text h4:hover a.headerlink {
  visibility: visible;
}
main article div.gist {
  line-height: .875em;
}
main article div.article_meta, div.article_readtime {
  font-size: .7rem;
  color: #999999;
}
main footer {
  border-top: #eeeeee 1px solid;
  padding: 40px;
}
main footer a.button_accent {
  padding: 10px;
  border: 2px solid #0e94ec;
  border-radius: 20px;
  -moz-border-radius: 20px;
  -webkit-border-radius: 20px;
  text-transform: uppercase;
  color: #0e94ec;
  font-size: 1rem;
}
main footer a.button_accent:hover {
  color: #ffffff;
  background-color: #0e94ec;
}
main footer a.button_accent:active {
  color: #ffffff;
  background-color: #0e94ec;
}
main div#ending_message {
  border-top: #eeeeee 1px solid;
  padding: 0 40px 0 40px;
  color: #999999;
  font-size: .6rem;
}
@media screen and (min-width: 1024px) {
  aside {
    width: 25%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;
    border-right: #eeeeee 1px solid;
  }
  aside h2 {
    margin: 10px 0 0 0;
  }
  aside div#user_meta {
    max-width: 192px;
    text-align: right;
  }
  aside div#user_meta ul li {
    display: block;
  }
  main {
    width: 75%;
    position: absolute;
    top: 0;
    left: 25%;
    overflow-x: hidden;
    overflow-y: hidden;
  }
  main article {
    max-width: 640px;
  }
  main header {
    border-top: 0;
  }
}


================================================
FILE: static/css/style.less
================================================
@red:  #ff0000;
@black:  #000000;
@white:  #ffffff;
@light-grey:  #eeeeee;
@med-grey:  #999999;
@dark-grey:  #4d4d4d;
@blue:  #0e94ec;
@accent:  @blue;
@sans: 'PT Sans', sans-serif;
@serif: 'PT Serif', serif;
@mono: 'PT Mono', monospace;

body {
  margin: 0;
  padding: 0;
  background-color: @white;
  color: @dark-grey;
  font-family: @sans;
  font-size: 18px;
}

a {
  color: @black;
  text-decoration: none;
}

hr {
  color: @light-grey;
  background-color: @light-grey;
  height: 1px;
  border: none;
}

.border-radius (@radius: 5px) {
  border-radius: @radius;
  -moz-border-radius: @radius;
  -webkit-border-radius: @radius;
}

img {
  max-width: 100%;
}

table {
    border-collapse: collapse;
}

th, td {
    padding: 4px;
    border-width: thin;
    border-style: solid;
}

.round-img {
  border-radius: 50%;
  padding: 2px;
  border: 10px solid;
}

aside {
  div#user_meta {
    padding: 40px;
    text-align: center;

    h2 {
      margin: 15px 0 5px 0;
    }

    p {
      margin: 0 0 15px 0;
      font-size: .8rem;
    }

    ul {
      margin: 40px 0 0 0;
      padding-left: 0;
      font-size: .9rem;
      list-style-type: none;

      li {
        display: inline;
        line-height: 3em;

        a {
          padding: 5px 15px 5px 15px;
          border: 3px solid @light-grey;
          .border-radius(15px);
          color: @med-grey;
        }
      }
    }
  }
}

main {
  header {
    padding: 40px;
    border-top: @light-grey 1px solid;
    border-bottom: @light-grey 1px solid;

    p {
      font-weight: bold;
      font-size: .6rem;
      text-transform: uppercase;
    }
  }

  article {
    max-width: 640px;
    padding: 40px;

    div.article_title {
    }

    div.article_text {
      line-height: 1.375em;
      a {
        text-decoration: underline;
      }

      code {
        margin: 2px;
        padding: 0;
        color: @black;
        font-size: .8rem;
        font-family: @mono;
        background: @light-grey;
      }

      pre {
        margin: 22px 2px 22px 2px;
        padding: 2px;
        color: @black;
        border-left: 3px solid @accent;
        font-size: .8rem;
        font-family: @mono;
        background: @light-grey;
        line-height: 1.125em;
        overflow-x: auto;
      }

      blockquote {
        margin: 22px 2px 22px 2px;
        padding-left: 40px;
        color: @med-grey;
        font-style: italic;
      }

      // quoteblock and attribution are used by the asciidoc backend.
      div.quoteblock {
        border-left: 5px solid @light-grey;
        color: @med-grey;
        margin-bottom: 1.5em;
        margin-left: 1.0em;
        margin-right: 10%;
        margin-top: 1.0em;
        padding-left: 1.0em;
      }
      div.quoteblock > div.attribution {
        padding-top: 0.5em;
        text-align: right;
      }

      // imageblock is used by the asciidoc backend.
      div.imageblock {
        margin: 5px;
        border: 1px solid @light-grey;
        padding: 5px;
      }

      // figure and figcaption are used by the markdown_captions markdown extension.
      figure {
        margin: 5px;
        border: 1px solid @light-grey;
        padding: 5px;
      }
      figcaption {
	text-align: center;
      }

      h1, h2, h3, h4 {
        a.headerlink {
	  visibility:hidden;
        }
      }
      h1:hover, h2:hover, h3:hover, h4:hover {
        a.headerlink {
	  visibility:visible;
        }
      }
    }

    div.gist {
      line-height: .875em;
    }

    div.article_meta, div.article_readtime {
      font-size: .7rem;
      color: @med-grey;
    }
  }

  footer {
    border-top: @light-grey 1px solid;
    padding: 40px;

    a.button_accent {
      padding: 10px;
      border: 2px solid @accent;
      .border-radius(20px);
      text-transform: uppercase;
      color: @accent;
      font-size: 1rem;
      &:hover {
        color: @white;
        background-color: @accent;
      }
      &:active {
        color: @white;
        background-color: @accent;
      }
    }

    div#paginator {
    }
  }

  div#ending_message {
    border-top: @light-grey 1px solid;
    padding: 0 40px 0 40px;
    color: @med-grey;
    font-size: .6rem;
  }
}

@media screen and (min-width: 1024px) {
  aside {
    width: 25%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;
    border-right: @light-grey 1px solid;

    h2 {
      margin: 10px 0 0 0;
    }

    div#user_meta {
      max-width: 192px;
      text-align: right;

      ul {
        li {
          display: block;
        }
      }
    }
  }

  main {
    width: 75%;
    position: absolute;
    top: 0;
    left: 25%;
    overflow-x: hidden;
    overflow-y: hidden;

    article {
      max-width: 640px;
    }

    header {
      border-top: 0;
    }
  }
}


================================================
FILE: templates/archives.html
================================================
{% extends "base.html" %}
{% block title %}– Archives{% endblock %}

{% block content %}
<article>
  <div class="article_text">
    <dl>
      {% for article in dates %}
      <dt>{{ article.locale_date }}</dt>
      <dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
      {% endfor %}
    </dl>
  </div>
</article>
{% endblock %}


================================================
FILE: templates/article.html
================================================
{% extends "base.html" %}
{% block head %}
<meta name="keywords" content="{{ article.tags|join(', ')  }}">
{% endblock %}

{% block title %}&ndash; {{ article.title }}{% endblock %}

{% block content %}
<article>
  <div class="article_title">
    <h1><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></h1>
  </div>
  <div class="article_meta">
    <p>Posted on: {{ article.locale_date }}</p>
  </div>
  {% if article.readtime %}
  <div class="article_readtime">
    <p>Estimated read time: {{article.readtime.minutes}} minutes</p>
  </div>
  {% endif %}
  <div class="article_text">
    {{ article.content }}
  </div>
  <div class="article_meta">
    <p>Category: <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>
      {% if article.tags %} &ndash; Tags:
      {% for tag in article.tags %}
      <a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>{% if not loop.last %},{% endif %}
      {% endfor %}
      {% endif %}
    </p>
  </div>

  {% if DISQUS_SITENAME %}
  <div id="article_comments">
    <div id="disqus_thread"></div>
    <script type="text/javascript">
        var disqus_identifier = "{{ article.url }}";
        (function() {
             var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
             dsq.src = '//{{ DISQUS_SITENAME }}.disqus.com/embed.js';
             (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
         })();
    </script>
  </div>
  {% endif %}

</article>
{% endblock %}


================================================
FILE: templates/author.html
================================================
{% extends "index.html" %}
{% block title %}&ndash; Posts by: {{ author }}{% endblock %}

{% block header %}
&gt; Author: {{ author }}
{% endblock %}


================================================
FILE: templates/authors.html
================================================
{% extends "base.html" %}
{% block title %}&ndash; Authors{% endblock %}

{% block content %}
<article>
  <div class="article_text">
    <ul>
      {% for author, articles in authors|sort %}
      <li><a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> ({{ articles|count }})</li>
      {% endfor %}
    </ul>
  </div>
</article>
{% endblock %}


================================================
FILE: templates/base.html
================================================
<!DOCTYPE html>
<html lang="{{ DEFAULT_LANG }}">

<head>
  <!-- ## for client-side less
  <link rel="stylesheet/less" type="text/css" href="{{ SITEURL }}/theme/css/style.less">
  <script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/1.7.3/less.min.js" type="text/javascript"></script>
  -->
  <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/style.css">
  <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/pygments.css">
  {% if not USE_GENERIC_FONT_FAMILIES %}
  <link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=PT+Sans|PT+Serif|PT+Mono">
  {% endif %}

  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="author" content="{{ AUTHOR }}">
  <meta name="description" content="Posts and writings by {{ AUTHOR }}">

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

  {% block head %}
  {% endblock %}

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

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

<body>
  <aside>
    <div id="user_meta">
      {% if not HIDE_USER_LOGO %}
      <a href="{{ SITEURL }}">
        {% if USER_LOGO_URL %}
        <img src="{{ USER_LOGO_URL }}" alt="logo"
        {%- if ROUND_USER_LOGO %} class="round-img"{% endif %}>
        {% else %}
        <img src="{{ SITEURL }}/theme/images/logo.png" alt="logo">
        {% endif %}
      </a>
      {% endif %}
      <h2><a href="{{ SITEURL }}">{{ SITENAME }}</a></h2>
      <p>{{ TAGLINE }}</p>
      <ul>
        {% for title, link in MENUITEMS %}
        <li><a href="{{ link }}">{{ title }}</a></li>
        {% endfor %}
        {% if DISPLAY_PAGES_ON_MENU %}{% for p in pages %}
        <li><a href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a></li>
        {% endfor %}{% endif %}
        {% if DISPLAY_CATEGORIES_ON_MENU %}{% for c, _ in categories %}
        <li><a href="{{ SITEURL }}/{{ c.url }}">{{ c }}</a></li>
        {% endfor %}{% endif %}
        {% for name, link in LINKS %}
        <li><a href="{{ link }}" target="_blank">{{ name }}</a></li>
        {% endfor %}
        {% for name, link in SOCIAL %}
        <li><a href="{{ link }}" target="_blank">{{ name }}</a></li>
        {% endfor %}
      </ul>
    </div>
  </aside>

  <main>
    <header>
      <p>
      <a href="{{ SITEURL }}">Index</a> &brvbar; <a href="{{ SITEURL }}/archives.html">Archives</a>
      {% if FEED_ALL_ATOM %}
      &brvbar; <a href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}">Atom</a>
      {% endif %}
      {% if FEED_ALL_RSS %}
      &brvbar; <a href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}">RSS</a>
      {% endif %}
      {% block header %}
      {% endblock header %}
      </p>
    </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 by Giulio Fidente on <a href="https://github.com/gfidente/pelican-svbhack" target="_blank">github</a>. {% if INTERNET_DEFENSE_LEAGUE %}Member of the <a href="http://internetdefenseleague.org">Internet Defense League</a>.{% endif %}</p>
    </div>
  </main>
  {% include "modules/idl.html" %}
</body>
</html>


================================================
FILE: templates/categories.html
================================================
{% extends "base.html" %}
{% block title %}&ndash; Categories{% endblock %}

{% block content %}
<article>
  <div class="article_text">
    <ul>
      {% for category, articles in categories|sort %}
      <li><a href="{{ SITEURL }}/{{ category.url }}">{{ category }}</a> ({{ articles|count }})</li>
      {% endfor %}
    </ul>
  </div>
</article>
{% endblock %}


================================================
FILE: templates/category.html
================================================
{% extends "index.html" %}
{% block title %}&ndash; Category: {{ category }}{% endblock %}

{% block head %}
{% if CATEGORY_FEED_ATOM %}
<link href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_ATOM|replace("{slug}", category.slug) }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} {{ category }} Category Atom" />
{% endif %}
{% if CATEGORY_FEED_RSS %}
<link href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_RSS|replace("{slug}", category.slug) }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} {{ category }} Category RSS" />
{% endif %}
{% endblock %}

{% block header %}
&gt; Category: {{ category }}
{% if CATEGORY_FEED_ATOM %}
&brvbar; <a href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_ATOM|replace("{slug}", category.slug) }}">Atom</a>
{% endif %}
{% if CATEGORY_FEED_RSS %}
&brvbar; <a href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_RSS|replace("{slug}", category.slug) }}">RSS</a>
{% endif %}
{% endblock %}


================================================
FILE: templates/index.html
================================================
{% extends "base.html" %}
{% block content %}
{% for article in articles_page.object_list %}
<article>
  <div class="article_title">
    <h1><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></h1>
  </div>
  <div class="article_meta">
    <p>Posted on: {{ article.locale_date }}</p>
  </div>
  {% if article.readtime %}
  <div class="article_readtime">
    <p>Estimated read time: {{article.readtime.minutes}} minutes</p>
  </div>
  {% endif %}
  <div class="article_text">
    {{ article.summary }}
  </div>
</article>
{% if not loop.last %}
<hr />
{% endif %}
{% endfor %}
{% endblock %}

{% block footer %}
<footer>
  {% include "modules/pagination.html" %}
</footer>
{% endblock %}


================================================
FILE: templates/modules/analytics.html
================================================
{% if GOOGLE_ANALYTICS %}
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', '{{ GOOGLE_ANALYTICS }}']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>
{% endif %}
{% if MATOMO_URL %}
<script type="text/javascript">
  var _paq = window._paq || [];
  /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="//{{ MATOMO_URL }}/";
    _paq.push(['setTrackerUrl', u+'matomo.php']);
    _paq.push(['setSiteId', '{{ MATOMO_SITE_ID }}']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
  })();
</script>
{% endif %}


================================================
FILE: templates/modules/idl.html
================================================
{% if INTERNET_DEFENSE_LEAGUE %}
<script type="text/javascript">
  window._idl = {};
  _idl.variant = "banner";
  (function() {
    var idl = document.createElement('script');
    idl.type = 'text/javascript';
    idl.async = true;
    idl.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'members.internetdefenseleague.org/include/?url=' + (_idl.url || '') + '&campaign=' + (_idl.campaign || '') + '&variant=' + (_idl.variant || 'banner');
    document.getElementsByTagName('body')[0].appendChild(idl);
  })();
</script>
{% endif %}


================================================
FILE: templates/modules/pagination.html
================================================
{% if DEFAULT_PAGINATION %}
<div id="paginator">
{% if articles_page.has_next() %}
<a href="{{ SITEURL }}/{{ page_name }}{{ articles_page.next_page_number() }}.html" class="button_accent">&larr; Older Posts</a>
{% endif %}

{% if articles_page.has_previous() %}
{% if articles_page.previous_page_number() == 1 %}
<a href="{{ SITEURL }}/{{ page_name }}.html" class="button_accent">Newer Posts &rarr;</a>
{% else %}
<a href="{{ SITEURL }}/{{ page_name }}{{ articles_page.previous_page_number() }}.html" class="button_accent">Newer Posts &rarr;</a>
{% endif %}
{% endif %}
</div>
{% endif %}


================================================
FILE: templates/page.html
================================================
{% extends "base.html" %}
{% block title %}&ndash; {{ page.title }}{% endblock %}

{% block content %}
<article>
  <div class="article_title">
    <h1><a href="{{ SITEURL }}/{{ page.url }}">{{ page.title }}</a></h1>
  </div>
  <div class="article_text">
    {{ page.content }}
  </div>
  <div class="article_meta">
    <p>Updated on: {{ page.locale_date }}</p>
  </div>
</article>
{% endblock %}


================================================
FILE: templates/tag.html
================================================
{% extends "index.html" %}
{% block title %}&ndash; Tag: {{ tag }}{% endblock %}

{% block head %}
{% if TAG_FEED_ATOM %}
<link href="{{ FEED_DOMAIN }}/{{ TAG_FEED_ATOM|replace("{slug}", tag.slug) }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} {{ tag }} Tag Atom" />
{% endif %}
{% if TAG_FEED_RSS %}
<link href="{{ FEED_DOMAIN }}/{{ TAG_FEED_RSS|replace("{slug}", tag.slug) }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} {{ tag }} Tag RSS" />
{% endif %}
{% endblock %}

{% block header %}
&gt; Tag: {{ tag }}
{% if TAG_FEED_ATOM %}
&brvbar; <a href="{{ FEED_DOMAIN }}/{{ TAG_FEED_ATOM|replace("{slug}", tag.slug) }}">Atom</a>
{% endif %}
{% if TAG_FEED_RSS %}
&brvbar; <a href="{{ FEED_DOMAIN }}/{{ TAG_FEED_RSS|replace("{slug}", tag.slug) }}">RSS</a>
{% endif %}
{% endblock %}


================================================
FILE: templates/tags.html
================================================
{% extends "base.html" %}
{% block title %}&ndash; Tags{% endblock %}

{% block content %}
<article>
  <div class="article_text">
    <ul>
      {%- for tag, articles in tags|sort %}
          <li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> ({{ articles|count }})</li>
      {% endfor %}
    </ul>
  </div>
</article>
{% endblock %}
Download .txt
gitextract_1ip4l591/

├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── static/
│   └── css/
│       ├── pygments.css
│       ├── style.css
│       └── style.less
└── templates/
    ├── archives.html
    ├── article.html
    ├── author.html
    ├── authors.html
    ├── base.html
    ├── categories.html
    ├── category.html
    ├── index.html
    ├── modules/
    │   ├── analytics.html
    │   ├── idl.html
    │   └── pagination.html
    ├── page.html
    ├── tag.html
    └── tags.html
Condensed preview — 21 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (30K chars).
[
  {
    "path": ".gitignore",
    "chars": 3,
    "preview": "*~\n"
  },
  {
    "path": "LICENSE",
    "chars": 1112,
    "preview": "The MIT License (MIT)\nCopyright (c) 2012 William Ting\nCopyright (c) 2013 Giulio Fidente\n\nPermission is hereby granted, f"
  },
  {
    "path": "Makefile",
    "chars": 337,
    "preview": "# Install using:\n#\n#   pip install pygments\n#\n# built in styles: ['monokai', 'manni', 'rrt', 'perldoc', 'borland', 'colo"
  },
  {
    "path": "README.md",
    "chars": 2336,
    "preview": "# SVBHACK\n\npelican-svbhack is a responsive theme for [Pelican](http://getpelican.com), it is my hack of a svbtle-like th"
  },
  {
    "path": "static/css/pygments.css",
    "chars": 3198,
    "preview": ".hll { background-color: #ffffcc }\n.c { color: #408080; font-style: italic } /* Comment */\n.err { border: 1px solid #FF0"
  },
  {
    "path": "static/css/style.css",
    "chars": 4297,
    "preview": "body {\n  margin: 0;\n  padding: 0;\n  background-color: #ffffff;\n  color: #4d4d4d;\n  font-family: 'PT Sans', sans-serif;\n "
  },
  {
    "path": "static/css/style.less",
    "chars": 4764,
    "preview": "@red:  #ff0000;\n@black:  #000000;\n@white:  #ffffff;\n@light-grey:  #eeeeee;\n@med-grey:  #999999;\n@dark-grey:  #4d4d4d;\n@b"
  },
  {
    "path": "templates/archives.html",
    "chars": 362,
    "preview": "{% extends \"base.html\" %}\n{% block title %}&ndash; Archives{% endblock %}\n\n{% block content %}\n<article>\n  <div class=\"a"
  },
  {
    "path": "templates/article.html",
    "chars": 1559,
    "preview": "{% extends \"base.html\" %}\n{% block head %}\n<meta name=\"keywords\" content=\"{{ article.tags|join(', ')  }}\">\n{% endblock %"
  },
  {
    "path": "templates/author.html",
    "chars": 150,
    "preview": "{% extends \"index.html\" %}\n{% block title %}&ndash; Posts by: {{ author }}{% endblock %}\n\n{% block header %}\n&gt; Author"
  },
  {
    "path": "templates/authors.html",
    "chars": 351,
    "preview": "{% extends \"base.html\" %}\n{% block title %}&ndash; Authors{% endblock %}\n\n{% block content %}\n<article>\n  <div class=\"ar"
  },
  {
    "path": "templates/base.html",
    "chars": 3548,
    "preview": "<!DOCTYPE html>\n<html lang=\"{{ DEFAULT_LANG }}\">\n\n<head>\n  <!-- ## for client-side less\n  <link rel=\"stylesheet/less\" ty"
  },
  {
    "path": "templates/categories.html",
    "chars": 363,
    "preview": "{% extends \"base.html\" %}\n{% block title %}&ndash; Categories{% endblock %}\n\n{% block content %}\n<article>\n  <div class="
  },
  {
    "path": "templates/category.html",
    "chars": 926,
    "preview": "{% extends \"index.html\" %}\n{% block title %}&ndash; Category: {{ category }}{% endblock %}\n\n{% block head %}\n{% if CATEG"
  },
  {
    "path": "templates/index.html",
    "chars": 701,
    "preview": "{% extends \"base.html\" %}\n{% block content %}\n{% for article in articles_page.object_list %}\n<article>\n  <div class=\"art"
  },
  {
    "path": "templates/modules/analytics.html",
    "chars": 1145,
    "preview": "{% if GOOGLE_ANALYTICS %}\n<script type=\"text/javascript\">\n  var _gaq = _gaq || [];\n  _gaq.push(['_setAccount', '{{ GOOGL"
  },
  {
    "path": "templates/modules/idl.html",
    "chars": 559,
    "preview": "{% if INTERNET_DEFENSE_LEAGUE %}\n<script type=\"text/javascript\">\n  window._idl = {};\n  _idl.variant = \"banner\";\n  (funct"
  },
  {
    "path": "templates/modules/pagination.html",
    "chars": 589,
    "preview": "{% if DEFAULT_PAGINATION %}\n<div id=\"paginator\">\n{% if articles_page.has_next() %}\n<a href=\"{{ SITEURL }}/{{ page_name }"
  },
  {
    "path": "templates/page.html",
    "chars": 396,
    "preview": "{% extends \"base.html\" %}\n{% block title %}&ndash; {{ page.title }}{% endblock %}\n\n{% block content %}\n<article>\n  <div "
  },
  {
    "path": "templates/tag.html",
    "chars": 826,
    "preview": "{% extends \"index.html\" %}\n{% block title %}&ndash; Tag: {{ tag }}{% endblock %}\n\n{% block head %}\n{% if TAG_FEED_ATOM %"
  },
  {
    "path": "templates/tags.html",
    "chars": 341,
    "preview": "{% extends \"base.html\" %}\n{% block title %}&ndash; Tags{% endblock %}\n\n{% block content %}\n<article>\n  <div class=\"artic"
  }
]

About this extraction

This page contains the full source code of the gfidente/pelican-svbhack GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 21 files (27.2 KB), approximately 8.5k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!