From: Vladimír Vondruš Date: Tue, 16 Jan 2018 23:15:30 +0000 (+0100) Subject: theme: ability to specify a favicon. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~cjwatson/git?a=commitdiff_plain;h=186aa823dc7346d21c6040e1115ee6d9369cec8f;p=blog.git theme: ability to specify a favicon. --- diff --git a/doc/pelican/theme.rst b/doc/pelican/theme.rst index 0e43d282..7baca8a9 100644 --- a/doc/pelican/theme.rst +++ b/doc/pelican/theme.rst @@ -124,6 +124,19 @@ can be either absolute or relative to :py:`SITEURL`. If :py:`M_BLOG_NAME` / M_BLOG_NAME = 'Your Brand Blog' M_BLOG_URL = 'blog/' +The :py:`M_FAVICON` setting, if present, is used to specify contents of the +:html:`` tag. It's a tuple of :py:`(url, type)` where +:py:`url` is favicon URL and :py:`type` is its corresponding MIME type. If +:py:`M_BLOG_FAVICON` is specified, it's overriding :py:`M_FAVICON` on blog-like +pages (articles, article listing... basically everything except pages). If +:py:`M_BLOG_FAVICON` is not specified, :py:`M_FAVICON` is used everywhere; if +neither is specified no :html:`` tag is rendered. Example configuration: + +.. code:: py + + M_FAVICON = ('favicon.ico', 'image/x-ico') + M_BLOG_FAVICON = ('favicon-blog.png', 'image/png') + `Top navbar`_ ------------- diff --git a/pelican-theme/templates/archives.html b/pelican-theme/templates/archives.html index 7de533a5..2332d95c 100644 --- a/pelican-theme/templates/archives.html +++ b/pelican-theme/templates/archives.html @@ -3,6 +3,7 @@ {% block title %}{{ M_BLOG_NAME|e }}{% endblock %} {% block head_links %} + {{- super() -}} {% if articles_page and articles_page.has_previous() %} {% endif %} diff --git a/pelican-theme/templates/article.html b/pelican-theme/templates/article.html index 79a9f515..b3023b5d 100644 --- a/pelican-theme/templates/article.html +++ b/pelican-theme/templates/article.html @@ -3,6 +3,8 @@ {% block title %}{{ article.title }} | {{ M_BLOG_NAME|e }}{% endblock %} {% block head_links %} + {{- super() -}} + {# don't mind me, I'm just fixing whitespace from the previous line #} {% endblock %} diff --git a/pelican-theme/templates/base_blog.html b/pelican-theme/templates/base_blog.html index 89ee2b7d..d41236df 100644 --- a/pelican-theme/templates/base_blog.html +++ b/pelican-theme/templates/base_blog.html @@ -2,6 +2,14 @@ {% if not M_BLOG_NAME %}{% set M_BLOG_NAME = SITENAME %}{% endif %} {% extends 'base.html' %} +{% block head_links %} + {% if M_BLOG_FAVICON %} + + {% elif M_FAVICON %} + + {% endif %} +{% endblock %} + {% block social %} {% endblock %} diff --git a/pelican-theme/templates/base_blog_section.html b/pelican-theme/templates/base_blog_section.html index f442aa86..5d10e120 100644 --- a/pelican-theme/templates/base_blog_section.html +++ b/pelican-theme/templates/base_blog_section.html @@ -1,6 +1,7 @@ {% extends "base_blog.html" %} {% block head_links %} + {{- super() -}} {% if articles_page.has_previous() %} {% endif %} diff --git a/pelican-theme/templates/page.html b/pelican-theme/templates/page.html index 6a8f33d2..70972616 100644 --- a/pelican-theme/templates/page.html +++ b/pelican-theme/templates/page.html @@ -20,6 +20,9 @@ {% endfor %} {% endif %} + {% if M_FAVICON %} + + {% endif %} {% endblock %} diff --git a/pelican-theme/test/blog/archives.html b/pelican-theme/test/blog/archives.html index d0854490..5cbdb224 100644 --- a/pelican-theme/test/blog/archives.html +++ b/pelican-theme/test/blog/archives.html @@ -5,6 +5,7 @@ A Pelican Blog + diff --git a/pelican-theme/test/blog/article-jumbo.html b/pelican-theme/test/blog/article-jumbo.html index b3a15b53..a9c164d1 100644 --- a/pelican-theme/test/blog/article-jumbo.html +++ b/pelican-theme/test/blog/article-jumbo.html @@ -5,6 +5,7 @@ An article — a jumbo one | A Pelican Blog + diff --git a/pelican-theme/test/blog/article.html b/pelican-theme/test/blog/article.html index 05fdad7c..7204624d 100644 --- a/pelican-theme/test/blog/article.html +++ b/pelican-theme/test/blog/article.html @@ -5,6 +5,7 @@ An article | A Pelican Blog + diff --git a/pelican-theme/test/blog/author-explicit-author.html b/pelican-theme/test/blog/author-explicit-author.html index cf4eade7..d1dc040c 100644 --- a/pelican-theme/test/blog/author-explicit-author.html +++ b/pelican-theme/test/blog/author-explicit-author.html @@ -5,6 +5,7 @@ Posts by Explicit Author | A Pelican Blog + diff --git a/pelican-theme/test/blog/category-another-category.html b/pelican-theme/test/blog/category-another-category.html index 4f1b0ec6..e356a0bb 100644 --- a/pelican-theme/test/blog/category-another-category.html +++ b/pelican-theme/test/blog/category-another-category.html @@ -5,6 +5,7 @@ Another category | A Pelican Blog + diff --git a/pelican-theme/test/blog/index.html b/pelican-theme/test/blog/index.html index b804f4c8..d9b7f998 100644 --- a/pelican-theme/test/blog/index.html +++ b/pelican-theme/test/blog/index.html @@ -5,6 +5,7 @@ A Pelican Blog + diff --git a/pelican-theme/test/blog/tag-third.html b/pelican-theme/test/blog/tag-third.html index 9bc9d909..e904d2e6 100644 --- a/pelican-theme/test/blog/tag-third.html +++ b/pelican-theme/test/blog/tag-third.html @@ -5,6 +5,7 @@ Posts tagged Third | A Pelican Blog + diff --git a/pelican-theme/test/blog_global_favicon/index.html b/pelican-theme/test/blog_global_favicon/index.html new file mode 100644 index 00000000..6ce35c9e --- /dev/null +++ b/pelican-theme/test/blog_global_favicon/index.html @@ -0,0 +1,38 @@ + + + + + A Pelican Blog + + + + + + +
+
+
+
+
+
+

Congratulations!

+ The m.css theme is alive and kicking! Now, feed it some articles so it doesn't feel so empty :) +
+
+ +
+
+
+ + diff --git a/pelican-theme/test/blog_html_escape/archives.html b/pelican-theme/test/blog_html_escape/archives.html index 1b2a5b10..b493f6d4 100644 --- a/pelican-theme/test/blog_html_escape/archives.html +++ b/pelican-theme/test/blog_html_escape/archives.html @@ -5,6 +5,7 @@ <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/archives2.html b/pelican-theme/test/blog_html_escape/archives2.html index 77ceb109..1d96fcb4 100644 --- a/pelican-theme/test/blog_html_escape/archives2.html +++ b/pelican-theme/test/blog_html_escape/archives2.html @@ -5,6 +5,7 @@ <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/article-jumbo.html b/pelican-theme/test/blog_html_escape/article-jumbo.html index c3878888..2da60756 100644 --- a/pelican-theme/test/blog_html_escape/article-jumbo.html +++ b/pelican-theme/test/blog_html_escape/article-jumbo.html @@ -5,6 +5,7 @@ Article with <&> — a <&> jumbo one | <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/article.html b/pelican-theme/test/blog_html_escape/article.html index 27b0ad9b..918c0491 100644 --- a/pelican-theme/test/blog_html_escape/article.html +++ b/pelican-theme/test/blog_html_escape/article.html @@ -5,6 +5,7 @@ Article with <&> in title | <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/author-and-in-author.html b/pelican-theme/test/blog_html_escape/author-and-in-author.html index 17ae8145..88a3d423 100644 --- a/pelican-theme/test/blog_html_escape/author-and-in-author.html +++ b/pelican-theme/test/blog_html_escape/author-and-in-author.html @@ -5,6 +5,7 @@ Posts by And <&> in author | <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/author-and-in-author2.html b/pelican-theme/test/blog_html_escape/author-and-in-author2.html index d16ba4ba..170726ab 100644 --- a/pelican-theme/test/blog_html_escape/author-and-in-author2.html +++ b/pelican-theme/test/blog_html_escape/author-and-in-author2.html @@ -5,6 +5,7 @@ Posts by And <&> in author | <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/category-and-in-category.html b/pelican-theme/test/blog_html_escape/category-and-in-category.html index 47cbaa92..7ba9cd7b 100644 --- a/pelican-theme/test/blog_html_escape/category-and-in-category.html +++ b/pelican-theme/test/blog_html_escape/category-and-in-category.html @@ -5,6 +5,7 @@ And <&> in category | <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/category-and-in-category2.html b/pelican-theme/test/blog_html_escape/category-and-in-category2.html index ca83e2e9..f43c0bd2 100644 --- a/pelican-theme/test/blog_html_escape/category-and-in-category2.html +++ b/pelican-theme/test/blog_html_escape/category-and-in-category2.html @@ -5,6 +5,7 @@ And <&> in category | <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/index.html b/pelican-theme/test/blog_html_escape/index.html index aee21227..3b24d2d3 100644 --- a/pelican-theme/test/blog_html_escape/index.html +++ b/pelican-theme/test/blog_html_escape/index.html @@ -5,6 +5,7 @@ <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/index2.html b/pelican-theme/test/blog_html_escape/index2.html index 4e96afbe..fe22f103 100644 --- a/pelican-theme/test/blog_html_escape/index2.html +++ b/pelican-theme/test/blog_html_escape/index2.html @@ -5,6 +5,7 @@ <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/tag-and-in-tag.html b/pelican-theme/test/blog_html_escape/tag-and-in-tag.html index cbc21ee9..d2101e65 100644 --- a/pelican-theme/test/blog_html_escape/tag-and-in-tag.html +++ b/pelican-theme/test/blog_html_escape/tag-and-in-tag.html @@ -5,6 +5,7 @@ Posts tagged And <&> in tag | <&> in blog name + diff --git a/pelican-theme/test/blog_html_escape/tag-and-in-tag2.html b/pelican-theme/test/blog_html_escape/tag-and-in-tag2.html index d5e501df..3f0cdb8b 100644 --- a/pelican-theme/test/blog_html_escape/tag-and-in-tag2.html +++ b/pelican-theme/test/blog_html_escape/tag-and-in-tag2.html @@ -5,6 +5,7 @@ Posts tagged And <&> in tag | <&> in blog name + diff --git a/pelican-theme/test/layout/features.html b/pelican-theme/test/layout/features.html index 59d39022..e199ece5 100644 --- a/pelican-theme/test/layout/features.html +++ b/pelican-theme/test/layout/features.html @@ -5,6 +5,7 @@ Features | Your Brand + diff --git a/pelican-theme/test/layout/guest-post-howto.html b/pelican-theme/test/layout/guest-post-howto.html index 9e44328e..38ceca10 100644 --- a/pelican-theme/test/layout/guest-post-howto.html +++ b/pelican-theme/test/layout/guest-post-howto.html @@ -5,6 +5,7 @@ Guest post howto | Your Brand + diff --git a/pelican-theme/test/layout/index.html b/pelican-theme/test/layout/index.html index 009bf9e7..75681f18 100644 --- a/pelican-theme/test/layout/index.html +++ b/pelican-theme/test/layout/index.html @@ -5,6 +5,7 @@ Your Brand Blog + diff --git a/pelican-theme/test/layout/showcase-requirements.html b/pelican-theme/test/layout/showcase-requirements.html index f4f2de6e..50bd555b 100644 --- a/pelican-theme/test/layout/showcase-requirements.html +++ b/pelican-theme/test/layout/showcase-requirements.html @@ -5,6 +5,7 @@ Showcase requirements | Your Brand + diff --git a/pelican-theme/test/layout_html_escape/index.html b/pelican-theme/test/layout_html_escape/index.html index 13246ef3..8a2a7bc5 100644 --- a/pelican-theme/test/layout_html_escape/index.html +++ b/pelican-theme/test/layout_html_escape/index.html @@ -5,6 +5,7 @@ A <&> blog + diff --git a/pelican-theme/test/page_html_escape/breadcrumb.html b/pelican-theme/test/page_html_escape/breadcrumb.html index 32fe8fc5..0c7b5f04 100644 --- a/pelican-theme/test/page_html_escape/breadcrumb.html +++ b/pelican-theme/test/page_html_escape/breadcrumb.html @@ -5,6 +5,7 @@ And <&> in breadcrumb » Page with <&> in title | <&> in site name + diff --git a/pelican-theme/test/page_html_escape/content.html b/pelican-theme/test/page_html_escape/content.html index 56be1101..c443735f 100644 --- a/pelican-theme/test/page_html_escape/content.html +++ b/pelican-theme/test/page_html_escape/content.html @@ -5,6 +5,7 @@ Escaping in content | <&> in site name + diff --git a/pelican-theme/test/page_html_escape/landing.html b/pelican-theme/test/page_html_escape/landing.html index de2e3849..2cde6de5 100644 --- a/pelican-theme/test/page_html_escape/landing.html +++ b/pelican-theme/test/page_html_escape/landing.html @@ -5,6 +5,7 @@ <&> in site name + diff --git a/pelican-theme/test/page_html_escape/page.html b/pelican-theme/test/page_html_escape/page.html index aec72cc5..a69cf525 100644 --- a/pelican-theme/test/page_html_escape/page.html +++ b/pelican-theme/test/page_html_escape/page.html @@ -5,6 +5,7 @@ Page with <&> in title | <&> in site name + diff --git a/pelican-theme/test/test_blog.py b/pelican-theme/test/test_blog.py index c8270a59..4fede2a8 100644 --- a/pelican-theme/test/test_blog.py +++ b/pelican-theme/test/test_blog.py @@ -34,6 +34,8 @@ class Blog(BlogTestCase): 'AUTHOR': "Implicit Author", 'STATIC_PATHS': ['ship.jpg'], 'M_BLOG_URL': 'archives.html', + 'M_FAVICON': ('favicon.png', 'image/png'), + 'M_BLOG_FAVICON': ('favicon-blog.ico', 'image/x-icon'), 'FORMATTED_FIELDS': ['summary', 'description'] }) @@ -447,6 +449,7 @@ class HtmlEscape(BlogTestCase): 'SITENAME': '<&> in site name', 'M_BLOG_NAME': '<&> in blog name', 'M_BLOG_URL': 'archives.html?and&in&url=""', + 'M_BLOG_FAVICON': ('favicon.ico?and&in&url=""', 'huh&what'), 'ARTICLE_URL': '{slug}.html?and&in&url=""', 'AUTHOR_URL': 'author-{slug}.html?and&in&url=""', 'CATEGORY_URL': 'category-{slug}.html?and&in&url=""', @@ -510,3 +513,15 @@ class ArchivedArticle(BlogTestCase): self.assertEqual(*self.actual_expected_contents('article.html')) self.assertEqual(*self.actual_expected_contents('article-jumbo.html')) + +class GlobalFavicon(BlogTestCase): + def __init__(self, *args, **kwargs): + super().__init__(__file__, 'global_favicon', *args, **kwargs) + + def test(self): + self.run_pelican({ + 'M_FAVICON': ('favicon.png', 'image/png'), + 'M_DISABLE_SOCIAL_META_TAGS': True + }) + + self.assertEqual(*self.actual_expected_contents('index.html')) diff --git a/pelican-theme/test/test_layout.py b/pelican-theme/test/test_layout.py index 96822bde..a50c4f35 100644 --- a/pelican-theme/test/test_layout.py +++ b/pelican-theme/test/test_layout.py @@ -35,6 +35,7 @@ class Layout(BaseTestCase): 'SITENAME': 'Your Brand', 'M_BLOG_NAME': 'Your Brand Blog', 'M_SITE_LOGO_TEXT': 'Your.brand', + 'M_FAVICON': ('favicon.ico', 'image/x-icon'), 'M_LINKS_NAVBAR1': [ ('Features', 'features.html', 'features', []), ('Showcase', '#', 'showcase', [ @@ -191,6 +192,7 @@ class HtmlEscape(BaseTestCase): 'M_BLOG_NAME': 'A <&> blog', 'M_SITE_LOGO': 'image.png?and&in&url=""', 'M_SITE_LOGO_TEXT': '<&>', + 'M_FAVICON': ('favicon.ico?and&in&url=""', 'huh&what'), 'M_LINKS_NAVBAR1': [ ('An <&> item', 'item.html?and&in&url=""', '', [ ('A <&> subitem', 'sub.html?and&in&url=""', '')]), diff --git a/pelican-theme/test/test_page.py b/pelican-theme/test/test_page.py index 57052666..381590a3 100644 --- a/pelican-theme/test/test_page.py +++ b/pelican-theme/test/test_page.py @@ -148,6 +148,7 @@ class HtmlEscape(PageTestCase): 'PAGE_URL': '{slug}.html?and&in&url=""', # The social meta tags should be escaped properly as well 'M_DISABLE_SOCIAL_META_TAGS': False, + 'M_FAVICON': ('favicon.ico?and&in&url=""', 'huh&what') }) # Verify that everything is properly escaped everywhere. The landing @@ -166,6 +167,7 @@ class HtmlEscape(PageTestCase): 'PAGE_URL': '{slug}.html?and&in&url=""', # The social meta tags should be escaped properly as well 'M_DISABLE_SOCIAL_META_TAGS': False, + 'M_FAVICON': ('favicon.ico?and&in&url=""', 'huh&what') }) # Verify that also the Pelican-produced content has correctly escaped