diff options
author | brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2010-04-14 22:25:37 +0000 |
---|---|---|
committer | brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2010-04-14 22:25:37 +0000 |
commit | 436ecaf476e5052434d0841aeeb7c0ccf8dd76f1 (patch) | |
tree | 73cfe69b7ee9aca03dcf1c62dc4437a99e27cab5 /mod | |
parent | 9b1f2384134da90edc116790babaa37ce7991151 (diff) | |
download | elgg-436ecaf476e5052434d0841aeeb7c0ccf8dd76f1.tar.gz elgg-436ecaf476e5052434d0841aeeb7c0ccf8dd76f1.tar.bz2 |
Changed tokenizer for ECML to support attribute quotes.
Added core youtube and slideshare keywords.
Passing the full keyword and attribute string to views.
git-svn-id: http://code.elgg.org/elgg/trunk@5735 36083f99-b078-4883-b0ff-0f9b5a30f544
Diffstat (limited to 'mod')
-rw-r--r-- | mod/ecml/ecml_functions.php | 101 | ||||
-rw-r--r-- | mod/ecml/start.php | 29 | ||||
-rw-r--r-- | mod/ecml/views/default/ecml/keywords/slideshare.php | 34 | ||||
-rw-r--r-- | mod/ecml/views/default/ecml/keywords/youtube.php | 43 |
4 files changed, 175 insertions, 32 deletions
diff --git a/mod/ecml/ecml_functions.php b/mod/ecml/ecml_functions.php index dca4e03f9..f0dcafa24 100644 --- a/mod/ecml/ecml_functions.php +++ b/mod/ecml/ecml_functions.php @@ -52,6 +52,8 @@ function ecml_parse_view_match($matches) { // match against custom keywords with optional args $keyword_info = $CONFIG->ecml_keywords[$keyword]; $vars = ecml_keywords_tokenize_params($params_string); + $vars['ecml_keyword'] = $keyword; + $vars['ecml_params_string'] = $params_string; $content = elgg_view($keyword_info['view'], $vars); break; } @@ -65,35 +67,102 @@ function ecml_parse_view_match($matches) { } /** - * Creates an array from a "name=value, name2=value2" string. + * Creates an array from a name=value name2='value2' name3="value3" string. * * @param $string * @return array */ function ecml_keywords_tokenize_params($string) { - $pairs = array_map('trim', explode(',', $string)); - $params = array(); - - foreach ($pairs as $pair) { - list($name, $value) = explode('=', $pair); - $name = trim($name); - $value = trim($value); + if (empty($string)) { + return array(); + } - // normalize BOOL values - if ($value === 'true') { - $value = TRUE; - } elseif ($value === 'false') { - $value = FALSE; + $params = array(); + $pos = 0; + $char = substr($string, $pos, 1); + + // working var for assembling name and values + $operand = $name = ''; + + while ($char !== FALSE) { + switch ($char) { + // handle quoted names/values + case '"': + case "'": + $quote = $char; + + $next_char = substr($string, ++$pos, 1); + while ($next_char != $quote) { + if ($next_char === FALSE) { + // no matching quote. bail. + return array(); + } + $operand .= $next_char; + $next_char = substr($string, ++$pos, 1); + } + break; + + case ECML_ATTR_SEPARATOR: + // normalize true and false + if ($operand == 'true'){ + $operand = TRUE; + } elseif ($operand == 'false') { + $operand = FALSE; + } + $params[$name] = $operand; + $operand = $name = ''; + break; + + case ECML_ATTR_OPERATOR: + // save name, switch to value + $name = $operand; + $operand = ''; + break; + + default: + $operand .= $char; } - // don't check against value since a falsy/empty value is valid. - if ($name) { - $params[$name] = $value; + $char = substr($string, ++$pos, 1); + } + + // need to get the last attr + if ($name && $operand) { + if ($operand == 'true'){ + $operand = TRUE; + } elseif ($operand == 'false') { + $operand = FALSE; } + $params[$name] = $operand; } return $params; + + // this is much faster, but doesn't allow quoting. +// $pairs = array_map('trim', explode(',', $string)); +// $params = array(); +// +// foreach ($pairs as $pair) { +// list($name, $value) = explode('=', $pair); +// +// $name = trim($name); +// $value = trim($value); +// +// // normalize BOOL values +// if ($value === 'true') { +// $value = TRUE; +// } elseif ($value === 'false') { +// $value = FALSE; +// } +// +// // don't check against value since a falsy/empty value is valid. +// if ($name) { +// $params[$name] = $value; +// } +// } +// +// return $params; } /** diff --git a/mod/ecml/start.php b/mod/ecml/start.php index a0fd3c929..6bf1a565d 100644 --- a/mod/ecml/start.php +++ b/mod/ecml/start.php @@ -13,7 +13,6 @@ * Update docs / help * Check for SQL injection problems. * Check entity keyword views against fullview. Force to FALSE? - * */ /** @@ -23,6 +22,9 @@ function ecml_init() { require_once(dirname(__FILE__) . '/ecml_functions.php'); global $CONFIG; + define('ECML_ATTR_SEPARATOR', ' '); + define('ECML_ATTR_OPERATOR', '='); + // help page register_page_handler('ecml', 'ecml_help_page_handler'); @@ -107,7 +109,8 @@ 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_]+):?([^\]]+)?\]\]/'; + $keyword_regex = '/\[\[([a-z0-9_]+)([^\]]+)?\]\]/'; $CONFIG->ecml_current_view = $params['view']; $return_value = preg_replace_callback($keyword_regex, 'ecml_parse_view_match', $return_value); @@ -116,7 +119,7 @@ function ecml_parse_view($hook, $entity_type, $return_value, $params) { /** - * Register some default keywords. + * Register default keywords. * * @param unknown_type $hook * @param unknown_type $entity_type @@ -125,20 +128,14 @@ function ecml_parse_view($hook, $entity_type, $return_value, $params) { * @return unknown_type */ function ecml_keyword_hook($hook, $entity_type, $return_value, $params) { - $return_value['login_box'] = array( - 'view' => 'account/forms/login', - 'description' => elgg_echo('ecml:keywords:login_box') - ); + $keywords = array('youtube', 'slideshare'); - $return_value['user_list'] = array( - 'view' => 'ecml/keywords/user_list', - 'description' => elgg_echo('ecml:keywords:user_list') - ); - - $return_value['site_stats'] = array( - 'view' => 'ecml/keywords/site_stats', - 'description' => elgg_echo('ecml:keywords:site_stats') - ); + foreach ($keywords as $keyword) { + $return_value[$keyword] = array( + 'view' => "ecml/keywords/$keyword", + 'description' => elgg_echo("ecml:keywords:$keyword") + ); + } return $return_value; } diff --git a/mod/ecml/views/default/ecml/keywords/slideshare.php b/mod/ecml/views/default/ecml/keywords/slideshare.php new file mode 100644 index 000000000..1881a1a89 --- /dev/null +++ b/mod/ecml/views/default/ecml/keywords/slideshare.php @@ -0,0 +1,34 @@ +<?php +/** + * ECML Slideshare support + * + * @package ECML + * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2 + * @author Curverider Ltd + * @copyright Curverider Ltd 2008-2010 + * @link http://elgg.org/ + */ + +// this wants the "wordpress.com" embed code. +// to make life easier on users, don't require them to add the "s +// and just chop out the id= bit here from the full attr list + +$id = str_replace('id=', '', $vars['ecml_params_string']); +$width = (isset($vars['width'])) ? $vars['width'] : 450; +$height = (isset($vars['height'])) ? $vars['height'] : 369; + +if ($id) { + // @todo need to check if the & should be encoded. + + $slide_url = "http://static.slideshare.net/swf/ssplayer2.swf?id=$id"; + + echo " +<object type=\"application/x-shockwave-flash\" wmode=\"opaque\" data=\"$slide_url\" width=\"$width\" height=\"$height\"> + <param name=\"movie\" value=\"$slide_url\" /> + <param name=\"allowFullScreen\" value=\"true\" /> + <param name=\"allowScriptAccess\" value=\"always\" /> + + <embed src=\"$slide_url\" type=\"application/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"$width\" height=\"$height\"></embed> +</object> +"; +}
\ No newline at end of file diff --git a/mod/ecml/views/default/ecml/keywords/youtube.php b/mod/ecml/views/default/ecml/keywords/youtube.php new file mode 100644 index 000000000..87fb669d2 --- /dev/null +++ b/mod/ecml/views/default/ecml/keywords/youtube.php @@ -0,0 +1,43 @@ +<?php +/** + * ECML Youtube support + * + * @package ECML + * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2 + * @author Curverider Ltd + * @copyright Curverider Ltd 2008-2010 + * @link http://elgg.org/ + */ + +$src = (isset($vars['src'])) ? $vars['src'] : FALSE; +$width = (isset($vars['width'])) ? $vars['width'] : 480; +$height = (isset($vars['height'])) ? $vars['height'] : 385; + +// need to extract the video id. +// the src arg can take a full url or an id. +// assume if no youtube.com that it's an id. +if (strpos($src, 'youtube.com') === FALSE) { + $vid = $src; +} else { + // grab the v param + if ($parts = parse_url($src)) { + if (isset($parts['query'])) { + parse_str($parts['query'], $query_arr); + $vid = (isset($query_arr['v'])) ? $query_arr['v'] : FALSE; + } + } +} + +if ($vid) { + $movie_url = "http://www.youtube.com/v/$vid"; + + echo " +<object width=\"$width\" height=\"$height\"> + <param name=\"movie\" value=\"$movie_url\"></param> + <param name=\"allowFullScreen\" value=\"true\"></param> + <param name=\"allowscriptaccess\" value=\"always\"></param> + + <embed src=\"$movie_url\" type=\"application/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"$width\" height=\"$height\"></embed> +</object> + "; +}
\ No newline at end of file |