Packages

BEAM-native coding agent substrate for Elixir/OTP projects

Current section

Files

Jump to
vibe lib vibe plugins web_search presentation markdown.ex
Raw

lib/vibe/plugins/web_search/presentation/markdown.ex

defimpl Vibe.Markdown, for: Vibe.Plugins.WebSearch.Result do
@moduledoc "Markdown rendering for WebSearch plugin results."
def to_markdown(result) do
Vibe.Plugins.WebSearch.SearchItemRenderer.render(%{
title: result.title,
url: result.url,
author: result.author,
date: result.published_date,
summary: result.summary,
highlights: result.highlights,
text: result.text
})
end
end
defimpl Vibe.Markdown, for: Vibe.Plugins.WebSearch.SearchResult do
@moduledoc "Markdown rendering for normalized web search results."
def to_markdown(result) do
[
"## Web search: ",
result.query,
"\n\n",
result.results |> Enum.map(&Vibe.Markdown.to_markdown/1) |> Enum.intersperse("\n\n---\n\n")
]
|> IO.iodata_to_binary()
|> String.trim()
end
end
defimpl Vibe.Markdown, for: Vibe.Plugins.WebSearch.SearchItem do
@moduledoc "Markdown rendering for normalized web search result items."
def to_markdown(result) do
Vibe.Plugins.WebSearch.SearchItemRenderer.render(%{
title: result.title,
url: result.url,
author: result.author,
date: result.published_at,
summary: result.summary,
highlights: result.highlights,
text: result.text
})
end
end
defimpl Vibe.Markdown, for: Vibe.Plugins.WebSearch.FetchResult do
@moduledoc "Markdown rendering for normalized URL fetch results."
def to_markdown(result) do
[
"## ",
title(result),
"\n\n",
metadata(result),
"\n\n",
Vibe.Plugins.WebSearch.Presentation.FetchBody.markdown(result)
]
|> IO.iodata_to_binary()
|> String.trim()
end
defp title(%{selector: selector}) when is_binary(selector) and selector != "",
do: "Fetched selection"
defp title(_result), do: "Fetched page"
defp metadata(result) do
[
url_line(result),
compact_status(result),
compact_size(result),
selector(result),
if(result.truncated?, do: "truncated", else: nil)
]
|> Enum.reject(&(&1 in [nil, ""]))
|> Enum.join(" · ")
end
defp url_line(%{redirected?: true, url: url, final_url: final_url}) when is_binary(final_url),
do: "`#{final_url}` ← `#{url}`"
defp url_line(%{url: url}), do: "`#{url}`"
defp compact_status(result) do
[
result.status,
result.format,
meaningful_content_type(result.format, result.content_type)
]
|> Enum.reject(&(&1 in [nil, ""]))
|> Enum.join(" · ")
end
defp compact_size(result) do
cond do
result.total_chars && result.size_bytes ->
"#{result.total_chars} chars"
result.total_chars ->
"#{result.total_chars} chars"
result.size_bytes ->
"#{result.size_bytes} bytes"
true ->
nil
end
end
defp selector(%{selector: selector}) when is_binary(selector) and selector != "",
do: "selector `#{selector}`"
defp selector(_result), do: nil
defp meaningful_content_type(:html, content_type) when is_binary(content_type) do
if content_type_summary(content_type) == "text/html",
do: nil,
else: content_type_summary(content_type)
end
defp meaningful_content_type(:json, content_type) when is_binary(content_type) do
if String.contains?(content_type, "json"), do: nil, else: content_type_summary(content_type)
end
defp meaningful_content_type(:markdown, _content_type), do: nil
defp meaningful_content_type(:text, _content_type), do: nil
defp meaningful_content_type(_format, content_type), do: content_type_summary(content_type)
defp content_type_summary(nil), do: nil
defp content_type_summary(""), do: nil
defp content_type_summary(content_type) do
content_type
|> String.split(";", parts: 2)
|> List.first()
end
end