render-engine 2025.9.1a2__tar.gz → 2025.10.1a1__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 (118) hide show
  1. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/PKG-INFO +1 -1
  2. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/site_map.md +8 -2
  3. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/sitemap.xml +2 -1
  4. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/sitemap_item.xml +2 -2
  5. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/site.py +12 -3
  6. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/site_map.py +12 -0
  7. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine.egg-info/PKG-INFO +1 -1
  8. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_site_map.py +50 -0
  9. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.all-contributorsrc +0 -0
  10. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.devcontainer/Dockerfile +0 -0
  11. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.devcontainer/devcontainer.json +0 -0
  12. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.devcontainer/setup.sh +0 -0
  13. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/FUNDING.yml +0 -0
  14. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
  15. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/ISSUE_TEMPLATE/form_issue_template.yml +0 -0
  16. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  17. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/dependabot-bot.yml +0 -0
  18. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/dependabot.yml +0 -0
  19. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/labeler.yml +0 -0
  20. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/release.yml +0 -0
  21. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/workflows/devcontainer-ci.yml +0 -0
  22. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/workflows/labeler.yml +0 -0
  23. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/workflows/lint.yml +0 -0
  24. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/workflows/publish.yml +0 -0
  25. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/workflows/scorecard.yml +0 -0
  26. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.github/workflows/test.yml +0 -0
  27. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.gitignore +0 -0
  28. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.markdownlint.json +0 -0
  29. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.pre-commit-config.yaml +0 -0
  30. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.readthedocs.yml +0 -0
  31. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/.vscode/tasks.json +0 -0
  32. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/CONTRIBUTING.md +0 -0
  33. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/README.md +0 -0
  34. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/SECURITY.md +0 -0
  35. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/.markdownlint.json +0 -0
  36. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/archive.md +0 -0
  37. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/assets/create environment vs code.gif +0 -0
  38. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/assets/create-app-help.png +0 -0
  39. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/assets/create-codespace.gif +0 -0
  40. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/assets/launching a dev container.gif +0 -0
  41. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/assets/render-engine-init-help.png +0 -0
  42. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/assets/render-engine-init.png +0 -0
  43. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/cli.md +0 -0
  44. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/collection.md +0 -0
  45. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/contributing/CODE_OF_CONDUCT.md +0 -0
  46. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/contributing/CONTRIBUTING.md +0 -0
  47. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/contributing/environment_setup.md +0 -0
  48. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/custom_collections.md +0 -0
  49. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/feeds.md +0 -0
  50. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/getting-started/building-your-site.md +0 -0
  51. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/getting-started/creating-a-collection.md +0 -0
  52. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/getting-started/creating-a-page.md +0 -0
  53. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/getting-started/creating-your-app.md +0 -0
  54. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/getting-started/getting-started.md +0 -0
  55. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/getting-started/installation.md +0 -0
  56. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/getting-started/layout.md +0 -0
  57. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/index.md +0 -0
  58. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/page.md +0 -0
  59. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/parsers.md +0 -0
  60. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/plugins.md +0 -0
  61. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/site.md +0 -0
  62. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/templates.md +0 -0
  63. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/docs/theme_management.md +0 -0
  64. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/mkdocs.yml +0 -0
  65. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/docs/requirements.txt +0 -0
  66. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/noxfile.py +0 -0
  67. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/pyproject.toml +0 -0
  68. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/requirements.txt +0 -0
  69. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/setup.cfg +0 -0
  70. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/.gitignore +0 -0
  71. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/__init__.py +0 -0
  72. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/__main__.py +0 -0
  73. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/_base_object.py +0 -0
  74. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/archive.py +0 -0
  75. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/blog.py +0 -0
  76. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/collection.py +0 -0
  77. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/engine.py +0 -0
  78. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/extras/__init__.py +0 -0
  79. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/feeds.py +0 -0
  80. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/hookspecs.py +0 -0
  81. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/links.py +0 -0
  82. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/page.py +0 -0
  83. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/parsers/markdown.py +0 -0
  84. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/plugins.py +0 -0
  85. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/py.typed +0 -0
  86. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/__init__.py +0 -0
  87. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/archive.html +0 -0
  88. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/base.html +0 -0
  89. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/base_collection_path.md +0 -0
  90. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/base_templates/_archive.html +0 -0
  91. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/base_templates/_base.html +0 -0
  92. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/base_templates/_page.html +0 -0
  93. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/components/footer.html +0 -0
  94. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/components/page_title.html +0 -0
  95. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/page.html +0 -0
  96. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/rss2.0.xml +0 -0
  97. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/render_engine_templates/rss2.0_items.xml +0 -0
  98. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/themes.py +0 -0
  99. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine/utils/__init__.py +0 -0
  100. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine.egg-info/SOURCES.txt +0 -0
  101. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine.egg-info/dependency_links.txt +0 -0
  102. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine.egg-info/requires.txt +0 -0
  103. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/src/render_engine.egg-info/top_level.txt +0 -0
  104. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/conftest.py +0 -0
  105. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_archive.py +0 -0
  106. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_base_object.py +0 -0
  107. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_blog.py +0 -0
  108. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_collections.py +0 -0
  109. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_engine.py +0 -0
  110. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_feeds/conftest_feed.py +0 -0
  111. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_feeds/test_feeds.py +0 -0
  112. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_page.py +0 -0
  113. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_parsers_remove_2024_3_1.py +0 -0
  114. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_plugins.py +0 -0
  115. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_site.py +0 -0
  116. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_templates/test_base_html.py +0 -0
  117. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/tests/test_theme_manager.py +0 -0
  118. {render_engine-2025.9.1a2 → render_engine-2025.10.1a1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: render_engine
3
- Version: 2025.9.1a2
3
+ Version: 2025.10.1a1
4
4
  Summary: A Flexible Static Site Generator for Python
5
5
  Project-URL: homepage, https://github.com/render-engine/render-engine/
6
6
  Project-URL: repository, https://github.com/render-engine/render-engine/
@@ -41,7 +41,7 @@ one found.
41
41
  The `SiteMap` object has an `html` property that will return an HTML sitemap with _absolute_ URLs with the
42
42
  `Site`'s `SITE_URL`.
43
43
 
44
- As a convenience, Render Engine will generate a site map page if the `Site` property of `render_site_map`
44
+ As a convenience, Render Engine will generate a site map page if the `Site` property of `render_html_site_map`
45
45
  is `True` (it defaults to `False`.) Please note that this will not be templated. Should you wish the generated
46
46
  site map to be on a template you can add the following to your app:
47
47
 
@@ -53,7 +53,13 @@ class SiteMapPage(Page):
53
53
  skip_site_map = True
54
54
  ```
55
55
 
56
- Please note the `skip_site_map = True` to avoid having a self referential link to the site map.
56
+ Please note the `skip_site_map = True` to avoid having a self-referential link to the site map.
57
+
58
+ ## Generating an XML site map
59
+
60
+ To have your site generate an XML site map set the `render_xml_site_map` property of your `Site` object
61
+ to `True` (defaults to `False`.) This will create the `site_map.xml` file in the root output directory
62
+ of your site.
57
63
 
58
64
  ## The `SiteMapEntry` object
59
65
 
@@ -1,6 +1,7 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
- {% for item in items %}
3
+ {% for item in site_map %}
4
4
  {% include 'sitemap_item.xml' %}
5
+
5
6
  {% endfor %}
6
7
  </urlset>
@@ -1,10 +1,10 @@
1
1
  <url>
2
- <loc>{{SITE_URL}}/{{item}}</loc>
2
+ <loc>{{SITE_URL.rstrip("/")}}/{{item.url_for.lstrip("/")}}</loc>
3
3
  {% if item.lastmod %}
4
4
  <lastmod>{{item.lastmod}}</lastmod>
5
5
  {% endif %}
6
6
  {% if item.changefreq %}
7
- <schangefreq>{{item.changefreq}}</changefreq>
7
+ <changefreq>{{item.changefreq}}</changefreq>
8
8
  {% endif %}
9
9
  {% if item.priority %}
10
10
  <priority>{{item.priority}}</priority>
@@ -21,7 +21,8 @@ class Site:
21
21
  Attributes:
22
22
  site_vars (dict): A dictionary containing site-wide variables and their values.
23
23
  plugin_settings (dict): A dictionary containing plugin settings.
24
- render_site_map (bool): Whether to render the generated site map as a page.
24
+ render_html_site_map (bool): Whether to render the generated site map as an HTML page.
25
+ render_xml_site_map (bool): Whether to render the generated site map as XML.
25
26
 
26
27
  Methods:
27
28
  update_site_vars(**kwargs): Updates the site-wide variables with the given key-value pairs.
@@ -51,7 +52,8 @@ class Site:
51
52
  _template_path: str | Path = "templates"
52
53
  _static_paths: set = {"static"}
53
54
  plugin_settings: dict = {"plugins": defaultdict(dict)}
54
- render_site_map: bool = False
55
+ render_html_site_map: bool = False
56
+ render_xml_site_map: bool = False
55
57
 
56
58
  def __init__(
57
59
  self,
@@ -253,7 +255,7 @@ class Site:
253
255
  with Progress() as progress:
254
256
  task_site_map = progress.add_task("Generating site map", total=1)
255
257
  self._site_map = SiteMap(self.route_list, self.site_vars.get("SITE_URL", ""))
256
- if self.render_site_map:
258
+ if self.render_html_site_map:
257
259
 
258
260
  @self.page
259
261
  class SiteMapPage(Page):
@@ -262,6 +264,13 @@ class Site:
262
264
  content = self._site_map.html
263
265
  template = "page.html"
264
266
 
267
+ if self.render_xml_site_map:
268
+
269
+ @self.page
270
+ class SiteMapXml(Page):
271
+ path_name = "site_map.xml"
272
+ template = "sitemap.xml"
273
+
265
274
  progress.update(task_site_map, advance=1)
266
275
 
267
276
  pre_build_task = progress.add_task("Loading Pre-Build Plugins and Themes", total=1)
@@ -34,6 +34,10 @@ class SiteMapEntry:
34
34
  """The URL for the given entry"""
35
35
  return str(self._route)
36
36
 
37
+ def __str__(self) -> str:
38
+ """String representation of the entry as its URL"""
39
+ return self.url_for
40
+
37
41
 
38
42
  class SiteMap:
39
43
  """Site map"""
@@ -58,6 +62,12 @@ class SiteMap:
58
62
  self._collections[sm_entry.slug] = sm_entry
59
63
  self.site_url = site_url
60
64
 
65
+ def __iter__(self):
66
+ """Iterator for the site map object"""
67
+ for entry in self._route_map.values():
68
+ yield entry
69
+ yield from entry.entries
70
+
61
71
  def find(
62
72
  self,
63
73
  value: str,
@@ -121,6 +131,8 @@ class SiteMap:
121
131
  def html(self) -> str:
122
132
  """Build the site map as HTML"""
123
133
  html_string = "<ul>\n"
134
+ # We can't iterate over `self` because that will flatten out the site map and we do not want that for the HTML
135
+ # version.
124
136
  for entry in self._route_map.values():
125
137
  html_string += f'\t<li><a href="{urljoin(self.site_url, entry.url_for)}">{entry.title}</a></li>\n'
126
138
  if entry.entries:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: render_engine
3
- Version: 2025.9.1a2
3
+ Version: 2025.10.1a1
4
4
  Summary: A Flexible Static Site Generator for Python
5
5
  Project-URL: homepage, https://github.com/render-engine/render-engine/
6
6
  Project-URL: repository, https://github.com/render-engine/render-engine/
@@ -138,3 +138,53 @@ def test_site_map_search(site, value, params, expected):
138
138
  def test_find_in_template(site):
139
139
  site.render()
140
140
  assert (site.output_path / "page1.html").read_text() == "Page 1\n/coll1/page0.html"
141
+
142
+
143
+ def test_site_map_to_xml(site):
144
+ site.render_xml_site_map = True
145
+ site.render()
146
+ assert (
147
+ (site.output_path / "site_map.xml").read_text()
148
+ == """<?xml version="1.0" encoding="UTF-8"?>
149
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
150
+ <url>
151
+ <loc>http://localhost:8000/coll1</loc>
152
+ </url>
153
+ <url>
154
+ <loc>http://localhost:8000/coll1/page0.html</loc>
155
+ </url>
156
+ <url>
157
+ <loc>http://localhost:8000/coll1/page1.html</loc>
158
+ </url>
159
+ <url>
160
+ <loc>http://localhost:8000/coll1/page2.html</loc>
161
+ </url>
162
+ <url>
163
+ <loc>http://localhost:8000/coll1/page3.html</loc>
164
+ </url>
165
+ <url>
166
+ <loc>http://localhost:8000/coll2</loc>
167
+ </url>
168
+ <url>
169
+ <loc>http://localhost:8000/coll2/page0.html</loc>
170
+ </url>
171
+ <url>
172
+ <loc>http://localhost:8000/coll2/page1.html</loc>
173
+ </url>
174
+ <url>
175
+ <loc>http://localhost:8000/coll2/page2.html</loc>
176
+ </url>
177
+ <url>
178
+ <loc>http://localhost:8000/coll2/page3.html</loc>
179
+ </url>
180
+ <url>
181
+ <loc>http://localhost:8000/page0.html</loc>
182
+ </url>
183
+ <url>
184
+ <loc>http://localhost:8000/page1.html</loc>
185
+ </url>
186
+ <url>
187
+ <loc>http://localhost:8000/page2.html</loc>
188
+ </url>
189
+ </urlset>"""
190
+ )