Преглед изворни кода

Use pelican-alchemy theme

Not via submodules for now to ease edit of templates
theenglishway (time) пре 8 година
родитељ
комит
fd841b99df
57 измењених фајлова са 3522 додато и 0 уклоњено
  1. 74 0
      themes/pelican-alchemy/CODE_OF_CONDUCT.md
  2. 21 0
      themes/pelican-alchemy/LICENSE
  3. 87 0
      themes/pelican-alchemy/README.md
  4. 7 0
      themes/pelican-alchemy/alchemy/static/css/bootstrap.min.css
  5. 4 0
      themes/pelican-alchemy/alchemy/static/css/font-awesome.min.css
  6. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/algol.min.css
  7. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/algol_nu.min.css
  8. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/autumn.min.css
  9. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/borland.min.css
  10. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/bw.min.css
  11. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/colorful.min.css
  12. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/default.min.css
  13. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/emacs.min.css
  14. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/friendly.min.css
  15. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/fruity.min.css
  16. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/igor.min.css
  17. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/lovelace.min.css
  18. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/manni.min.css
  19. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/monokai.min.css
  20. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/murphy.min.css
  21. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/native.min.css
  22. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/paraiso-dark.min.css
  23. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/paraiso-light.min.css
  24. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/pastie.min.css
  25. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/perldoc.min.css
  26. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/rrt.min.css
  27. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/tango.min.css
  28. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/trac.min.css
  29. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/vim.min.css
  30. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/vs.min.css
  31. 1 0
      themes/pelican-alchemy/alchemy/static/css/pygments/xcode.min.css
  32. 127 0
      themes/pelican-alchemy/alchemy/static/css/theme.css
  33. BIN
      themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.eot
  34. 2671 0
      themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.svg
  35. BIN
      themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.ttf
  36. BIN
      themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.woff
  37. BIN
      themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.woff2
  38. 18 0
      themes/pelican-alchemy/alchemy/templates/archives.html
  39. 51 0
      themes/pelican-alchemy/alchemy/templates/article.html
  40. 9 0
      themes/pelican-alchemy/alchemy/templates/author.html
  41. 20 0
      themes/pelican-alchemy/alchemy/templates/authors.html
  42. 52 0
      themes/pelican-alchemy/alchemy/templates/base.html
  43. 20 0
      themes/pelican-alchemy/alchemy/templates/categories.html
  44. 9 0
      themes/pelican-alchemy/alchemy/templates/category.html
  45. 53 0
      themes/pelican-alchemy/alchemy/templates/include/analytics.html
  46. 20 0
      themes/pelican-alchemy/alchemy/templates/include/comments.html
  47. 16 0
      themes/pelican-alchemy/alchemy/templates/include/footer.html
  48. 36 0
      themes/pelican-alchemy/alchemy/templates/include/header.html
  49. 24 0
      themes/pelican-alchemy/alchemy/templates/include/pagination.html
  50. 26 0
      themes/pelican-alchemy/alchemy/templates/include/xml_feeds.html
  51. 55 0
      themes/pelican-alchemy/alchemy/templates/index.html
  52. 22 0
      themes/pelican-alchemy/alchemy/templates/page.html
  53. 18 0
      themes/pelican-alchemy/alchemy/templates/period_archives.html
  54. 27 0
      themes/pelican-alchemy/alchemy/templates/sitemap.html
  55. 9 0
      themes/pelican-alchemy/alchemy/templates/tag.html
  56. 20 0
      themes/pelican-alchemy/alchemy/templates/tags.html
  57. BIN
      themes/pelican-alchemy/screenshot.jpg

+ 74 - 0
themes/pelican-alchemy/CODE_OF_CONDUCT.md

@@ -0,0 +1,74 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age,
+body size, disability, ethnicity, gender identity and expression, level of
+experience, nationality, personal appearance, race, religion, or sexual
+identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+  advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an
+appointed representative at an online or offline event. Representation of a
+project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team. All complaints will be reviewed and
+investigated and will result in a response that is deemed necessary and
+appropriate to the circumstances. The project team is obligated to maintain
+confidentiality with regard to the reporter of an incident. Further details of
+specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 1.4, available at
+https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org

+ 21 - 0
themes/pelican-alchemy/LICENSE

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 Nairobi GNU/Linux Users Group
+
+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.

+ 87 - 0
themes/pelican-alchemy/README.md

