#4674 Add support for external medias: oembed, ogp, etc
parent
0433b28f7f
commit
7b2e9fbbd7
@ -0,0 +1 @@ |
||||
Used to extract metadata from external resources : youtube, dailymotion, etc |
@ -0,0 +1,56 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Process all renderers attached in order. |
||||
* |
||||
* If a renderer returns an key value that has not already been set add it |
||||
* to the result. Otherwise let the previous value unchanged. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetAggregatedRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
protected $renderers = array(); |
||||
|
||||
public function __construct($renderers) |
||||
{ |
||||
$this->renderers = $renderers; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function renderers() |
||||
{ |
||||
return $this->renderers; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
* @return array |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
$result = array(); |
||||
$plugins = self::plugins(); |
||||
foreach ($this->renderers as $renderer) |
||||
{ |
||||
$data = $renderer->render($asset); |
||||
$data = $data ? $data : array(); |
||||
foreach ($data as $key => $value) |
||||
{ |
||||
if (!isset($result[$key]) && !empty($value)) |
||||
{ |
||||
$result[$key] = $value; |
||||
} |
||||
} |
||||
} |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,107 @@ |
||||
<?php |
||||
|
||||
require_once dirname(__FILE__) . '/http_resource.class.php'; |
||||
require_once dirname(__FILE__) . '/asset_aggregated_renderer.class.php'; |
||||
|
||||
/** |
||||
* Renderer for an http resource. |
||||
* Extract meta data and snippet html view from an given url/resource. |
||||
* |
||||
* Base class. Other renderers must inherit from it. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetRenderer |
||||
{ |
||||
|
||||
const THUMBNAIL = 'thumbnail'; |
||||
const EMBED_SNIPPET = 'embed_snippet'; |
||||
const EMBED_TYPE = 'embed_type'; |
||||
const EMBED_URL = 'embed_url'; |
||||
const WIDTH = 'width'; |
||||
const HEIGHT = 'height'; |
||||
const LANGUAGE = 'language'; |
||||
const URL = 'url'; |
||||
const TAGS = 'tags'; |
||||
const TITLE = 'title'; |
||||
const CREATED_TIME = 'created_time'; |
||||
const DURATION = 'duration'; |
||||
const DESCRIPTION = 'description'; |
||||
const ICON = 'icon'; |
||||
|
||||
static function get($url, $config = array()) |
||||
{ |
||||
if (strpos('url', 'javascript:') !== false) |
||||
{ |
||||
return array(); |
||||
} |
||||
$result = array(); |
||||
$url = trim($url); |
||||
if (empty($url)) |
||||
{ |
||||
return array(); |
||||
} |
||||
$asset = new HttpResource($url, $config); |
||||
$renderer = new AssetAggregatedRenderer(self::plugins()); |
||||
$result = $renderer->render($asset); |
||||
$result['url'] = $url; |
||||
return $result; |
||||
} |
||||
|
||||
static function plugins() |
||||
{ |
||||
static $result = array(); |
||||
if (!empty($result)) |
||||
{ |
||||
return $result; |
||||
} |
||||
|
||||
/* |
||||
* We make sure we load them from most specialized to less specialized. |
||||
* The first that provides a value for a field wins. |
||||
*/ |
||||
$protocols = array( |
||||
'oembed', |
||||
'og', |
||||
'image', |
||||
'media', |
||||
'rss', |
||||
'google_map', |
||||
'google_document', |
||||
'google_document_viewer', |
||||
'google_widget', |
||||
'mediaserver', |
||||
'scratch', |
||||
'page'); |
||||
|
||||
foreach ($protocols as $protocol) |
||||
{ |
||||
$file = "asset_{$protocol}_renderer.class.php"; |
||||
require_once dirname(__FILE__) . '/protocol/' . $file; |
||||
|
||||
$class = "asset_{$protocol}_renderer"; |
||||
$class = explode('_', $class); |
||||
$class = array_map('ucfirst', $class); |
||||
$class = implode($class); |
||||
|
||||
$result[] = new $class(); |
||||
} |
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* Renderer function. Take a http asset as input and return an array containing |
||||
* various properties: metadata, html snippet, etc. |
||||
* |
||||
* @param HttpResource $asset |
||||
* @return array |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
$result = array(); |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,662 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* An HTTP resource. In most cases an HTML document. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class HttpResource |
||||
{ |
||||
|
||||
/** |
||||
* Fetch the content and metadata of an url. |
||||
* |
||||
* If the content type is not parsable, i.e. it is not made of text, |
||||
* only fetch the metadata and not the content. This is mostly done to |
||||
* avoid downloading big files - videos, images, etc - which is unnecessary. |
||||
* |
||||
* @param string $url the url to fetch |
||||
* @return array array containing the content and various info |
||||
*/ |
||||
static function fetch($url, $fetch_content = null) |
||||
{ |
||||
static $cache = array(); |
||||
if (isset($cache[$url])) |
||||
{ |
||||
return $cache; |
||||
} |
||||
|
||||
if (is_null($fetch_content) || $fetch_content === false) |
||||
{ |
||||
// create a new cURL resource |
||||
$ch = curl_init(); |
||||
|
||||
// set URL and other appropriate options |
||||
curl_setopt($ch, CURLOPT_URL, $url); |
||||
curl_setopt($ch, CURLOPT_HEADER, false); |
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
||||
curl_setopt($ch, CURLOPT_NOBODY, true); |
||||
|
||||
$content = curl_exec($ch); |
||||
$error = curl_error($ch); |
||||
$info = curl_getinfo($ch); |
||||
|
||||
// close cURL resource, and free up system resources |
||||
curl_close($ch); |
||||
$info['content'] = $content; |
||||
$info['error'] = $error; |
||||
|
||||
if ($fetch_content === false) |
||||
{ |
||||
return $cache[$url] = $info; |
||||
} |
||||
|
||||
if (isset($info['content_type']) && strpos($info['content_type'], 'text') === false) |
||||
{ |
||||
return $cache[$url] = $info; |
||||
} |
||||
} |
||||
|
||||
// create a new cURL resource |
||||
$ch = curl_init(); |
||||
|
||||
// set URL and other appropriate options |
||||
curl_setopt($ch, CURLOPT_URL, $url); |
||||
curl_setopt($ch, CURLOPT_HEADER, false); |
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
||||
|
||||
//curl_setopt($ch, CURLOPT_VERBOSE, true); |
||||
|
||||
$content = curl_exec($ch); |
||||
$error = curl_error($ch); |
||||
$info = curl_getinfo($ch); |
||||
|
||||
// close cURL resource, and free up system resources |
||||
curl_close($ch); |
||||
$info['content'] = $content; |
||||
$info['error'] = $error; |
||||
|
||||
return $cache[$url] = $info; |
||||
} |
||||
|
||||
static function fetch_json($url) |
||||
{ |
||||
$content = self::fetch($url, true); |
||||
$content = $content['content']; |
||||
if ($content) |
||||
{ |
||||
$result = (array) json_decode($content); |
||||
} |
||||
else |
||||
{ |
||||
$result = array(); |
||||
} |
||||
return $result; |
||||
} |
||||
|
||||
protected $url; |
||||
protected $url_params = null; |
||||
protected $info = null; |
||||
protected $source = null; |
||||
protected $metadata = null; |
||||
protected $links = null; |
||||
protected $title = null; |
||||
protected $mime = null; |
||||
protected $doc = null; |
||||
protected $config = array(); |
||||
|
||||
public function __construct($url, $config = array()) |
||||
{ |
||||
$this->url = $url; |
||||
$this->config = $config; |
||||
} |
||||
|
||||
public function config($key = '', $default = null) |
||||
{ |
||||
return isset($this->config[$key]) ? $this->config[$key] : $default; |
||||
} |
||||
|
||||
/** |
||||
* Url of the resource |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function url() |
||||
{ |
||||
return $this->url; |
||||
} |
||||
|
||||
public function url_domain() |
||||
{ |
||||
$url = $this->url(); |
||||
$url = trim($url, '/'); |
||||
if (strpos($url, '//') !== false) |
||||
{ |
||||
$parts = explode('//', $url); |
||||
$url = end($parts); |
||||
} |
||||
$parts = explode('/', $url); |
||||
$result = reset($parts); |
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param array|string $part |
||||
* @return boolean |
||||
*/ |
||||
public function url_match($part) |
||||
{ |
||||
$params = func_get_args(); |
||||
$params = is_array($params) ? $params : array($params); |
||||
|
||||
$url = strtolower($this->url()); |
||||
foreach ($params as $param) |
||||
{ |
||||
if (strpos($url, strtolower($param)) !== false) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public function url_params() |
||||
{ |
||||
if (!is_null($this->url_params)) |
||||
{ |
||||
return $this->url_params; |
||||
} |
||||
|
||||
$url = $this->url(); |
||||
if (strpos($url, '?') === false) |
||||
{ |
||||
return $this->url_params = array(); |
||||
} |
||||
|
||||
$result = array(); |
||||
$params = explode('?', $url); |
||||
$params = end($params); |
||||
$params = explode('&', $params); |
||||
foreach ($params as $param) |
||||
{ |
||||
list($key, $val) = explode('=', $param); |
||||
$result[$key] = $val; |
||||
} |
||||
|
||||
return $this->url_params = $result; |
||||
} |
||||
|
||||
public function url_param($name, $default = false) |
||||
{ |
||||
$params = $this->url_params(); |
||||
return isset($params[$name]) ? $params[$name] : $default; |
||||
} |
||||
|
||||
/** |
||||
* The name of the resource. I.e. the last part of the url without the ext |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function name() |
||||
{ |
||||
$url = $this->url(); |
||||
$url = explode('/', $url); |
||||
$title = end($url); |
||||
$title = explode('.', $title); |
||||
$title = reset($title); |
||||
return $title; |
||||
} |
||||
|
||||
/** |
||||
* Extention of the url |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function ext() |
||||
{ |
||||
$url = $this->url(); |
||||
$url = explode('.', $url); |
||||
$ext = end($url); |
||||
$ext = strtolower($ext); |
||||
return $ext; |
||||
} |
||||
|
||||
/** |
||||
* Return true if the object has one of the extentions. Overloaded: |
||||
* |
||||
* $res->has_ext('pdf'); |
||||
* $res->has_ext('pdf', 'doc'); |
||||
* $res->has_ext(array('pdf', 'doc')); |
||||
* |
||||
* @param array|string $_ |
||||
* @return boolean true if the resource has one of the extentions passed |
||||
*/ |
||||
public function has_ext($_) |
||||
{ |
||||
if (is_array($_)) |
||||
{ |
||||
$params = $_; |
||||
} |
||||
else |
||||
{ |
||||
$params = func_get_args(); |
||||
$params = is_array($params) ? $params : array($params); |
||||
} |
||||
$ext = $this->ext(); |
||||
foreach ($params as $param) |
||||
{ |
||||
if (strtolower($param) == $ext) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public function charset() |
||||
{ |
||||
$info = $this->info(); |
||||
|
||||
$content_type = isset($info['content_type']) ? $info['content_type'] : ''; |
||||
if (empty($content_type)) |
||||
{ |
||||
return null; |
||||
} |
||||
$items = explode(';', $content_type); |
||||
foreach ($items as $item) |
||||
{ |
||||
$parts = explode('=', $item); |
||||
if (count($parts) == 2 && reset($parts) == 'charset') |
||||
{ |
||||
return strtolower(end($parts)); |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* The mime type of the resource or the empty string if none has been specified |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function mime() |
||||
{ |
||||
if (!is_null($this->mime)) |
||||
{ |
||||
return $this->mime; |
||||
} |
||||
$info = $this->info(); |
||||
|
||||
$content_type = isset($info['content_type']) ? $info['content_type'] : ''; |
||||
if ($content_type) |
||||
{ |
||||
$result = reset(explode(';', $content_type)); |
||||
$result = strtolower($result); |
||||
return $this->mime = $result; |
||||
} |
||||
|
||||
return $this->mime = ''; |
||||
} |
||||
|
||||
public function is_xml() |
||||
{ |
||||
$mime = $this->mime(); |
||||
if (!empty($mime)) |
||||
{ |
||||
return strpos($mime, 'xml') !== false; |
||||
} |
||||
return $this->ext() == 'xml'; |
||||
} |
||||
|
||||
public function is_image() |
||||
{ |
||||
$mime = $this->mime(); |
||||
if ($mime) |
||||
{ |
||||
return strpos($mime, 'image') !== false; |
||||
} |
||||
|
||||
$ext = $this->ext(); |
||||
$formats = array('gif', 'jpeg', 'jpg', 'jpe', 'pjpeg', 'png', 'svg', 'tiff', 'ico'); |
||||
foreach ($formats as $format) |
||||
{ |
||||
if ($format == $ext) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public function is_video() |
||||
{ |
||||
$mime = $this->mime(); |
||||
if ($mime) |
||||
{ |
||||
return strpos($mime, 'video') !== false; |
||||
} |
||||
|
||||
$ext = $this->ext(); |
||||
$formats = array('mpeg', 'mp4', 'ogg', 'wmv', 'mkv'); |
||||
foreach ($formats as $format) |
||||
{ |
||||
if ($format == $ext) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public function is_audio() |
||||
{ |
||||
$mime = $this->mime(); |
||||
if ($mime) |
||||
{ |
||||
return strpos($mime, 'audio') !== false; |
||||
} |
||||
|
||||
$ext = $this->ext(); |
||||
$formats = array('mp3'); |
||||
foreach ($formats as $format) |
||||
{ |
||||
if ($format == $ext) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public function is_rss() |
||||
{ |
||||
if (!$this->is_xml()) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
$doc = $this->doc(); |
||||
$nodes = $doc->getElementsByTagName('rss'); |
||||
return $nodes->length != 0; |
||||
} |
||||
|
||||
public function is_gadget() |
||||
{ |
||||
if (!$this->is_xml()) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
$doc = $this->doc(); |
||||
$nodes = $doc->getElementsByTagName('ModulePrefs'); |
||||
return $nodes->length != 0; |
||||
} |
||||
|
||||
public function canonic_url($src) |
||||
{ |
||||
if (strpos($src, '//') === 0) |
||||
{ |
||||
$src = "http:$src"; |
||||
} |
||||
else if (strpos($src, '/') === 0) //relative url to the root |
||||
{ |
||||
$url = $this->url(); |
||||
$protocol = reset(explode('://', $url)); |
||||
$domain = end(explode('://', $url)); |
||||
$domain = reset(explode('/', $domain)); |
||||
$src = "$protocol://$domain/$src"; |
||||
} |
||||
else if (strpos($src, 'http') !== 0) //relative url to the document |
||||
{ |
||||
$url = $this->url(); |
||||
$tail = end(explode('/', $url)); |
||||
$base = str_replace($tail, '', $url); |
||||
|
||||
$src = $base . $src; |
||||
} |
||||
return $src; |
||||
} |
||||
|
||||
/** |
||||
* Content of the resource. |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function source() |
||||
{ |
||||
if (!is_null($this->source)) |
||||
{ |
||||
return $this->source; |
||||
} |
||||
$info = $this->info(); |
||||
|
||||
return $this->source = $info['content']; |
||||
} |
||||
|
||||
/** |
||||
* Array of arrays containing the page's metadata. |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function metadata() |
||||
{ |
||||
if (!is_null($this->metadata)) |
||||
{ |
||||
return $this->metadata; |
||||
} |
||||
return $this->metadata = $this->get_metadata(); |
||||
} |
||||
|
||||
public function title() |
||||
{ |
||||
if (!is_null($this->title)) |
||||
{ |
||||
return $this->title; |
||||
} |
||||
return $this->title = $this->get_title(); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @return DOMDocument|boolean |
||||
*/ |
||||
public function doc() |
||||
{ |
||||
if (!is_null($this->doc)) |
||||
{ |
||||
return $this->doc; |
||||
} |
||||
return $this->doc = $this->get_doc($this->source()); |
||||
} |
||||
|
||||
function get_meta($name) |
||||
{ |
||||
$metadata = $this->metadata(); |
||||
$name = strtolower($name); |
||||
foreach ($metadata as $attributes) |
||||
{ |
||||
$key = isset($attributes['name']) ? $attributes['name'] : false; |
||||
$key = $key ? strtolower($key) : $key; |
||||
if ($name == $key) |
||||
{ |
||||
return $attributes['content']; |
||||
} |
||||
$key = isset($attributes['property']) ? $attributes['property'] : false; |
||||
$key = $key ? strtolower($key) : $key; |
||||
if ($name == $key) |
||||
{ |
||||
return isset($attributes['content']) ? $attributes['content'] : false; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
function get_link($key, $value) |
||||
{ |
||||
$links = $this->links(); |
||||
$key = strtolower($key); |
||||
$value = strtolower($value); |
||||
foreach ($links as $attributes) |
||||
{ |
||||
$a = isset($attributes[$key]) ? $attributes[$key] : false; |
||||
$a = $a ? strtolower($a) : $a; |
||||
if ($a == $value) |
||||
{ |
||||
return $attributes; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public function links() |
||||
{ |
||||
if (!is_null($this->links)) |
||||
{ |
||||
return $this->links; |
||||
} |
||||
return $this->links = $this->get_links(); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param string $xpath dom xpath |
||||
* @return string |
||||
*/ |
||||
public function findx($query) |
||||
{ |
||||
$doc = $this->doc(); |
||||
if (empty($doc)) |
||||
{ |
||||
return array(); |
||||
} |
||||
$xpath = new DOMXpath($doc); |
||||
$nodes = $xpath->query($query); |
||||
if ($nodes->length > 0) |
||||
{ |
||||
return $doc->saveXML($nodes->item(0)); |
||||
} |
||||
else |
||||
{ |
||||
return ''; |
||||
} |
||||
} |
||||
|
||||
protected function info() |
||||
{ |
||||
if (!is_null($this->info)) |
||||
{ |
||||
return $this->info; |
||||
} |
||||
return $this->info = self::fetch($this->url()); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param string $source |
||||
* @return boolean|DOMDocument |
||||
*/ |
||||
protected function get_doc($source) |
||||
{ |
||||
if ($source == false) |
||||
{ |
||||
return false; |
||||
} |
||||
$source = $this->source(); |
||||
$result = new DOMDocument(); |
||||
libxml_clear_errors(); |
||||
libxml_use_internal_errors(true); |
||||
if ($this->is_xml()) |
||||
{ |
||||
$success = $result->loadXML($source); |
||||
} |
||||
else |
||||
{ |
||||
$success = $result->loadHTML($source); |
||||
} |
||||
//$e = libxml_get_errors(); |
||||
return $result ? $result : false; |
||||
} |
||||
|
||||
protected function get_metadata() |
||||
{ |
||||
$result = array(); |
||||
|
||||
$doc = $this->doc(); |
||||
if ($doc == false) |
||||
{ |
||||
return array(); |
||||
} |
||||
$metas = $doc->getElementsByTagName('meta'); |
||||
if ($metas->length == 0) |
||||
{ |
||||
return $result; |
||||
} |
||||
foreach ($metas as $meta) |
||||
{ |
||||
$values = array(); |
||||
$attributes = $meta->attributes; |
||||
$length = $attributes->length; |
||||
for ($i = 0; $i < $length; ++$i) |
||||
{ |
||||
$name = $attributes->item($i)->name; |
||||
$value = $attributes->item($i)->value; |
||||
$value = $attributes->item($i)->value; |
||||
$values[$name] = $value; |
||||
} |
||||
$result[] = $values; |
||||
} |
||||
return $result; |
||||
} |
||||
|
||||
protected function get_title() |
||||
{ |
||||
$doc = $this->doc(); |
||||
if ($doc == false) |
||||
{ |
||||
return ''; |
||||
} |
||||
$titles = $doc->getElementsByTagName('title'); |
||||
if ($titles->length == 0) |
||||
{ |
||||
return false; |
||||
} |
||||
$result = $titles->item(0)->nodeValue; |
||||
return $result; |
||||
} |
||||
|
||||
protected function get_links() |
||||
{ |
||||
$doc = $this->doc(); |
||||
if ($doc == false) |
||||
{ |
||||
return array(); |
||||
} |
||||
$result = array(); |
||||
|
||||
$metas = $doc->getElementsByTagName('link'); |
||||
if ($metas->length == 0) |
||||
{ |
||||
return $result; |
||||
} |
||||
foreach ($metas as $meta) |
||||
{ |
||||
$values = array(); |
||||
$attributes = $meta->attributes; |
||||
$length = $attributes->length; |
||||
for ($i = 0; $i < $length; ++$i) |
||||
{ |
||||
$name = $attributes->item($i)->name; |
||||
$value = $attributes->item($i)->value; |
||||
$values[$name] = $value; |
||||
} |
||||
$result[] = $values; |
||||
} |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,113 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Google calendar renderer. |
||||
* |
||||
* @todo: |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetGoogleCalendarRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function accept($asset) |
||||
{ |
||||
$url = $asset->url(); |
||||
$url = str_replace('http://', '', $url); |
||||
$url = str_replace('https://', '', $url); |
||||
|
||||
$domain = reset(split('/', $url)); |
||||
return strpos($domain, 'google.com/calendar') !== false; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param string $url |
||||
*/ |
||||
public function explode_url_parameters($url = null) |
||||
{ |
||||
if (strpos($url, '?') === false) |
||||
{ |
||||
return array(); |
||||
} |
||||
|
||||
$result = array(); |
||||
$params = explode('?', $url); |
||||
$params = end($params); |
||||
$params = explode('&', $params); |
||||
foreach ($params as $param) |
||||
{ |
||||
list($key, $val) = explode('=', $param); |
||||
$result[$key] = $val; |
||||
} |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
public function implode_url_parameters($params) |
||||
{ |
||||
$result = array(); |
||||
foreach ($params as $key => $value) |
||||
{ |
||||
if ($value) |
||||
{ |
||||
$result[] = "$key=$value"; |
||||
} |
||||
} |
||||
return join('&', $result); |
||||
} |
||||
|
||||
protected function url($base = 'http:://map.google.com/', $params = array()) |
||||
{ |
||||
$head = reset(explode('?', $base)); |
||||
$items = $this->explode_url_parameters($base); |
||||
foreach ($params as $key => $value) |
||||
{ |
||||
$items[$key] = $value; |
||||
} |
||||
$tail = $this->implode_url_parameters($items); |
||||
$tail = empty($tail) ? '' : "?$tail"; |
||||
return $head . $tail; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$this->accept($asset)) |
||||
{ |
||||
return; |
||||
} |
||||
$params = array('output' => 'embed'); |
||||
|
||||
$base = $asset->url(); |
||||
$url = $this->url($base, $params); |
||||
|
||||
$title = $asset->title(); |
||||
$description = $asset->get_meta('description'); |
||||
|
||||
$keywords = $asset->get_meta('keywords'); |
||||
|
||||
$embed = <<<EOT |
||||
<iframe width="100%" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="$url"></iframe> |
||||
EOT; |
||||
|
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
$result[self::THUMBNAIL] = $image_src; |
||||
$result[self::DESCRIPTION] = $description; |
||||
$result[self::TAGS] = $keywords; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,57 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Internal group. I.e. a group from this instance of Mahara. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetMaharaGroupRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
public static function get_group_id($ref) |
||||
{ |
||||
$ref = trim($ref); |
||||
$pattern = '#group/view.php\?id\=([0123456789]+)#'; |
||||
$matches = array(); |
||||
//mahara group's profile |
||||
if (preg_match($pattern, $ref, $matches)) |
||||
{ |
||||
return $matches[1]; |
||||
} |
||||
//group id |
||||
if ($val = intval($ref)) |
||||
{ |
||||
return $val; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
$url = $asset->url(); |
||||
$group_id = self::get_group_id($url); |
||||
if (empty($group_id)) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
$data = get_record('group', 'id', $group_id); |
||||
|
||||
$result = array(); |
||||
safe_require('blocktype', 'ple/group'); |
||||
$result[self::EMBED_SNIPPET] = PluginBlocktypeGroup::render_preview($group_id); |
||||
$result[self::THUMBNAIL] = PluginBlocktypeGroup::get_thumbnail($group_id); |
||||
$result[self::TITLE] = $data->name; |
||||
$result[self::DESCRIPTION] = $data->description; |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,63 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* |
||||
* Internal person. I.e. a person from this instance of Mahara. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetMaharaPersonRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
public static function get_user_id($ref) |
||||
{ |
||||
$ref = trim($ref); |
||||
$pattern = '#user/view.php\?id\=([0123456789]+)#'; |
||||
$matches = array(); |
||||
//mahara user's profile |
||||
if (preg_match($pattern, $ref, $matches)) |
||||
{ |
||||
return $matches[1]; |
||||
} |
||||
//email |
||||
if ($user = get_record('usr', 'email', $ref)) |
||||
{ |
||||
return $user->id; |
||||
} |
||||
//user id |
||||
if ($val = intval($ref)) |
||||
{ |
||||
return $val; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
$url = $asset->url(); |
||||
$id = self::get_user_id($url); |
||||
if (empty($id)) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
$data = get_record('usr', 'id', $id); |
||||
|
||||
$result = array(); |
||||
safe_require('blocktype', 'ple/person'); |
||||
$result[self::EMBED_SNIPPET] = PluginBlocktypePerson::render_preview($id); |
||||
$result[self::THUMBNAIL] = PluginBlocktypePerson::get_thumbnail($id); |
||||
$result[self::TITLE] = $data->prefferedname ? $data->prefferedname : $data->firstname . ' ' . $data->lastname; |
||||
$result[self::DESCRIPTION] = isset($data->description) ? $data->description : ''; |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,46 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Wiki renderer. |
||||
* |
||||
* @see http://en.wikipedia.org/w/api.php |
||||
* |
||||
* @copyright (c) 2012 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetWikiRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function accept($asset) |
||||
{ |
||||
return $asset->url_match('wikipedia.org/wiki', 'mediawiki.org/wiki'); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
* |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$this->accept($asset)) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
$domain = $asset->url_domain(); |
||||
$description = $asset->findx('//div[@id="bodyContent"]/p'); |
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $description; |
||||
$result[self::TITLE] = $title; |
||||
$result[self::DESCRIPTION] = $description; |
||||
$result[self::TAGS] = $keywords; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,75 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Google document renderer. |
||||
* |
||||
* @see http://support.google.com/docs/bin/answer.py?hl=en&answer=86101&topic=1360911&ctx=topic |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetGoogleDocumentRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function accept($asset) |
||||
{ |
||||
$url = $asset->url(); |
||||
|
||||
return strpos($url, 'docs.google.com/document/pub') !== false; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$this->accept($asset)) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
$url = $asset->url(); |
||||
|
||||
$title = $asset->title(); |
||||
$description = $asset->get_meta('description'); |
||||
$keywords = $asset->get_meta('keywords'); |
||||
|
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
$embed = <<<EOT |
||||
|
||||
<div style="height:{$size}px;" class="resize vertical" > |
||||
<iframe style=background-color:#ffffff;" width="100%" height="100%" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="$url"></iframe> |
||||
</div> |
||||
<style type="text/css"> |
||||
div.resize.vertical { |
||||
background-color: #EEEEEE; |
||||
border-color: #EEEEEE; |
||||
border-style: solid; |
||||
border-width: 1px; |
||||
resize:vertical; |
||||
overflow: hidden; |
||||
padding-bottom:15px; |
||||
min-height:24px; |
||||
max-height:800px; |
||||
} |
||||
</style> |
||||
EOT; |
||||
|
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
$result[self::DESCRIPTION] = $description; |
||||
$result[self::TAGS] = $keywords; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,95 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Google document viewer renderer. Provide an embeded viewer for the following |
||||
* documetn types: |
||||
* |
||||
* Microsoft Word (.DOC and .DOCX) |
||||
* Microsoft Excel (.XLS and .XLSX) |
||||
* Microsoft PowerPoint (.PPT and .PPTX) |
||||
* Adobe Portable Document Format (.PDF) |
||||
* Apple Pages (.PAGES) |
||||
* Adobe Illustrator (.AI) |
||||
* Adobe Photoshop (.PSD) |
||||
* Tagged Image File Format (.TIFF) |
||||
* Autodesk AutoCad (.DXF) |
||||
* Scalable Vector Graphics (.SVG) |
||||
* PostScript (.EPS, .PS) |
||||
* TrueType (.TTF) |
||||
* XML Paper Specification (.XPS) |
||||
* Archive file types (.ZIP and .RAR) |
||||
* |
||||
* @see https://docs.google.com/viewer |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetGoogleDocumentViewerRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function accept($asset) |
||||
{ |
||||
$supported_extentions = array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'pages', 'ai', 'psd', 'tiff', 'dxf', 'svg', 'eps', 'ps', 'eps', 'ttf', 'zip', 'rar'); |
||||
return $asset->has_ext($supported_extentions); |
||||
} |
||||
|
||||
protected function url($document_url) |
||||
{ |
||||
return 'https://docs.google.com/viewer?embedded=true&url=' . urlencode($document_url); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$this->accept($asset)) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
$url = $this->url($asset->url()); |
||||
|
||||
$title = $asset->title(); |
||||
$description = $asset->get_meta('description'); |
||||
|
||||
$keywords = $asset->get_meta('keywords'); |
||||
|
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
$embed = <<<EOT |
||||
<div style="height:{$size}px;" class="resize vertical" > |
||||
<iframe style=background-color:#ffffff;" width="100%" height="100%" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="$url"></iframe> |
||||
</div> |
||||
<style type="text/css"> |
||||
div.resize.vertical { |
||||
background-color: #EEEEEE; |
||||
border-color: #EEEEEE; |
||||
border-style: solid; |
||||
border-width: 1px; |
||||
resize:vertical; |
||||
overflow: hidden; |
||||
padding-bottom:15px; |
||||
min-height:24px; |
||||
max-height:800px; |
||||
} |
||||
</style> |
||||
EOT; |
||||
|
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
//$result[self::THUMBNAIL] = $image_src; |
||||
$result[self::DESCRIPTION] = $description; |
||||
$result[self::TAGS] = $keywords; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,129 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Google map page renderer. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetGoogleMapRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function accept($asset) |
||||
{ |
||||
$url = $asset->url(); |
||||
$url = str_replace('http://', '', $url); |
||||
$url = str_replace('https://', '', $url); |
||||
|
||||
$domain = reset(explode('/', $url)); |
||||
return strpos($domain, 'maps.google') !== false; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param string $url |
||||
*/ |
||||
public function explode_url_parameters($url = null) |
||||
{ |
||||
if (strpos($url, '?') === false) |
||||
{ |
||||
return array(); |
||||
} |
||||
|
||||
$result = array(); |
||||
$params = explode('?', $url); |
||||
$params = end($params); |
||||
$params = explode('&', $params); |
||||
foreach ($params as $param) |
||||
{ |
||||
list($key, $val) = explode('=', $param); |
||||
$result[$key] = $val; |
||||
} |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
public function implode_url_parameters($params) |
||||
{ |
||||
$result = array(); |
||||
foreach ($params as $key => $value) |
||||
{ |
||||
if ($value) |
||||
{ |
||||
$result[] = "$key=$value"; |
||||
} |
||||
} |
||||
return join('&', $result); |
||||
} |
||||
|
||||
protected function url($base = 'http:://map.google.com/', $params = array()) |
||||
{ |
||||
$head = reset(explode('?', $base)); |
||||
$items = $this->explode_url_parameters($base); |
||||
foreach ($params as $key => $value) |
||||
{ |
||||
$items[$key] = $value; |
||||
} |
||||
$tail = $this->implode_url_parameters($items); |
||||
$tail = empty($tail) ? '' : "?$tail"; |
||||
return $head . $tail; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$this->accept($asset)) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
$params = array('output' => 'embed'); |
||||
|
||||
$base = $asset->url(); |
||||
$url = $this->url($base, $params); |
||||
|
||||
$title = $asset->title(); |
||||
$description = $asset->get_meta('description'); |
||||
|
||||
$keywords = $asset->get_meta('keywords'); |
||||
|
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
$embed = <<<EOT |
||||
<div style="height:{$size}px;" class="resize vertical" > |
||||
<iframe style=background-color:#ffffff;" width="100%" height="100%" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="$url"></iframe> |
||||
</div> |
||||
<style type="text/css"> |
||||
div.resize.vertical { |
||||
background-color: #EEEEEE; |
||||
border-color: #EEEEEE; |
||||
border-style: solid; |
||||
border-width: 1px; |
||||
resize:vertical; |
||||
overflow: hidden; |
||||
padding-bottom:15px; |
||||
min-height:24px; |
||||
max-height:800px; |
||||
} |
||||
</style> |
||||
EOT; |
||||
|
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
$result[self::DESCRIPTION] = $description; |
||||
$result[self::TAGS] = $keywords; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,90 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Google widget/gadget renderer. |
||||
* Accept the following urls: |
||||
* |
||||
* module: http://www.google.com/ig/directory?type=gadgets&url=www.google.com/ig/modules/eyes/eyes.xml |
||||
* directory entry: www.google.com/ig/modules/eyes/eyes.xml |
||||
* configured url: www.gmodules.com/ig/ifr?url=http://www.google.com/ig/modules/eyes/eyes.xml&synd=open&w=320&h=121&title=__MSG_title__&lang=fr&country=ALL&border=%23ffffff%7C3px%2C1px+solid+%23999999&output=js |
||||
* |
||||
* @see http://www.google.com/ig/directory?type=gadgets&url=www.google.com/ig/modules/eyes/eyes.xml |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetGoogleWidgetRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
|
||||
if ($asset->url_match('gmodules.com/ig/') && $asset->url_param('url') != false) |
||||
{ |
||||
$url = $asset->url(); |
||||
$title = $asset->url_param('title'); |
||||
$title = ($title == '__MSG_title__') ? '' : $title; |
||||
|
||||
$embed = <<<EOT |
||||
<script src="$url"></script> |
||||
EOT; |
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
return $result; |
||||
} |
||||
|
||||
if (!$asset->is_gadget()) |
||||
{ |
||||
$url = $asset->url(); |
||||
|
||||
if (!$asset->url_match('google.com/ig/directory')) |
||||
{ |
||||
return false; |
||||
} |
||||
if (!$asset->url_match('type=gadgets')) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
$url = $asset->url_param('url'); |
||||
if (empty($url)) |
||||
{ |
||||
return false; |
||||
} |
||||
$asset = new HttpResource($url); |
||||
if (!$asset->is_gadget()) |
||||
{ |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
$url = $asset->url(); |
||||
if (strpos($url, 'http') !== 0) |
||||
{ |
||||
$url = "http://$url"; |
||||
} |
||||
$url = urlencode($url); |
||||
$title = $asset->title(); |
||||
$title = $title ? $title : $asset->name(); |
||||
|
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
$embed = <<<EOT |
||||
<script src="//www.gmodules.com/ig/ifr?url=$url&w=$size&output=js"></script> |
||||
EOT; |
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,44 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Process image resources. I.e. png, jpeg, etc. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetImageRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (! $asset->is_image()) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
global $THEME; |
||||
$url = $asset->url(); |
||||
$title = $asset->title(); |
||||
$title = $title ? $title : $asset->name(); |
||||
|
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
$embed = <<<EOT |
||||
<div style="text-align:center"><a href="$url"><img src="{$url}" width="$size" alt="{$title}" title="{$title}"></a></div> |
||||
EOT; |
||||
|
||||
$result = array(); |
||||
$result[self::URL] = $url; |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
$result[self::THUMBNAIL] = $url; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,65 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Media renderer. I.e. video streams that can be embeded through an embed tag. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetMediaRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function accept($asset) |
||||
{ |
||||
if ($asset->is_video()) |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
//swf mime type is application/x-shockwave-flash |
||||
return $asset->has_ext('swf'); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$this->accept($asset)) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
$url = $asset->url(); |
||||
|
||||
$title = $asset->title(); |
||||
$description = $asset->get_meta('description'); |
||||
$keywords = $asset->get_meta('keywords'); |
||||
|
||||
|
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
$width = $size; |
||||
$height = $size *9/16; |
||||
|
||||
$embed = <<<EOT |
||||
<div style="text-align:center;"><embed style="display:inline-block;" width="{$width}px" height="{$height}px" name="plugin" src="$url" ></div> |
||||
EOT; |
||||
|
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
$result[self::DESCRIPTION] = $description; |
||||
$result[self::TAGS] = $keywords; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,65 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Media Server renderer. |
||||
* |
||||
* Note that some videos are protected. It is therefore not possible to use the |
||||
* autodiscovery feature. That is to get the web page, look at the meta data headers |
||||
* and read the oembed api call. This would only work for public content/javascript |
||||
* bookmarklet. |
||||
* |
||||
* So here we bypass the discovery service and directly call the API endpoint |
||||
* with the page url to retrieve oembed metadata - which happens to be public. |
||||
* |
||||
* @see https://mediaserver.unige.ch |
||||
* |
||||
* @copyright (c) 2012 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetMediaserverRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
const API_ENDPOINT = 'http://129.194.20.121/oembed/unige-oembed-provider-test.php'; |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function accept($asset) |
||||
{ |
||||
return $asset->url_match('https://mediaserver.unige.ch/play/') ||$asset->url_match('http://mediaserver.unige.ch/play/'); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$this->accept($asset)) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
$width = (int) $asset->config('size'); |
||||
$width = (24 <= $width && $width <= 800) ? $width : 300; |
||||
|
||||
$url = $asset->url(); |
||||
|
||||
$oembed = self::API_ENDPOINT . '?url=' . urlencode($url) . '&maxwidth=' . $width; |
||||
|
||||
$data = HttpResource::fetch_json($oembed); |
||||
if (empty($data)) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
$result[self::THUMBNAIL] = isset($data['thumbnail_url']) ? $data['thumbnail_url'] : ''; |
||||
$result[self::TITLE] = isset($data['title']) ? $data['title'] : ''; |
||||
$result[self::EMBED_SNIPPET] = isset($data['html']) ? $data['html'] : ''; |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,124 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Process html pages that support the oembed protocol. |
||||
* |
||||
* Note that here we rely on the discovery service. That is each page that contains in |
||||
* its metadata the oembed request. |
||||
* |
||||
* @see http://oembed.com/ |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
* |
||||
*/ |
||||
class AssetOembedRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
$link = $asset->get_link('type', 'application/json+oembed'); |
||||
if (empty($link)) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
$width = (int) $asset->config('size'); |
||||
$width = (24 <= $width && $width <= 800) ? $width : 300; |
||||
|
||||
$href = $link['href']; |
||||
$data = HttpResource::fetch_json("$href&maxwidth=$width"); //&maxheight=$height |
||||
if (empty($data)) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
$data['title'] = isset($data['title']) ? $data['title'] : ''; |
||||
$data['width'] = isset($data['width']) ? intval($data['width']) : ''; |
||||
$data['height'] = isset($data['height']) ? intval($data['height']) : ''; |
||||
|
||||
$type = $data['type']; |
||||
$f = array($this, "render_$type"); |
||||
if (is_callable($f)) |
||||
{ |
||||
$result = call_user_func($f, $asset, $data); |
||||
} |
||||
else |
||||
{ |
||||
$result = array(); |
||||
} |
||||
$result[self::THUMBNAIL] = isset($data['thumbnail_url']) ? $data['thumbnail_url'] : ''; |
||||
$result[self::TITLE] = isset($data['title']) ? $data['title'] : ''; |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
protected function render_photo($asset, $data) |
||||
{ |
||||
if ($data['type'] != 'photo') |
||||
{ |
||||
return array(); |
||||
} |
||||
|
||||
$result = array(); |
||||
$html = isset($data['html']) ? $data['html'] : ''; |
||||
if ($html) |
||||
{ |
||||
$result[self::EMBED_SNIPPET] = '<div style="display:inline-block">' . $html . '</div>'; |
||||
return $result; |
||||
} |
||||
|
||||
$title = $data['title']; |
||||
$width = (int)$data['width']; |
||||
$height = (int)$data['height']; |
||||
// $ratio = $height / $width; |
||||
// $height = $ratio * $width; |
||||
|
||||
$url = $data['url']; |
||||
|
||||
$embed = <<<EOT |
||||
<div><a href="$url"><img src="{$url}" width="{$width}" height="{$height}" "alt="{$title}" title="{$title}"></a></div> |
||||
EOT; |
||||
|
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
return $result; |
||||
} |
||||
|
||||
protected function render_video($asset, $data) |
||||
{ |
||||
if ($data['type'] != 'video') |
||||
{ |
||||
return array(); |
||||
} |
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = '<div style="display:inline-block">' . $data['html'] . '</div>'; |
||||
return $result; |
||||
} |
||||
|
||||
protected function render_rich($asset, $data) |
||||
{ |
||||
if ($data['type'] != 'rich') |
||||
{ |
||||
return array(); |
||||
} |
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = '<div style="display:inline-block">' . $data['html'] . '</div>'; |
||||
return $result; |
||||
} |
||||
|
||||
protected function render_link($asset, $data) |
||||
{ |
||||
if ($data['type'] != 'link') |
||||
{ |
||||
return array(); |
||||
} |
||||
return array(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,201 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Process pages that support the open graph protocol |
||||
* |
||||
* @see http://ogp.me/ |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetOgRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* Renderer function. Take a http asset as input and return an array containing |
||||
* various properties: metadata, html snippet, etc. |
||||
* |
||||
* @param HttpResource $asset |
||||
* @return array |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
$type = $asset->get_meta('og:type'); |
||||
if (empty($type)) |
||||
{ |
||||
if ($video = $asset->get_meta('og:video')) |
||||
{ |
||||
$type = 'video'; |
||||
} |
||||
else if ($video = $asset->get_meta('og:image')) |
||||
{ |
||||
$type = 'default'; |
||||
} |
||||
} |
||||
if (empty($type)) |
||||
{ |
||||
return array(); |
||||
} |
||||
|
||||
$type = explode('.', $type); |
||||
$type = reset($type); |
||||
$f = array($this, "render_$type"); |
||||
if (is_callable($f)) |
||||
{ |
||||
$result = call_user_func($f, $asset); |
||||
} |
||||
else |
||||
{ |
||||
$result = $this->render_default($asset); |
||||
} |
||||
|
||||
$result[self::TITLE] = $asset->get_meta('og:title'); |
||||
$result[self::THUMBNAIL] = $asset->get_meta('og:image'); |
||||
$result[self::LANGUAGE] = $asset->get_meta('og:language'); |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* @param HttpResource $asset |
||||
* @return array |
||||
*/ |
||||
protected function render_video($asset) |
||||
{ |
||||
$url = $asset->get_meta('og:video'); |
||||
$url = str_replace('?autoPlay=1', '?', $url); |
||||
$url = str_replace('&autoPlay=1', '', $url); |
||||
|
||||
if (empty($url)) |
||||
{ |
||||
return array(); |
||||
} |
||||
|
||||
$type = $asset->get_meta('og:video:type'); |
||||
if ($type) |
||||
{ |
||||
$type = ' type="' . $type . '" '; |
||||
} |
||||
|
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
$width = $asset->get_meta('og:video:width'); |
||||
$width = $width ? $width : $asset->get_meta('video_width'); |
||||
$height = $asset->get_meta('og:video:height'); |
||||
$height = $height ? $height : $asset->get_meta('video_height'); |
||||
|
||||
if ($width) |
||||
{ |
||||
$ratio = $height / $width; |
||||
$base = min($size, $width); |
||||
$width = $base; |
||||
$height = $ratio * $base; |
||||
$size = 'width="' . $width . '" height="' . $height . '"'; |
||||
} |
||||
else |
||||
{ |
||||
$size = 'width="' . $size . '"'; |
||||
} |
||||
|
||||
$embed = <<<EOT |
||||
<embed $type $size src="$url" /> |
||||
EOT; |
||||
|
||||
$result[self::EMBED_TYPE] = $type; |
||||
$result[self::EMBED_URL] = $url; |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TAGS] = $asset->get_meta('og:video:tag'); |
||||
$result[self::CREATED_TIME] = $asset->get_meta('og:video:release_date'); |
||||
$result[self::DURATION] = $asset->get_meta('og:duration'); |
||||
return $result; |
||||
} |
||||
|
||||
protected function render_article($asset) |
||||
{ |
||||
$result = $this->render_default($asset); |
||||
return $result; |
||||
} |
||||
|
||||
protected function render_audio($asset) |
||||
{ |
||||
$result = $this->render_default($asset); |
||||
return $result; |
||||
} |
||||
|
||||
protected function render_book($asset) |
||||
{ |
||||
$result = $this->render_default($asset); |
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
* @return array |
||||
*/ |
||||
protected function render_default($asset) |
||||
{ |
||||
$url = $asset->get_meta('og:url'); |
||||
$url = htmlentities($url); |
||||
$title = $asset->get_meta('og:title'); |
||||
$image = $asset->get_meta('og:image'); |
||||
$image = htmlentities($image); |
||||
$width = $asset->get_meta('og:image:width'); |
||||
$height = $asset->get_meta('og:image:height'); |
||||
$description = $asset->get_meta('og:description'); |
||||
$description = $description ? $description : $asset->get_meta('description'); |
||||
|
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
if ($width) |
||||
{ |
||||
$ratio = $height / $width; |
||||
$base = min($size, $width); |
||||
$width = $base; |
||||
$height = $ratio * $base; |
||||
$size = 'width="' . $width . '" height="' . $height . '"'; |
||||
} |
||||
else |
||||
{ |
||||
$size = 'width="' . $size . '"'; |
||||
} |
||||
$embed = <<<EOT |
||||
<div> |
||||
<a href="$url" style="float:left; margin-right:5px; margin-bottom:5px; display:block;"><img src="{$image}" {$size} alt="{$title}" title="{$title}"></a> |
||||
<div style="clear:both;"></div> |
||||
</div> |
||||
EOT; |
||||
|
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::DESCRIPTION] = $asset->get_meta('description'); |
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* @param HttpResource $asset |
||||
* @return array |
||||
*/ |
||||
protected function render_image($asset) |
||||
{ |
||||
$size = (int) $asset->config('size'); |
||||
$size = (24 <= $size && $size <= 800) ? $size : 300; |
||||
|
||||
$title = $data['title']; |
||||
$width = $data['width']; |
||||
$height = $data['height']; |
||||
$ratio = $height / $width; |
||||
$base = min($size, $width); |
||||
$width = $base; |
||||
$height = $ratio * $base; |
||||
|
||||
$url = $data['url']; |
||||
|
||||
$embed = <<<EOT |
||||
<a href="$url"><img src="{$url}" width="{$width}" height="{$height} "alt="{$title}" title="{$title}"></a> |
||||
EOT; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,83 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Generic HTML page renderer. Process any html page. |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetPageRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
global $THEME; |
||||
$url = $asset->url(); |
||||
$title = $asset->title(); |
||||
$title = $title ? $title : $asset->name(); |
||||
$description = $asset->get_meta('description'); |
||||
$description = $description; |
||||
|
||||
$keywords = $asset->get_meta('keywords'); |
||||
|
||||
$image_src = $asset->get_link('rel', 'image_src'); |
||||
$image_src = $image_src ? $image_src['href'] : false; |
||||
|
||||
if (empty($image_src)) |
||||
{ |
||||
$image_src = $this->get_icon($asset); |
||||
} |
||||
|
||||
$icon = $this->get_icon($asset); |
||||
|
||||
$image_src = $asset->canonic_url($image_src); |
||||
$icon = $asset->canonic_url($icon); |
||||
|
||||
$embed = <<<EOT |
||||
<a href="$url"> |
||||
<img src="{$image_src}" alt="{$title}" title="{$title}" style="float:left; margin-right:5px; margin-bottom:5px; " > |
||||
</a> |
||||
$description |
||||
<span style="clear:both;"></span> |
||||
EOT; |
||||
|
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
$result[self::THUMBNAIL] = $image_src; |
||||
$result[self::DESCRIPTION] = $description; |
||||
$result[self::ICON] = $icon; |
||||
$result[self::TAGS] = $keywords; |
||||
return $result; |
||||
} |
||||
|
||||
function get_icon($asset) |
||||
{ |
||||
|
||||
$icon = $asset->get_link('rel', 'apple-touch-icon'); |
||||
$icon = $icon ? $icon['href'] : false; |
||||
if (empty($icon)) |
||||
{ |
||||
$icon = $asset->get_link('rel', 'fluid-icon'); |
||||
$icon = $icon ? $icon['href'] : false; |
||||
} |
||||
if (empty($icon)) |
||||
{ |
||||
$icon = $asset->get_link('rel', 'shortcut icon'); |
||||
$icon = $icon ? $icon['href'] : false; |
||||
} |
||||
if (empty($icon)) |
||||
{ |
||||
$icon = $asset->get_link('rel', 'icon'); |
||||
$icon = $icon ? $icon['href'] : false; |
||||
} |
||||
return $icon; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,95 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Rss renderer. Display RSS thanks to Google feed control. |
||||
* |
||||
* @see http://www.google.com/uds/solutions/dynamicfeed/reference.html |
||||
* @see http://code.google.com/apis/ajax/playground/#dynamic_feed_control_-_vertical |
||||
* |
||||
* @copyright (c) 2011 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetRssRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$asset->is_rss()) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
$url = $asset->url(); |
||||
$title = $asset->title(); |
||||
$id = 'a' . md5($url); |
||||
|
||||
$embed = <<<EOT |
||||
<style type="text/css"> |
||||
.gfg-root { |
||||
border: none; |
||||
font-family: inherit; |
||||
} |
||||
</style> |
||||
<script type="text/javascript" src="http://www.google.com/jsapi"></script> |
||||
<script src="http://www.google.com/uds/solutions/dynamicfeed/gfdynamicfeedcontrol.js" type="text/javascript"></script> |
||||
<script type="text/javascript"> |
||||
|
||||
function init() |
||||
{ |
||||
if (typeof this.has_run == 'undefined' ) |
||||
{ |
||||
this.has_run = true; |
||||
} |
||||
else |
||||
{ |
||||
return; |
||||
} |
||||
var head = document.getElementsByTagName('head')[0]; |
||||
|
||||
var element = document.createElement('link'); |
||||
element.type = 'text/css'; |
||||
element.rel = 'stylesheet'; |
||||
element.href = 'http://www.google.com/uds/solutions/dynamicfeed/gfdynamicfeedcontrol.css'; |
||||
head.appendChild(element); |
||||
} |
||||
|
||||
function load_$id() { |
||||
var feeds = [ |
||||
{ |
||||
title: ' ', |
||||
url: '$url' |
||||
} |
||||
]; |
||||
|
||||
var options = { |
||||
stacked : false, |
||||
horizontal : false, |
||||
title : '', |
||||
numResults : 10 |
||||
}; |
||||
|
||||
new GFdynamicFeedControl(feeds, '$id', options); |
||||
document.getElementById('content').style.width = "500px"; |
||||
} |
||||
|
||||
|
||||
init(); |
||||
google.load('feeds', '1'); |
||||
google.setOnLoadCallback(load_$id); |
||||
</script> |
||||
<div id="$id" style="min-height:271px;">Loading...</div> |
||||
EOT; |
||||
|
||||
|
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::TITLE] = $title; |
||||
return $result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,76 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Scratch renderer. |
||||
* |
||||
* @see http://scratch.mit.edu/projects/ |
||||
* |
||||
* @copyright (c) 2012 University of Geneva |
||||
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html |
||||
* @author Laurent Opprecht |
||||
*/ |
||||
class AssetScratchRenderer extends AssetRenderer |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function accept($asset) |
||||
{ |
||||
return $asset->url_match('http://scratch.mit.edu/projects/'); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param HttpResource $asset |
||||
*/ |
||||
public function render($asset) |
||||
{ |
||||
if (!$this->accept($asset)) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
$matches = array(); |
||||
$pattern = "#http:\/\/scratch.mit.edu\/projects\/(\w+)/(\d*)\/?#ims"; |
||||
preg_match($pattern, $asset->url(), $matches); |
||||
|
||||
$url = $matches[0]; |
||||
$author = $matches[1]; |
||||
$project_id = $matches[2]; |
||||
|
||||
$project_url = "../../static/projects/$author/$project_id.sb"; |
||||
$image_url = "http://scratch.mit.edu/static/projects/$author/{$project_id}_med.png"; |
||||
$thumb_url = "http://scratch.mit.edu/static/projects/$author/{$project_id}_sm.png"; |
||||
|
||||
$height = 387; |
||||
$width = 482; |
||||
|
||||
if (function_exists('get_string')) |
||||
{ |
||||
$no_java = get_string('no_java', 'artefact.extresource'); |
||||
} |
||||
else |
||||
{ |
||||
$no_java = 'Java is not installed on your computer. You must install java first.'; |
||||
} |
||||
|
||||
$embed = <<<EOT |
||||
<object type="application/x-java-applet" width="$width" height="$height" style="display:block" id="ProjectApplet"> |
||||
|
||||
<param name="codebase" value="http://scratch.mit.edu/static/misc"> |
||||
<param name="archive" value="ScratchApplet.jar"> |
||||
<param name="code" value="ScratchApplet"> |
||||
<param name="project" value="$project_url"> |
||||
<pre>$no_java</pre> |
||||
<img alt="" src="$image_url"> |
||||
</object> |
||||
EOT; |
||||
$result = array(); |
||||
$result[self::EMBED_SNIPPET] = $embed; |
||||
$result[self::THUMBNAIL] = $thumb_url; |
||||
return $result; |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue