Packages
fermo
0.19.0
0.20.1
0.20.0
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.1
0.17.0
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.4
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A static site generator
Current section
Files
Jump to
Current section
Files
lib/fermo/sitemap.ex
defmodule Fermo.Sitemap do
require Logger
@xml_header ~s(<?xml version="1.0" encoding="UTF-8"?>\n)
@open_tag ~S(<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">)
@close_tag ~S(</urlset>)
@file_impl Application.compile_env(:fermo, :file_impl, File)
@template Application.compile_env(:fermo, :template, Fermo.Template)
@doc """
The sitemap is built if config[:sitemap] is set.
It should be a Map.
Available options:
* `:default_change_frequency` - see https://www.sitemaps.org/protocol.html#changefreqdef
* `:default_priority` - a value between 0 and 1
Other `config` options that affect the sitemap are:
* `:base_url`
* `:build_path`
Use a template's frontmatter to exclude it from the sitemap:
---
hide_from_sitemap: true
---
"""
@callback build(map()) :: map()
def build(config)
def build(%{sitemap: sitemap} = config) do
root = config.base_url
build_path = config[:build_path] || "build"
Fermo.File.ensure_path(build_path)
sitemap_pathname = build_path <> "/sitemap.xml"
datetime = DateTime.utc_now()
lastmod = DateTime.to_iso8601(datetime, :extended)
config_defaults = %{
lastmod: lastmod,
change_frequency: sitemap[:default_change_frequency] || "weekly",
priority: sitemap[:default_priority] || 0.5
}
@file_impl.write!(sitemap_pathname, @xml_header)
@file_impl.write!(sitemap_pathname, @open_tag, [:append])
Stream.map(config.pages, fn page ->
module = @template.module_for_template(page.template)
page_defaults = module.defaults()
|> Enum.into(%{}, fn {k, v} -> {String.to_atom(k), v} end)
values = Map.merge(config_defaults, page_defaults)
if !page_defaults[:hide_from_sitemap] do
loc = "#{root}#{page.path}"
~s(
<url>
<loc>#{loc}</loc>
<lastmod>#{values.lastmod}</lastmod>
<changefreq>#{values.change_frequency}</changefreq>
<priority>#{values.priority}</priority>
</url>
)
else
Logger.debug "[Sitemap] Excluding path '#{page.path}', as defaults include `:hide_from_sitemap`"
end
end)
|> Stream.filter(&(&1))
|> Stream.into(@file_impl.stream!(sitemap_pathname, [:append, :utf8]))
|> Stream.run()
@file_impl.write!(sitemap_pathname, @close_tag, [:append])
put_in(config, [:stats, :sitemap_built], Time.utc_now)
end
def build(config) do
Logger.debug "[Sitemap] Skipping sitemap generation as config[:sitemap] is missing"
config
end
end