Merge branch '0.8.x' of git@gitorious.org:laconica/dev into 0.8.x

This commit is contained in:
Evan Prodromou 2009-02-06 15:38:01 -05:00
commit d260d841eb
15 changed files with 4716 additions and 1066 deletions

34
README
View File

@ -26,14 +26,14 @@ instant messenger programs (GTalk/Jabber), and specially-designed
desktop clients that support the Twitter API. desktop clients that support the Twitter API.
Laconica supports an open standard called OpenMicroBlogging Laconica supports an open standard called OpenMicroBlogging
(http://openmicroblogging.org/) that lets users on different Web sites <http://openmicroblogging.org/> that lets users on different Web sites
or in different companies subscribe to each others' notices. It or in different companies subscribe to each others' notices. It
enables a distributed social network spread all across the Web. enables a distributed social network spread all across the Web.
Laconica was originally developed for the Open Software Service, Laconica was originally developed for the Open Software Service,
Identi.ca (http://identi.ca/). It is shared with you in hope that you Identi.ca <http://identi.ca/>. It is shared with you in hope that you
too make an Open Software Service available to your users. To learn too make an Open Software Service available to your users. To learn
more, please see the Open Software Service Definition 1.0: more, please see the Open Software Service Definition 1.1:
http://www.opendefinition.org/ossd http://www.opendefinition.org/ossd
@ -182,6 +182,10 @@ and the URLs are listed here for your convenience.
version may render your Laconica site unable to send or receive XMPP version may render your Laconica site unable to send or receive XMPP
messages. messages.
- Facebook library. Used for the Facebook application. - Facebook library. Used for the Facebook application.
- PEAR Services_oEmbed. Used for some multimedia integration.
- PEAR HTTP_Request is an oEmbed dependency.
- PEAR Validat is an oEmbed dependency.e
- PEAR Net_URL is an oEmbed dependency.2
A design goal of Laconica is that the basic Web functionality should A design goal of Laconica is that the basic Web functionality should
work on even the most restrictive commercial hosting services. work on even the most restrictive commercial hosting services.
@ -404,7 +408,7 @@ config.php, and access to the Laconica database from the mail server.
XMPP XMPP
---- ----
XMPP (eXtended Message and Presence Protocol, http://xmpp.org/) is the XMPP (eXtended Message and Presence Protocol, <http://xmpp.org/>) is the
instant-messenger protocol that drives Jabber and GTalk IM. You can instant-messenger protocol that drives Jabber and GTalk IM. You can
distribute messages via XMPP using the system below; however, you distribute messages via XMPP using the system below; however, you
need to run the XMPP incoming daemon to allow incoming messages as need to run the XMPP incoming daemon to allow incoming messages as
@ -537,7 +541,7 @@ Sample cron job:
Sitemaps Sitemaps
-------- --------
Sitemap files (http://sitemaps.org/) are a very nice way of telling Sitemap files <http://sitemaps.org/> are a very nice way of telling
search engines and other interested bots what's available on your site search engines and other interested bots what's available on your site
and what's changed recently. You can generate sitemap files for your and what's changed recently. You can generate sitemap files for your
Laconica instance. Laconica instance.
@ -558,7 +562,7 @@ Laconica instance.
like './sitemapindex.xml'. sitemap-directory is the directory where like './sitemapindex.xml'. sitemap-directory is the directory where
you want the sitemaps stored, like './sitemaps/' (make sure the dir you want the sitemaps stored, like './sitemaps/' (make sure the dir
exists). URL-prefix-for-sitemaps is the full URL for the sitemap dir, exists). URL-prefix-for-sitemaps is the full URL for the sitemap dir,
typically something like 'http://example.net/mublog/sitemaps/'. typically something like <http://example.net/mublog/sitemaps/>.
You can use several methods for submitting your sitemap index to You can use several methods for submitting your sitemap index to
search engines to get your site indexed. One is to add a line like the search engines to get your site indexed. One is to add a line like the
@ -612,7 +616,7 @@ modification to use the new output format.
Translation Translation
----------- -----------
Translations in Laconica use the gettext system (http://www.gnu.org/software/gettext/). Translations in Laconica use the gettext system <http://www.gnu.org/software/gettext/>.
Theoretically, you can add your own sub-directory to the locale/ Theoretically, you can add your own sub-directory to the locale/
subdirectory to add a new language to your system. You'll need to subdirectory to add a new language to your system. You'll need to
compile the ".po" files into ".mo" files, however. compile the ".po" files into ".mo" files, however.
@ -627,7 +631,7 @@ Backups
There is no built-in system for doing backups in Laconica. You can make There is no built-in system for doing backups in Laconica. You can make
backups of a working Laconica system by backing up the database and backups of a working Laconica system by backing up the database and
the Web directory. To backup the database use mysqldump (http://ur1.ca/7xo) the Web directory. To backup the database use mysqldump <http://ur1.ca/7xo>
and to backup the Web directory, try tar. and to backup the Web directory, try tar.
Private Private
@ -819,7 +823,7 @@ db
-- --
This section is a reference to the configuration options for This section is a reference to the configuration options for
DB_DataObject (see http://ur1.ca/7xp). The ones that you may want to DB_DataObject (see <http://ur1.ca/7xp>). The ones that you may want to
set are listed below for clarity. set are listed below for clarity.
database: a DSN (Data Source Name) for your Laconica database. This is database: a DSN (Data Source Name) for your Laconica database. This is
@ -919,7 +923,7 @@ server: If set, defines another server where avatars are stored in the
the client to speed up page loading, either with another the client to speed up page loading, either with another
virtual server or with an NFS or SAMBA share. Clients virtual server or with an NFS or SAMBA share. Clients
typically only make 2 connections to a single server at a typically only make 2 connections to a single server at a
time (http://ur1.ca/6ih), so this can parallelize the job. time <http://ur1.ca/6ih>, so this can parallelize the job.
Defaults to null. Defaults to null.
public public
@ -1000,7 +1004,7 @@ memcached
--------- ---------
You can get a significant boost in performance by caching some You can get a significant boost in performance by caching some
database data in memcached (http://www.danga.com/memcached/). database data in memcached <http://www.danga.com/memcached/>.
enabled: Set to true to enable. Default false. enabled: Set to true to enable. Default false.
server: a string with the hostname of the memcached server. Can also server: a string with the hostname of the memcached server. Can also
@ -1011,7 +1015,7 @@ sphinx
You can get a significant boost in performance using Sphinx Search You can get a significant boost in performance using Sphinx Search
instead of your database server to search for users and notices. instead of your database server to search for users and notices.
(http://sphinxsearch.com/). <http://sphinxsearch.com/>.
enabled: Set to true to enable. Default false. enabled: Set to true to enable. Default false.
server: a string with the hostname of the sphinx server. server: a string with the hostname of the sphinx server.
@ -1024,7 +1028,7 @@ A catch-all for integration with other systems.
source: The name to use for the source of posts to Twitter. Defaults source: The name to use for the source of posts to Twitter. Defaults
to 'laconica', but if you request your own source name from to 'laconica', but if you request your own source name from
Twitter (http://twitter.com/help/request_source), you can use Twitter <http://twitter.com/help/request_source>, you can use
that here instead. Status updates on Twitter will then have that here instead. Status updates on Twitter will then have
links to your site. links to your site.
@ -1101,7 +1105,7 @@ Unstable version
If you're adventurous or impatient, you may want to install the If you're adventurous or impatient, you may want to install the
development version of Laconica. To get it, use the git version development version of Laconica. To get it, use the git version
control tool (http://git-scm.com/) like so: control tool <http://git-scm.com/> like so:
git clone http://laconi.ca/software/laconica.git git clone http://laconi.ca/software/laconica.git
@ -1114,7 +1118,7 @@ There are several ways to get more information about Laconica.
* There is a mailing list for Laconica developers and admins at * There is a mailing list for Laconica developers and admins at
http://mail.laconi.ca/mailman/listinfo/laconica-dev http://mail.laconi.ca/mailman/listinfo/laconica-dev
* The #laconica IRC channel on freenode.net (http://www.freenode.net/). * The #laconica IRC channel on freenode.net <http://www.freenode.net/>.
* The Laconica wiki, http://laconi.ca/trac/ * The Laconica wiki, http://laconi.ca/trac/
Feedback Feedback

1521
extlib/HTTP/Request.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,106 @@
<?php
/**
* Listener for HTTP_Request and HTTP_Response objects
*
* PHP versions 4 and 5
*
* LICENSE:
*
* Copyright (c) 2002-2007, Richard Heyes
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* o Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* o Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* o The names of the authors may not be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @category HTTP
* @package HTTP_Request
* @author Alexey Borzov <avb@php.net>
* @copyright 2002-2007 Richard Heyes
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Listener.php,v 1.3 2007/05/18 10:33:31 avb Exp $
* @link http://pear.php.net/package/HTTP_Request/
*/
/**
* Listener for HTTP_Request and HTTP_Response objects
*
* This class implements the Observer part of a Subject-Observer
* design pattern.
*
* @category HTTP
* @package HTTP_Request
* @author Alexey Borzov <avb@php.net>
* @version Release: 1.4.4
*/
class HTTP_Request_Listener
{
/**
* A listener's identifier
* @var string
*/
var $_id;
/**
* Constructor, sets the object's identifier
*
* @access public
*/
function HTTP_Request_Listener()
{
$this->_id = md5(uniqid('http_request_', 1));
}
/**
* Returns the listener's identifier
*
* @access public
* @return string
*/
function getId()
{
return $this->_id;
}
/**
* This method is called when Listener is notified of an event
*
* @access public
* @param object an object the listener is attached to
* @param string Event name
* @param mixed Additional data
* @abstract
*/
function update(&$subject, $event, $data = null)
{
echo "Notified of event: '$event'\n";
if (null !== $data) {
echo "Additional data: ";
var_dump($data);
}
}
}
?>

813
extlib/Net/URL2.php Normal file
View File

@ -0,0 +1,813 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2007-2008, Christian Schmidt, Peytz & Co. A/S |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Christian Schmidt <schmidt at php dot net> |
// +-----------------------------------------------------------------------+
//
// $Id: URL2.php,v 1.10 2008/04/26 21:57:08 schmidt Exp $
//
// Net_URL2 Class (PHP5 Only)
// This code is released under the BSD License - http://www.opensource.org/licenses/bsd-license.php
/**
* @license BSD License
*/
class Net_URL2
{
/**
* Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default
* is true.
*/
const OPTION_STRICT = 'strict';
/**
* Represent arrays in query using PHP's [] notation. Default is true.
*/
const OPTION_USE_BRACKETS = 'use_brackets';
/**
* URL-encode query variable keys. Default is true.
*/
const OPTION_ENCODE_KEYS = 'encode_keys';
/**
* Query variable separators when parsing the query string. Every character
* is considered a separator. Default is specified by the
* arg_separator.input php.ini setting (this defaults to "&").
*/
const OPTION_SEPARATOR_INPUT = 'input_separator';
/**
* Query variable separator used when generating the query string. Default
* is specified by the arg_separator.output php.ini setting (this defaults
* to "&").
*/
const OPTION_SEPARATOR_OUTPUT = 'output_separator';
/**
* Default options corresponds to how PHP handles $_GET.
*/
private $options = array(
self::OPTION_STRICT => true,
self::OPTION_USE_BRACKETS => true,
self::OPTION_ENCODE_KEYS => true,
self::OPTION_SEPARATOR_INPUT => 'x&',
self::OPTION_SEPARATOR_OUTPUT => 'x&',
);
/**
* @var string|bool
*/
private $scheme = false;
/**
* @var string|bool
*/
private $userinfo = false;
/**
* @var string|bool
*/
private $host = false;
/**
* @var int|bool
*/
private $port = false;
/**
* @var string
*/
private $path = '';
/**
* @var string|bool
*/
private $query = false;
/**
* @var string|bool
*/
private $fragment = false;
/**
* @param string $url an absolute or relative URL
* @param array $options
*/
public function __construct($url, $options = null)
{
$this->setOption(self::OPTION_SEPARATOR_INPUT,
ini_get('arg_separator.input'));
$this->setOption(self::OPTION_SEPARATOR_OUTPUT,
ini_get('arg_separator.output'));
if (is_array($options)) {
foreach ($options as $optionName => $value) {
$this->setOption($optionName);
}
}
if (preg_match('@^([a-z][a-z0-9.+-]*):@i', $url, $reg)) {
$this->scheme = $reg[1];
$url = substr($url, strlen($reg[0]));
}
if (preg_match('@^//([^/#?]+)@', $url, $reg)) {
$this->setAuthority($reg[1]);
$url = substr($url, strlen($reg[0]));
}
$i = strcspn($url, '?#');
$this->path = substr($url, 0, $i);
$url = substr($url, $i);
if (preg_match('@^\?([^#]*)@', $url, $reg)) {
$this->query = $reg[1];
$url = substr($url, strlen($reg[0]));
}
if ($url) {
$this->fragment = substr($url, 1);
}
}
/**
* Returns the scheme, e.g. "http" or "urn", or false if there is no
* scheme specified, i.e. if this is a relative URL.
*
* @return string|bool
*/
public function getScheme()
{
return $this->scheme;
}
/**
* @param string|bool $scheme
*
* @return void
* @see getScheme()
*/
public function setScheme($scheme)
{
$this->scheme = $scheme;
}
/**
* Returns the user part of the userinfo part (the part preceding the first
* ":"), or false if there is no userinfo part.
*
* @return string|bool
*/
public function getUser()
{
return $this->userinfo !== false ? preg_replace('@:.*$@', '', $this->userinfo) : false;
}
/**
* Returns the password part of the userinfo part (the part after the first
* ":"), or false if there is no userinfo part (i.e. the URL does not
* contain "@" in front of the hostname) or the userinfo part does not
* contain ":".
*
* @return string|bool
*/
public function getPassword()
{
return $this->userinfo !== false ? substr(strstr($this->userinfo, ':'), 1) : false;
}
/**
* Returns the userinfo part, or false if there is none, i.e. if the
* authority part does not contain "@".
*
* @return string|bool
*/
public function getUserinfo()
{
return $this->userinfo;
}
/**
* Sets the userinfo part. If two arguments are passed, they are combined
* in the userinfo part as username ":" password.
*
* @param string|bool $userinfo userinfo or username
* @param string|bool $password
*
* @return void
*/
public function setUserinfo($userinfo, $password = false)
{
$this->userinfo = $userinfo;
if ($password !== false) {
$this->userinfo .= ':' . $password;
}
}
/**
* Returns the host part, or false if there is no authority part, e.g.
* relative URLs.
*
* @return string|bool
*/
public function getHost()
{
return $this->host;
}
/**
* @param string|bool $host
*
* @return void
*/
public function setHost($host)
{
$this->host = $host;
}
/**
* Returns the port number, or false if there is no port number specified,
* i.e. if the default port is to be used.
*
* @return int|bool
*/
public function getPort()
{
return $this->port;
}
/**
* @param int|bool $port
*
* @return void
*/
public function setPort($port)
{
$this->port = intval($port);
}
/**
* Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or
* false if there is no authority none.
*
* @return string|bool
*/
public function getAuthority()
{
if (!$this->host) {
return false;
}
$authority = '';
if ($this->userinfo !== false) {
$authority .= $this->userinfo . '@';
}
$authority .= $this->host;
if ($this->port !== false) {
$authority .= ':' . $this->port;
}
return $authority;
}
/**
* @param string|false $authority
*
* @return void
*/
public function setAuthority($authority)
{
$this->user = false;
$this->pass = false;
$this->host = false;
$this->port = false;
if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $authority, $reg)) {
if ($reg[1]) {
$this->userinfo = $reg[2];
}
$this->host = $reg[3];
if (isset($reg[5])) {
$this->port = intval($reg[5]);
}
}
}
/**
* Returns the path part (possibly an empty string).
*
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* @param string $path
*
* @return void
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* Returns the query string (excluding the leading "?"), or false if "?"
* isn't present in the URL.
*
* @return string|bool
* @see self::getQueryVariables()
*/
public function getQuery()
{
return $this->query;
}
/**
* @param string|bool $query
*
* @return void
* @see self::setQueryVariables()
*/
public function setQuery($query)
{
$this->query = $query;
}
/**
* Returns the fragment name, or false if "#" isn't present in the URL.
*
* @return string|bool
*/
public function getFragment()
{
return $this->fragment;
}
/**
* @param string|bool $fragment
*
* @return void
*/
public function setFragment($fragment)
{
$this->fragment = $fragment;
}
/**
* Returns the query string like an array as the variables would appear in
* $_GET in a PHP script.
*
* @return array
*/
public function getQueryVariables()
{
$pattern = '/[' .
preg_quote($this->getOption(self::OPTION_SEPARATOR_INPUT), '/') .
']/';
$parts = preg_split($pattern, $this->query, -1, PREG_SPLIT_NO_EMPTY);
$return = array();
foreach ($parts as $part) {
if (strpos($part, '=') !== false) {
list($key, $value) = explode('=', $part, 2);
} else {
$key = $part;
$value = null;
}
if ($this->getOption(self::OPTION_ENCODE_KEYS)) {
$key = rawurldecode($key);
}
$value = rawurldecode($value);
if ($this->getOption(self::OPTION_USE_BRACKETS) &&
preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) {
$key = $matches[1];
$idx = $matches[2];
// Ensure is an array
if (empty($return[$key]) || !is_array($return[$key])) {
$return[$key] = array();
}
// Add data
if ($idx === '') {
$return[$key][] = $value;
} else {
$return[$key][$idx] = $value;
}
} elseif (!$this->getOption(self::OPTION_USE_BRACKETS)
&& !empty($return[$key])
) {
$return[$key] = (array) $return[$key];
$return[$key][] = $value;
} else {
$return[$key] = $value;
}
}
return $return;
}
/**
* @param array $array (name => value) array
*
* @return void
*/
public function setQueryVariables(array $array)
{
if (!$array) {
$this->query = false;
} else {
foreach ($array as $name => $value) {
if ($this->getOption(self::OPTION_ENCODE_KEYS)) {
$name = rawurlencode($name);
}
if (is_array($value)) {
foreach ($value as $k => $v) {
$parts[] = $this->getOption(self::OPTION_USE_BRACKETS)
? sprintf('%s[%s]=%s', $name, $k, $v)
: ($name . '=' . $v);
}
} elseif (!is_null($value)) {
$parts[] = $name . '=' . $value;
} else {
$parts[] = $name;
}
}
$this->query = implode($this->getOption(self::OPTION_SEPARATOR_OUTPUT),
$parts);
}
}
/**
* @param string $name
* @param mixed $value
*
* @return array
*/
public function setQueryVariable($name, $value)
{
$array = $this->getQueryVariables();
$array[$name] = $value;
$this->setQueryVariables($array);
}
/**
* @param string $name
*
* @return void
*/
public function unsetQueryVariable($name)
{
$array = $this->getQueryVariables();
unset($array[$name]);
$this->setQueryVariables($array);
}
/**
* Returns a string representation of this URL.
*
* @return string
*/
public function getURL()
{
// See RFC 3986, section 5.3
$url = "";
if ($this->scheme !== false) {
$url .= $this->scheme . ':';
}
$authority = $this->getAuthority();
if ($authority !== false) {
$url .= '//' . $authority;
}
$url .= $this->path;
if ($this->query !== false) {
$url .= '?' . $this->query;
}
if ($this->fragment !== false) {
$url .= '#' . $this->fragment;
}
return $url;
}
/**
* Returns a normalized string representation of this URL. This is useful
* for comparison of URLs.
*
* @return string
*/
public function getNormalizedURL()
{
$url = clone $this;
$url->normalize();
return $url->getUrl();
}
/**
* Returns a normalized Net_URL2 instance.
*
* @return Net_URL2
*/
public function normalize()
{
// See RFC 3886, section 6
// Schemes are case-insensitive
if ($this->scheme) {
$this->scheme = strtolower($this->scheme);
}
// Hostnames are case-insensitive
if ($this->host) {
$this->host = strtolower($this->host);
}
// Remove default port number for known schemes (RFC 3986, section 6.2.3)
if ($this->port &&
$this->scheme &&
$this->port == getservbyname($this->scheme, 'tcp')) {
$this->port = false;
}
// Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
foreach (array('userinfo', 'host', 'path') as $part) {
if ($this->$part) {
$this->$part = preg_replace('/%[0-9a-f]{2}/ie', 'strtoupper("\0")', $this->$part);
}
}
// Path segment normalization (RFC 3986, section 6.2.2.3)
$this->path = self::removeDotSegments($this->path);
// Scheme based normalization (RFC 3986, section 6.2.3)
if ($this->host && !$this->path) {
$this->path = '/';
}
}
/**
* Returns whether this instance represents an absolute URL.
*
* @return bool
*/
public function isAbsolute()
{
return (bool) $this->scheme;
}
/**
* Returns an Net_URL2 instance representing an absolute URL relative to
* this URL.
*
* @param Net_URL2|string $reference relative URL
*
* @return Net_URL2
*/
public function resolve($reference)
{
if (is_string($reference)) {
$reference = new self($reference);
}
if (!$this->isAbsolute()) {
throw new Exception('Base-URL must be absolute');
}
// A non-strict parser may ignore a scheme in the reference if it is
// identical to the base URI's scheme.
if (!$this->getOption(self::OPTION_STRICT) && $reference->scheme == $this->scheme) {
$reference->scheme = false;
}
$target = new self('');
if ($reference->scheme !== false) {
$target->scheme = $reference->scheme;
$target->setAuthority($reference->getAuthority());
$target->path = self::removeDotSegments($reference->path);
$target->query = $reference->query;
} else {
$authority = $reference->getAuthority();
if ($authority !== false) {
$target->setAuthority($authority);
$target->path = self::removeDotSegments($reference->path);
$target->query = $reference->query;
} else {
if ($reference->path == '') {
$target->path = $this->path;
if ($reference->query !== false) {
$target->query = $reference->query;
} else {
$target->query = $this->query;
}
} else {
if (substr($reference->path, 0, 1) == '/') {
$target->path = self::removeDotSegments($reference->path);
} else {
// Merge paths (RFC 3986, section 5.2.3)
if ($this->host !== false && $this->path == '') {
$target->path = '/' . $this->path;
} else {
$i = strrpos($this->path, '/');
if ($i !== false) {
$target->path = substr($this->path, 0, $i + 1);
}
$target->path .= $reference->path;
}
$target->path = self::removeDotSegments($target->path);
}
$target->query = $reference->query;
}
$target->setAuthority($this->getAuthority());
}
$target->scheme = $this->scheme;
}
$target->fragment = $reference->fragment;
return $target;
}
/**
* Removes dots as described in RFC 3986, section 5.2.4, e.g.
* "/foo/../bar/baz" => "/bar/baz"
*
* @param string $path a path
*
* @return string a path
*/
private static function removeDotSegments($path)
{
$output = '';
// Make sure not to be trapped in an infinite loop due to a bug in this
// method
$j = 0;
while ($path && $j++ < 100) {
// Step A
if (substr($path, 0, 2) == './') {
$path = substr($path, 2);
} elseif (substr($path, 0, 3) == '../') {
$path = substr($path, 3);
// Step B
} elseif (substr($path, 0, 3) == '/./' || $path == '/.') {
$path = '/' . substr($path, 3);
// Step C
} elseif (substr($path, 0, 4) == '/../' || $path == '/..') {
$path = '/' . substr($path, 4);
$i = strrpos($output, '/');
$output = $i === false ? '' : substr($output, 0, $i);
// Step D
} elseif ($path == '.' || $path == '..') {
$path = '';
// Step E
} else {
$i = strpos($path, '/');
if ($i === 0) {
$i = strpos($path, '/', 1);
}
if ($i === false) {
$i = strlen($path);
}
$output .= substr($path, 0, $i);
$path = substr($path, $i);
}
}
return $output;
}
/**
* Returns a Net_URL2 instance representing the canonical URL of the
* currently executing PHP script.
*
* @return string
*/
public static function getCanonical()
{
if (!isset($_SERVER['REQUEST_METHOD'])) {
// ALERT - no current URL
throw new Exception('Script was not called through a webserver');
}
// Begin with a relative URL
$url = new self($_SERVER['PHP_SELF']);
$url->scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
$url->host = $_SERVER['SERVER_NAME'];
$port = intval($_SERVER['SERVER_PORT']);
if ($url->scheme == 'http' && $port != 80 ||
$url->scheme == 'https' && $port != 443) {
$url->port = $port;
}
return $url;
}
/**
* Returns the URL used to retrieve the current request.
*
* @return string
*/
public static function getRequestedURL()
{
return self::getRequested()->getUrl();
}
/**
* Returns a Net_URL2 instance representing the URL used to retrieve the
* current request.
*
* @return Net_URL2
*/
public static function getRequested()
{
if (!isset($_SERVER['REQUEST_METHOD'])) {
// ALERT - no current URL
throw new Exception('Script was not called through a webserver');
}
// Begin with a relative URL
$url = new self($_SERVER['REQUEST_URI']);
$url->scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
// Set host and possibly port
$url->setAuthority($_SERVER['HTTP_HOST']);
return $url;
}
/**
* Sets the specified option.
*
* @param string $optionName a self::OPTION_ constant
* @param mixed $value option value
*
* @return void
* @see self::OPTION_STRICT
* @see self::OPTION_USE_BRACKETS
* @see self::OPTION_ENCODE_KEYS
*/
function setOption($optionName, $value)
{
if (!array_key_exists($optionName, $this->options)) {
return false;
}
$this->options[$optionName] = $value;
}
/**
* Returns the value of the specified option.
*
* @param string $optionName The name of the option to retrieve
*
* @return mixed
*/
function getOption($optionName)
{
return isset($this->options[$optionName])
? $this->options[$optionName] : false;
}
}

357
extlib/Services/oEmbed.php Normal file
View File

@ -0,0 +1,357 @@
<?php
/**
* An interface for oEmbed consumption
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Validate.php';
require_once 'Net/URL2.php';
require_once 'HTTP/Request.php';
require_once 'Services/oEmbed/Exception.php';
require_once 'Services/oEmbed/Exception/NoSupport.php';
require_once 'Services/oEmbed/Object.php';
/**
* Base class for consuming oEmbed objects
*
* <code>
* <?php
*
* require_once 'Services/oEmbed.php';
*
* // The URL that we'd like to find out more information about.
* $url = 'http://flickr.com/photos/joestump/2848795611/';
*
* // The oEmbed API URI. Not all providers support discovery yet so we're
* // explicitly providing one here. If one is not provided Services_oEmbed
* // attempts to discover it. If none is found an exception is thrown.
* $oEmbed = new Services_oEmbed($url, array(
* Services_oEmbed::OPTION_API => 'http://www.flickr.com/services/oembed/'
* ));
* $object = $oEmbed->getObject();
*
* // All of the objects have somewhat sane __toString() methods that allow
* // you to output them directly.
* echo (string)$object;
*
* ?>
* </code>
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed
{
/**
* HTTP timeout in seconds
*
* All HTTP requests made by Services_oEmbed will respect this timeout.
* This can be passed to {@link Services_oEmbed::setOption()} or to the
* options parameter in {@link Services_oEmbed::__construct()}.
*
* @var string OPTION_TIMEOUT Timeout in seconds
*/
const OPTION_TIMEOUT = 'http_timeout';
/**
* HTTP User-Agent
*
* All HTTP requests made by Services_oEmbed will be sent with the
* string set by this option.
*
* @var string OPTION_USER_AGENT The HTTP User-Agent string
*/
const OPTION_USER_AGENT = 'http_user_agent';
/**
* The API's URI
*
* If the API is known ahead of time this option can be used to explicitly
* set it. If not present then the API is attempted to be discovered
* through the auto-discovery mechanism.
*
* @var string OPTION_API
*/
const OPTION_API = 'oembed_api';
/**
* Options for oEmbed requests
*
* @var array $options The options for making requests
*/
protected $options = array(
self::OPTION_TIMEOUT => 3,
self::OPTION_API => null,
self::OPTION_USER_AGENT => 'Services_oEmbed 0.1.0'
);
/**
* URL of object to get embed information for
*
* @var object $url {@link Net_URL2} instance of URL of object
*/
protected $url = null;
/**
* Constructor
*
* @param string $url The URL to fetch an oEmbed for
* @param array $options A list of options for the oEmbed lookup
*
* @throws {@link Services_oEmbed_Exception} if the $url is invalid
* @throws {@link Services_oEmbed_Exception} when no valid API is found
* @return void
*/
public function __construct($url, array $options = array())
{
if (Validate::uri($url)) {
$this->url = new Net_URL2($url);
} else {
throw new Services_oEmbed_Exception('URL is invalid');
}
if (count($options)) {
foreach ($options as $key => $val) {
$this->setOption($key, $val);
}
}
if ($this->options[self::OPTION_API] === null) {
$this->options[self::OPTION_API] = $this->discover();
}
}
/**
* Set an option for the oEmbed request
*
* @param mixed $option The option name
* @param mixed $value The option value
*
* @see Services_oEmbed::OPTION_API, Services_oEmbed::OPTION_TIMEOUT
* @throws {@link Services_oEmbed_Exception} on invalid option
* @access public
* @return void
*/
public function setOption($option, $value)
{
switch ($option) {
case self::OPTION_API:
case self::OPTION_TIMEOUT:
break;
default:
throw new Services_oEmbed_Exception(
'Invalid option "' . $option . '"'
);
}
$func = '_set_' . $option;
if (method_exists($this, $func)) {
$this->options[$option] = $this->$func($value);
} else {
$this->options[$option] = $value;
}
}
/**
* Set the API option
*
* @param string $value The API's URI
*
* @throws {@link Services_oEmbed_Exception} on invalid API URI
* @see Validate::uri()
* @return string
*/
protected function _set_oembed_api($value)
{
if (!Validate::uri($value)) {
throw new Services_oEmbed_Exception(
'API URI provided is invalid'
);
}
return $value;
}
/**
* Get the oEmbed response
*
* @param array $params Optional parameters for
*
* @throws {@link Services_oEmbed_Exception} on cURL errors
* @throws {@link Services_oEmbed_Exception} on HTTP errors
* @throws {@link Services_oEmbed_Exception} when result is not parsable
* @return object The oEmbed response as an object
*/
public function getObject(array $params = array())
{
$params['url'] = $this->url->getURL();
if (!isset($params['format'])) {
$params['format'] = 'json';
}
$sets = array();
foreach ($params as $var => $val) {
$sets[] = $var . '=' . urlencode($val);
}
$url = $this->options[self::OPTION_API] . '?' . implode('&', $sets);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->options[self::OPTION_TIMEOUT]);
$result = curl_exec($ch);
if (curl_errno($ch)) {
throw new Services_oEmbed_Exception(
curl_error($ch), curl_errno($ch)
);
}
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (substr($code, 0, 1) != '2') {
throw new Services_oEmbed_Exception('Non-200 code returned');
}
curl_close($ch);
switch ($params['format']) {
case 'json':
$res = json_decode($result);
if (!is_object($res)) {
throw new Services_oEmbed_Exception(
'Could not parse JSON response'
);
}
break;
case 'xml':
libxml_use_internal_errors(true);
$res = simplexml_load_string($result);
if (!$res instanceof SimpleXMLElement) {
$errors = libxml_get_errors();
$err = array_shift($errors);
libxml_clear_errors();
libxml_use_internal_errors(false);
throw new Services_oEmbed_Exception(
$err->message, $error->code
);
}
break;
}
return Services_oEmbed_Object::factory($res);
}
/**
* Discover an oEmbed API
*
* @param string $url The URL to attempt to discover oEmbed for
*
* @throws {@link Services_oEmbed_Exception} if the $url is invalid
* @return string The oEmbed API endpoint discovered
*/
protected function discover($url)
{
$body = $this->sendRequest($url);
// Find all <link /> tags that have a valid oembed type set. We then
// extract the href attribute for each type.
$regexp = '#<link([^>]*)type="' .
'(application/json|text/xml)\+oembed"([^>]*)>#i';
$m = $ret = array();
if (!preg_match_all($regexp, $body, $m)) {
throw new Services_oEmbed_Exception_NoSupport(
'No valid oEmbed links found on page'
);
}
foreach ($m[0] as $i => $link) {
$h = array();
if (preg_match('/href="([^"]+)"/i', $link, $h)) {
$ret[$m[2][$i]] = $h[1];
}
}
return (isset($ret['json']) ? $ret['json'] : array_pop($ret));
}
/**
* Send a GET request to the provider
*
* @param mixed $url The URL to send the request to
*
* @throws {@link Services_oEmbed_Exception} on HTTP errors
* @return string The contents of the response
*/
private function sendRequest($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->options[self::OPTION_TIMEOUT]);
curl_setopt($ch, CURLOPT_USERAGENT, $this->options[self::OPTION_USER_AGENT]);
$result = curl_exec($ch);
if (curl_errno($ch)) {
throw new Services_oEmbed_Exception(
curl_error($ch), curl_errno($ch)
);
}
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (substr($code, 0, 1) != '2') {
throw new Services_oEmbed_Exception('Non-200 code returned');
}
return $result;
}
}
?>

View File

@ -0,0 +1,65 @@
<?php
/**
* Base exception class for {@link Services_oEmbed}
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'PEAR/Exception.php';
/**
* Base exception class for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Exception extends PEAR_Exception
{
}
?>

View File

@ -0,0 +1,63 @@
<?php
/**
* Exception class when no oEmbed support is discovered
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
/**
* Exception class when no oEmbed support is discovered
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Exception_NoSupport extends Services_oEmbed_Exception
{
}
?>

View File

@ -0,0 +1,126 @@
<?php
/**
* An interface for oEmbed consumption
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Exception.php';
/**
* Base class for consuming oEmbed objects
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
abstract class Services_oEmbed_Object
{
/**
* Valid oEmbed object types
*
* @var array $types Array of valid object types
* @see Services_oEmbed_Object::factory()
*/
static protected $types = array(
'photo' => 'Photo',
'video' => 'Video',
'link' => 'Link',
'rich' => 'Rich'
);
/**
* Create an oEmbed object from result
*
* @param object $object Raw object returned from API
*
* @throws {@link Services_oEmbed_Object_Exception} on object error
* @return object Instance of object driver
* @see Services_oEmbed_Object_Link, Services_oEmbed_Object_Photo
* @see Services_oEmbed_Object_Rich, Services_oEmbed_Object_Video
*/
static public function factory($object)
{
if (!isset($object->type)) {
throw new Services_oEmbed_Object_Exception(
'Object has no type'
);
}
$type = (string)$object->type;
if (!isset(self::$types[$type])) {
throw new Services_oEmbed_Object_Exception(
'Object type is unknown or invalid: ' . $type
);
}
$file = 'Services/oEmbed/Object/' . self::$types[$type] . '.php';
include_once $file;
$class = 'Services_oEmbed_Object_' . self::$types[$type];
if (!class_exists($class)) {
throw new Services_oEmbed_Object_Exception(
'Object class is invalid or not present'
);
}
$instance = new $class($object);
return $instance;
}
/**
* Instantiation is not allowed
*
* @return void
*/
private function __construct()
{
}
}
?>

View File

@ -0,0 +1,139 @@
<?php
/**
* Base class for oEmbed objects
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
/**
* Base class for oEmbed objects
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
abstract class Services_oEmbed_Object_Common
{
/**
* Raw object returned from API
*
* @var object $object The raw object from the API
*/
protected $object = null;
/**
* Required fields per the specification
*
* @var array $required Array of required fields
* @link http://oembed.com
*/
protected $required = array();
/**
* Constructor
*
* @param object $object Raw object returned from the API
*
* @throws {@link Services_oEmbed_Object_Exception} on missing fields
* @return void
*/
public function __construct($object)
{
$this->object = $object;
$this->required[] = 'version';
foreach ($this->required as $field) {
if (!isset($this->$field)) {
throw new Services_oEmbed_Object_Exception(
'Object is missing required ' . $field . ' attribute'
);
}
}
}
/**
* Get object variable
*
* @param string $var Variable to get
*
* @see Services_oEmbed_Object_Common::$object
* @return mixed Attribute's value or null if it's not set/exists
*/
public function __get($var)
{
if (property_exists($this->object, $var)) {
return $this->object->$var;
}
return null;
}
/**
* Is variable set?
*
* @param string $var Variable name to check
*
* @return boolean True if set, false if not
* @see Services_oEmbed_Object_Common::$object
*/
public function __isset($var)
{
if (property_exists($this->object, $var)) {
return (isset($this->object->$var));
}
return false;
}
/**
* Require a sane __toString for all objects
*
* @return string
*/
abstract public function __toString();
}
?>

View File

@ -0,0 +1,65 @@
<?php
/**
* Exception for {@link Services_oEmbed_Object}
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Exception.php';
/**
* Exception for {@link Services_oEmbed_Object}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Exception extends Services_oEmbed_Exception
{
}
?>

View File

@ -0,0 +1,73 @@
<?php
/**
* Link object for {@link Services_oEmbed}
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Common.php';
/**
* Link object for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Link extends Services_oEmbed_Object_Common
{
/**
* Output a sane link
*
* @return string An HTML link of the object
*/
public function __toString()
{
return '<a href="' . $this->url . '">' . $this->title . '</a>';
}
}
?>

View File

@ -0,0 +1,89 @@
<?php
/**
* Photo object for {@link Services_oEmbed}
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Common.php';
/**
* Photo object for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Photo extends Services_oEmbed_Object_Common
{
/**
* Required fields for photo objects
*
* @var array $required Required fields
*/
protected $required = array(
'url', 'width', 'height'
);
/**
* Output a valid HTML tag for image
*
* @return string HTML <img /> tag for Photo
*/
public function __toString()
{
$img = '<img src="' . $this->url . '" width="' . $this->width . '" ' .
'height="' . $this->height . '"';
if (isset($this->title)) {
$img .= ' alt="' . $this->title . '"';
}
return $img . ' />';
}
}
?>

View File

@ -0,0 +1,82 @@
<?php
/**
* Photo object for {@link Services_oEmbed}
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Common.php';
/**
* Photo object for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Rich extends Services_oEmbed_Object_Common
{
/**
* Required fields for rich objects
*
* @var array $required Required fields
*/
protected $required = array(
'html', 'width', 'height'
);
/**
* Output a the HTML tag for rich object
*
* @return string HTML for rich object
*/
public function __toString()
{
return $this->html;
}
}
?>

View File

@ -0,0 +1,82 @@
<?php
/**
* Photo object for {@link Services_oEmbed}
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Common.php';
/**
* Photo object for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Video extends Services_oEmbed_Object_Common
{
/**
* Required fields for video objects
*
* @var array $required Required fields
*/
protected $required = array(
'html', 'width', 'height'
);
/**
* Output a valid embed tag for video
*
* @return string HTML for video
*/
public function __toString()
{
return $this->html;
}
}
?>

File diff suppressed because it is too large Load Diff