diff options
author | brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2010-07-08 18:51:34 +0000 |
---|---|---|
committer | brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2010-07-08 18:51:34 +0000 |
commit | cf3752e80273d93964305e43481fabc370888a47 (patch) | |
tree | 273451f549351eacd8b0e2374ffb2470567926e7 /mod/ecml/start.php | |
parent | 74c3aaeea871e28b2b1785b9044271d040b84396 (diff) | |
download | elgg-cf3752e80273d93964305e43481fabc370888a47.tar.gz elgg-cf3752e80273d93964305e43481fabc370888a47.tar.bz2 |
Pulled ECML regex into a constant.
Added ecml_get_keywords(), ecml_parse_string(), ecml_extract_keywords(), ecml_get_keyword_info().
Added callback for resolving ECML given an embed code / URL.
Removed unused page setup hook.
Added web services support.
Updated docs.
git-svn-id: http://code.elgg.org/elgg/trunk@6664 36083f99-b078-4883-b0ff-0f9b5a30f544
Diffstat (limited to 'mod/ecml/start.php')
-rw-r--r-- | mod/ecml/start.php | 151 |
1 files changed, 120 insertions, 31 deletions
diff --git a/mod/ecml/start.php b/mod/ecml/start.php index 598af0185..1c1bbd3fd 100644 --- a/mod/ecml/start.php +++ b/mod/ecml/start.php @@ -24,13 +24,18 @@ function ecml_init() { define('ECML_ATTR_SEPARATOR', ' '); define('ECML_ATTR_OPERATOR', '='); + + // find alphanumerics (keywords) possibly followed by everything that is not a ] (args) and all surrounded by [ ]s + define('ECML_KEYWORD_REGEX', '/\[([a-z0-9\.]+)([^\]]+)?\]/'); // help page register_page_handler('ecml', 'ecml_help_page_handler'); // admin access page register_page_handler('ecml_admin', 'ecml_admin_page_handler'); - register_elgg_event_handler('pagesetup', 'system', 'ecml_pagesetup'); + + // ecml validator for embed + register_page_handler('ecml_generate', 'ecml_generate_page_handler'); // CSS for admin access elgg_extend_view('css', 'ecml/admin/css'); @@ -70,16 +75,9 @@ function ecml_init() { // but probably makes more sense from a UI perspective as a whitelist. // uses [views][view_name] = array(keywords, not, allowed) $CONFIG->ecml_permissions = unserialize(get_plugin_setting('ecml_permissions', 'ecml')); -} - -/** - * Page setup. Adds admin controls to the admin panel for granular permission - */ -function ecml_pagesetup(){ - if (get_context() == 'admin' && isadminloggedin()) { - global $CONFIG; - - } + + // 3rd party media embed section + register_plugin_hook('embed_get_sections', 'all', 'ecml_embed_web_services_hook'); } /** @@ -94,6 +92,74 @@ function ecml_help_page_handler($page) { } /** + * Generate ECML given a URL or embed link and service. + * Doesn't check if the resource actually exists. + * Outputs JSON. + * + * @param unknown_type $page + */ +function ecml_generate_page_handler($page) { + $service = trim(get_input('service')); + $resource = trim(get_input('resource')); + + // if standard ECML is passed, guess the service from that instead + // only support one. + if (elgg_substr($resource, 0, 1) == '[') { + if ($keywords = ecml_extract_keywords($resource)) { + $keyword = $keywords[0]['keyword']; + $ecml_info = ecml_get_keyword_info($keyword); + $html = ecml_parse_string($resource); + + echo json_encode(array( + 'status' => 'success', + 'ecml' => $resource, + 'html' => $html + )); + + exit; + } + } + + if (!$service || !$resource) { + echo json_encode(array( + 'status' => 'error', + 'message' => elgg_echo('ecml:embed:invalid_web_service_keyword') + )); + + exit; + } + + $ecml_info = ecml_get_keyword_info($service); + + if ($ecml_info) { + // don't allow embedding for restricted. + if (isset($ecml_info['restricted'])) { + $result = array( + 'status' => 'error', + 'message' => elgg_echo('ecml:embed:cannot_embed'), + ); + } else { + // @todo pull this out into a function. allow optional arguments. + $ecml = "[$service " . sprintf($ecml_info['embed_format'], $resource) . ']'; + $html = ecml_parse_string($ecml, NULL); + $result = array( + 'status' => 'success', + 'ecml' => $ecml, + 'html' => $html + ); + } + } else { + $result = array( + 'status' => 'error', + 'message' => elgg_echo('ecml:embed:invalid_web_service_keyword') + ); + } + + echo json_encode($result); + exit; +} + +/** * Display a admin area for ECML * * @param array $page @@ -118,13 +184,7 @@ function ecml_admin_page_handler($page) { function ecml_parse_view($hook, $entity_type, $return_value, $params) { global $CONFIG; - // give me everything that is not a ], possibly followed by a :, and surrounded by [ ]s - //$keyword_regex = '/\[\[([a-z0-9_]+):?([^\]]+)?\]\]/'; - $keyword_regex = '/\[([a-z0-9\.]+)([^\]]+)?\]/'; - $CONFIG->ecml_current_view = $params['view']; - $return_value = preg_replace_callback($keyword_regex, 'ecml_parse_view_match', $return_value); - - return $return_value; + return ecml_parse_string($return_value, $params['view']); } @@ -141,26 +201,37 @@ function ecml_keyword_hook($hook, $type, $value, $params) { // I keep going back and forth about entity and view. They're powerful, but // a great way to let a site get hacked if the admin doesn't lock them down. $keywords = array( - 'youtube', - 'slideshare', - 'vimeo', - 'googlemaps', - 'scribd', - 'blip.tv', - 'dailymotion', - 'livevideo', - 'redlasso', - 'entity' + 'youtube' => array('params' => array('src', 'width', 'height'), 'embed_format' => 'src="%s"'), + 'slideshare' => array('params' => array('id', 'width', 'height'), 'embed_format' => 'id="%s"'), + 'vimeo' => array('params' => array('src', 'width', 'height'), 'embed_format' => 'src="%s"'), + 'googlemaps' => array('params' => array('src', 'width', 'height'), 'embed_format' => 'src="%s"'), + //'scribd' + 'blip.tv' => array('params' => array('width', 'height'), 'embed_format' => '%s'), + 'dailymotion' => array('params' => array('src', 'width', 'height'), 'embed_format' => 'src="%s"'), + 'livevideo' => array('params' => array('src', 'width', 'height'), 'embed_format' => 'src="%s"'), + 'redlasso' => array('params' => array('id', 'width', 'height'), 'embed_format' => 'id="%s"'), ); - foreach ($keywords as $keyword) { + foreach ($keywords as $keyword => $info) { $value[$keyword] = array( + 'name' => elgg_echo("ecml:keywords:$keyword"), 'view' => "ecml/keywords/$keyword", 'description' => elgg_echo("ecml:keywords:$keyword:desc"), - 'usage' => elgg_echo("ecml:keywords:$keyword:usage") + 'usage' => elgg_echo("ecml:keywords:$keyword:usage"), + 'type' => 'web_service', + 'params' => $info['params'], + 'embed_format' => $info['embed_format'] ); } - + + // default entity keyword + $value['entity'] = array( + 'name' => elgg_echo('ecml:keywords:entity'), + 'view' => "ecml/keywords/entity", + 'description' => elgg_echo("ecml:keywords:entity:desc"), + 'usage' => elgg_echo("ecml:keywords:entity:usage") + ); + return $value; } @@ -178,5 +249,23 @@ function ecml_views_hook($hook, $type, $value, $params) { return $value; } +/** + * Show the special Web Services embed section. + * + * @param unknown_type $hook + * @param unknown_type $type + * @param unknown_type $value + * @param unknown_type $params + */ +function ecml_embed_web_services_hook($hook, $type, $value, $params) { + // we're using a view override for this section's content + // so only need to pass the name. + $value['web_services'] = array( + 'name' => elgg_echo('embed:web_services') + ); + + return $value; +} + // be sure to run after other plugins register_elgg_event_handler('init', 'system', 'ecml_init', 9999);
\ No newline at end of file |