Packages
tableau
0.14.1
0.30.0
0.29.0
0.28.0
0.27.1
0.27.0
0.26.1
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.1
0.17.0
0.16.0
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
Static site generator for elixir
Current section
Files
Jump to
Current section
Files
lib/tableau/extensions/sitemap_extension.ex
defmodule Tableau.SitemapExtension.Config do
@moduledoc false
def new(input), do: {:ok, input}
end
defmodule Tableau.SitemapExtension do
@moduledoc """
Generate a sitemap.xml for your site, for improved search-engine indexing.
## Configuration
- `:enabled` - boolean - Extension is active or not.
### Example
```elixir
config :tableau, Tableau.SitemapExtension,
enabled: true,
```
## Custom attributes
Any page may add attributes to its sitemap `<url>` entry by adding a `sitemap` entry, with a map of elements to add
### Frontmatter
```yaml
title: "Some Page"
sitemap:
priority: 0.8
changefreq: hourly
```
### `Tableau.Page`
```elixir
defmodule MySite.AboutPage do
use Tableau.Page,
layout: MySite.RootLayout,
permalink: "/about",
sitemap: %{priority: 0.8, changefreq: "monthly"}
# ...
end
```
Generated sitemap is stored in the root of your site, at /sitemap.xml.
For more information about sitemaps, see <https://www.sitemaps.org>.
"""
use Tableau.Extension, key: :sitemap, type: :post_write, priority: 300
def run(%{site: %{config: %{url: root}, pages: pages}} = token) do
urls =
for page <- pages, uniq: true do
loc =
[{:loc, nil, URI.merge(root, page.permalink)}]
|> prepend_lastmod(page)
|> prepend_sitemap_assigns(page)
{:url, nil, loc}
end
xml =
XmlBuilder.document(
:urlset,
[
xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9",
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"xsi:schemaLocation":
"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
],
urls
)
File.mkdir_p!("_site")
File.write!("_site/sitemap.xml", XmlBuilder.generate_iodata(xml))
{:ok, token}
end
defp prepend_lastmod(body, %{date: date}) do
[{:lastmod, nil, DateTime.to_iso8601(date)} | body]
end
defp prepend_lastmod(body, _), do: body
defp prepend_sitemap_assigns(body, %{sitemap: sitemap_data}) do
for {key, value} <- sitemap_data, reduce: body do
acc -> [{key, [], value} | acc]
end
end
defp prepend_sitemap_assigns(body, _), do: body
end