aboutsummaryrefslogtreecommitdiff
path: root/lib/xml.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/xml.ml')
-rw-r--r--lib/xml.ml54
1 files changed, 46 insertions, 8 deletions
diff --git a/lib/xml.ml b/lib/xml.ml
index fe4abdc..d5f8df3 100644
--- a/lib/xml.ml
+++ b/lib/xml.ml
@@ -1,10 +1,48 @@
-type xml = Tag of string * xml list | String of string
+type attribute = string * string
-let tag name body = Tag (name, body)
-let format, format_list = Format.(fprintf, pp_print_list)
+type xml =
+ | Tag of string * attribute list * xml list
+ | String of string
+ | Closing_tag of string * attribute list
-let rec format_xml f = function
- | Tag (name, body) ->
- let format_body = format_list format_xml in
- format f "@[<hv 3><%s>@,%a@;<0 -3></%s>@]" name format_body body name
- | String text -> format f "%s" text
+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;
+ "</";
+ name;
+ ">";
+ ]
+ | 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