diff --git a/assets/css/frenzy.scss b/assets/css/frenzy.scss index a4f234f..2887ef0 100644 --- a/assets/css/frenzy.scss +++ b/assets/css/frenzy.scss @@ -141,6 +141,10 @@ label.sidebar-toggle > .oi { display: inline-block; } -.post-content img { +.item-content img { max-width: 100%; } + +.item-content > .raw-content { + white-space: pre-wrap; +} diff --git a/lib/frenzy/item.ex b/lib/frenzy/item.ex index f1a2204..76212e5 100644 --- a/lib/frenzy/item.ex +++ b/lib/frenzy/item.ex @@ -45,6 +45,7 @@ defmodule Frenzy.Item do schema "items" do field :content, :string + field :content_type, :string field :date, :utc_datetime field :creator, :string field :guid, :string @@ -63,6 +64,7 @@ defmodule Frenzy.Item do __meta__: Ecto.Schema.Metadata.t(), id: integer() | nil, content: String.t(), + content_type: String.t() | nil, date: DateTime.t(), creator: String.t(), guid: String.t(), diff --git a/lib/frenzy/pipeline/gemini_scrape_stage.ex b/lib/frenzy/pipeline/gemini_scrape_stage.ex index 35dfc1f..e5feb9a 100644 --- a/lib/frenzy/pipeline/gemini_scrape_stage.ex +++ b/lib/frenzy/pipeline/gemini_scrape_stage.ex @@ -11,8 +11,8 @@ defmodule Frenzy.Pipeline.GeminiScrapeStage do Logger.warn("Unable to get Gemini content for #{url}: #{reason}") {:ok, item_params} - content -> - {:ok, %{item_params | content: content}} + {content, content_type} -> + {:ok, %{item_params | content: content, content_type: content_type}} end end @@ -24,14 +24,21 @@ defmodule Frenzy.Pipeline.GeminiScrapeStage do @impl Stage def default_opts(), do: %{} - @spec get_content(String.t(), map()) :: {:ok, String.t()} | {:error, term()} + @spec get_content(String.t(), map()) :: {String.t(), String.t()} | {:error, term()} def get_content(url, _opts) do case Network.gemini_request(url) do {:error, reason} -> {:error, reason} - {:ok, %Gemini.Response{body: body}} -> - body + {:ok, %Gemini.Response{body: body, meta: meta}} -> + {body, parse_content_type(meta)} end end + + defp parse_content_type(meta) do + meta + |> String.split(";") + |> hd() + |> String.trim() + end end diff --git a/lib/frenzy/task/create_item.ex b/lib/frenzy/task/create_item.ex index 0d8105a..c0621f4 100644 --- a/lib/frenzy/task/create_item.ex +++ b/lib/frenzy/task/create_item.ex @@ -32,7 +32,9 @@ defmodule Frenzy.Task.CreateItem do url: url, date: date, creator: "", - content: entry.content + content: entry.content, + # we assume text/html in the feed itself, other stages may alter this + content_type: "text/html" } feed = Repo.preload(feed, :pipeline) diff --git a/lib/frenzy_web/templates/item/show.html.eex b/lib/frenzy_web/templates/item/show.html.eex index 9edf4f3..ab3a779 100644 --- a/lib/frenzy_web/templates/item/show.html.eex +++ b/lib/frenzy_web/templates/item/show.html.eex @@ -16,6 +16,10 @@ <% end %> -
- <%= raw(@item.content) %> +
+ <%= if @item.content_type in [nil, "text/html"] do %> + <%= raw(@item.content) %> + <% else %> +
<%= raw(@item.content) %>
+ <% end %>
diff --git a/priv/repo/migrations/20200718235114_item_add_content_type.exs b/priv/repo/migrations/20200718235114_item_add_content_type.exs new file mode 100644 index 0000000..9c98bee --- /dev/null +++ b/priv/repo/migrations/20200718235114_item_add_content_type.exs @@ -0,0 +1,9 @@ +defmodule Frenzy.Repo.Migrations.ItemAddContentType do + use Ecto.Migration + + def change do + alter table(:items) do + add :content_type, :string, default: nil + end + end +end