X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Factivity.php;h=e974ca991d4407f4a37df2cb75ee751ce3c76c7d;hb=8212df3e1a132e13d2a7aed9c4f0cd1212ff44ba;hp=f9192c6b80061d4c5caeddfc07f16083e0ab7135;hpb=800b33590696e85480aa73c25261d80f1926e56d;p=quix0rs-gnu-social.git diff --git a/lib/activity.php b/lib/activity.php index f9192c6b80..e974ca991d 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -48,7 +48,6 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 * @link http://status.net/ */ - class Activity { const SPEC = 'http://activitystrea.ms/spec/1.0/'; @@ -83,6 +82,7 @@ class Activity const CREATOR = 'creator'; const CONTENTNS = 'http://purl.org/rss/1.0/modules/content/'; + const ENCODED = 'encoded'; public $actor; // an ActivityObject public $verb; // a string (the URL) @@ -107,7 +107,6 @@ class Activity * @param DOMElement $entry Atom entry to poke at * @param DOMElement $feed Atom feed, for context */ - function __construct($entry = null, $feed = null) { if (is_null($entry)) { @@ -117,7 +116,8 @@ class Activity // Insist on a feed's root DOMElement; don't allow a DOMDocument if ($feed instanceof DOMDocument) { throw new ClientException( - _("Expecting a root feed element but got a whole XML document.") + // TRANS: Client exception thrown when a feed instance is a DOMDocument. + _('Expecting a root feed element but got a whole XML document.') ); } @@ -131,6 +131,7 @@ class Activity $entry->localName == 'item') { $this->_fromRssItem($entry, $feed); } else { + // Low level exception. No need for i18n. throw new Exception("Unknown DOM element: {$entry->namespaceURI} {$entry->localName}"); } } @@ -179,6 +180,17 @@ class Activity $this->actor = new ActivityObject($actorEl); + // Cliqset has bad actor IDs (just nickname of user). We + // work around it by getting the author data and using its + // id instead + + if (!preg_match('/^\w+:/', $this->actor->id)) { + $authorEl = ActivityUtils::child($entry, 'author'); + if (!empty($authorEl)) { + $authorObj = new ActivityObject($authorEl); + $this->actor->id = $authorObj->id; + } + } } else if (!empty($feed) && $subjectEl = $this->_child($feed, self::SUBJECT)) { @@ -257,14 +269,21 @@ class Activity $this->title = ActivityUtils::childContent($item, ActivityObject::TITLE, self::RSS); - $contentEl = ActivityUtils::child($item, ActivityUtils::CONTENT, self::CONTENTNS); + $contentEl = ActivityUtils::child($item, self::ENCODED, self::CONTENTNS); if (!empty($contentEl)) { - $this->content = htmlspecialchars_decode($contentEl->textContent, ENT_QUOTES); + // XML node's text content is HTML; no further processing needed. + $this->content = $contentEl->textContent; } else { $descriptionEl = ActivityUtils::child($item, self::DESCRIPTION, self::RSS); if (!empty($descriptionEl)) { - $this->content = htmlspecialchars_decode($descriptionEl->textContent, ENT_QUOTES); + // Per spec, must be plaintext. + // In practice, often there's HTML... but these days good + // feeds are using which is explicitly + // real HTML. + // We'll treat this following spec, and do HTML escaping + // to convert from plaintext to HTML. + $this->content = htmlspecialchars($descriptionEl->textContent); } } @@ -293,13 +312,12 @@ class Activity * * @return DOMElement Atom entry */ - function toAtomEntry() { return null; } - function asString($namespace=false) + function asString($namespace=false, $author=true) { $xs = new XMLStringer(true); @@ -318,7 +336,7 @@ class Activity $xs->element('id', null, $this->id); $xs->element('title', null, $this->title); - $xs->element('published', null, common_date_iso8601($this->time)); + $xs->element('published', null, self::iso8601Date($this->time)); $xs->element('content', array('type' => 'html'), $this->content); if (!empty($this->summary)) { @@ -333,13 +351,15 @@ class Activity // XXX: add context - $xs->elementStart('author'); - $xs->element('uri', array(), $this->actor->id); - if ($this->actor->title) { - $xs->element('name', array(), $this->actor->title); + if ($author) { + $xs->elementStart('author'); + $xs->element('uri', array(), $this->actor->id); + if ($this->actor->title) { + $xs->element('name', array(), $this->actor->title); + } + $xs->elementEnd('author'); + $xs->raw($this->actor->asString('activity:actor')); } - $xs->elementEnd('author'); - $xs->raw($this->actor->asString('activity:actor')); $xs->element('activity:verb', null, $this->verb); @@ -366,5 +386,12 @@ class Activity { return ActivityUtils::child($element, $tag, $namespace); } -} + static function iso8601Date($tm) + { + $dateStr = date('d F Y H:i:s', $tm); + $d = new DateTime($dateStr, new DateTimeZone('UTC')); + $d->setTimezone(new DateTimeZone(common_timezone())); + return $d->format('c'); + } +}