public $replyToID;
public $replyToUrl;
public $location;
- public $attention = array();
+ public $attention = array(); // 'uri' => 'type'
public $conversation;
- public $forwardID; // deprecated, use ActivityVerb::SHARE instead
- public $forwardUrl; // deprecated, use ActivityVerb::SHARE instead
+ public $conversation_url;
+ public $scope;
const THR = 'http://purl.org/syndication/thread/1.0';
const GEORSS = 'http://www.georss.org/georss';
const OSTATUS = 'http://ostatus.org/schema/1.0';
- const INREPLYTO = 'in-reply-to';
- const REF = 'ref';
- const HREF = 'href';
+ const INREPLYTO = 'in-reply-to';
+ const REF = 'ref';
+ const HREF = 'href';
+
+ // OStatus element names with prefixes
+ const OBJECTTYPE = 'ostatus:object-type'; // FIXME: Undocumented!
+ const CONVERSATION = 'conversation';
const POINT = 'point';
- const ATTENTION = 'ostatus:attention';
const MENTIONED = 'mentioned';
- const CONVERSATION = 'ostatus:conversation';
+
+ const ATTN_PUBLIC = 'http://activityschema.org/collection/public';
function __construct($element = null)
{
$this->location = $this->getLocation($element);
- $this->conversation = ActivityUtils::getLink($element, self::CONVERSATION);
+ foreach ($element->getElementsByTagNameNS(self::OSTATUS, self::CONVERSATION) as $conv) {
+ if ($conv->hasAttribute('ref')) {
+ $this->conversation = $conv->getAttribute('ref');
+ if ($conv->hasAttribute('href')) {
+ $this->conversation_url = $conv->getAttribute('href');
+ }
+ } else {
+ $this->conversation = $conv->textContent;
+ }
+ if (!empty($this->conversation)) {
+ break;
+ }
+ }
+ if (empty($this->conversation)) {
+ // fallback to the atom:link rel="ostatus:conversation" element
+ $this->conversation = ActivityUtils::getLink($element, 'ostatus:'.self::CONVERSATION);
+ }
// Multiple attention links allowed
$links = $element->getElementsByTagNameNS(ActivityUtils::ATOM, ActivityUtils::LINK);
- $attention = array();
for ($i = 0; $i < $links->length; $i++) {
$link = $links->item($i);
- $linkRel = $link->getAttribute(ActivityUtils::REL);
-
- // XXX: Deprecate this in favour of "mentioned" from Salmon spec
- // http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SALR
- if ($linkRel == self::ATTENTION) {
- $attention[] = $link->getAttribute(self::HREF);
- } elseif ($linkRel == self::MENTIONED) {
- $attention[] = $link->getAttribute(self::HREF);
+ $linkRel = $link->getAttribute(ActivityUtils::REL);
+ $linkHref = $link->getAttribute(self::HREF);
+ if ($linkRel == self::MENTIONED && $linkHref !== '') {
+ $this->attention[$linkHref] = $link->getAttribute(ActivityContext::OBJECTTYPE);
}
}
- $this->attention = array_unique($attention);
}
/**
{
$context = array();
- $context['replyTo'] = $this->getInReplyToArray();
+ $context['inReplyTo'] = $this->getInReplyToArray();
$context['conversation'] = $this->conversation;
- $context['forwardId'] = $this->forwardID;
- $context['forwardUrl'] = $this->forwardUrl;
+ $context['conversation_url'] = $this->conversation_url;
return array_filter($context);
}
{
$tos = array();
- foreach ($this->attention as $attnUrl) {
+ foreach ($this->attention as $attnUrl => $attnType) {
$to = array(
- 'objectType' => 'person',
+ 'objectType' => $attnType, // can be empty
'id' => $attnUrl,
- 'url' => $attnUrl
);
$tos[] = $to;
}
return $tos;
}
- /*
- * Show replyTo
+ /**
+ * Return an array for the notices this notice is a reply to
+ * suitable for serializing as JSON note objects.
+ *
+ * @return array the array of notes
*/
function getInReplyToArray()
{
- $replyToObj = array('objectType' => 'note');
+ if (empty($this->replyToID) && empty($this->replyToUrl)) {
+ return null;
+ }
- $replyToObj['id'] = $this->replyToID;
+ $replyToObj = array('objectType' => 'note');
+ // XXX: Possibly shorten this to just the numeric ID?
+ // Currently, it's the full URI of the notice.
+ if (!empty($this->replyToID)) {
+ $replyToObj['id'] = $this->replyToID;
+ }
if (!empty($this->replyToUrl)) {
$replyToObj['url'] = $this->replyToUrl;
}
+ return $replyToObj;
}
}