PhoenixKit.Pages.Metadata (phoenix_kit v1.6.16)
View SourceMetadata management for Pages module.
Handles parsing and serialization of metadata stored in HTML comment blocks with YAML content.
Format
<!-- METADATA
status: published
title: My Page Title
description: A brief description
slug: custom-url
author: John Doe
created_at: 2025-01-15T10:00:00Z
updated_at: 2025-01-15T10:00:00Z
-->Fields
status-draft|published|archived(default:draft)title- Page title (optional, defaults to filename)description- SEO description (optional)slug- Custom URL slug (optional)author- Content author (optional)created_at- ISO 8601 datetime (auto-generated)updated_at- ISO 8601 datetime (auto-updated)
Summary
Functions
Returns default metadata for new files.
Merges user-provided metadata with defaults.
Parses metadata from file content.
Serializes metadata to HTML comment format.
Strips metadata block from content.
Updates metadata in content.
Types
@type metadata() :: %{ status: String.t(), title: String.t() | nil, description: String.t() | nil, slug: String.t() | nil, author: String.t() | nil, created_at: DateTime.t(), updated_at: DateTime.t() }
Functions
@spec default_metadata() :: metadata()
Returns default metadata for new files.
Examples
iex> metadata = Metadata.default_metadata()
iex> metadata.status
"draft"
Merges user-provided metadata with defaults.
Preserves custom fields that aren't in the standard set.
Examples
iex> user_data = %{"status" => "published", "custom_field" => "value"}
iex> metadata = Metadata.merge_metadata(user_data, default_metadata())
iex> metadata.status
"published"
Parses metadata from file content.
Searches for metadata block in first 20 lines (optimization), then searches entire file if not found.
Returns metadata map and content without metadata block.
Examples
iex> content = """
...> <!-- METADATA
...> status: published
...> title: My Page
...> -->
...> # Content
...> """
iex> {:ok, metadata, content} = Metadata.parse(content)
iex> metadata.status
"published"
Serializes metadata to HTML comment format.
Examples
iex> metadata = %{
...> status: "published",
...> title: "My Page",
...> created_at: ~U[2025-01-15 10:00:00Z],
...> updated_at: ~U[2025-01-15 10:00:00Z]
...> }
iex> Metadata.serialize(metadata)
"<!-- METADATA\nstatus: published\n...\n-->"
Strips metadata block from content.
Returns content without the metadata block.
Examples
iex> content = "<!-- METADATA\nstatus: draft\n-->\n\n# Content"
iex> Metadata.strip_metadata(content)
"# Content"
Updates metadata in content.
If metadata exists, replaces it. If not, prepends it.
Examples
iex> content = "# Content"
iex> metadata = default_metadata()
iex> updated = Metadata.update_metadata(content, metadata)
iex> updated =~ "<!-- METADATA"
true