diff --git a/lib/feed_reader/formats/rss.ex b/lib/feed_reader/formats/rss.ex index 4cd6242..bc56bc6 100644 --- a/lib/feed_reader/formats/rss.ex +++ b/lib/feed_reader/formats/rss.ex @@ -1,5 +1,5 @@ defmodule FeedReader.Formats.RSS do - @moduledoc "RSS 2.0 format detection and normalization." + @moduledoc "RSS format detection and normalization." @behaviour FeedReader.Format @@ -7,7 +7,17 @@ defmodule FeedReader.Formats.RSS do @impl true def matches_prefix?(prefix) do - Regex.match?(~r/]*\bversion\s*=\s*(["'])(?:0\.9(?:1|2)?|2\.0)\1/is, prefix) + case Regex.run(~r/]*)>/is, prefix, capture: :all_but_first) do + [attributes] -> + not Regex.match?(~r/\bversion\s*=/is, attributes) or + Regex.match?( + ~r/\bversion\s*=\s*(["'])(?:0\.9(?:1|2)?|2\.0)\1/is, + attributes + ) + + _none -> + false + end end @impl true diff --git a/test/feed_reader/format_detection_test.exs b/test/feed_reader/format_detection_test.exs index 195e7b4..f922cb8 100644 --- a/test/feed_reader/format_detection_test.exs +++ b/test/feed_reader/format_detection_test.exs @@ -6,6 +6,8 @@ defmodule FeedReader.FormatDetectionTest do test "detects RSS, Atom, and RDF from a bounded XML prefix" do assert FeedReader.detect_format("") == :rss assert FeedReader.detect_format("") == :rss + assert FeedReader.detect_format("") == :rss + assert FeedReader.detect_format("") == :unknown assert FeedReader.detect_format("") == :atom assert FeedReader.detect_format("") == :rdf assert FeedReader.detect_format("not a feed") == :unknown