You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

210 lines
5.8 KiB

  1. module AtomBuilderHelper
  2. def stream_updated_at
  3. @account.stream_entries.last ? (@account.updated_at > @account.stream_entries.last.created_at ? @account.updated_at : @account.stream_entries.last.created_at) : @account.updated_at
  4. end
  5. def entry(xml, is_root = false, &block)
  6. if is_root
  7. root_tag(xml, :entry, &block)
  8. else
  9. xml.entry(&block)
  10. end
  11. end
  12. def feed(xml, &block)
  13. root_tag(xml, :feed, &block)
  14. end
  15. def unique_id(xml, date, id, type)
  16. xml.id_ unique_tag(date, id, type)
  17. end
  18. def simple_id(xml, id)
  19. xml.id_ id
  20. end
  21. def published_at(xml, date)
  22. xml.published date.iso8601
  23. end
  24. def updated_at(xml, date)
  25. xml.updated date.iso8601
  26. end
  27. def verb(xml, verb)
  28. xml['activity'].send('verb', "http://activitystrea.ms/schema/1.0/#{verb}")
  29. end
  30. def content(xml, content)
  31. xml.content({ type: 'html' }, content)
  32. end
  33. def title(xml, title)
  34. xml.title title
  35. end
  36. def author(xml, &block)
  37. xml.author(&block)
  38. end
  39. def target(xml, &block)
  40. xml['activity'].object(&block)
  41. end
  42. def object_type(xml, type)
  43. xml['activity'].send('object-type', "http://activitystrea.ms/schema/1.0/#{type}")
  44. end
  45. def uri(xml, uri)
  46. xml.uri uri
  47. end
  48. def name(xml, name)
  49. xml.name name
  50. end
  51. def summary(xml, summary)
  52. xml.summary summary
  53. end
  54. def subtitle(xml, subtitle)
  55. xml.subtitle subtitle
  56. end
  57. def link_alternate(xml, url)
  58. xml.link(rel: 'alternate', type: 'text/html', href: url)
  59. end
  60. def link_self(xml, url)
  61. xml.link(rel: 'self', type: 'application/atom+xml', href: url)
  62. end
  63. def link_hub(xml, url)
  64. xml.link(rel: 'hub', href: url)
  65. end
  66. def link_salmon(xml, url)
  67. xml.link(rel: 'salmon', href: url)
  68. end
  69. def portable_contact(xml, account)
  70. xml['poco'].preferredUsername account.username
  71. xml['poco'].displayName account.display_name
  72. xml['poco'].note account.note
  73. end
  74. def in_reply_to(xml, uri, url)
  75. xml['thr'].send('in-reply-to', { ref: uri, href: url, type: 'text/html' })
  76. end
  77. def uri_for_target(target)
  78. if target.local?
  79. if target.object_type == :person
  80. account_url(target)
  81. else
  82. unique_tag(target.stream_entry.created_at, target.stream_entry.activity_id, target.stream_entry.activity_type)
  83. end
  84. else
  85. target.uri
  86. end
  87. end
  88. def url_for_target(target)
  89. if target.local?
  90. if target.object_type == :person
  91. account_url(target)
  92. else
  93. account_stream_entry_url(target.account, target.stream_entry)
  94. end
  95. else
  96. target.url
  97. end
  98. end
  99. def link_mention(xml, account)
  100. xml.link(rel: 'mentioned', href: uri_for_target(account))
  101. end
  102. def link_avatar(xml, account)
  103. xml.link('rel' => 'avatar', 'type' => account.avatar_content_type, 'media:width' => '300', 'media:height' =>'300', 'href' => asset_url(account.avatar.url(:large, false)))
  104. xml.link('rel' => 'avatar', 'type' => account.avatar_content_type, 'media:width' => '96', 'media:height' =>'96', 'href' => asset_url(account.avatar.url(:medium, false)))
  105. xml.link('rel' => 'avatar', 'type' => account.avatar_content_type, 'media:width' => '48', 'media:height' =>'48', 'href' => asset_url(account.avatar.url(:small, false)))
  106. end
  107. def logo(xml, url)
  108. xml.logo url
  109. end
  110. def conditionally_formatted(activity)
  111. if activity.is_a?(Status)
  112. if activity.reblog? && activity.reblog.local?
  113. linkify(activity.reblog)
  114. elsif activity.local?
  115. linkify(activity)
  116. else
  117. activity.content
  118. end
  119. elsif activity.nil?
  120. ''
  121. else
  122. activity.content
  123. end
  124. end
  125. def include_author(xml, account)
  126. object_type xml, :person
  127. uri xml, url_for_target(account)
  128. name xml, account.username
  129. summary xml, account.note
  130. link_alternate xml, url_for_target(account)
  131. link_avatar xml, account
  132. portable_contact xml, account
  133. end
  134. def include_entry(xml, stream_entry)
  135. unique_id xml, stream_entry.created_at, stream_entry.activity_id, stream_entry.activity_type
  136. published_at xml, stream_entry.created_at
  137. updated_at xml, stream_entry.updated_at
  138. title xml, stream_entry.title
  139. content xml, conditionally_formatted(stream_entry.activity)
  140. verb xml, stream_entry.verb
  141. link_self xml, account_stream_entry_url(stream_entry.account, stream_entry, format: 'atom')
  142. object_type xml, stream_entry.object_type
  143. # Comments need thread element
  144. if stream_entry.threaded?
  145. in_reply_to xml, uri_for_target(stream_entry.thread), url_for_target(stream_entry.thread)
  146. end
  147. if stream_entry.targeted?
  148. target(xml) do
  149. object_type xml, stream_entry.target.object_type
  150. simple_id xml, uri_for_target(stream_entry.target)
  151. title xml, stream_entry.target.title
  152. link_alternate xml, url_for_target(stream_entry.target)
  153. # People have summary and portable contacts information
  154. if stream_entry.target.object_type == :person
  155. summary xml, stream_entry.target.content
  156. portable_contact xml, stream_entry.target
  157. link_avatar xml, stream_entry.target
  158. end
  159. # Statuses have content
  160. if [:note, :comment].include? stream_entry.target.object_type
  161. content xml, conditionally_formatted(stream_entry.target)
  162. end
  163. end
  164. end
  165. stream_entry.mentions.each do |mentioned|
  166. link_mention xml, mentioned
  167. end
  168. end
  169. private
  170. def root_tag(xml, tag, &block)
  171. xml.send(tag, { :xmlns => 'http://www.w3.org/2005/Atom', 'xmlns:thr' => 'http://purl.org/syndication/thread/1.0', 'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/', 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0', 'xmlns:media' => 'http://purl.org/syndication/atommedia' }, &block)
  172. end
  173. end