note
	description: "[
				ATOM Parser.
				
				Warning: the implementation may not support the full ATOM specification.
		]"
	date: "$Date$"
	revision: "$Revision$"
	EIS: "name=ATOM at wikipedia", "protocol=URI", "src=https://en.wikipedia.org/wiki/Atom_(standard)"
	EIS: "name=RSS at wikipedia", "protocol=URI", "src=https://en.wikipedia.org/wiki/RSS"
	EIS: "name=ATOM 1.0 RFC4287", "protocol=URI", "src=https://tools.ietf.org/html/rfc4287"

class
	ATOM_FEED_PARSER

inherit
	FEED_PARSER

feature -- Access

	name: STRING = "atom1"
			-- Associated name.	

	is_detected (xdoc: XML_DOCUMENT): BOOLEAN
			-- Is `xdoc' an ATOM feed representation?
		do
			Result := attached {XML_ELEMENT} xdoc.element_by_name ("feed") as x_feed and then
					(
						not attached xml_attribute_text (x_feed, "xmlns") as l_xmlns
						or else l_xmlns.same_string ("http://www.w3.org/2005/Atom")
					)
		end

	feed (xdoc: XML_DOCUMENT): detachable FEED
			-- Feed from `xdoc' XML document.
		local
			l_title: READABLE_STRING_32
			x_entry, x_link: detachable XML_ELEMENT
			e: FEED_ITEM
			l_author: FEED_AUTHOR
			lnk: FEED_LINK
			s: STRING_32
		do
			if
				attached xdoc.element_by_name ("feed") as x_feed and then
--				(not attached xml_attribute_text (x_feed, "xmlns") as l_xmlns or else l_xmlns.same_string ("http://www.w3.org/2005/Atom"))				
				attached xml_element_text (x_feed, "title") as t
			then
				l_title := t
				create Result.make (l_title)
				Result.set_description (xml_element_text (x_feed, "subtitle"), "plain")
				Result.set_id (xml_element_text (x_feed, "id"))
				Result.set_date_with_text (xml_element_text (x_feed, "updated"))
				if attached links_from_xml (x_feed, "link") as l_links then
					across
						l_links as link_ic
					loop
						lnk := link_ic.item
						Result.links.force (lnk, lnk.relation)
					end
				end
				if attached x_feed.elements_by_name ("entry") as x_entries then
					across
						x_entries as ic
					loop
						x_entry := ic.item
						if attached xml_element_text (x_entry, "title") as e_title then
							create e.make (e_title)
							e.set_description (xml_element_text (x_entry, "summary"))
							e.set_id (xml_element_text (x_entry, "id"))
							e.set_date_with_text (xml_element_text (x_entry, "updated"))

							if attached links_from_xml (x_entry, "link") as l_links then
								across
									l_links as link_ic
								loop
									lnk := link_ic.item
									e.links.force (lnk, lnk.relation)
								end
							end
							if attached x_entry.element_by_name ("content") as x_content then
								e.set_content (xml_element_code (x_content), xml_attribute_text (x_content, "type"))
							end

							if attached x_entry.element_by_name ("author") as x_author then
								if attached x_author.element_by_name ("name") as x_name and then
									attached x_name.text as l_author_name
								then
									create l_author.make (l_author_name)
									if attached x_author.element_by_name ("email") as x_email then
										l_author.set_email (x_email.text)
									end
									e.set_author (l_author)
								end
							end

								-- Optional "category"
							if attached x_entry.elements_by_name ("category") as x_categories then
								across
									x_categories as cats_ic
								loop
									if attached xml_attribute_text (cats_ic.item, "term") as l_term then
										e.set_category (l_term)
									end
								end
							end
							Result.extend (e)
						end
					end
				end
			end
		end



end
