blurry-cli 0.7.1__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/PKG-INFO +2 -1
  2. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/__init__.py +4 -1
  3. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/cli.py +5 -1
  4. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/markdown/__init__.py +10 -1
  5. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/open_graph.py +1 -1
  6. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/plugins/__init__.py +1 -0
  7. blurry_cli-0.8.0/blurry/plugins/jinja_plugins/blurry_image_extension.py +75 -0
  8. blurry_cli-0.8.0/blurry/py.typed +0 -0
  9. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/pyproject.toml +5 -1
  10. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/LICENSE +0 -0
  11. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/README.md +0 -0
  12. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/__main__.py +0 -0
  13. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/async_typer.py +0 -0
  14. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/constants.py +0 -0
  15. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/images.py +0 -0
  16. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/markdown/front_matter.py +0 -0
  17. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/markdown/renderer_functions/__init__.py +0 -0
  18. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/markdown/renderer_functions/render_video.py +0 -0
  19. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/plugins/html_plugins/__init__.py +0 -0
  20. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/plugins/html_plugins/minify_html_plugin.py +0 -0
  21. {blurry_cli-0.7.1/blurry/plugins/markdown_plugins → blurry_cli-0.8.0/blurry/plugins/jinja_plugins}/__init__.py +0 -0
  22. /blurry_cli-0.7.1/blurry/py.typed → /blurry_cli-0.8.0/blurry/plugins/markdown_plugins/__init__.py +0 -0
  23. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/plugins/markdown_plugins/container_plugin.py +0 -0
  24. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/plugins/markdown_plugins/punctuation_plugin.py +0 -0
  25. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/plugins/markdown_plugins/python_code_plugin.py +0 -0
  26. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/schema_validation.py +0 -0
  27. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/settings.py +0 -0
  28. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/sitemap.py +0 -0
  29. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/types.py +0 -0
  30. {blurry_cli-0.7.1 → blurry_cli-0.8.0}/blurry/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: blurry-cli
3
- Version: 0.7.1
3
+ Version: 0.8.0
4
4
  Summary: A Mistune-based static site generator for Python
5
5
  Home-page: https://github.com/blurry-dev/blurry
6
6
  License: MIT
@@ -26,6 +26,7 @@ Requires-Dist: Wand (>=0.6.6,<0.7.0)
26
26
  Requires-Dist: dpath (>=2.1.6,<3.0.0)
27
27
  Requires-Dist: ffmpeg-python (>=0.2.0,<0.3.0)
28
28
  Requires-Dist: htmlmin2 (>=0.1.13,<0.2.0)
29
+ Requires-Dist: jinja2-simple-tags (>=0.6.1,<0.7.0)
29
30
  Requires-Dist: livereload (>=2.6.3,<3.0.0)
30
31
  Requires-Dist: mistune (>=3.0.0rc5,<4.0.0)
31
32
  Requires-Dist: pydantic2-schemaorg (>=0.1.1,<0.2.0)
@@ -25,6 +25,7 @@ from blurry.images import generate_images_for_srcset
25
25
  from blurry.markdown import convert_markdown_file_to_html
26
26
  from blurry.open_graph import open_graph_meta_tags
27
27
  from blurry.plugins import discovered_html_plugins
28
+ from blurry.plugins import discovered_jinja_extensions
28
29
  from blurry.plugins import discovered_jinja_filter_plugins
29
30
  from blurry.schema_validation import validate_front_matter_as_schema
30
31
  from blurry.settings import get_build_directory
@@ -69,6 +70,9 @@ def get_jinja_env():
69
70
  }
70
71
  )
71
72
  ),
73
+ extensions=[
74
+ jinja_extension.load() for jinja_extension in discovered_jinja_extensions
75
+ ],
72
76
  )
73
77
  for filter_plugin in discovered_jinja_filter_plugins:
74
78
  try:
@@ -96,7 +100,6 @@ async def process_non_markdown_file(filepath: Path):
96
100
  if mimetype in [
97
101
  mimetypes.types_map[".jpg"],
98
102
  mimetypes.types_map[".png"],
99
- mimetypes.common_types[".webp"],
100
103
  ]:
101
104
  await generate_images_for_srcset(filepath)
102
105
 
@@ -2,6 +2,7 @@ from rich.console import Console
2
2
  from rich.table import Table
3
3
 
4
4
  from blurry.plugins import discovered_html_plugins
5
+ from blurry.plugins import discovered_jinja_extensions
5
6
  from blurry.plugins import discovered_jinja_filter_plugins
6
7
  from blurry.plugins import discovered_markdown_plugins
7
8
 
@@ -27,7 +28,10 @@ def print_plugin_table():
27
28
  plugin_table.add_row(
28
29
  "\n".join([p.name for p in discovered_markdown_plugins]),
29
30
  "\n".join([p.name for p in discovered_html_plugins]),
30
- "\n".join([p.name for p in discovered_jinja_filter_plugins]),
31
+ "\n".join(
32
+ [p.name for p in discovered_jinja_filter_plugins]
33
+ + [p.name for p in discovered_jinja_extensions]
34
+ ),
31
35
  )
32
36
 
33
37
  console.print(plugin_table)
@@ -69,15 +69,24 @@ class BlurryRenderer(mistune.HTMLRenderer):
69
69
  attributes["src"] = src
70
70
 
71
71
  if extension.lower() in SETTINGS.get("VIDEO_EXTENSIONS"):
72
- return render_video(src, absolute_path, extension, title=text)
72
+ return render_video(src, absolute_path, extension, title=title)
73
73
 
74
74
  # Tailor srcset and sizes to image width
75
75
  with Image(filename=str(absolute_path)) as img:
