diff --git a/flatfilecms/models.py b/flatfilecms/models.py
index ba8b69d..e8412d2 100644
--- a/flatfilecms/models.py
+++ b/flatfilecms/models.py
@@ -111,6 +111,8 @@ class Folder(dict):
def walk(self):
for name, item in self.items():
+ if name == 'index':
+ name = ''
yield name, item
if isinstance(item, Folder):
for subname, subitem in item.walk():
diff --git a/flatfilecms/templates/sitemap.jinja2 b/flatfilecms/templates/sitemap.jinja2
index 295bc38..26510da 100644
--- a/flatfilecms/templates/sitemap.jinja2
+++ b/flatfilecms/templates/sitemap.jinja2
@@ -1,8 +1,8 @@
- {%- for item in request.root.structure() %}{% if item != '/sitemap.xml' and item not in data.ignore %}
+ {%- for item in pages %}
- {{data.base_url}}{{item}}
+ {{data.base_url}}/{{item}}
- {%- endif %}{%- endfor %}
+ {%- endfor %}
diff --git a/flatfilecms/views/__init__.py b/flatfilecms/views/__init__.py
index d671002..53124d5 100644
--- a/flatfilecms/views/__init__.py
+++ b/flatfilecms/views/__init__.py
@@ -1,3 +1,4 @@
+import re
import yaml
from pyramid.renderers import render_to_response
from pyramid.path import AssetResolver
@@ -6,7 +7,7 @@ from flatfilecms.models import LoaderFactory
from pyramid.httpexceptions import HTTPFound
from pyramid.traversal import (find_root, find_resource)
-from flatfilecms.models import (YAML, Markdown)
+from flatfilecms.models import (Folder, YAML, Markdown)
def redirect(self, url):
@@ -42,3 +43,20 @@ def blog(self, options={}):
post,
request=self.request,
response=self.request.response)
+
+
+def sitemap(self, options={}):
+ ignore = [re.compile(i) for i in options.get('ignore', [])]
+ root = find_root(self.context)
+ post = self.context.page.copy()
+ post['pages'] = []
+ for name, item in root.walk():
+ if not isinstance(item, Folder) and name != 'sitemap.xml' and not next(
+ (True for r in ignore if r.match(name)), False):
+ post['pages'].append(name)
+ set_content_type(self, 'text/xml')
+ return render_to_response(
+ '{0}.jinja2'.format(post.get('template', 'sitemap')),
+ post,
+ request=self.request,
+ response=self.request.response)
diff --git a/tests/pages/sitemap.xml.yaml b/tests/pages/sitemap.xml.yaml
new file mode 100644
index 0000000..d830aed
--- /dev/null
+++ b/tests/pages/sitemap.xml.yaml
@@ -0,0 +1,6 @@
+view:
+ flatfilecms.views.sitemap:
+ ignore:
+ - blog/.*$
+data:
+ base_url: https://flatfilecms.test
diff --git a/tests/test_pages.py b/tests/test_pages.py
index 554ce2e..f871353 100644
--- a/tests/test_pages.py
+++ b/tests/test_pages.py
@@ -70,3 +70,24 @@ def test_blogindex(pages, fake_request, config):
fake_view_object = PagesView(pages['blog']['index'], fake_request)
response = blog(fake_view_object, {'base': '/blog'})
assert response.text == '/blog/blogpost2 /blog/blogpost1 '
+
+
+def test_sitemap(pages, fake_request, config):
+ from flatfilecms.views.pages import PagesView
+ response = PagesView(pages['sitemap.xml'], fake_request).process_yaml()
+ assert response.text == """
+
+
+ https://flatfilecms.test/
+
+
+ https://flatfilecms.test/view
+
+
+ https://flatfilecms.test/views
+
+
+ https://flatfilecms.test/view-with-options
+
+"""
+ assert response.content_type == 'text/xml'