type attribute = string * string type xml = | Tag of string * attribute list * xml list | String of string | Closing_tag of string * attribute list let tag name attributes body = Tag (name, attributes, body) let entry value = String value let closing_tag name attributes = Closing_tag (name, attributes) let format_attributes attributes = let format_attribut (name, value) = Printf.sprintf " %s=\"%s\"" name value in String.concat "" (List.map format_attribut attributes) let rec format = function | Tag (name, attributes, body) -> let body = List.map format body in String.concat "" [ "<"; name; " "; format_attributes attributes; ">"; String.concat "" body; ""; ] | String text -> text | Closing_tag (name, attributes) -> String.concat "" [ "<"; name; " "; format_attributes attributes; "/>" ] let format_rss host_name last_updated entries = tag "feed" [ ("xml:base", host_name) ] [ tag "title" [] [ entry "Sensemaking Galaxy" ]; tag "subtitle" [] [ entry "A collection of sensemaking links" ]; closing_tag "link" [ ("href", host_name ^ "/feed.xml"); ("rel", "self") ]; closing_tag "link" [ ("href", host_name) ]; tag "id" [] [ entry host_name ]; tag "updated" [] [ entry last_updated ]; tag "author" [] [ tag "name" [] [ entry "Sensemaking Galaxy" ] ]; tag "entry" [] entries; ] |> format