@@ -0,0 +1,87 @@
+# Pelican Alchemy
+
+> A magical ✨ Pelican theme
+
+Alchemy is a functional, clean, responsive theme for the [Pelican](http://getpelican.com) static site generator.
+
+Inspired by [crowsfoot](http://github.com/porterjamesj/crowsfoot) and [clean-blog](https://github.com/BlackrockDigital/startbootstrap-clean-blog), it features:
+
+- Powered by [Bootstap 4](http://v4-alpha.getbootstrap.com/) (v4.0.0-beta.2)
+- [Font Awesome](http://fontawesome.io/) icons
+- [Pygments](http://pygments.org/) syntax highlighting styles
+- Pelican `sitemap.xml` support
+- [Favicon Generator](http://realfavicongenerator.net/) support
+- External analytics ([Google](https://analytics.google.com), [Gauges](https://gaug.es), [Piwik](https://piwik.org)) support **
+- External comments ([Disqus](https://disqus.com)) support **
+
+** Features link to external assets (webfonts etc).
+
+![](screenshot.jpg)
+
+## Installation
+
+Clone the repo:
+
+```bash
+git clone https://github.com/nairobilug/pelican-alchemy
+```
+
+Set the `THEME` variable in your Pelican config:
+
+```python
+THEME = '<PATH_TO_REPO>/alchemy'
+```
+
+### As a Submodule
+
+In your Pelican site:
+
+```bash
+mkdir themes
+git submodule add https://github.com/nairobilug/pelican-alchemy themes/pelican-alchemy
+```
+
+And in Pelican config:
+
+```python
+THEME = 'themes/pelican-alchemy/alchemy'
+```
+
+## Usage
+
+Visit the [Settings wiki](https://github.com/nairobilug/pelican-alchemy/wiki/Settings) for examples:
+
+- **SITESUBTITLE**: Subtitle that appears in the header.
+- **SITEIMAGE**: Image that appears in the header.
+- **DESCRIPTION**: Index HTML head `<meta>` description.
+- **LINKS**: A list of tuples (Title, URL) for menu links.
+- **ICONS**: A list of tuples (Icon, URL) for icon links.
+- **PYGMENTS_STYLE**: Built-in Pygments style for syntax highlighting.
+- **HIDE_AUTHORS**: Hide the author(s) of an article - useful for single author sites.
+- **RFG_FAVICONS**: Use a Favicon Generator package.
+
+Misc settings:
+
+- **DISQUS_SITENAME**
+- **GAUGES**
+- **GOOGLE_ANALYTICS**
+- **PIWIK_URL**
+- **PIWIK_SITE_ID**
+
+Example [pelicanconf.py](https://github.com/nairobilug/pelican-alchemy/blob/demo/pelicanconf.py) (demo website).
+
+### Tips & Tricks
+
+https://github.com/nairobilug/pelican-alchemy/wiki/Tips
+
+## How to Contribute
+
+1. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug.
+1. Fork [the repository](https://github.com/nairobilug/pelican-alchemy) on GitHub to start making your changes to the master branch (or branch off of it).
+1. Send a pull request and bug the maintainer until it gets merged and published. :)
+
+Alchemy follows the [Contributor Covenant](CODE_OF_CONDUCT.md) code of conduct.
+
+## License
+
+[MIT](LICENSE) © 2017 Nairobi GNU/Linux Users Group

Разлика између датотеке није приказан због своје велике величине
+ 7 - 0
themes/pelican-alchemy/alchemy/static/css/bootstrap.min.css


Разлика између датотеке није приказан због своје велике величине
+ 4 - 0
themes/pelican-alchemy/alchemy/static/css/font-awesome.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/algol.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/algol_nu.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/autumn.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/borland.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/bw.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/colorful.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/default.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/emacs.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/friendly.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/fruity.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/igor.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/lovelace.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/manni.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/monokai.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/murphy.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/native.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/paraiso-dark.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/paraiso-light.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/pastie.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/perldoc.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/rrt.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/tango.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/trac.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/vim.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/vs.min.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
themes/pelican-alchemy/alchemy/static/css/pygments/xcode.min.css


+ 127 - 0
themes/pelican-alchemy/alchemy/static/css/theme.css

@@ -0,0 +1,127 @@
+::selection {
+  background: #0085a1;
+  color: #fff;
+  text-shadow: none;
+}
+
+body {
+  background-color: #f5f5f5;
+}
+
+a {
+  color: #333;
+}
+
+a:focus,
+a:hover {
+  color: #0085a1;
+}
+
+blockquote {
+  color: #818a91;
+  font-style: italic;
+}
+
+hr {
+  margin: 1.5rem 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+.container {
+  max-width: 960px;
+}
+
+.header,
+.footer {
+  padding: 1.5rem 0 .5rem;
+}
+
+.header {
+  border-bottom: 1px solid rgba(0,0,0,.1);
+}
+
+.header img {
+  margin-bottom: 1rem;
+}
+
+.header .title {
+  font-weight: bold;
+  margin-bottom: 1rem;
+}
+
+.header ul,
+.header li {
+  margin-bottom: .5rem;
+}
+
+.header ul {
+  font-size: 1.25rem;
+  font-weight: 300;
+  text-transform: lowercase;
+}
+
+.main {
+  background-color: #fff;
+  padding: 1.5rem 0;
+}
+
+.footer {
+  border-top: 1px solid rgba(0,0,0,.1);
+}
+
+.highlight pre {
+  border: 1px solid rgba(0,0,0,.1);
+  padding: 1rem;
+}
+
+.pagination .page-link {
+  color: #333;
+}
+
+.teaser header ul {
+  list-style: none;
+  padding-left: 0;
+}
+
+.teaser header li {
+  margin-bottom: .5rem;
+}
+
+.teaser .content p {
+  margin-bottom: 0;
+}
+
+.article header ul,
+.article header li {
+  margin-bottom: .5rem;
+}
+
+.article header li:not(:last-child) {
+  margin-right: 10px;
+}
+
+.article .content a {
+  text-decoration: underline
+}
+
+@media (min-width: 576px) {
+  .header .title {
+    font-size: 3rem;
+  }
+}
+
+@media (max-width: 576px) {
+  .header,
+  .footer {
+    text-align: center;
+  }
+
+  .teaser header li {
+    display: inline-block;
+  }
+
+  .teaser header li:not(:last-child) {
+    margin-right: 10px;
+  }
+}

BIN
themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.eot


Разлика између датотеке није приказан због своје велике величине
+ 2671 - 0
themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.svg


BIN
themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.ttf


BIN
themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.woff


BIN
themes/pelican-alchemy/alchemy/static/fonts/fontawesome-webfont.woff2


+ 18 - 0
themes/pelican-alchemy/alchemy/templates/archives.html

@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+
+{% block title %}
+  Archives {{ super() }}
+{% endblock %}
+
+{% block page_header %}
+  Archives
+{% endblock %}
+
+{% block content %}
+  <dl class="row">
+    {% for article in dates %}
+      <dt class="col-sm-4">{{ article.locale_date }}</dt>
+      <dd class="col-sm-8"><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
+    {% endfor %}
+  </dl>
+{% endblock %}

+ 51 - 0
themes/pelican-alchemy/alchemy/templates/article.html

@@ -0,0 +1,51 @@
+{% extends "base.html" %}
+
+{% block head %}
+  {{ super() }}
+  <meta name="description" content="{{ article.summary|striptags }}">
+{% endblock %}
+
+{% block title %}
+  {{ article.title|striptags }} {{ super() }}
+{% endblock %}
+
+{% block page_header %}
+  {{ article.title }}
+{% endblock %}
+
+{% block content %}
+  <article class="article">
+    <header>
+      <ul class="list-inline">
+        <li class="list-inline-item text-muted" title="{{ article.date.isoformat() }}">
+          <i class="fa fa-clock-o"></i>
+          {{ article.locale_date }}
+        </li>
+        <li class="list-inline-item">
+          <i class="fa fa-folder-open-o"></i>
+          <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>
+        </li>
+        {% if not HIDE_AUTHORS and article.authors %}
+          <li class="list-inline-item">
+            <i class="fa fa-user-o"></i>
+            {% for author in article.authors %}
+              <a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a>{% if not loop.last %}, {% endif %}
+            {% endfor %}
+          </li>
+        {% endif %}
+        {% if article.tags %}
+          <li class="list-inline-item">
+            <i class="fa fa-files-o"></i>
+            {% for tag in article.tags %}
+              <a href="{{ SITEURL }}/{{ tag.url }}">#{{ tag }}</a>{% if not loop.last %}, {% endif %}
+            {% endfor %}
+          </li>
+        {% endif %}
+      </ul>
+    </header>
+    <div class="content">
+      {{ article.content }}
+    </div>
+  </article>
+  {% include 'include/comments.html' %}
+{% endblock %}

+ 9 - 0
themes/pelican-alchemy/alchemy/templates/author.html

@@ -0,0 +1,9 @@
+{% extends "index.html" %}
+
+{% block title %}
+  {{ author }} Articles | {{ SITENAME }}
+{% endblock %}
+
+{% block page_header %}
+  {{ author }} Articles
+{% endblock %}

+ 20 - 0
themes/pelican-alchemy/alchemy/templates/authors.html

@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+
+{% block title %}
+  Authors {{ super() }}
+{% endblock %}
+
+{% block page_header %}
+  Authors
+{% endblock %}
+
+{% block content %}
+  <table class="table table-bordered table-striped">
+    {% for author, articles in authors|sort %}
+      <tr>
+        <td><a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a></td>
+        <td>{{ articles|count }}</td>
+      </tr>
+    {% endfor %}
+  </table>
+{% endblock %}

+ 52 - 0
themes/pelican-alchemy/alchemy/templates/base.html

@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="{{ DEFAULT_LANG }}">
+
+<head>
+  <!-- Required meta tags -->
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+
+  <title>{% block title %}| {{ SITENAME }}{% endblock %}</title>
+  <link rel="canonical" href="{{ SITEURL }}/{{ output_file }}">
+
+  {% if RFG_FAVICONS %}
+    <link rel="apple-touch-icon" href="{{ SITEURL }}/apple-touch-icon.png" sizes="180x180">
+    <link rel="icon" type="image/png" href="{{ SITEURL }}/favicon-32x32.png" sizes="32x32">
+    <link rel="icon" type="image/png" href="{{ SITEURL }}/favicon-16x16.png" sizes="16x16">
+    <link rel="manifest" href="{{ SITEURL }}/manifest.json">
+    <meta name="theme-color" content="#333333">
+  {% endif %}
+
+  <link rel="stylesheet" href="{{ SITEURL }}/theme/css/bootstrap.min.css">
+  <link rel="stylesheet" href="{{ SITEURL }}/theme/css/font-awesome.min.css">
+  <link rel="stylesheet" href="{{ SITEURL }}/theme/css/pygments/{{ PYGMENTS_STYLE|default('default') }}.min.css">
+  <link rel="stylesheet" href="{{ SITEURL }}/theme/css/theme.css">
+
+  {% include 'include/xml_feeds.html' %}
+  {% block head %}{% endblock %}
+  {% include 'include/analytics.html' %}
+</head>
+
+<body>
+  <header class="header">
+    <div class="container">
+      {% include 'include/header.html' %}
+    </div>
+  </header>
+
+  <div class="main">
+    <div class="container">
+      <h1>{% block page_header %}{% endblock %}</h1>
+      <hr>
+      {% block content %}{% endblock %}
+    </div>
+  </div>
+
+  <footer class="footer">
+    <div class="container">
+      {% include 'include/footer.html' %}
+    </div>
+  </footer>
+</body>
+
+</html>

+ 20 - 0
themes/pelican-alchemy/alchemy/templates/categories.html

@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+
+{% block title %}
+  Categories {{ super() }}
+{% endblock %}
+
+{% block page_header %}
+  Categories
+{% endblock %}
+
+{% block content %}
+  <table class="table table-bordered table-striped">
+    {% for category, articles in categories|sort %}
+      <tr>
+        <td><a href="{{ SITEURL }}/{{ category.url }}">{{ category }}</a></td>
+        <td>{{ articles|count }}</td>
+      </tr>
+    {% endfor %}
+  </table>
+{% endblock %}

+ 9 - 0
themes/pelican-alchemy/alchemy/templates/category.html

@@ -0,0 +1,9 @@
+{% extends "index.html" %}
+
+{% block title %}
+  {{ category }} Articles | {{ SITENAME }}
+{% endblock %}
+
+{% block page_header %}
+  {{ category }} Articles
+{% endblock %}

+ 53 - 0
themes/pelican-alchemy/alchemy/templates/include/analytics.html

@@ -0,0 +1,53 @@
+{% if GOOGLE_ANALYTICS %}
+  <script>
+    (function(i, s, o, g, r, a, m) {
+      i['GoogleAnalyticsObject'] = r;
+      i[r] = i[r] || function() {
+        (i[r].q = i[r].q || []).push(arguments)
+      }, i[r].l = 1 * new Date();
+      a = s.createElement(o);
+      a.async = 1;
+      a.src = g;
+      m = s.getElementsByTagName(o)[0];
+      m.parentNode.insertBefore(a, m)
+    })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
+    ga('create', '{{ GOOGLE_ANALYTICS }}', 'auto');
+    ga('send', 'pageview');
+  </script>
+{% endif %}
+
+{% if GAUGES %}
+  <script>
+    var _gauges = _gauges || [];
+    (function() {
+      var t = document.createElement('script');
+      t.type = 'text/javascript';
+      t.async = true;
+      t.id = 'gauges-tracker';
+      t.setAttribute('data-site-id', '{{ GAUGES }}');
+      t.src = 'https://secure.gaug.es/track.js';
+      var s = document.getElementsByTagName('script')[0];
+      s.parentNode.insertBefore(t, s);
+    })();
+  </script>
+{% endif %}
+
+{% if PIWIK_URL and PIWIK_SITE_ID %}
+  <script>
+    var _paq = _paq || [];
+    _paq.push(['trackPageView']);
+    _paq.push(['enableLinkTracking']);
+    (function() {
+      var u = '{{ PIWIK_URL }}/';
+      _paq.push(['setTrackerUrl', u + 'piwik.php']);
+      _paq.push(['setSiteId', '{{ PIWIK_SITE_ID }}']);
+      var g = document.createElement('script');
+      g.type = 'text/javascript';
+      g.async = true;
+      g.defer = true;
+      g.src = u + 'piwik.js';
+      var s = document.getElementsByTagName('script')[0];
+      s.parentNode.insertBefore(g, s);
+    })();
+  </script>
+{% endif %}

+ 20 - 0
themes/pelican-alchemy/alchemy/templates/include/comments.html

@@ -0,0 +1,20 @@
+{% if DISQUS_SITENAME %}
+  <hr>
+  <div id="disqus_thread"></div>
+  <script>
+    var disqus_config = function() {
+      this.page.url = '{{ SITEURL }}/{{ output_file }}';
+      this.page.identifier = '{{ article.slug }}';
+    };
+    (function() {
+      var d = document;
+      var s = d.createElement('script');
+      s.src = '//{{ DISQUS_SITENAME }}.disqus.com/embed.js';
+      s.setAttribute('data-timestamp', +new Date());
+      (d.head || d.body).appendChild(s);
+    })();
+  </script>
+  <noscript class="text-muted">
+    Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a>
+  </noscript>
+{% endif %}

+ 16 - 0
themes/pelican-alchemy/alchemy/templates/include/footer.html

@@ -0,0 +1,16 @@
+<div class="row">
+  <ul class="col-sm-6 list-inline">
+    {% if not HIDE_AUTHORS %}
+      <li class="list-inline-item"><a href="{{ SITEURL }}/authors.html">Authors</a></li>
+    {% endif %}
+    <li class="list-inline-item"><a href="{{ SITEURL }}/archives.html">Archives</a></li>
+    <li class="list-inline-item"><a href="{{ SITEURL }}/categories.html">Categories</a></li>
+    {% if tags|length %}
+      <li class="list-inline-item"><a href="{{ SITEURL }}/tags.html">Tags</a></li>
+    {% endif %}
+  </ul>
+  <p class="col-sm-6 text-sm-right text-muted">
+    Generated by <a href="https://github.com/getpelican/pelican" target="_blank">Pelican</a>
+    / <a href="https://github.com/nairobilug/pelican-alchemy" target="_blank">&#x2728;</a>
+  </p>
+</div>

+ 36 - 0
themes/pelican-alchemy/alchemy/templates/include/header.html

@@ -0,0 +1,36 @@
+<div class="row">
+  {% if SITEIMAGE %}
+    <div class="col-sm-4">
+      <a href="{{ SITEURL }}/">
+        <img class="img-fluid rounded" src={{ SITEURL }}{{ SITEIMAGE }} alt="{{ SITENAME }}">
+      </a>
+    </div>
+  {% endif %}
+  <div class="col-sm-{% if SITEIMAGE %}8{% else %}12{% endif %}">
+    <h1 class="title"><a href="{{ SITEURL }}/">{{ SITENAME }}</a></h1>
+    {% if SITESUBTITLE %}
+      <p class="text-muted">{{ SITESUBTITLE }}</p>
+    {% endif %}
+    {% if LINKS or (DISPLAY_PAGES_ON_MENU and pages) or ICONS %}
+      <ul class="list-inline">
+        {% for title, link in LINKS %}
+          <li class="list-inline-item"><a href="{{ link }}" target="_blank">{{ title }}</a></li>
+        {% endfor %}
+        {% if DISPLAY_PAGES_ON_MENU %}
+          {% for page in pages %}
+            {% if LINKS and loop.first %}
+              <li class="list-inline-item text-muted">|</li>
+            {% endif %}
+            <li class="list-inline-item"><a href="{{ SITEURL }}/{{ page.url }}">{{ page.title }}</a></li>
+          {% endfor %}
+        {% endif %}
+        {% for icon, link in ICONS %}
+          {% if (LINKS or (DISPLAY_PAGES_ON_MENU and pages)) and loop.first %}
+            <li class=" list-inline-item text-muted">|</li>
+          {% endif %}
+          <li class="list-inline-item"><a class="fa fa-{{ icon }}" href="{{ link }}" target="_blank"></a></li>
+        {% endfor %}
+      </ul>
+    {% endif %}
+  </div>
+</div>

+ 24 - 0
themes/pelican-alchemy/alchemy/templates/include/pagination.html

@@ -0,0 +1,24 @@
+{% if articles_paginator.num_pages > 1 %}
+  <hr>
+  <ul class="pagination">
+    {% if articles_page.has_previous() %}
+      <li class="page-item">
+        <a class="page-link" href="{{ SITEURL }}/{{ articles_previous_page.url }}">
+          <span aria-hidden="true">&laquo;</span>
+          <span class="sr-only">Previous</span>
+        </a>
+      </li>
+    {% endif %}
+    <li class="page-item disabled">
+      <span class="page-link">{{ articles_page.number }} of {{ articles_paginator.num_pages }}</span>
+    </li>
+    {% if articles_page.has_next() %}
+      <li class="page-item">
+        <a class="page-link" href="{{ SITEURL }}/{{ articles_next_page.url }}">
+          <span aria-hidden="true">&raquo;</span>
+          <span class="sr-only">Next</span>
+        </a>
+      </li>
+    {% endif %}
+  </ul>
+{% endif %}

+ 26 - 0
themes/pelican-alchemy/alchemy/templates/include/xml_feeds.html

@@ -0,0 +1,26 @@
+{% if FEED_ALL_ATOM %}
+  <link rel="alternate" type="application/atom+xml" title="Full Atom Feed"
+        href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}">
+{% endif %}
+{% if FEED_ALL_RSS %}
+  <link rel="alternate" type="application/rss+xml" title="Full RSS Feed"
+        href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}">{% endif %}
+{% if FEED_ATOM %}
+  <link rel="alternate" type="application/atom+xml" title="Atom Feed"
+        href="{{ FEED_DOMAIN }}/{{ FEED_ATOM }}">{% endif %}
+{% if FEED_RSS %}
+  <link rel="alternate" type="application/rss+xml" title="RSS Feed"
+        href="{{ FEED_DOMAIN }}/{{ FEED_RSS }}">{% endif %}
+{% if CATEGORY_FEED_ATOM and category %}
+  <link rel="alternate" type="application/atom+xml" title="Categories Atom Feed"
+        href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_ATOM|format(category.slug) }}">{% endif %}
+{% if CATEGORY_FEED_RSS and category %}
+  <link rel="alternate" type="application/rss+xml" title="Categories RSS Feed"
+        href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_RSS|format(category.slug) }}">{% endif %}
+{% if TAG_FEED_ATOM and tag %}
+  <link rel="alternate" type="application/atom+xml" title="Tags Atom Feed"
+        href="{{ FEED_DOMAIN }}/{{ TAG_FEED_ATOM|format(tag.slug) }}">{% endif %}
+{% if TAG_FEED_RSS and tag %}
+  <link rel="alternate" type="application/rss+xml" title="Tags RSS Feed"
+        href="{{ FEED_DOMAIN }}/{{ TAG_FEED_RSS|format(tag.slug) }}">
+{% endif %}

+ 55 - 0
themes/pelican-alchemy/alchemy/templates/index.html

@@ -0,0 +1,55 @@
+{% extends "base.html" %}
+
+{% block head %}
+  {{ super() }}
+  {% if DESCRIPTION %}
+    <meta name="description" content="{{ DESCRIPTION|striptags }}">
+  {% endif %}
+{% endblock %}
+
+{% block title %}
+  {{ SITENAME }} | {{ SITESUBTITLE }}
+{% endblock %}
+
+{% block page_header %}
+  Articles
+{% endblock %}
+
+{% block content %}
+  {% for article in articles_page.object_list %}
+    <article class="row teaser">
+      <header class="col-sm-4 text-muted">
+        <ul>
+          <li title="{{ article.date.isoformat() }}">
+            <i class="fa fa-clock-o"></i>
+            {{ article.locale_date }}
+          </li>
+          <li>
+            <i class="fa fa-folder-open-o"></i>
+            <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>
+          </li>
+          {% if not HIDE_AUTHORS and article.authors %}
+            <li>
+              <i class="fa fa-user-o"></i>
+              {% for author in article.authors %}
+                <a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a>{% if not loop.last %}, {% endif %}
+              {% endfor %}
+            </li>
+          {% endif %}
+        </ul>
+      </header>
+      <div class="col-sm-8">
+        <h4 class="title">
+          <a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a>
+        </h4>
+        <div class="content">
+          {{ article.summary|striptags }}
+        </div>
+      </div>
+    </article>
+    {% if not loop.last %}
+      <hr>
+    {% endif %}
+  {% endfor %}
+  {% include 'include/pagination.html' %}
+{% endblock %}

+ 22 - 0
themes/pelican-alchemy/alchemy/templates/page.html

@@ -0,0 +1,22 @@
+{% extends "base.html" %}
+
+{% block head %}
+  {{ super() }}
+  <meta name="description" content="{{ page.summary|striptags }}">
+{% endblock %}
+
+{% block title %}
+  {{ page.title|striptags }} {{ super() }}
+{% endblock %}
+
+{% block page_header %}
+  {{ page.title }}
+{% endblock %}
+
+{% block content %}
+  <article class="article">
+    <div class="content">
+      {{ page.content }}
+    </div>
+  </article>
+{% endblock %}

+ 18 - 0
themes/pelican-alchemy/alchemy/templates/period_archives.html

@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+
+{% block title %}
+  Archives for {{ period | reverse | join(' ') }} {{ super() }}
+{% endblock %}
+
+{% block page_header %}
+  Archives for {{ period | reverse | join(' ') }}
+{% endblock %}
+
+{% block content %}
+  <dl class="dl-horizontal">
+    {% for article in dates %}
+      <dt>{{ article.locale_date }}</dt>
+      <dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
+    {% endfor %}
+  </dl>
+{% endblock %}

+ 27 - 0
themes/pelican-alchemy/alchemy/templates/sitemap.html

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+  {% for article in articles %}
+    <url>
+      <loc>{{ SITEURL }}/{{ article.url }}</loc>
+      <priority>0.8</priority>
+    </url>
+    {% for translation in article.translations %}
+      <url>
+        <loc>{{ SITEURL }}/{{ translation.url }}</loc>
+        <priority>0.8</priority>
+      </url>
+    {% endfor %}
+  {% endfor %}
+  {% for page in pages %}
+    <url>
+      <loc>{{ SITEURL }}/{{ page.url }}</loc>
+      <priority>1.0</priority>
+    </url>
+    {% for translation in page.translations %}
+      <url>
+        <loc>{{ SITEURL }}/{{ translation.url }}</loc>
+        <priority>1.0</priority>
+      </url>
+    {% endfor %}
+  {% endfor %}
+</urlset>

+ 9 - 0
themes/pelican-alchemy/alchemy/templates/tag.html

@@ -0,0 +1,9 @@
+{% extends "index.html" %}
+
+{% block title %}
+  #{{ tag }} Articles | {{ SITENAME }}
+{% endblock %}
+
+{% block page_header %}
+  #{{ tag }} Articles
+{% endblock %}

+ 20 - 0
themes/pelican-alchemy/alchemy/templates/tags.html

@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+
+{% block title %}
+  Tags {{ super() }}
+{% endblock %}
+
+{% block page_header %}
+  Tags
+{% endblock %}
+
+{% block content %}
+  <table class="table table-bordered table-striped">
+    {% for tag, articles in tags|sort %}
+      <tr>
+        <td><a href="{{ SITEURL }}/{{ tag.url }}">#{{ tag }}</a></td>
+        <td>{{ articles|count }}</td>
+      </tr>
+    {% endfor %}
+  </table>
+{% endblock %}

BIN
themes/pelican-alchemy/screenshot.jpg