note description: "Convert a FEED into an ATOM content." date: "$Date$" revision: "$Revision$" class ATOM_FEED_GENERATOR inherit FEED_VISITOR FEED_GENERATOR rename process_feed as visit_feed end create make feature -- Visitor visit_feed (a_feed: FEED) do buffer.append ("[ ]") buffer.append_character ('%N') indent append_content_tag_to ("title", Void, a_feed.title, buffer) append_content_tag_to ("subtitle", Void, a_feed.description, buffer) if attached a_feed.id as l_id then append_content_tag_to ("id", Void, l_id, buffer) else append_content_tag_to ("id", Void, "urn:uuid:" + new_uuid, buffer) end across a_feed.links as tb loop tb.item.accept (Current) end if attached a_feed.date as dt then append_content_tag_to ("updated", Void, date_to_string (dt), buffer) end across a_feed.items as ic loop ic.item.accept (Current) end exdent buffer.append ("") end visit_item (a_entry: FEED_ITEM) do buffer.append (indentation) buffer.append ("%N") indent append_content_tag_to ("title", Void, a_entry.title, buffer) across a_entry.links as tb loop tb.item.accept (Current) end if attached a_entry.id as l_id then append_content_tag_to ("id", Void, l_id, buffer) else append_content_tag_to ("id", Void, "urn:uuid:" + new_uuid, buffer) end if attached a_entry.date as dt then append_content_tag_to ("updated", Void, date_to_string (dt), buffer) end if attached a_entry.categories as cats then across cats as ic loop append_content_tag_to ("category", <<["term", ic.item]>>, Void, buffer) end end append_content_tag_to ("summary", Void, a_entry.description, buffer) if attached a_entry.content as l_content then if attached a_entry.content_type_or_default ("xhtml").is_case_insensitive_equal_general ("xhtml") then append_content_tag_to ("content", <<["type", "xhtml"]>>, l_content, buffer) else append_content_tag_to ("content", <<["type", a_entry.content_type]>>, l_content, buffer) end end if attached a_entry.author as u then u.accept (Current) end exdent buffer.append (indentation) buffer.append ("%N") end visit_link (a_link: FEED_LINK) local attr: detachable ARRAYED_LIST [TUPLE [name: READABLE_STRING_8; value: READABLE_STRING_32]] tu: TUPLE [name: READABLE_STRING_8; value: READABLE_STRING_32] do create attr.make (2) if attached a_link.relation as rel and then not rel.is_whitespace then tu := ["rel", rel] attr.force (tu) end if attached a_link.type as t and then not t.is_whitespace then tu := ["type", t.as_string_32] attr.force (tu) end tu := ["href", a_link.href.as_string_32] attr.force (tu) if attr.is_empty then attr := Void end append_content_tag_to ("link", attr, Void, buffer) end visit_author (a_author: FEED_AUTHOR) do buffer.append (indentation) buffer.append ("%N") indent append_content_tag_to ("name", Void, a_author.name, buffer) append_content_tag_to ("email", Void, a_author.email, buffer) exdent buffer.append (indentation) buffer.append ("%N") end feature {NONE} -- Helpers new_uuid: STRING local gen: UUID_GENERATOR do create gen Result := gen.generate_uuid.out.as_lower end date_to_string (dt: DATE_TIME): STRING do Result := date_to_rfc3339_string (dt) end date_to_rfc3339_string (d: DATE_TIME): STRING -- 2003-12-13T18:30:02Z local i: INTEGER do create Result.make_empty Result.append_integer (d.year) Result.append_character ('-') i := d.month if i < 10 then Result.append_integer (0) end Result.append_integer (i) Result.append_character ('-') i := d.day if i < 10 then Result.append_integer (0) end Result.append_integer (i) Result.append_character ('T') i := d.hour if i < 10 then Result.append_integer (0) end Result.append_integer (i) Result.append_character (':') i := d.minute if i < 10 then Result.append_integer (0) end Result.append_integer (i) Result.append_character (':') i := d.second if i < 10 then Result.append_integer (0) end Result.append_integer (i) Result.append_character ('Z') end end