Compare commits
No commits in common. "77816b6c5dfe11ff59c2eebd1463b393dcde2617" and "e4aa5c6e6e8e33556d52d21bc7ddd9531d0ac5c1" have entirely different histories.
77816b6c5d
...
e4aa5c6e6e
13 changed files with 326 additions and 178 deletions
|
@ -10,7 +10,7 @@
|
||||||
{{i}}<h4 class="card-title p-name">{{ entry.name }}</h4>
|
{{i}}<h4 class="card-title p-name">{{ entry.name }}</h4>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{i}}<div class="e-content">
|
{{i}}<div class="e-content">
|
||||||
{{i}}{{ entry.content | markdown }}
|
{{i}}{{ entry.content | indent(indent_width + 6) }}
|
||||||
{{i}}</div>
|
{{i}}</div>
|
||||||
{{i}}</div>
|
{{i}}</div>
|
||||||
|
|
||||||
|
|
17
entries/templates/entries/entry.html
Normal file
17
entries/templates/entries/entry.html
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{% extends 'lemoncurry/layout.html' %}
|
||||||
|
{% load absolute_url static %}
|
||||||
|
|
||||||
|
{% block head %}
|
||||||
|
<link rel="shortlink" href="{{ entry.short_url }}" />
|
||||||
|
<link rel="alternate" type="application/json+oembed" href="https://wirres.net/oembed/oembed.php?url={{ uri | absolute_url | urlencode }}" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block styles %}
|
||||||
|
<link rel="stylesheet" type="text/stylus" href="{% static 'entries/css/h-entry.styl' %}" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<div class="entry">
|
||||||
|
{% include 'entries/h-entry.html' %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
67
entries/templates/entries/h-entry.html
Normal file
67
entries/templates/entries/h-entry.html
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
{% load bleach friendly_url humanize jsonify markdown %}<article class="card h-entry">
|
||||||
|
{% if entry.photo %}<img class="card-img-top u-photo" src="{{ entry.photo.url }}" />{% endif %}
|
||||||
|
|
||||||
|
{% if entry.in_reply_to %}{% with reply=entry.reply_context %}
|
||||||
|
<article class="card-header media u-in-reply-to h-cite">
|
||||||
|
<a class="align-self-center p-author h-card" href="{{ reply.author.url }}">
|
||||||
|
<img class="mr-3 rounded" width="100" src="{{ reply.author.photo }}"
|
||||||
|
alt="{{ reply.author.name }}" title="{{ reply.author.name }}" />
|
||||||
|
</a>
|
||||||
|
<div class="media-body">
|
||||||
|
{% if reply.name %}<h4 class="p-name">{{ reply.name }}</h4>{% endif %}
|
||||||
|
<div class="e-content{% if not reply.name %} p-name{% endif %}">{{ reply.content | bleach }}</div>
|
||||||
|
</div>
|
||||||
|
</article>{% endwith %}{% endif %}
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
{% if entry.name %}<h4 class="card-title p-name">{{ entry.name }}</h4>{% endif %}
|
||||||
|
<div class="e-content{% if not entry.name %} p-name{% endif %}">{{ entry.content | markdown }}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-footer">
|
||||||
|
<a class="p-author h-card" href="{{ entry.author.url }}">
|
||||||
|
<img class="u-photo" src="{{ entry.author.avatar.url }}" />
|
||||||
|
{{ entry.author.first_name }} {{ entry.author.last_name }}
|
||||||
|
</a>
|
||||||
|
<a class="u-uid u-url" href="{{ entry.url }}">
|
||||||
|
<time class="dt-published" datetime="{{ entry.published.isoformat }}">
|
||||||
|
<i class="fas fa-calendar"></i>
|
||||||
|
{{ entry.published | naturaltime }}
|
||||||
|
</time>
|
||||||
|
</a>
|
||||||
|
{% if entry.updated != entry.published %}
|
||||||
|
<time class="dt-updated" datetime="{{ entry.updated.isoformat }}">
|
||||||
|
<i class="fas fa-pencil-alt"></i>
|
||||||
|
{{ entry.updated | naturaltime }}
|
||||||
|
</time>
|
||||||
|
{% endif %}
|
||||||
|
<a class="u-url" href="{{ entry.short_url }}">
|
||||||
|
<i class="fas fa-link"></i>
|
||||||
|
{{ entry.short_url | friendly_url }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if entry.cats.exists %}
|
||||||
|
<div class="card-footer">
|
||||||
|
{% for c in entry.cats.all %}
|
||||||
|
<a class="p-category" href="{{ c.url }}">
|
||||||
|
<i class="fas fa-paw"></i>
|
||||||
|
{{ c.name }}
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if entry.syndications.exists %}
|
||||||
|
<div class="card-footer">
|
||||||
|
{% for s in entry.syndications.all %}
|
||||||
|
<a class="u-syndication" href="{{ s.url }}">
|
||||||
|
<i class="{{ s.profile.site.icon }}" aria-hidden="true"></i>
|
||||||
|
{{ s.profile }}
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<script class="p-json-ld" type="application/ld+json">{{ entry.json_ld | jsonify }}</script>
|
||||||
|
</article>
|
17
entries/templates/entries/index.html
Normal file
17
entries/templates/entries/index.html
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{% extends 'lemoncurry/layout.html' %}
|
||||||
|
{% load static %}
|
||||||
|
{% block html_class %}h-feed{% endblock %}
|
||||||
|
|
||||||
|
{% block styles %}
|
||||||
|
<link rel="stylesheet" type="text/stylus" href="{% static 'entries/css/h-entry.styl' %}" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<ol class="list-unstyled entries">
|
||||||
|
{% for entry in entries %}
|
||||||
|
<li>
|
||||||
|
{% include 'entries/h-entry.html' %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
{% endblock %}
|
|
@ -1,102 +0,0 @@
|
||||||
{% extends 'lemoncurry/layout.html' %}
|
|
||||||
|
|
||||||
{% block html_attr %}
|
|
||||||
class="h-feed"{{ super() }}
|
|
||||||
{%- endblock %}
|
|
||||||
|
|
||||||
{% block styles %}
|
|
||||||
<link rel="stylesheet" type="text/stylus" href="{{ static('home/css/index.styl') }}" />
|
|
||||||
<link rel="stylesheet" type="text/stylus" href="{{ static('entries/css/h-entry.styl') }}" />
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block head %}
|
|
||||||
{% for key in user.keys.all() %}
|
|
||||||
<link rel="pgpkey" href="{{ key.file.url }}" />
|
|
||||||
{% endfor %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
<aside class="author">
|
|
||||||
<article class="h-card p-author card">
|
|
||||||
<a class="u-uid u-url" href="{{ user.full_url }}">
|
|
||||||
{% if user.avatar %}
|
|
||||||
<img class="u-photo card-img-top" src="{{ user.avatar.url }}" alt="{{ user.name }}" />
|
|
||||||
{% endif %}
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div class="card-body">
|
|
||||||
<h4 class="p-name card-title">
|
|
||||||
<span class="p-given-name">{{ user.first_name }}</span> <span class="p-family-name">{{ user.last_name }}</span>
|
|
||||||
</h4>
|
|
||||||
{% if user.note %}
|
|
||||||
<div class="p-note">
|
|
||||||
{{ user.note | markdown }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card-footer">
|
|
||||||
<ul class="profiles">
|
|
||||||
<li>
|
|
||||||
<a class="u-email" rel="me" href="mailto:{{ user.email }}">
|
|
||||||
<i class="fas fa-envelope" aria-hidden="true"></i>
|
|
||||||
{{ user.email }}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% if user.xmpp %}
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<a class="u-impp" rel="me" href="xmpp:{{ user.xmpp }}">
|
|
||||||
<i class="openwebicons-xmpp" aria-hidden="true"></i>
|
|
||||||
{{ user.xmpp }}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% if user.keys.exists() %}
|
|
||||||
|
|
||||||
<div class="card-footer">
|
|
||||||
<ul class="profiles">
|
|
||||||
{% for key in user.keys.all() %}
|
|
||||||
<a class="u-key" href="{{ key.file.url }}">
|
|
||||||
<i class="fas fa-key" aria-hidden="true"></i>
|
|
||||||
{{ key.pretty_print() }}
|
|
||||||
</a>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if user.profiles.exists() %}
|
|
||||||
|
|
||||||
<div class="card-footer">
|
|
||||||
<ul class="profiles">
|
|
||||||
{% for profile in user.profiles.all() %}
|
|
||||||
<a class="u-url" rel="me" href="{{ profile.url }}" title="{{ profile }}">
|
|
||||||
<i class="{{ profile.site.icon }}" aria-hidden="true"></i>
|
|
||||||
<span class="sr-only">{{ profile }}</span>
|
|
||||||
</a>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<script class="p-json-ld" type="application/ld+json">{{ user.json_ld | tojson }}</script>
|
|
||||||
</article>
|
|
||||||
</aside>
|
|
||||||
|
|
||||||
{% import 'entries/h-entry.html' as h %}
|
|
||||||
<ol class="list-unstyled entries">
|
|
||||||
{% for entry in entries %}
|
|
||||||
<li>
|
|
||||||
{{ h.hEntry(entry, indent_width=10) }}
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ol>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block foot %}
|
|
||||||
<script type="text/javascript">
|
|
||||||
tippy('.profiles [title]', {arrow: true});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
70
home/templates/home/index.html
Normal file
70
home/templates/home/index.html
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
{% extends 'lemoncurry/layout.html' %}
|
||||||
|
{% load jsonify markdown static %}
|
||||||
|
{% block html_class %}h-feed{% endblock %}
|
||||||
|
{% block styles %}
|
||||||
|
<link rel="stylesheet" type="text/stylus" href="{% static 'home/css/index.styl' %}" />
|
||||||
|
<link rel="stylesheet" type="text/stylus" href="{% static 'entries/css/h-entry.styl' %}" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block head %}{% for key in user.keys.all %}<link rel="pgpkey" href="{{ key.file.url }}" />{% endfor %}{% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<aside class="author">
|
||||||
|
<article class="h-card card p-author">
|
||||||
|
<a class="u-uid u-url" href="{{ uri }}">
|
||||||
|
{% if user.avatar %}<img class="card-img-top u-photo" src="{{ user.avatar.url }}" alt="{{ user.first_name }} {{ user.last_name }}" />{% endif %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<h4 class="card-title p-name">
|
||||||
|
<span class="p-given-name">{{ user.first_name }}</span> <span class="p-family-name">{{ user.last_name }}</span>
|
||||||
|
</h4>
|
||||||
|
{% if user.note %}<div class="p-note">{{ user.note | markdown }}</div>{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-footer">
|
||||||
|
<ul class="profiles">
|
||||||
|
<li><a class="u-email" rel="me" href="mailto:{{ user.email }}">
|
||||||
|
<i class="fas fa-envelope"></i> {{ user.email }}
|
||||||
|
</a></li>
|
||||||
|
{% if user.xmpp %}<li><a class="u-impp" rel="me" href="xmpp:{{ user.xmpp }}">
|
||||||
|
<i class="openwebicons-xmpp" aria-hidden="true"></i> {{ user.xmpp }}
|
||||||
|
</a></li>{% endif %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if user.keys.exists %}<div class="card-footer">
|
||||||
|
<ul class="profiles">
|
||||||
|
{% for key in user.keys.all %}<li>
|
||||||
|
<a class="u-key" href="{{ key.file.url }}">
|
||||||
|
<i class="fas fa-key"></i> {{ key.pretty_print }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>{% endif %}
|
||||||
|
|
||||||
|
{% if user.profiles.exists %}<div class="card-footer">
|
||||||
|
<ul class="profiles">
|
||||||
|
{% for profile in user.profiles.all %}<li>
|
||||||
|
<a class="u-url" rel="me" href="{{ profile.url }}" title="{{ profile }}"><i class="{{ profile.site.icon }}" aria-hidden="true"></i><span class="sr-only">{{ profile }}</span></a>
|
||||||
|
</li>{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>{% endif %}
|
||||||
|
|
||||||
|
<script class="p-json-ld" type="application/ld+json">{{ user.json_ld | jsonify }}</script>
|
||||||
|
</article>
|
||||||
|
</aside>
|
||||||
|
<ol class="list-unstyled entries">
|
||||||
|
{% for entry in entries %}
|
||||||
|
<li>
|
||||||
|
{% include 'entries/h-entry.html' %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
{% endblock %}
|
||||||
|
{% block foot %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
tippy('.profiles [title]', {arrow: true});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
|
@ -7,8 +7,7 @@ from compressor.contrib.jinja2ext import CompressorExtension
|
||||||
from django_activeurl.ext.django_jinja import ActiveUrl
|
from django_activeurl.ext.django_jinja import ActiveUrl
|
||||||
|
|
||||||
from entries.kinds import all as entry_kinds
|
from entries.kinds import all as entry_kinds
|
||||||
from .markdown import markdown
|
from .utils import friendly_url, load_package_json
|
||||||
from ..utils import friendly_url, load_package_json
|
|
||||||
|
|
||||||
|
|
||||||
def environment(**options):
|
def environment(**options):
|
||||||
|
@ -20,7 +19,6 @@ def environment(**options):
|
||||||
)
|
)
|
||||||
env.filters.update({
|
env.filters.update({
|
||||||
'friendly_url': friendly_url,
|
'friendly_url': friendly_url,
|
||||||
'markdown': markdown,
|
|
||||||
'naturaltime': naturaltime,
|
'naturaltime': naturaltime,
|
||||||
})
|
})
|
||||||
env.globals.update({
|
env.globals.update({
|
|
@ -1,21 +0,0 @@
|
||||||
from bleach.sanitizer import Cleaner, ALLOWED_TAGS
|
|
||||||
from bleach.linkifier import LinkifyFilter
|
|
||||||
from jinja2 import evalcontextfilter, Markup
|
|
||||||
|
|
||||||
TAGS = ['cite', 'code', 'p', 'pre', 'img', 'span']
|
|
||||||
TAGS.extend(ALLOWED_TAGS)
|
|
||||||
ATTRIBUTES = {
|
|
||||||
'a': ('href', 'title', 'class'),
|
|
||||||
'img': ('alt', 'src', 'title'),
|
|
||||||
'span': ('class',),
|
|
||||||
}
|
|
||||||
|
|
||||||
cleaner = Cleaner(tags=TAGS, attributes=ATTRIBUTES, filters=(LinkifyFilter,))
|
|
||||||
|
|
||||||
|
|
||||||
@evalcontextfilter
|
|
||||||
def bleach(ctx, html):
|
|
||||||
res = cleaner.clean(html)
|
|
||||||
if ctx.autoescape:
|
|
||||||
res = Markup(res)
|
|
||||||
return res
|
|
|
@ -81,41 +81,6 @@
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<p>all content licensed under <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">cc by-sa 4.0</a></p>
|
<p>all content licensed under <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">cc by-sa 4.0</a></p>
|
||||||
{% if entries is defined and entries.has_other_pages() %}
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<ul class="pagination">
|
|
||||||
{% if entries.prev %}
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" rel="prev" href="{{ entries.prev.url }}">
|
|
||||||
<i class="fas fa-step-backward" aria-hidden="true"></i> <span class="sr-only">previous page</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
{% for page in entries.pages %}
|
|
||||||
{% if page.current %}
|
|
||||||
<li class="page-item active">
|
|
||||||
<span class="page-link">{{ page.i }} <span class="sr-only">(current page)</span></span>
|
|
||||||
</li>
|
|
||||||
{% else %}
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" href="{{ page.url }}">{{ page.i }}</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% if entries.next %}
|
|
||||||
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" rel="next" href="{{ entries.next.url }}">
|
|
||||||
<i class="fas fa-step-forward" aria-hidden="true"></i> <span class="sr-only">next page</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
<p>powered by <a rel="code-repository" href="{{ package.repository }}/src/tag/v{{ package.version }}">{{ package.name }} {{ package.version }}</a></p>
|
<p>powered by <a rel="code-repository" href="{{ package.repository }}/src/tag/v{{ package.version }}">{{ package.name }} {{ package.version }}</a></p>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
from jinja2 import evalcontextfilter
|
|
||||||
from markdown import Markdown
|
|
||||||
|
|
||||||
from .bleach import bleach
|
|
||||||
|
|
||||||
md = Markdown(extensions=(
|
|
||||||
'markdown.extensions.extra',
|
|
||||||
'markdown.extensions.headerid',
|
|
||||||
'markdown.extensions.sane_lists',
|
|
||||||
'markdown.extensions.smarty',
|
|
||||||
))
|
|
||||||
|
|
||||||
|
|
||||||
@evalcontextfilter
|
|
||||||
def markdown(ctx, source):
|
|
||||||
return bleach(ctx, md.reset().convert(source))
|
|
134
lemoncurry/templates/lemoncurry/layout.html
Normal file
134
lemoncurry/templates/lemoncurry/layout.html
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
{% load analytical compress favicon lemoncurry_tags meta static theme_colour %}<!doctype html>
|
||||||
|
<html dir="ltr" lang="en" class="{% block html_class %}{% endblock %}">
|
||||||
|
<head{% meta_namespaces %}>{% site_name as site_name %}{% request_uri request as uri %}{% request_origin request as origin %}
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
|
||||||
|
|
||||||
|
<base href="{{ origin }}" />
|
||||||
|
<link rel="canonical" href="{{ uri }}" />
|
||||||
|
<title class="p-name">{% if title %}{{ title }} ~ {% endif %}{{ site_name }}</title>
|
||||||
|
|
||||||
|
{% analytical_head_top %}
|
||||||
|
{% if atom %}<link rel="alternate" type="application/atom+xml" href="{{ atom }}" />{% endif %}
|
||||||
|
{% if rss %}<link rel="alternate" type="application/rss+xml" href="{{ rss }}" /> {% endif %}
|
||||||
|
{% block head %}{% endblock %}
|
||||||
|
|
||||||
|
<link rel="authorization_endpoint" href="{{ origin }}{% url 'lemonauth:indie' %}" />
|
||||||
|
<link rel="token_endpoint" href="{{ origin }}{% url 'lemonauth:token' %}" />
|
||||||
|
<link rel="micropub" href="{{ origin }}{% url 'micropub:micropub' %}" />
|
||||||
|
<link rel="openid.delegate" href="{{ uri }}" />
|
||||||
|
<link rel="openid.server" href="https://openid.indieauth.com/openid" />
|
||||||
|
|
||||||
|
<link rel="hub" href="{% get_push_hub %}" />
|
||||||
|
<link rel="self" href="{{ uri }}" />
|
||||||
|
|
||||||
|
<link rel="manifest" href="{% url 'wellknowns:manifest' %}" />
|
||||||
|
<meta name="theme-color" content="{% theme_colour 2 %}" />
|
||||||
|
{% get_package_json as package %}
|
||||||
|
<meta name="generator" content="{{ package.name }} {{ package.version }}" />
|
||||||
|
|
||||||
|
<meta property="og:url" content="{{ uri }}" />
|
||||||
|
<meta property="og:title" content="{% firstof title site_name %}" />
|
||||||
|
{% include 'meta/meta.html' %}
|
||||||
|
{% get_favicons 'favicon/' %}
|
||||||
|
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"
|
||||||
|
integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/monokai.min.css"
|
||||||
|
integrity="sha384-bHqbpRh/XW+phptvH9nQvMKHwPH1ZbOxpIeAB2D2OIEL4Ni7aZzZgMFpsRra+v1g" crossorigin="anonymous" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://unpkg.com/openwebicons@1.4.3/css/openwebicons.min.css"
|
||||||
|
integrity="sha384-Ljk0G9f8GyEhAzrdHNkQc89A/Kpq+sy09gejdAPyMyTDnPe4aDfS/ppZ/rDGM0Y9" crossorigin="anonymous" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://unpkg.com/tippy.js@2.5.2/dist/tippy.css"
|
||||||
|
integrity="sha384-JsezPuW/bNd38848K5/8rIEbB+23QGQ8faCF8xEmjFT3i1qujgGiewfYevzMO3J1" crossorigin="anonymous" />
|
||||||
|
{% compress css %}
|
||||||
|
<link rel="stylesheet" type="text/stylus" href="{% static 'lemoncurry/css/layout.styl' %}" />
|
||||||
|
{% block styles %}{% endblock %}
|
||||||
|
{% endcompress %}
|
||||||
|
<script type="text/javascript" defer src="https://use.fontawesome.com/releases/v5.0.13/js/all.js"
|
||||||
|
integrity="sha384-xymdQtn1n3lH2wcu0qhcdaOpQwyoarkgLVxC/wZ5q7h9gHtxICrpcaSUfygqZGOe" crossorigin="anonymous"></script>
|
||||||
|
{% analytical_head_bottom %}
|
||||||
|
</head>
|
||||||
|
<body{% block body_attr %}{% endblock %}>
|
||||||
|
{% analytical_body_top %}
|
||||||
|
<header>
|
||||||
|
<nav class="navbar navbar-expand-md navbar-dark">
|
||||||
|
<a class="navbar-brand" rel="home" href="{% url 'home:index' %}">{% site_name %}</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar"
|
||||||
|
aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="navbar">
|
||||||
|
{% block nav_left %}{% nav_left request %}{% endblock %}
|
||||||
|
{% block nav_right %}{% nav_right request %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
{% if request.resolver_match.view_name %}
|
||||||
|
{% nav_crumbs request.resolver_match %}
|
||||||
|
{% endif %}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
{% block main %}{% endblock %}
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>all content licensed under <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">cc by-sa 4.0</a></p>
|
||||||
|
|
||||||
|
{% if entries.has_other_pages %}
|
||||||
|
<nav>
|
||||||
|
<ul class="pagination">
|
||||||
|
{% if entries.prev %}
|
||||||
|
<li class="page-item">
|
||||||
|
<a class="page-link" rel="prev" href="{{ entries.prev.url }}">
|
||||||
|
<i class="fas fa-step-backward"></i><span class="sr-only">previous page</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% for page in entries.pages %}
|
||||||
|
{% if page.current %}
|
||||||
|
<li class="page-item active">
|
||||||
|
<span class="page-link">{{ page.i }} <span class="sr-only">(current page)</span></span>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="page-item">
|
||||||
|
<a class="page-link" href="{{ page.url }}">{{ page.i }}</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% if entries.next %}
|
||||||
|
<li class="page-item">
|
||||||
|
<a class="page-link" rel="next" href="{{ entries.next.url }}">
|
||||||
|
<i class="fas fa-step-forward"></i><span class="sr-only">next page</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<p>powered by <a rel="code-repository" href="{{ package.repository }}/src/tag/v{{ package.version }}">{{ package.name }} {{ package.version }}</a></p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" crossorigin="anonymous"
|
||||||
|
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" crossorigin="anonymous"
|
||||||
|
integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" crossorigin="anonymous"
|
||||||
|
integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js" crossorigin="anonymous"
|
||||||
|
integrity="sha384-ZeLYJ2PNSQjvogWP559CDAf02Qb8FE5OyQicqtz/+UhZutbrwyr87Be7NPH/RgyC"></script>
|
||||||
|
<script src="https://unpkg.com/tippy.js@2.5.2/dist/tippy.standalone.min.js" crossorigin="anonymous"
|
||||||
|
integrity="sha384-VEMCz3fC5atUNN+ezSHq2AZIBciT3aWGEZsStnW58gtO9PYb3wenWsYNoxLTbi/M"></script>
|
||||||
|
|
||||||
|
{% compress js %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
hljs.initHighlightingOnLoad();
|
||||||
|
</script>
|
||||||
|
{% block foot %}{% endblock %}
|
||||||
|
{% endcompress %}
|
||||||
|
{% analytical_body_bottom %}
|
||||||
|
</body>
|
||||||
|
</html>
|
11
lemoncurry/templates/lemoncurry/tags/breadcrumbs.html
Normal file
11
lemoncurry/templates/lemoncurry/tags/breadcrumbs.html
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{% load jsonify %}{% if crumbs %}
|
||||||
|
<nav class="breadcrumbs" aria-label="breadcrumb" role="navigation">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
{% for crumb in crumbs %}
|
||||||
|
<li class="breadcrumb-item"><a href="{{ crumb.url }}">{{ crumb.label }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
<li class="breadcrumb-item active" aria-current="page">{% firstof current.label title %}</li>
|
||||||
|
</ol>
|
||||||
|
<script type="application/ld+json">{{ breadcrumb_list | jsonify }}</script>
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
8
lemoncurry/templates/lemoncurry/tags/nav.html
Normal file
8
lemoncurry/templates/lemoncurry/tags/nav.html
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{% load activeurl %}{% activeurl %}<ul class="navbar-nav">
|
||||||
|
{% for item in items %}
|
||||||
|
<li class="nav-item"><a class="nav-link" href="{{ item.url }}">
|
||||||
|
<i class="{{ item.icon }} fa-fw"></i>
|
||||||
|
{{ item.label }}
|
||||||
|
</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>{% endactiveurl %}
|
Loading…
Reference in a new issue