import os import xml.etree.ElementTree as ET def setup(app): """Setup connects events to the sitemap builder""" app.connect('html-page-context', add_html_link) app.connect('build-finished', create_sitemap) app.sitemap_links = [] is_production = os.getenv('PRODUCTION') == 'YES' return {"version": "1.0.0", "parallel_read_safe": True, "parallel_write_safe": not is_production} def add_html_link(app, pagename, templatename, context, doctree): """As each page is built, collect page names for the sitemap""" app.sitemap_links.append(pagename + ".html") def create_sitemap(app, exception): """Generates the sitemap.xml from the collected HTML page links""" root = ET.Element("urlset") root.set("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9") app.sitemap_links.sort() for link in app.sitemap_links: url = ET.SubElement(root, "url") priority = 0.5 if link == 'index.html': priority = 1.0 link = '' elif link.endswith('index.html'): priority += 0.25 link = link[:-len('index.html')] if link.endswith('.html'): link = link[:-len('.html')] ET.SubElement(url, "loc").text = app.builder.config.html_baseurl + '/' + link ET.SubElement(url, "priority").text = str(priority) filename = os.path.join(app.outdir, "sitemap.xml") ET.ElementTree(root).write(filename, xml_declaration=True, encoding='utf-8', method="xml") with open(os.path.join(app.builder.outdir, 'robots.txt'), 'wt') as f: if os.getenv('PRODUCTION') != 'YES': f.write('User-agent: *\nDisallow: /\n') else: f.write('User-agent: *\nDisallow: \n\n' 'Sitemap: https://esphome.io/sitemap.xml\n')