diff options
author | Evan Prodromou <evan@controlyourself.ca> | 2009-03-11 19:42:53 -0400 |
---|---|---|
committer | Evan Prodromou <evan@controlyourself.ca> | 2009-03-11 19:42:53 -0400 |
commit | dfd9e318599a527e2b8ad9b3374143cfcdd02fda (patch) | |
tree | a50ca9664692f72c41c1ad3f7b92a728bd098caa | |
parent | 70d5fc46845804507640e354c9d9e06367a53fb0 (diff) |
Add initial trackback support
-rw-r--r-- | plugins/LinkbackPlugin.php | 95 |
1 files changed, 89 insertions, 6 deletions
diff --git a/plugins/LinkbackPlugin.php b/plugins/LinkbackPlugin.php index 77adfa87d..1b5365100 100644 --- a/plugins/LinkbackPlugin.php +++ b/plugins/LinkbackPlugin.php @@ -94,18 +94,25 @@ class LinkbackPlugin extends Plugin return $orig; } + $pb = null; + $tb = null; + if (array_key_exists('X-Pingback', $result->headers)) { - $endpoint = $result->headers['X-Pingback']; + $pb = $result->headers['X-Pingback']; } else if (preg_match('/<link rel="pingback" href="([^"]+)" ?/?>/', $result->body, $match)) { - $endpoint = $match[1]; - } else { - // XXX: do Trackback lookup - return $orig; + $pb = $match[1]; + } + + $tb = $this->getTrackback($result->body, $result->final_url); + + if (!empty($tb)) { + $this->trackback($result->final_url, $tb); + } else if (!empty($pb)) { + $this->pingback($result->final_url, $pb); } - $this->pingback($url, $endpoint); return $orig; } @@ -132,6 +139,82 @@ class LinkbackPlugin extends Plugin } } + // Largely cadged from trackback_cls.php by + // Ran Aroussi <ran@blogish.org>, GPL2 + // http://phptrackback.sourceforge.net/ + + function getTrackback($text, $url) + { + if (preg_match_all('/(<rdf:RDF.*?<\/rdf:RDF>)/sm', $text, $match, PREG_SET_ORDER)) { + for ($i = 0; $i < count($match); $i++) { + if (preg_match('|dc:identifier="' . preg_quote($url) . '"|ms', $match[$i][1])) { + $rdf_array[] = trim($match[$i][1]); + } + } + + // Loop through the RDFs array and extract trackback URIs + + $tb_array = array(); // <- holds list of trackback URIs + + if (!empty($rdf_array)) { + + for ($i = 0; $i < count($rdf_array); $i++) { + if (preg_match('/trackback:ping="([^"]+)"/', $rdf_array[$i], $array)) { + $tb_array[] = trim($array[1]); + break; + } + } + } + + // Return Trackbacks + + if (empty($tb_array)) { + return null; + } else { + return $tb_array[0]; + } + } + + if (preg_match_all('/(<a[^>]*?rel=[\'"]trackback[\'"][^>]*?>)/', $text, $match)) { + foreach ($match[1] as $atag) { + if (preg_match('/href=[\'"]([^\'"]*?)[\'"]/', $atag, $url)) { + return $url[1]; + } + } + } + + return null; + + } + + function trackback($url, $endpoint) + { + $profile = $this->notice->getProfile(); + + $args = array('title' => sprintf(_('%1$s\'s status on %2$s'), + $profile->nickname, + common_exact_date($this->notice->created)), + 'excerpt' => $this->notice->content, + 'url' => $this->notice->uri, + 'blog_name' => $profile->nickname); + + $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + + $result = $fetcher->post($endpoint, + http_build_query($args), + array('User-Agent: ' . $this->userAgent())); + + if ($result->status != '200') { + common_log(LOG_WARNING, + "Trackback error for '$url' ($endpoint): ". + "$result->body"); + } else { + common_log(LOG_INFO, + "Trackback success for '$url' ($endpoint): ". + "'$result->body'"); + } + } + function userAgent() { return 'LinkbackPlugin/'.LINKBACKPLUGIN_VERSION . |