web_PYTHON = \
src/web/__init__.py \
+ src/web/blog.py \
src/web/handlers.py \
src/web/handlers_accounts.py \
src/web/handlers_admin.py \
templatesdir = $(datadir)/templates
+templates_blog_DATA = \
+ src/templates/blog/base.html \
+ src/templates/blog/post.html
+
+templates_blogdir = $(templatesdir)/blog
+
templates_modules_DATA = \
src/templates/modules/menu.html
$small-font-size: 87.5%;
// Headings
-$headings-font-weight: 400;
+$headings-font-weight: 500;
$headings-line-height: 1.5;
$headings-margin-bottom: 1.5rem;
$headings-color: $blue-grey-900;
}
}
+.blog-post {
+ // Custom CSS for blog posts goes here
+}
+
// Sidebar navigation
#sidebar .nav {
<a class="navbar-brand mx-auto text-dark" href="/">
<img src="{{ static_url("img/ipfire-tux.png") }}" alt="IPFire" height="32px" />
- IP<strong>Fire</strong>
+ IP<strong>Fire</strong> {% block subtitle %}{% end block %}
</a>
<div class="collapse navbar-collapse" id="navbar">
{% block container %}
<div class="container">
{% block body %}{% end block %}
+ {% block content %}{% end block %}
</div>
{% end block %}
--- /dev/null
+{% extends "../base.html" %}
+
+{% block subtitle %}{{ _("Blog") }}{% end block %}
+
+{% block menu %}{% end block %}
+
+{% block content %}
+ <div class="row">
+ <div class="col-12 col-md-3">
+ <nav class="mb-5">
+ <ul class="nav flex-column">
+ <li class="nav-item">
+ <a class="nav-link {% if request.path == "/" %}active{% end %}" href="/">
+ {{ _("Newest") }}
+ </a>
+ </li>
+
+ <li class="nav-item">
+ <a class="nav-link {% if request.path == "/featured" %}active{% end %}" href="/featured">
+ {{ _("Featured") }}
+ </a>
+ </li>
+
+ <li class="nav-item">
+ <a class="nav-link {% if request.path == "/tags/lightning-wire-labs" %}active{% end %}" href="/tags/lightning-wire-labs">
+ {{ _("Lightning Wire Labs") }}
+ </a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+
+ <div class="col">
+ {% block main %}{% end block %}
+ </div>
+ </div>
+{% end block %}
--- /dev/null
+{% extends "base.html" %}
+
+{% block title %}{{ post.title }}{% end block %}
+
+{% block main %}
+ <div class="card">
+ <div class="card-body blog-post">
+ <h5 class="mb-0">{{ post.title }}</h5>
+
+ <p class="small text-muted">
+ {{ _("by") }} <a href="/authors/{{ post.author.uid }}">{{ post.author.name }}</a>,
+ {{ locale.format_date(post.published, shorter=True, relative=False) }}
+ </p>
+
+ {% raw post.text %}
+ </div>
+ </div>
+{% end block %}
from handlers import *
from ui_modules import *
+from . import blog
+
BASEDIR = os.path.join(os.path.dirname(__file__), "..")
class Application(tornado.web.Application):
(r"/(de|en)/(.*)", LangCompatHandler),
])
+ # blog.ipfire.org
+ self.add_handlers(r"blog(\.dev)?\.ipfire\.org", [
+ (r"/post/(.*)", blog.PostHandler),
+ ])
+
# downloads.ipfire.org
self.add_handlers(r"downloads?(\.dev)?\.ipfire\.org", [
(r"/", DownloadsIndexHandler),
--- /dev/null
+#!/usr/bin/python
+
+import tornado.web
+
+import handlers_base as base
+
+class PostHandler(base.BaseHandler):
+ def get(self, slug):
+ entry = self.planet.get_entry_by_slug(slug)
+ if not entry:
+ raise tornado.web.HTTPError(404)
+
+ self.render("blog/post.html", post=entry)