Compare commits
2 Commits
4b404c1de1
...
a36dcc9535
Author | SHA1 | Date |
---|---|---|
Shadowfacts | a36dcc9535 | |
Shadowfacts | dc0f5964a9 |
|
@ -23,7 +23,13 @@ defmodule FeedParser do
|
|||
"""
|
||||
@spec parse(data :: String.t(), content_type :: String.t(), parsers :: [module()]) ::
|
||||
{:ok, feed :: FeedParser.Feed.t()} | {:error, reason :: String.t()}
|
||||
def parse(data, content_type, parsers \\ @default_parsers) when is_binary(data) do
|
||||
def parse(data, content_type, parsers \\ @default_parsers)
|
||||
|
||||
def parse(nil, _, _) do
|
||||
{:error, "no data"}
|
||||
end
|
||||
|
||||
def parse(data, content_type, parsers) when is_binary(data) do
|
||||
parsers
|
||||
|> Enum.reduce_while(false, fn parser, acc ->
|
||||
case parser.accepts(data, content_type) do
|
||||
|
|
|
@ -12,15 +12,22 @@ defmodule FeedParser.Parser.Atom do
|
|||
def accepts(data, content_type) do
|
||||
case content_type do
|
||||
"application/atom+xml" ->
|
||||
{true, XML.parse(data)}
|
||||
case XML.parse(data) do
|
||||
{:error, _} -> false
|
||||
{:ok, doc} -> {true, doc}
|
||||
end
|
||||
|
||||
_ when content_type in ["text/xml", "application/xml"] ->
|
||||
doc = XML.parse(data)
|
||||
case XML.parse(data) do
|
||||
{:error, _} ->
|
||||
false
|
||||
|
||||
if XML.xmlElement(doc, :name) == :feed do
|
||||
{true, doc}
|
||||
else
|
||||
false
|
||||
{:ok, doc} ->
|
||||
if XML.xmlElement(doc, :name) == :feed do
|
||||
{true, doc}
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
_ ->
|
||||
|
|
|
@ -12,15 +12,22 @@ defmodule FeedParser.Parser.RSS2 do
|
|||
def accepts(data, content_type) do
|
||||
cond do
|
||||
content_type in ["application/rss+xml", "text/rss+xml"] ->
|
||||
{true, XML.parse(data)}
|
||||
case XML.parse(data) do
|
||||
{:error, _} -> false
|
||||
{:ok, doc} -> {true, doc}
|
||||
end
|
||||
|
||||
content_type in ["text/xml", "application/xml"] ->
|
||||
doc = XML.parse(data)
|
||||
case XML.parse(data) do
|
||||
{:error, _} ->
|
||||
false
|
||||
|
||||
if XML.xmlElement(doc, :name) == :rss do
|
||||
{true, doc}
|
||||
else
|
||||
false
|
||||
{:ok, doc} ->
|
||||
if XML.xmlElement(doc, :name) == :rss do
|
||||
{true, doc}
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
true ->
|
||||
|
|
12
lib/xml.ex
12
lib/xml.ex
|
@ -9,12 +9,16 @@ defmodule FeedParser.XML do
|
|||
defrecord :xmlAttribute, extract(:xmlAttribute, from_lib: "xmerl/include/xmerl.hrl")
|
||||
defrecord :xmlText, extract(:xmlText, from_lib: "xmerl/include/xmerl.hrl")
|
||||
|
||||
@spec parse(data :: String.t()) :: tuple()
|
||||
@spec parse(data :: String.t()) :: {:ok, tuple()} | {:error, String.t()}
|
||||
def parse(data) do
|
||||
{doc, _} =
|
||||
data
|
||||
|> :binary.bin_to_list()
|
||||
|> :xmerl_scan.string()
|
||||
try do
|
||||
data
|
||||
|> :binary.bin_to_list()
|
||||
|> :xmerl_scan.string()
|
||||
catch
|
||||
:exit, reason -> {:error, "parsing XML failed: #{inspect(reason)}"}
|
||||
end
|
||||
|
||||
doc
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue