summaryrefslogtreecommitdiffstats
path: root/nikola/data/themes/bootstrap4-jinja/templates
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2021-02-03 19:17:00 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2021-02-03 19:17:00 -0500
commit3a0d66f07b112b6d2bdc2b57bbf717a89a351ce6 (patch)
treea7cf56282e54f05785243bc1e903d6594f2c06ba /nikola/data/themes/bootstrap4-jinja/templates
parent787b97a4cb24330b36f11297c6d3a7a473a907d0 (diff)
New upstream version 8.1.2.upstream/8.1.2
Diffstat (limited to 'nikola/data/themes/bootstrap4-jinja/templates')
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/authors.tmpl25
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/base.tmpl105
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/base_helper.tmpl165
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/index_helper.tmpl13
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/listing.tmpl30
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/pagination_helper.tmpl40
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/post.tmpl57
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/tags.tmpl38
-rw-r--r--nikola/data/themes/bootstrap4-jinja/templates/ui_helper.tmpl24
9 files changed, 497 insertions, 0 deletions
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/authors.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/authors.tmpl
new file mode 100644
index 0000000..922de74
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/authors.tmpl
@@ -0,0 +1,25 @@
+{# -*- coding: utf-8 -*- #}
+{% extends 'base.tmpl' %}
+{% import 'feeds_translations_helper.tmpl' as feeds_translations with context %}
+
+{% block extra_head %}
+ {{ feeds_translations.head(kind=kind, feeds=False) }}
+{% endblock %}
+
+{% block content %}
+{% if items %}
+ <h2>{{ messages("Authors") }}</h2>
+ <div class="metadata">
+ {{ feeds_translations.translation_link(kind) }}
+ </div>
+{% endif %}
+{% if items %}
+ <ul class="list-inline">
+ {% for text, link in items %}
+ {% if text not in hidden_authors %}
+ <li><a class="reference badge" href="{{ link }}">{{ text|e }}</a></li>
+ {% endif %}
+ {% endfor %}
+ </ul>
+{% endif %}
+{% endblock %}
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/base.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/base.tmpl
new file mode 100644
index 0000000..0748bb2
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/base.tmpl
@@ -0,0 +1,105 @@
+{# -*- coding: utf-8 -*- #}
+{% import 'base_helper.tmpl' as base with context %}
+{% import 'annotation_helper.tmpl' as notes with context %}
+{{ set_locale(lang) }}
+{{ base.html_headstart() }}
+{% block extra_head %}
+{# Leave this block alone. #}
+{% endblock %}
+{{ template_hooks['extra_head']() }}
+</head>
+<body>
+<a href="#content" class="sr-only sr-only-focusable">{{ messages("Skip to main content") }}</a>
+
+<!-- Menubar -->
+
+<nav class="navbar navbar-expand-md static-top mb-4
+{% if theme_config.get('navbar_light') %}
+navbar-light
+{% else %}
+navbar-dark
+{% endif %}
+{% if theme_config.get('navbar_custom_bg') %}
+{{ theme_config['navbar_custom_bg'] }}
+{% elif theme_config.get('navbar_light') %}
+bg-light
+{% else %}
+bg-dark
+{% endif %}
+">
+ <div class="container"><!-- This keeps the margins nice -->
+ <a class="navbar-brand" href="{{ _link("root", None, lang) }}">
+ {% if logo_url %}
+ <img src="{{ logo_url }}" alt="{{ blog_title|e }}" id="logo" class="d-inline-block align-top">
+ {% endif %}
+
+ {% if show_blog_title %}
+ <span id="blog-title">{{ blog_title|e }}</span>
+ {% endif %}
+ </a>
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#bs-navbar" aria-controls="bs-navbar" aria-expanded="false" aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+
+ <div class="collapse navbar-collapse" id="bs-navbar">
+ <ul class="navbar-nav mr-auto">
+ {{ base.html_navigation_links_entries(navigation_links) }}
+ {{ template_hooks['menu']() }}
+ </ul>
+ {% if search_form %}
+ {{ search_form }}
+ {% endif %}
+
+ <ul class="navbar-nav navbar-right">
+ {{ base.html_navigation_links_entries(navigation_alt_links) }}
+ {% block belowtitle %}
+ {% if translations|length > 1 %}
+ <li>{{ base.html_translations() }}</li>
+ {% endif %}
+ {% endblock %}
+ {% if show_sourcelink %}
+ {% block sourcelink %}{% endblock %}
+ {% endif %}
+ {{ template_hooks['menu_alt']() }}
+ </ul>
+ </div><!-- /.navbar-collapse -->
+ </div><!-- /.container -->
+</nav>
+
+<!-- End of Menubar -->
+
+<div class="container" id="content" role="main">
+ <div class="body-content">
+ <!--Body content-->
+ {{ template_hooks['page_header']() }}
+ {% block extra_header %}{% endblock %}
+ {% block content %}{% endblock %}
+ <!--End of body content-->
+
+ <footer id="footer">
+ {{ content_footer }}
+ {{ template_hooks['page_footer']() }}
+ {% block extra_footer %}{% endblock %}
+ </footer>
+ </div>
+</div>
+
+{{ base.late_load_js() }}
+ {% if date_fanciness != 0 %}
+ <!-- fancy dates -->
+ <script>
+ luxon.Settings.defaultLocale = "{{ luxon_locales[lang] }}";
+ fancydates({{ date_fanciness }}, {{ luxon_date_format }});
+ </script>
+ <!-- end fancy dates -->
+ {% endif %}
+ {% block extra_js %}{% endblock %}
+ <script>
+ baguetteBox.run('div#content', {
+ ignoreClass: 'islink',
+ captions: function(element){var i=element.getElementsByTagName('img')[0];return i===undefined?'':i.alt;}});
+ </script>
+{{ body_end }}
+{{ template_hooks['body_end']() }}
+</body>
+</html>
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/base_helper.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/base_helper.tmpl
new file mode 100644
index 0000000..b4bcf85
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/base_helper.tmpl
@@ -0,0 +1,165 @@
+{# -*- coding: utf-8 -*- #}
+{% import 'feeds_translations_helper.tmpl' as feeds_translations with context %}
+
+{% macro html_headstart() %}
+<!DOCTYPE html>
+<html
+
+prefix='
+og: http://ogp.me/ns# article: http://ogp.me/ns/article#
+{% if comment_system == 'facebook' %}
+fb: http://ogp.me/ns/fb#
+{% endif %}
+'
+{% if is_rtl %}
+dir="rtl"
+{% endif %}
+
+lang="{{ lang }}">
+ <head>
+ <meta charset="utf-8">
+ {% if description %}
+ <meta name="description" content="{{ description|e }}">
+ {% endif %}
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ {% if title == blog_title %}
+ <title>{{ blog_title|e }}</title>
+ {% else %}
+ <title>{{ title|e }} | {{ blog_title|e }}</title>
+ {% endif %}
+
+ {{ html_stylesheets() }}
+ <meta name="theme-color" content="{{ theme_color }}">
+ {% if meta_generator_tag %}
+ <meta name="generator" content="Nikola (getnikola.com)">
+ {% endif %}
+ {{ html_feedlinks() }}
+ <link rel="canonical" href="{{ abs_link(permalink) }}">
+
+ {% if favicons %}
+ {% for name, file, size in favicons %}
+ <link rel="{{ name }}" href="{{ file }}" sizes="{{ size }}"/>
+ {% endfor %}
+ {% endif %}
+
+ {% if comment_system == 'facebook' %}
+ <meta property="fb:app_id" content="{{ comment_system_id }}">
+ {% endif %}
+
+ {% if prevlink %}
+ <link rel="prev" href="{{ prevlink }}" type="text/html">
+ {% endif %}
+ {% if nextlink %}
+ <link rel="next" href="{{ nextlink }}" type="text/html">
+ {% endif %}
+
+ {% if use_cdn %}
+ <!--[if lt IE 9]><script src="https://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
+ {% else %}
+ <!--[if lt IE 9]><script src="{{ url_replacer(permalink, '/assets/js/html5.js', lang, url_type) }}"></script><![endif]-->
+ {% endif %}
+
+ {{ extra_head_data }}
+{% endmacro %}
+
+{% macro late_load_js() %}
+ {% if use_cdn %}
+ <script src="http://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
+ <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/baguettebox.js/1.11.1/baguetteBox.min.js" integrity="sha256-ULQV01VS9LCI2ePpLsmka+W0mawFpEA0rtxnezUj4A4=" crossorigin="anonymous"></script>
+ {% endif %}
+ {% if use_bundles and use_cdn %}
+ <script src="/assets/js/all.js"></script>
+ {% elif use_bundles %}
+ <script src="/assets/js/all-nocdn.js"></script>
+ {% else %}
+ {% if not use_cdn %}
+ <script src="/assets/js/jquery.min.js"></script>
+ <script src="/assets/js/popper.min.js"></script>
+ <script src="/assets/js/bootstrap.min.js"></script>
+ <script src="/assets/js/baguetteBox.min.js"></script>
+ {% endif %}
+ {% endif %}
+ {% if date_fanciness != 0 %}
+ {% if date_fanciness == 2 %}
+ <script src="https://polyfill.io/v3/polyfill.js?features=Intl.RelativeTimeFormat.%7Elocale.{{ luxon_locales[lang] }}"></script>
+ {% endif %}
+ {% if use_cdn %}
+ <script src="https://cdn.jsdelivr.net/npm/luxon@1.25.0/build/global/luxon.min.js" integrity="sha256-OVk2fwTRcXYlVFxr/ECXsakqelJbOg5WCj1dXSIb+nU=" crossorigin="anonymous"></script>
+ {% else %}
+ <script src="/assets/js/luxon.min.js"></script>
+ {% endif %}
+ {% if not use_bundles %}
+ <script src="/assets/js/fancydates.min.js"></script>
+ {% endif %}
+ {% endif %}
+ {{ social_buttons_code }}
+{% endmacro %}
+
+
+{% macro html_stylesheets() %}
+ {% if use_cdn %}
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/baguettebox.js/1.11.1/baguetteBox.min.css" integrity="sha256-cLMYWYYutHkt+KpNqjg7NVkYSQ+E2VbrXsEvOqU7mL0=" crossorigin="anonymous">
+ {% endif %}
+ {% if use_bundles and use_cdn %}
+ <link href="/assets/css/all.css" rel="stylesheet" type="text/css">
+ {% elif use_bundles %}
+ <link href="/assets/css/all-nocdn.css" rel="stylesheet" type="text/css">
+ {% else %}
+ {% if not use_cdn %}
+ <link href="/assets/css/bootstrap.min.css" rel="stylesheet" type="text/css">
+ <link href="/assets/css/baguetteBox.min.css" rel="stylesheet" type="text/css">
+ {% endif %}
+ <link href="/assets/css/rst.css" rel="stylesheet" type="text/css">
+ <link href="/assets/css/code.css" rel="stylesheet" type="text/css">
+ <link href="/assets/css/theme.css" rel="stylesheet" type="text/css">
+ {% if has_custom_css %}
+ <link href="/assets/css/custom.css" rel="stylesheet" type="text/css">
+ {% endif %}
+ {% endif %}
+ {% if needs_ipython_css %}
+ <link href="/assets/css/ipython.min.css" rel="stylesheet" type="text/css">
+ <link href="/assets/css/nikola_ipython.css" rel="stylesheet" type="text/css">
+ {% endif %}
+{% endmacro %}
+
+{% macro html_navigation_links() %}
+ {{ html_navigation_links_entries(navigation_links) }}
+{% endmacro %}
+
+{% macro html_navigation_links_entries(navigation_links_source) %}
+ {% for url, text in navigation_links_source[lang] %}
+ {% if isinstance(url, tuple) %}
+ <li class="nav-item dropdown"><a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ text }}</a>
+ <div class="dropdown-menu">
+ {% for suburl, text in url %}
+ {% if rel_link(permalink, suburl) == "#" %}
+ <a href="{{ permalink }}" class="dropdown-item active">{{ text }} <span class="sr-only">{{ messages("(active)", lang) }}</span></a>
+ {% else %}
+ <a href="{{ suburl }}" class="dropdown-item">{{ text }}</a>
+ {% endif %}
+ {% endfor %}
+ </div>
+ {% else %}
+ {% if rel_link(permalink, url) == "#" %}
+ <li class="nav-item active"><a href="{{ permalink }}" class="nav-link">{{ text }} <span class="sr-only">{{ messages("(active)", lang) }}</span></a>
+ {% else %}
+ <li class="nav-item"><a href="{{ url }}" class="nav-link">{{ text }}</a>
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+{% endmacro %}
+
+{% macro html_feedlinks() %}
+ {{ feeds_translations.head(classification=None, kind='index', other=False) }}
+{% endmacro %}
+
+{% macro html_translations() %}
+ {% for langname in translations|sort %}
+ {% if langname != lang %}
+ <li class="nav-item"><a href="{{ _link("root", None, langname) }}" rel="alternate" hreflang="{{ langname }}" class="nav-link">{{ messages("LANGUAGE", langname) }}</a></li>
+ {% endif %}
+ {% endfor %}
+{% endmacro %}
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/index_helper.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/index_helper.tmpl
new file mode 100644
index 0000000..2fec2c6
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/index_helper.tmpl
@@ -0,0 +1,13 @@
+{# -*- coding: utf-8 -*- #}
+{% macro html_pager() %}
+ {% if prevlink or nextlink %}
+ <ul class="pager postindexpager clearfix">
+ {% if prevlink %}
+ <li class="previous"><a href="{{ prevlink }}" rel="prev">{{ messages("Newer posts") }}</a></li>
+ {% endif %}
+ {% if nextlink %}
+ <li class="next"><a href="{{ nextlink }}" rel="next">{{ messages("Older posts") }}</a></li>
+ {% endif %}
+ </ul>
+ {% endif %}
+{% endmacro %}
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/listing.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/listing.tmpl
new file mode 100644
index 0000000..56a1b4f
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/listing.tmpl
@@ -0,0 +1,30 @@
+{# -*- coding: utf-8 -*- #}
+{% extends 'base.tmpl' %}
+{% import 'ui_helper.tmpl' as ui with context %}
+{% block content %}
+{{ ui.breadcrumbs(crumbs) }}
+{% if folders or files %}
+<ul>
+{% for name in folders %}
+ <li><a href="{{ name|e }}">📂&nbsp;{{ name|e }}</a>
+{% endfor %}
+{% for name in files %}
+ <li><a href="{{ name|e }}.html">📄&nbsp;{{ name|e }}</a>
+{% endfor %}
+</ul>
+{% endif %}
+{% if code %}
+<h1>{{ title }}
+ {% if source_link %}
+ <small><a href="{{ source_link }}">({{ messages("Source") }})</a></small>
+ {% endif %}
+ </h1>
+ {{ code }}
+{% endif %}
+{% endblock %}
+
+{% block sourcelink %}
+{% if source_link and show_sourcelink %}
+ {{ ui.show_sourcelink(source_link) }}
+{% endif %}
+{% endblock %}
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/pagination_helper.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/pagination_helper.tmpl
new file mode 100644
index 0000000..30fe534
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/pagination_helper.tmpl
@@ -0,0 +1,40 @@
+{# -*- coding: utf-8 -*- #}
+{% macro page_navigation(current_page, page_links, prevlink, nextlink, prev_next_links_reversed, surrounding=5) %}
+<nav aria-label="Page navigation">
+ <ul class="pagination">
+ {% if prev_next_links_reversed %}
+ {% if nextlink %}
+ <li class="page-item"><a href="{{ nextlink }}" class="page-link" aria-label="{{ messages("Older posts") }}"><span aria-hidden="true">&laquo;</span></a></li>
+ {% else %}
+ <li class="page-item disabled"><a href="#" class="page-link" aria-label="{{ messages("Older posts") }}"><span aria-hidden="true">&laquo;</span></a></li>
+ {% endif %}
+ {% else %}
+ {% if prevlink %}
+ <li class="page-item"><a href="{{ prevlink }}" class="page-link" aria-label="{{ messages("Newer posts") }}"><span aria-hidden="true">&laquo;</span></a></li>
+ {% else %}
+ <li class="page-item disabled"><a href="#" class="page-link" aria-label="{{ messages("Newer posts") }}"><span aria-hidden="true">&laquo;</span></a></li>
+ {% endif %}
+ {% endif %}
+ {% for i, link in enumerate(page_links) %}
+ {% if (i - current_page)|abs <= surrounding or i == 0 or i == page_links|length - 1 %}
+ <li class="page-item {{ 'active' if i == current_page else '' }}"><a href="{{ link }}" class="page-link">{{ i + 1 }}{{ ' <span class="sr-only">(current)</span>' if i == current_page else '' }}</a></li>
+ {% elif i == current_page - surrounding - 1 or i == current_page + surrounding + 1 %}
+ <li class="page-item disabled"><a href="#" class="page-link" aria-label="…"><span aria-hidden="true">…</span></a></li>
+ {% endif %}
+ {% endfor %}
+ {% if prev_next_links_reversed %}
+ {% if prevlink %}
+ <li class="page-item"><a href="{{ prevlink }}" class="page-link" aria-label="{{ messages("Newer posts") }}"><span aria-hidden="true">&raquo;</span></a></li>
+ {% else %}
+ <li class="page-item disabled"><a href="#" class="page-link" aria-label="{{ messages("Newer posts") }}"><span aria-hidden="true">&raquo;</span></a></li>
+ {% endif %}
+ {% else %}
+ {% if nextlink %}
+ <li class="page-item"><a href="{{ nextlink }}" class="page-link" aria-label="{{ messages("Older posts") }}"><span aria-hidden="true">&raquo;</span></a></li>
+ {% else %}
+ <li class="page-item disabled"><a href="#" class="page-link" aria-label="{{ messages("Older posts") }}"><span aria-hidden="true">&raquo;</span></a></li>
+ {% endif %}
+ {% endif %}
+ </ul>
+</nav>
+{% endmacro %}
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/post.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/post.tmpl
new file mode 100644
index 0000000..7e18f90
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/post.tmpl
@@ -0,0 +1,57 @@
+{# -*- coding: utf-8 -*- #}
+{% import 'post_helper.tmpl' as helper with context %}
+{% import 'post_header.tmpl' as pheader with context %}
+{% import 'comments_helper.tmpl' as comments with context %}
+{% import 'math_helper.tmpl' as math with context %}
+{% import 'ui_helper.tmpl' as ui with context %}
+{% extends 'base.tmpl' %}
+
+{% block extra_head %}
+ {{ super() }}
+ {% if post.meta('keywords') %}
+ <meta name="keywords" content="{{ smartjoin(', ', post.meta('keywords'))|e }}">
+ {% endif %}
+ <meta name="author" content="{{ post.author()|e }}">
+ {% if post.prev_post %}
+ <link rel="prev" href="{{ post.prev_post.permalink() }}" title="{{ post.prev_post.title()|e }}" type="text/html">
+ {% endif %}
+ {% if post.next_post %}
+ <link rel="next" href="{{ post.next_post.permalink() }}" title="{{ post.next_post.title()|e }}" type="text/html">
+ {% endif %}
+ {% if post.is_draft %}
+ <meta name="robots" content="noindex">
+ {% endif %}
+ {{ helper.open_graph_metadata(post) }}
+ {{ helper.twitter_card_information(post) }}
+ {{ helper.meta_translations(post) }}
+ {{ math.math_styles_ifpost(post) }}
+{% endblock %}
+
+{% block content %}
+<article class="post-{{ post.meta('type') }} h-entry hentry postpage" itemscope="itemscope" itemtype="http://schema.org/Article">
+ {{ pheader.html_post_header() }}
+ <div class="e-content entry-content" itemprop="articleBody text">
+ {{ post.text() }}
+ </div>
+ <aside class="postpromonav">
+ <nav>
+ {{ helper.html_tags(post) }}
+ {{ helper.html_pager(post) }}
+ </nav>
+ </aside>
+ {% if not post.meta('nocomments') and site_has_comments %}
+ <section class="comments hidden-print">
+ <h2>{{ messages("Comments") }}</h2>
+ {{ comments.comment_form(post.permalink(absolute=True), post.title(), post._base_path) }}
+ </section>
+ {% endif %}
+ {{ math.math_scripts_ifpost(post) }}
+</article>
+{{ comments.comment_link_script() }}
+{% endblock %}
+
+{% block sourcelink %}
+{% if show_sourcelink %}
+ {{ ui.show_sourcelink(post.source_link()) }}
+{% endif %}
+{% endblock %}
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/tags.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/tags.tmpl
new file mode 100644
index 0000000..0eadff6
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/tags.tmpl
@@ -0,0 +1,38 @@
+{# -*- coding: utf-8 -*- #}
+{% extends 'base.tmpl' %}
+
+{% block content %}
+<h1>{{ title|e }}</h1>
+{% if cat_items %}
+ {% if items %}
+ <h2>{{ messages("Categories") }}</h2>
+ {% endif %}
+ {% for text, full_name, path, link, indent_levels, indent_change_before, indent_change_after in cat_hierarchy %}
+ {% for i in range(indent_change_before) %}
+ <ul class="list-inline">
+ {% endfor %}
+ <li class="list-inline-item"><a class="reference badge badge-secondary" href="{{ link }}">{{ text|e }}</a>
+ {% if indent_change_after <= 0 %}
+ </li>
+ {% endif %}
+ {% for i in range(-indent_change_after) %}
+ </ul>
+ {% if i + 1 < indent_levels|length %}
+ </li>
+ {% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% if items %}
+ <h2>{{ messages("Tags") }}</h2>
+ {% endif %}
+{% endif %}
+{% if items %}
+ <ul class="list-inline">
+ {% for text, link in items %}
+ {% if text not in hidden_tags %}
+ <li class="list-inline-item"><a class="reference badge badge-secondary" href="{{ link }}">{{ text|e }}</a></li>
+ {% endif %}
+ {% endfor %}
+ </ul>
+{% endif %}
+{% endblock %}
diff --git a/nikola/data/themes/bootstrap4-jinja/templates/ui_helper.tmpl b/nikola/data/themes/bootstrap4-jinja/templates/ui_helper.tmpl
new file mode 100644
index 0000000..d8c8d4d
--- /dev/null
+++ b/nikola/data/themes/bootstrap4-jinja/templates/ui_helper.tmpl
@@ -0,0 +1,24 @@
+{# -*- coding: utf-8 -*- #}
+{% macro breadcrumbs(crumbs) %}
+{% if crumbs %}
+<nav class="breadcrumbs">
+<ul class="breadcrumb">
+ {% for link, text in crumbs %}
+ {% if text != index_file %}
+ {% if link == '#' %}
+ <li class="breadcrumb-item active">{{ text.rsplit('.html', 1)[0] }}</li>
+ {% else %}
+ <li class="breadcrumb-item"><a href="{{ link }}">{{ text }}</a></li>
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+</ul>
+</nav>
+{% endif %}
+{% endmacro %}
+
+{% macro show_sourcelink(sourcelink_href) %}
+ <li class="nav-item">
+ <a href="{{ sourcelink_href }}" id="sourcelink" class="nav-link">{{ messages("Source") }}</a>
+ </li>
+{% endmacro %}