Skip to content

Commit

Permalink
feat: add blurry_image Jinja extension
Browse files Browse the repository at this point in the history
Adds blurry_image extension to insert an <img> tag with width &
height into a Jinja template. Optionally inserts an image of a
specific size.

Usage:

```
{% blurry_image page.image, width=250 %}
```
  • Loading branch information
johnfraney committed Apr 27, 2024
1 parent 73154f2 commit 5ebe4b6
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 3 deletions.
4 changes: 4 additions & 0 deletions blurry/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from blurry.markdown import convert_markdown_file_to_html
from blurry.open_graph import open_graph_meta_tags
from blurry.plugins import discovered_html_plugins
from blurry.plugins import discovered_jinja_extensions
from blurry.plugins import discovered_jinja_filter_plugins
from blurry.schema_validation import validate_front_matter_as_schema
from blurry.settings import get_build_directory
Expand Down Expand Up @@ -69,6 +70,9 @@ def get_jinja_env():
}
)
),
extensions=[
jinja_extension.load() for jinja_extension in discovered_jinja_extensions
],
)
for filter_plugin in discovered_jinja_filter_plugins:
try:
Expand Down
6 changes: 5 additions & 1 deletion blurry/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from rich.table import Table

from blurry.plugins import discovered_html_plugins
from blurry.plugins import discovered_jinja_extensions
from blurry.plugins import discovered_jinja_filter_plugins
from blurry.plugins import discovered_markdown_plugins

Expand All @@ -27,7 +28,10 @@ def print_plugin_table():
plugin_table.add_row(
"\n".join([p.name for p in discovered_markdown_plugins]),
"\n".join([p.name for p in discovered_html_plugins]),
"\n".join([p.name for p in discovered_jinja_filter_plugins]),
"\n".join(
[p.name for p in discovered_jinja_filter_plugins]
+ [p.name for p in discovered_jinja_extensions]
),
)

console.print(plugin_table)
1 change: 1 addition & 0 deletions blurry/plugins/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
discovered_markdown_plugins = entry_points(group="blurry.markdown_plugins")
discovered_html_plugins = entry_points(group="blurry.html_plugins")
discovered_jinja_filter_plugins = entry_points(group="blurry.jinja_filter_plugins")
discovered_jinja_extensions = entry_points(group="blurry.jinja_extensions")
Empty file.
53 changes: 53 additions & 0 deletions blurry/plugins/jinja_plugins/blurry_image_extension.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import mimetypes
from pathlib import Path
from urllib.parse import urlparse

from jinja2_simple_tags import StandaloneTag
from rich.console import Console
from wand.exceptions import BlobError
from wand.image import Image

from blurry.images import add_image_width_to_path
from blurry.settings import get_build_directory
from blurry.utils import build_path_to_url

warning_console = Console(stderr=True, style="bold yellow")


class BlurryImage(StandaloneTag):
safe_output = True
tags = {"blurry_image"}

def render(self, *args, **kwargs):
(image_url,) = args
width = kwargs.get("width")
image_content_path: str = "." + urlparse(image_url).path
image_path = get_build_directory() / image_content_path

try:
with Image(filename=str(image_path)) as image:
image_width = image.width
image_height = image.height
image_mimetype = image.mimetype
except BlobError:
warning_console.print(f"Could not find image: {image_path}")
return ""

if width:
image_path = add_image_width_to_path(image_path, width)

if image_mimetype in [
mimetypes.types_map[".jpg"],
mimetypes.types_map[".png"],
]:
image_path = Path(str(image_path).replace(image_path.suffix, ".avif"))

if not image_path.exists():
warning_console.print(
f"blurry_image: Could not find {image_path}. Skipping."
)
return ""

src = build_path_to_url(image_path)

return f'<img src="{src}" width="{image_width}" height="{image_height}" />'
Loading

0 comments on commit 5ebe4b6

Please sign in to comment.