/dylan/feed.dylan

http://github.com/cgay/wiki · Unknown · 103 lines · 93 code · 10 blank · 0 comment · 0 complexity · 84e70f4c18e4241976ec88d3022ec0e7 MD5 · raw file

  1. Module: %wiki
  2. /*
  3. TODO...
  4. define method atom-feed-responder
  5. (#key type, name)
  6. let name = name & percent-decode(name);
  7. let (changes, description)
  8. = select (type by \=)
  9. "users" =>
  10. values(wiki-changes(change-type: <wiki-user-change>, name: name),
  11. iff(name, concatenate("user ", name), "all users"));
  12. "groups" =>
  13. values(wiki-changes(change-type: <wiki-group-change>, name: name),
  14. iff(name, concatenate("group ", name), "all groups"));
  15. "pages" =>
  16. values(wiki-changes(change-type: <wiki-page-change>, name: name),
  17. iff(name, concatenate("page ", name), "all pages"));
  18. "tags" =>
  19. values(wiki-changes(change-type: <wiki-page-change>, tag: name),
  20. iff(name, concatenate("pages tagged ", name), "all pages"));
  21. otherwise =>
  22. values(wiki-changes(), "");
  23. end;
  24. if (~empty?(description))
  25. description := concatenate(" to ", description);
  26. end;
  27. let changes = sort(changes,
  28. test: method (change1, change2)
  29. change1.creation-date > change2.creation-date
  30. end);
  31. let date-updated = iff(empty?(changes),
  32. current-date(),
  33. changes.first.creation-date);
  34. let feed-authors = #[];
  35. for (change in changes)
  36. for (author in change.authors)
  37. feed-authors := add-new!(feed-authors, author, test: \=);
  38. end for;
  39. end for;
  40. let feed = make(<feed>,
  41. generator: make(<generator>,
  42. text: *site-name*,
  43. version: $wiki-version,
  44. uri: *site-url*),
  45. title: *site-name*,
  46. subtitle: concatenate("Recent changes", description),
  47. updated: date-updated,
  48. author: feed-authors,
  49. categories: #[]);
  50. let url = current-request().request-url;
  51. feed.identifier := url;
  52. feed.links["self"] := make(<link>, rel: "self", href: url);
  53. set-header(current-response(), "Content-Type", "application/atom+xml");
  54. output("%s", generate-atom(feed, entries: changes));
  55. end method atom-feed-responder;
  56. define method generate-atom (change :: <wiki-change>, #key)
  57. // todo -- enforce at least one author when any <entry> is created.
  58. let authors = change.authors;
  59. let author = ~empty?(authors) & find-user(first(authors));
  60. with-xml()
  61. entry {
  62. title(change.title),
  63. // do(do(method(x) collect(generate-atom(x)) end, entry.links)),
  64. id(build-uri(change-identifier(change))),
  65. published(generate-atom(change.creation-date)),
  66. updated(generate-atom(change.creation-date)),
  67. do(if (author) generate-atom(author) end if),
  68. // do(do(method(x) collect(generate-atom(x)) end, entry.contributors)),
  69. do(collect(generate-atom(change.comments[0].content)))
  70. } //missing: category, summary
  71. end;
  72. end;
  73. define sideways method generate-atom (user :: <wiki-user>, #key)
  74. with-xml()
  75. author {
  76. name(user.user-name),
  77. uri(build-uri(permanent-link(user)))
  78. }
  79. end;
  80. end;
  81. define method change-identifier (change :: <wiki-page-change>)
  82. let location = page-permanent-link(change.title);
  83. push-last(location.uri-path, "versions");
  84. push-last(location.uri-path, integer-to-string(change.change-version));
  85. location;
  86. end;
  87. define method change-identifier (change :: <wiki-group-change>)
  88. group-permanent-link(change.title)
  89. end;
  90. define method change-identifier (change :: <wiki-user-change>)
  91. user-permanent-link(change.title)
  92. end;
  93. */