diff options
Diffstat (limited to 'engine/classes/ElggPluginManifest.php')
| -rw-r--r-- | engine/classes/ElggPluginManifest.php | 290 |
1 files changed, 223 insertions, 67 deletions
diff --git a/engine/classes/ElggPluginManifest.php b/engine/classes/ElggPluginManifest.php index 801769eb9..6912c2b08 100644 --- a/engine/classes/ElggPluginManifest.php +++ b/engine/classes/ElggPluginManifest.php @@ -8,8 +8,8 @@ * as $this->parser. * * To add new parser versions, name them ElggPluginManifestParserXX - * where XX is the version specified in the top-level <plugin-manifest> - * tag. + * where XX is the version specified in the top-level <plugin_manifest> + * tag's XML namespace. * * @package Elgg.Core * @subpackage Plugins @@ -23,19 +23,34 @@ class ElggPluginManifest { protected $parser; /** - * The expected structure of a requires element + * The root for plugin manifest namespaces. + * This is in the format http://www.elgg.org/plugin_manifest/<version> */ - private $depsRequiresStructPlugin = array( + protected $namespace_root = 'http://www.elgg.org/plugin_manifest/'; + + /** + * The expected structure of a plugins requires element + */ + private $depsStructPlugin = array( 'type' => '', 'name' => '', 'version' => '', 'comparison' => 'ge' ); + /** + * The expected structure of a priority element + */ + private $depsStructPriority = array( + 'type' => '', + 'priority' => '', + 'plugin' => '' + ); + /* - * The expected structure of elgg and elgg_release requires element + * The expected structure of elgg_version and elgg_release requires element */ - private $depsRequiresStructElgg = array( + private $depsStructElgg = array( 'type' => '', 'version' => '', 'comparison' => 'ge' @@ -44,7 +59,7 @@ class ElggPluginManifest { /** * The expected structure of a requires php_ini dependency element */ - private $depsRequiresStructPhpIni = array( + private $depsStructPhpIni = array( 'type' => '', 'name' => '', 'value' => '', @@ -54,7 +69,7 @@ class ElggPluginManifest { /** * The expected structure of a requires php_extension dependency element */ - private $depsRequiresStructPhpExtension = array( + private $depsStructPhpExtension = array( 'type' => '', 'name' => '', 'version' => '', @@ -115,7 +130,7 @@ class ElggPluginManifest { } // see if we need to construct the xml object. - if ($manifest instanceof XmlElement) { + if ($manifest instanceof ElggXMLElement) { $manifest_obj = $manifest; } else { if (substr(trim($manifest), 0, 1) == '<') { @@ -135,12 +150,15 @@ class ElggPluginManifest { } // set manifest api version - if (isset($manifest_obj->attributes['version'])) { - $this->apiVersion = (float)$manifest_obj->attributes['version']; + if (isset($manifest_obj->attributes['xmlns'])) { + $namespace = $manifest_obj->attributes['xmlns']; + $version = str_replace($this->namespace_root, '', $namespace); } else { - $this->apiVersion = 1.7; + $version = 1.7; } + $this->apiVersion = $version; + $parser_class_name = 'ElggPluginManifestParser' . str_replace('.', '', $this->apiVersion); // @todo currently the autoloader freaks out if a class doesn't exist. @@ -225,7 +243,7 @@ class ElggPluginManifest { * @return string */ public function getDescription() { - return elgg_echo($this->parser->getAttribute('description')); + return $this->parser->getAttribute('description'); } /** @@ -234,7 +252,7 @@ class ElggPluginManifest { * @return string */ public function getBlurb() { - $blurb = elgg_echo($this->parser->getAttribute('blurb')); + $blurb = $this->parser->getAttribute('blurb'); if (!$blurb) { $blurb = elgg_get_excerpt($this->getDescription()); @@ -246,12 +264,44 @@ class ElggPluginManifest { /** * Returns the license * - * @return sting + * @return string */ public function getLicense() { - return $this->parser->getAttribute('license'); + // license vs licence. Use license. + $en_us = $this->parser->getAttribute('license'); + if ($en_us) { + return $en_us; + } else { + return $this->parser->getAttribute('licence'); + } + } + + /** + * Returns the repository url + * + * @return string + */ + public function getRepositoryURL() { + return $this->parser->getAttribute('repository'); + } + + /** + * Returns the bug tracker page + * + * @return string + */ + public function getBugTrackerURL() { + return $this->parser->getAttribute('bugtracker'); } + /** + * Returns the donations page + * + * @return string + */ + public function getDonationsPageURL() { + return $this->parser->getAttribute('donations'); + } /** * Returns the version of the plugin. @@ -295,12 +345,26 @@ class ElggPluginManifest { * @return array */ public function getCategories() { + $bundled_plugins = array('blog', 'bookmarks', 'categories', + 'custom_index', 'dashboard', 'developers', 'diagnostics', + 'embed', 'externalpages', 'file', 'garbagecollector', + 'groups', 'htmlawed', 'invitefriends', 'likes', + 'logbrowser', 'logrotate', 'members', 'messageboard', + 'messages', 'notifications', 'oauth_api', 'pages', 'profile', + 'reportedcontent', 'search', 'tagcloud', 'thewire', 'tinymce', + 'twitter', 'twitter_api', 'uservalidationbyemail', 'zaudio', + ); + $cats = $this->parser->getAttribute('category'); if (!$cats) { $cats = array(); } + if (in_array('bundled', $cats) && !in_array($this->getPluginID(), $bundled_plugins)) { + unset($cats[array_search('bundled', $cats)]); + } + return $cats; } @@ -330,7 +394,12 @@ class ElggPluginManifest { * @return array */ public function getProvides() { - $provides = $this->parser->getAttribute('provides'); + // normalize for 1.7 + if ($this->getApiVersion() < 1.8) { + $provides = array(); + } else { + $provides = $this->parser->getAttribute('provides'); + } if (!$provides) { $provides = array(); @@ -370,6 +439,8 @@ class ElggPluginManifest { 'comparison' => 'ge' ) ); + } else { + $reqs = array(); } } else { $reqs = $this->parser->getAttribute('requires'); @@ -381,82 +452,120 @@ class ElggPluginManifest { $normalized = array(); foreach ($reqs as $req) { + $normalized[] = $this->normalizeDep($req); + } - switch ($req['type']) { - case 'elgg_version': - case 'elgg_release': - $struct = $this->depsRequiresStructElgg; - break; + return $normalized; + } - case 'plugin': - $struct = $this->depsRequiresStructPlugin; - break; + /** + * Returns the suggests elements. + * + * @return array + */ + public function getSuggests() { + $suggests = $this->parser->getAttribute('suggests'); - case 'php_extension': - $struct = $this->depsRequiresStructPhpExtension; - break; + if (!$suggests) { + $suggests = array(); + } - case 'php_ini': - $struct = $this->depsRequiresStructPhpIni; - - // also normalize boolean values - if (isset($req['value'])) { - switch (strtolower($normalized_req['value'])) { - case 'yes': - case 'true': - case 'on': - case 1: - $normalized_req['value'] = 1; - break; - - case 'no': - case 'false': - case 'off': - case 0: - case '': - $normalized_req['value'] = 0; - break; - } - } + $normalized = array(); + foreach ($suggests as $suggest) { + $normalized[] = $this->normalizeDep($suggest); + } - break; - } + return $normalized; + } + + /** + * Normalizes a dependency array using the defined structs. + * Can be used with either requires or suggests. + * + * @param array $dep A dependency array. + * @return array The normalized deps array. + */ + private function normalizeDep($dep) { + switch ($dep['type']) { + case 'elgg_version': + case 'elgg_release': + $struct = $this->depsStructElgg; + break; + + case 'plugin': + $struct = $this->depsStructPlugin; + break; + + case 'priority': + $struct = $this->depsStructPriority; + break; + + case 'php_extension': + $struct = $this->depsStructPhpExtension; + break; + + case 'php_ini': + $struct = $this->depsStructPhpIni; + + // also normalize boolean values + if (isset($dep['value'])) { + switch (strtolower($dep['value'])) { + case 'yes': + case 'true': + case 'on': + case 1: + $dep['value'] = 1; + break; + + case 'no': + case 'false': + case 'off': + case 0: + case '': + $dep['value'] = 0; + break; + } + } + break; + default: + // unrecognized so we just return the raw dependency + return $dep; + } - $normalized_req = $this->buildStruct($struct, $req); + $normalized_dep = $this->buildStruct($struct, $dep); - // normalize comparison operators - switch ($normalized_req['comparison']) { + // normalize comparison operators + if (isset($normalized_dep['comparison'])) { + switch ($normalized_dep['comparison']) { case '<': - $normalized_req['comparison'] = 'lt'; + $normalized_dep['comparison'] = 'lt'; break; case '<=': - $normalized_req['comparison'] = 'le'; + $normalized_dep['comparison'] = 'le'; break; case '>': - $normalized_req['comparison'] = 'gt'; + $normalized_dep['comparison'] = 'gt'; break; case '>=': - $normalized_req['comparison'] = 'ge'; + $normalized_dep['comparison'] = 'ge'; break; case '==': case 'eq': - $normalized_req['comparison'] = '='; + $normalized_dep['comparison'] = '='; break; case '<>': case 'ne': - $normalized_req['comparison'] = '!='; + $normalized_dep['comparison'] = '!='; break; } - - $normalized[] = $normalized_req; } - return $normalized; + return $normalized_dep; } /** @@ -465,7 +574,12 @@ class ElggPluginManifest { * @return array */ public function getConflicts() { - $conflicts = $this->parser->getAttribute('conflicts'); + // normalize for 1.7 + if ($this->getApiVersion() < 1.8) { + $conflicts = array(); + } else { + $conflicts = $this->parser->getAttribute('conflicts'); + } if (!$conflicts) { $conflicts = array(); @@ -481,6 +595,29 @@ class ElggPluginManifest { } /** + * Should this plugin be activated when Elgg is installed + * + * @return bool + */ + public function getActivateOnInstall() { + $activate = $this->parser->getAttribute('activate_on_install'); + switch (strtolower($activate)) { + case 'yes': + case 'true': + case 'on': + case 1: + return true; + + case 'no': + case 'false': + case 'off': + case 0: + case '': + return false; + } + } + + /** * Normalizes an array into the structure specified * * @param array $struct The struct to normalize $element to. @@ -492,9 +629,28 @@ class ElggPluginManifest { $return = array(); foreach ($struct as $index => $default) { - $return[$index] = elgg_get_array_value($index, $array, $default); + $return[$index] = elgg_extract($index, $array, $default); } return $return; } -}
\ No newline at end of file + + /** + * Returns a category's friendly name. This can be localized by + * defining the string 'admin:plugins:category:<category>'. If no + * localization is found, returns the category with _ and - converted to ' ' + * and then ucwords()'d. + * + * @param str $category The category as defined in the manifest. + * @return str A human-readable category + */ + static public function getFriendlyCategory($category) { + $cat_raw_string = "admin:plugins:category:$category"; + $cat_display_string = elgg_echo($cat_raw_string); + if ($cat_display_string == $cat_raw_string) { + $category = str_replace(array('-', '_'), ' ', $category); + $cat_display_string = ucwords($category); + } + return $cat_display_string; + } +} |