76
76
  image_width = img.width
77
77
  image_height = img.height
78
+ # The .animated property doesn't always detect animated .webp images
79
+ # and .webp is optimized enough not to benefit much from .avif
80
+ image_is_animated = img.animation or extension.lower() == "webp"
78
81
  attributes["width"] = image_width
79
82
  attributes["height"] = image_height
80
83
 
84
+ if image_is_animated:
85
+ attributes_str = " ".join(
86
+ f'{name}="{value}"' for name, value in attributes.items()
87
+ )
88
+ return f"<img {attributes_str} >"
89
+
81
90
  image_widths = get_widths_for_image_width(image_width)
82
91
 
83
92
  attributes["sizes"] = generate_sizes_string(image_widths)
@@ -4,7 +4,7 @@ from typing import Literal
4
4
  from blurry.types import SchemaType
5
5
 
6
6
 
7
- META_TAG_TEMPLATE = '<meta property="og:{property}" content="{content}" />'
7
+ META_TAG_TEMPLATE = '<meta property="og:{property}" content="{content}">'
8
8
 
9
9
  OpenGraphType = Literal["article", "book", "profile", "website"]
10
10
 
@@ -3,3 +3,4 @@ from importlib.metadata import entry_points
3
3
  discovered_markdown_plugins = entry_points(group="blurry.markdown_plugins")
4
4
  discovered_html_plugins = entry_points(group="blurry.html_plugins")
5
5
  discovered_jinja_filter_plugins = entry_points(group="blurry.jinja_filter_plugins")
6
+ discovered_jinja_extensions = entry_points(group="blurry.jinja_extensions")
@@ -0,0 +1,75 @@
1
+ import mimetypes
2
+ from pathlib import Path
3
+ from urllib.parse import urlparse
4
+
5
+ from jinja2_simple_tags import StandaloneTag
6
+ from rich.console import Console
7
+ from wand.exceptions import BlobError
8
+ from wand.image import Image
9
+
10
+ from blurry.images import add_image_width_to_path
11
+ from blurry.settings import get_build_directory
12
+ from blurry.utils import build_path_to_url
13
+
14
+ warning_console = Console(stderr=True, style="bold yellow")
15
+
16
+
17
+ class BlurryImage(StandaloneTag):
18
+ safe_output = True
19
+ tags = {"blurry_image"}
20
+
21
+ def render(self, *args, **kwargs):
22
+ (image_url, width) = args
23
+ image_content_path: str = "." + urlparse(image_url).path
24
+ image_path = get_build_directory() / image_content_path
25
+
26
+ try:
27
+ with Image(filename=str(image_path)) as image:
28
+ image_width = image.width
29
+ image_height = image.height
30
+ image_mimetype = image.mimetype
31
+ except BlobError:
32
+ warning_console.print(f"Could not find image: {image_path}")
33
+ return ""
34
+
35
+ attributes = {
36
+ "width": image_width,
37
+ "height": image_height,
38
+ }
39
+ for attribute_key in kwargs:
40
+ if attribute_key in ["width", "height"]:
41
+ warning_console.print(
42
+ f"blurry_image: Received {attribute_key} in template {self.template} but this attribute is dynamic. Skipping."
43
+ )
44
+ continue
45
+ attributes[attribute_key] = kwargs.get(attribute_key)
46
+
47
+ if width:
48
+ image_path = add_image_width_to_path(image_path, width)
49
+
50
+ if image_mimetype in [
51
+ mimetypes.types_map[".jpg"],
52
+ mimetypes.types_map[".png"],
53
+ ]:
54
+ image_path = Path(str(image_path).replace(image_path.suffix, ".avif"))
55
+
56
+ if not image_path.exists():
57
+ warning_console.print(
58
+ f"blurry_image: Could not find {image_path}. Skipping."
59
+ )
60
+ return ""
61
+
62
+ attributes["src"] = build_path_to_url(image_path)
63
+
64
+ if "alt" not in attributes:
65
+ warning_console.print(
66
+ f"blurry_image: alt attribute missing for image in {self.template}. "
67
+ "This can negatively affect accessibility. "
68
+ "Use an empty alt tag if an image is only for show."
69
+ )
70
+
71
+ attributes_str = " ".join(
72
+ f'{name}="{value}"' for name, value in attributes.items()
73
+ )
74
+
75
+ return f"<img {attributes_str}/>"
File without changes
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "blurry-cli"
3
- version = "0.7.1"
3
+ version = "0.8.0"
4
4
  description = "A Mistune-based static site generator for Python"
5
5
  authors = ["John Franey <franey@duck.com>"]
6
6
  license = "MIT"
@@ -37,6 +37,7 @@ typer = "^0.6.1"
37
37
  htmlmin2 = "^0.1.13"
38
38
  pydantic2-schemaorg = "^0.1.1"
39
39
  dpath = "^2.1.6"
40
+ jinja2-simple-tags = "^0.6.1"
40
41
 
41
42
  [tool.poetry.scripts]
42
43
  blurry = 'blurry:main'
@@ -70,3 +71,6 @@ python_code = 'blurry.plugins.markdown_plugins.python_code_plugin:python_code'
70
71
  python_code_in_list = 'blurry.plugins.markdown_plugins.python_code_plugin:python_code_in_list'
71
72
  punctuation = 'blurry.plugins.markdown_plugins.punctuation_plugin:punctuation'
72
73
  container = 'blurry.plugins.markdown_plugins.container_plugin:container'
74
+
75
+ [tool.poetry.plugins."blurry.jinja_extensions"]
76
+ blurry_image = "blurry.plugins.jinja_plugins.blurry_image_extension:BlurryImage"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes