mirror of
https://github.com/getpelican/pelican.git
synced 2025-10-15 20:28:56 +02:00
Merge pull request #3405 from frederik-elwert/improve-simple-theme
Add more blocks to Simple theme's base template
This commit is contained in:
commit
64be147463
2 changed files with 174 additions and 28 deletions
138
pelican/tests/test_theme.py
Normal file
138
pelican/tests/test_theme.py
Normal file
|
|
@ -0,0 +1,138 @@
|
||||||
|
import os
|
||||||
|
import unittest
|
||||||
|
from shutil import rmtree
|
||||||
|
from tempfile import mkdtemp
|
||||||
|
|
||||||
|
from pelican import Pelican
|
||||||
|
from pelican.settings import read_settings
|
||||||
|
from pelican.tests.support import LoggedTestCase, mute
|
||||||
|
|
||||||
|
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
CONTENT_DIR = os.path.join(CURRENT_DIR, "simple_content")
|
||||||
|
|
||||||
|
|
||||||
|
class TestTemplateInheritance(LoggedTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
self.temp_output = mkdtemp(prefix="pelican_test_output.")
|
||||||
|
self.temp_theme = mkdtemp(prefix="pelican_test_theme.")
|
||||||
|
self.temp_cache = mkdtemp(prefix="pelican_test_cache.")
|
||||||
|
|
||||||
|
# Create test theme directory structure
|
||||||
|
os.makedirs(os.path.join(self.temp_theme, "templates"), exist_ok=True)
|
||||||
|
|
||||||
|
# Create base.html template that inherits from simple theme
|
||||||
|
template_content = """{% extends "!simple/base.html" %}
|
||||||
|
|
||||||
|
{% block head %}
|
||||||
|
{{ super() }}
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/style.css" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block footer %}
|
||||||
|
<p>New footer</p>
|
||||||
|
{% endblock %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open(os.path.join(self.temp_theme, "templates", "base.html"), "w") as f:
|
||||||
|
f.write(template_content)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
"""Clean up temporary directories and files"""
|
||||||
|
for path in [self.temp_output, self.temp_theme, self.temp_cache]:
|
||||||
|
if os.path.exists(path):
|
||||||
|
rmtree(path)
|
||||||
|
|
||||||
|
super().tearDown()
|
||||||
|
|
||||||
|
def test_simple_theme(self):
|
||||||
|
"""Test that when a template is missing from our theme, Pelican falls back
|
||||||
|
to using the template from the simple theme."""
|
||||||
|
|
||||||
|
settings = read_settings(
|
||||||
|
path=None,
|
||||||
|
override={
|
||||||
|
"THEME": "simple",
|
||||||
|
"PATH": CONTENT_DIR,
|
||||||
|
"OUTPUT_PATH": self.temp_output,
|
||||||
|
"CACHE_PATH": self.temp_cache,
|
||||||
|
"SITEURL": "http://example.com",
|
||||||
|
# Disable unnecessary output that might cause failures
|
||||||
|
"ARCHIVES_SAVE_AS": "",
|
||||||
|
"CATEGORIES_SAVE_AS": "",
|
||||||
|
"TAGS_SAVE_AS": "",
|
||||||
|
"AUTHOR_SAVE_AS": "",
|
||||||
|
"AUTHORS_SAVE_AS": "",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
pelican = Pelican(settings=settings)
|
||||||
|
mute(True)(pelican.run)()
|
||||||
|
|
||||||
|
output_file = os.path.join(self.temp_output, "test-md-file.html")
|
||||||
|
self.assertTrue(os.path.exists(output_file))
|
||||||
|
|
||||||
|
with open(output_file) as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
# Verify file content is present
|
||||||
|
self.assertIn("Test md File", content)
|
||||||
|
|
||||||
|
# Verify simple theme content is present
|
||||||
|
self.assertIn('<html lang="en">', content)
|
||||||
|
self.assertIn("Proudly powered by", content)
|
||||||
|
|
||||||
|
# Verify our custom theme additions are NOT present
|
||||||
|
# (since we should be using the simple theme's template directly)
|
||||||
|
self.assertNotIn(
|
||||||
|
'<link rel="stylesheet" type="text/css" href="http://example.com/theme/css/style.css"',
|
||||||
|
content,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_theme_inheritance(self):
|
||||||
|
"""Test that theme inheritance works correctly"""
|
||||||
|
settings = read_settings(
|
||||||
|
path=None,
|
||||||
|
override={
|
||||||
|
"THEME": self.temp_theme,
|
||||||
|
"PATH": CONTENT_DIR,
|
||||||
|
"OUTPUT_PATH": self.temp_output,
|
||||||
|
"CACHE_PATH": self.temp_cache,
|
||||||
|
"SITEURL": "http://example.com",
|
||||||
|
# Disable unnecessary output that might cause failures
|
||||||
|
"ARCHIVES_SAVE_AS": "",
|
||||||
|
"CATEGORIES_SAVE_AS": "",
|
||||||
|
"TAGS_SAVE_AS": "",
|
||||||
|
"AUTHOR_SAVE_AS": "",
|
||||||
|
"AUTHORS_SAVE_AS": "",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
pelican = Pelican(settings=settings)
|
||||||
|
# Generate the site with muted output
|
||||||
|
mute(True)(pelican.run)()
|
||||||
|
|
||||||
|
# Check the output file
|
||||||
|
output_file = os.path.join(self.temp_output, "test-md-file.html")
|
||||||
|
self.assertTrue(os.path.exists(output_file))
|
||||||
|
|
||||||
|
with open(output_file) as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
# Verify inheritance worked
|
||||||
|
self.assertIn('<html lang="en">', content) # From simple theme
|
||||||
|
|
||||||
|
# Verify super() maintained original head content
|
||||||
|
self.assertIn('<meta charset="utf-8"', content)
|
||||||
|
|
||||||
|
# Verify our changes were included
|
||||||
|
self.assertIn(
|
||||||
|
'<link rel="stylesheet" type="text/css" href="http://example.com/theme/css/style.css"',
|
||||||
|
content,
|
||||||
|
)
|
||||||
|
self.assertNotIn("Proudly powered by", content)
|
||||||
|
self.assertIn("New footer", content)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
64
pelican/themes/simple/templates/base.html
vendored
64
pelican/themes/simple/templates/base.html
vendored
|
|
@ -40,33 +40,41 @@
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<header>
|
{% block body %}
|
||||||
<hgroup><h1><a href="{{ SITEURL }}/">{{ SITENAME }}</a></h1>{% if SITESUBTITLE %}<p>{{ SITESUBTITLE }}</p>{% endif %}</hgroup>
|
<header>
|
||||||
<nav><ul>
|
{% block header %}
|
||||||
{% for title, link in MENUITEMS %}
|
<hgroup><h1><a href="{{ SITEURL }}/">{{ SITENAME }}</a></h1>{% if SITESUBTITLE %}<p>{{ SITESUBTITLE }}</p>{% endif %}</hgroup>
|
||||||
<li><a href="{{ link }}">{{ title }}</a></li>
|
{% endblock header %}
|
||||||
{% endfor %}
|
{% block nav %}
|
||||||
{% if DISPLAY_PAGES_ON_MENU %}
|
<nav><ul>
|
||||||
{% for p in pages %}
|
{% for title, link in MENUITEMS %}
|
||||||
<li><a href="{{ SITEURL }}/{{ p.url }}" {% if p==page %} aria-current="page" {% endif %}>{{ p.title }}</a></li>
|
<li><a href="{{ link }}">{{ title }}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% if DISPLAY_PAGES_ON_MENU %}
|
||||||
{% if DISPLAY_CATEGORIES_ON_MENU %}
|
{% for p in pages %}
|
||||||
{% for cat, null in categories %}
|
<li><a href="{{ SITEURL }}/{{ p.url }}" {% if p==page %} aria-current="page" {% endif %}>{{ p.title }}</a></li>
|
||||||
<li><a href="{{ SITEURL }}/{{ cat.url }}" {% if cat==category %} aria-current="page" {% endif %}>{{ cat}}</a></li>
|
{% endfor %}
|
||||||
{% endfor %}
|
{% endif %}
|
||||||
{% endif %}
|
{% if DISPLAY_CATEGORIES_ON_MENU %}
|
||||||
</ul></nav>
|
{% for cat, null in categories %}
|
||||||
</header>
|
<li><a href="{{ SITEURL }}/{{ cat.url }}" {% if cat==category %} aria-current="page" {% endif %}>{{ cat}}</a></li>
|
||||||
<main>
|
{% endfor %}
|
||||||
{% block content %}
|
{% endif %}
|
||||||
{% endblock %}
|
</ul></nav>
|
||||||
</main>
|
{% endblock nav %}
|
||||||
<footer>
|
</header>
|
||||||
<address>
|
<main>
|
||||||
Proudly powered by <a rel="nofollow" href="https://getpelican.com/">Pelican</a>,
|
{% block content %}
|
||||||
which takes great advantage of <a rel="nofollow" href="https://www.python.org/">Python</a>.
|
{% endblock content %}
|
||||||
</address>
|
</main>
|
||||||
</footer>
|
<footer>
|
||||||
|
{% block footer %}
|
||||||
|
<address>
|
||||||
|
Proudly powered by <a rel="nofollow" href="https://getpelican.com/">Pelican</a>,
|
||||||
|
which takes great advantage of <a rel="nofollow" href="https://www.python.org/">Python</a>.
|
||||||
|
</address>
|
||||||
|
{% endblock footer %}
|
||||||
|
</footer>
|
||||||
|
{% endblock body %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue