diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 6c4dd504..c700141e 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -15,10 +15,26 @@ CANONICAL_DOMAIN = 'www.i2p2.de' BLOG_ENTRIES_PER_PAGE = 20 MEETINGS_PER_PAGE = 20 +SUPPORTED_LANGS = [ + 'en', + 'es', + 'zh', + 'de', + 'fr', + 'it', + 'nl', + 'ru', + 'sv', + 'cs', + 'ar', + 'el', + ] + TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages') STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static') BLOG_DIR = os.path.join(os.path.dirname(__file__), 'blog') MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings/logs') +SITE_DIR = os.path.join(TEMPLATE_DIR, 'site') MIRRORS_FILE = os.path.join(TEMPLATE_DIR, 'downloads/mirrors') diff --git a/i2p2www/sitemap.py b/i2p2www/sitemap.py new file mode 100644 index 00000000..d713a34e --- /dev/null +++ b/i2p2www/sitemap.py @@ -0,0 +1,86 @@ +from flask import make_response, render_template, request, safe_join +import os.path + +from i2p2www import SITE_DIR, SUPPORTED_LANGS +from i2p2www.blog.helpers import get_blog_slugs +from i2p2www.meetings.helpers import get_meetings_ids + + +########## +# Sitemaps + +def render_sitemap_index(): + # Include the / at the end, so the language can be + # sandwiched between url_root and /sitemap.xml in + # the template. + url_root = request.url_root + + # Render and return the sitemap index + response = make_response(render_template('global/sitemap_index.xml', url_root=url_root, langs=SUPPORTED_LANGS)) + response.headers['Content-Type'] = 'application/xml' + return response + +def render_sitemap(): + # Include the / at the end, so the language can be + # sandwiched between url_root and url.path in the + # template. + url_root = request.url_root + urls = [] + + # -------------- + # Main site urls + # -------------- + # walk over all directories/files + for v in os.walk(SITE_DIR): + # iterate over all files + pathbase = os.path.relpath(v[0], SITE_DIR) + for f in v[2]: + # ignore all non-.html files + if not f.endswith('.html'): + continue + path = pathbase + if f != 'index.html': + path = safe_join(pathbase, f[:-5]) + if path.startswith('.'): + path = path[1:] + if not path.startswith('/'): + path = '/%s' % path + urls.append({ + 'path': path, + }) + + # --------- + # Blog urls + # --------- + urls.append({ + 'path': '/blog/', + }) + blog_slugs = get_blog_slugs() + for slug in blog_slugs: + urls.append({ + 'path': '/blog/entry/%s' % slug, + }) + + # ------------- + # Meetings urls + # ------------- + urls.append({ + 'path': '/meetings/', + }) + meetings = get_meetings_ids() + for id in meetings: + urls.append({ + 'path': '/meetings/%d' % id, + }) + + # -------------- + # Downloads urls + # -------------- + urls.append({ + 'path': '/download', + }) + + # Render and return the sitemap + response = make_response(render_template('global/sitemap.xml', url_root=url_root, langs=SUPPORTED_LANGS, urls=urls)) + response.headers['Content-Type'] = 'application/xml' + return response diff --git a/i2p2www/urls.py b/i2p2www/urls.py index 84ed409d..a905d45e 100644 --- a/i2p2www/urls.py +++ b/i2p2www/urls.py @@ -68,3 +68,6 @@ url('/.html', 'legacy.legacy_show') url('/hosts.txt', 'views.hosts') url('/robots.txt', 'views.robots') url('/favicon.ico', 'views.favicon') + +url('/sitemap_index.xml', 'sitemap.render_sitemap_index') +url('//sitemap.xml', 'sitemap.render_sitemap')