| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747 | 
							- <?php
 
- /**
 
-  * Parses Elgg manifest.xml files.
 
-  *
 
-  * Normalizes the values from the \ElggManifestParser object.
 
-  *
 
-  * This requires an \ElggPluginManifestParser class implementation
 
-  * as $this->parser.
 
-  *
 
-  * To add new parser versions, name them \ElggPluginManifestParserXX
 
-  * where XX is the version specified in the top-level <plugin_manifest>
 
-  * tag's XML namespace.
 
-  *
 
-  * @package    Elgg.Core
 
-  * @subpackage Plugins
 
-  * @since      1.8
 
-  */
 
- class ElggPluginManifest {
 
- 	/**
 
- 	 * The parser object
 
- 	 *
 
- 	 * @var \ElggPluginManifestParser18
 
- 	 */
 
- 	protected $parser;
 
- 	/**
 
- 	 * The root for plugin manifest namespaces.
 
- 	 * This is in the format http://www.elgg.org/plugin_manifest/<version>
 
- 	 */
 
- 	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_version and elgg_release requires element
 
- 	 */
 
- 	private $depsStructElgg = array(
 
- 		'type' => '',
 
- 		'version' => '',
 
- 		'comparison' => 'ge'
 
- 	);
 
- 	
 
- 	/**
 
- 	 * The expected structure of a requires php_version dependency element
 
- 	 */
 
- 	private $depsStructPhpVersion = array(
 
- 		'type' => '',
 
- 		'version' => '',
 
- 		'comparison' => 'ge'
 
- 	);
 
- 	/**
 
- 	 * The expected structure of a requires php_ini dependency element
 
- 	 */
 
- 	private $depsStructPhpIni = array(
 
- 		'type' => '',
 
- 		'name' => '',
 
- 		'value' => '',
 
- 		'comparison' => '='
 
- 	);
 
- 	/**
 
- 	 * The expected structure of a requires php_extension dependency element
 
- 	 */
 
- 	private $depsStructPhpExtension = array(
 
- 		'type' => '',
 
- 		'name' => '',
 
- 		'version' => '',
 
- 		'comparison' => '='
 
- 	);
 
- 	/**
 
- 	 * The expected structure of a conflicts depedency element
 
- 	 */
 
- 	private $depsConflictsStruct = array(
 
- 		'type' => '',
 
- 		'name' => '',
 
- 		'version' => '',
 
- 		'comparison' => '='
 
- 	);
 
- 	/**
 
- 	 * The expected structure of a provides dependency element.
 
- 	 */
 
- 	private $depsProvidesStruct = array(
 
- 		'type' => '',
 
- 		'name' => '',
 
- 		'version' => ''
 
- 	);
 
- 	/**
 
- 	 * The expected structure of a screenshot element
 
- 	 */
 
- 	private $screenshotStruct = array(
 
- 		'description' => '',
 
- 		'path' => ''
 
- 	);
 
- 	
 
- 	/**
 
- 	 * The expected structure of a contributor element
 
- 	 */
 
- 	private $contributorStruct = array(
 
- 		'name' => '',
 
- 		'email' => '',
 
- 		'website' => '',
 
- 		'username' => '',
 
- 		'description' => '',
 
- 	);
 
- 	/**
 
- 	 * The API version of the manifest.
 
- 	 *
 
- 	 * @var int
 
- 	 */
 
- 	protected $apiVersion;
 
- 	/**
 
- 	 * The optional plugin id this manifest belongs to.
 
- 	 *
 
- 	 * @var string
 
- 	 */
 
- 	protected $pluginID;
 
- 	/**
 
- 	 * Load a manifest file, XmlElement or path to manifest.xml file
 
- 	 *
 
- 	 * @param mixed  $manifest  A string, XmlElement, or path of a manifest file.
 
- 	 * @param string $plugin_id Optional ID of the owning plugin. Used to
 
- 	 *                          fill in some values automatically.
 
- 	 *
 
- 	 * @throws PluginException
 
- 	 */
 
- 	public function __construct($manifest, $plugin_id = null) {
 
- 		if ($plugin_id) {
 
- 			$this->pluginID = $plugin_id;
 
- 		}
 
- 		// see if we need to construct the xml object.
 
- 		if ($manifest instanceof \ElggXMLElement) {
 
- 			$manifest_obj = $manifest;
 
- 		} else {
 
- 			$raw_xml = '';
 
- 			if (substr(trim($manifest), 0, 1) == '<') {
 
- 				// this is a string
 
- 				$raw_xml = $manifest;
 
- 			} elseif (is_file($manifest)) {
 
- 				// this is a file
 
- 				$raw_xml = file_get_contents($manifest);
 
- 			}
 
- 			if ($raw_xml) {
 
- 				$manifest_obj = new \ElggXMLElement($raw_xml);
 
- 			} else {
 
- 				$manifest_obj = null;
 
- 			}
 
- 		}
 
- 		if (!$manifest_obj) {
 
- 			throw new \PluginException(_elgg_services()->translator->translate('PluginException:InvalidManifest',
 
- 						array($this->getPluginID())));
 
- 		}
 
- 		// set manifest api version
 
- 		if (isset($manifest_obj->attributes['xmlns'])) {
 
- 			$namespace = $manifest_obj->attributes['xmlns'];
 
- 			$version = str_replace($this->namespace_root, '', $namespace);
 
- 		} else {
 
- 			$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.
 
- 		try {
 
- 			$class_exists = class_exists($parser_class_name);
 
- 		} catch (Exception $e) {
 
- 			$class_exists = false;
 
- 		}
 
- 		if ($class_exists) {
 
- 			$this->parser = new $parser_class_name($manifest_obj, $this);
 
- 		} else {
 
- 			throw new \PluginException(_elgg_services()->translator->translate('PluginException:NoAvailableParser',
 
- 							array($this->apiVersion, $this->getPluginID())));
 
- 		}
 
- 		if (!$this->parser->parse()) {
 
- 			throw new \PluginException(_elgg_services()->translator->translate('PluginException:ParserError',
 
- 						array($this->apiVersion, $this->getPluginID())));
 
- 		}
 
- 	}
 
- 	/**
 
- 	 * Returns the API version in use.
 
- 	 *
 
- 	 * @return int
 
- 	 */
 
- 	public function getApiVersion() {
 
- 		return $this->apiVersion;
 
- 	}
 
- 	/**
 
- 	 * Returns the plugin ID.
 
- 	 *
 
- 	 * @return string
 
- 	 */
 
- 	public function getPluginID() {
 
- 		if ($this->pluginID) {
 
- 			return $this->pluginID;
 
- 		} else {
 
- 			return _elgg_services()->translator->translate('unknown');
 
- 		}
 
- 	}
 
- 	/**
 
- 	 * Returns the manifest array.
 
- 	 *
 
- 	 * Used for backward compatibility.  Specific
 
- 	 * methods should be called instead.
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	public function getManifest() {
 
- 		return $this->parser->getManifest();
 
- 	}
 
- 	/***************************************
 
- 	 * Parsed and Normalized Manifest Data *
 
- 	 ***************************************/
 
- 	/**
 
- 	 * Returns the plugin name
 
- 	 *
 
- 	 * @return string
 
- 	 */
 
- 	public function getName() {
 
- 		$name = $this->parser->getAttribute('name');
 
- 		if (!$name && $this->pluginID) {
 
- 			$name = ucwords(str_replace('_', ' ', $this->pluginID));
 
- 		}
 
- 		return $name;
 
- 	}
 
- 	/**
 
- 	 * Return the plugin ID required by the author. If getPluginID() does
 
- 	 * not match this, the plugin should not be started.
 
- 	 *
 
- 	 * @return string empty string if not empty/not defined
 
- 	 */
 
- 	public function getID() {
 
- 		return trim((string) $this->parser->getAttribute('id'));
 
- 	}
 
- 	/**
 
- 	 * Return the description
 
- 	 *
 
- 	 * @return string
 
- 	 */
 
- 	public function getDescription() {
 
- 		return $this->parser->getAttribute('description');
 
- 	}
 
- 	/**
 
- 	 * Return the short description
 
- 	 *
 
- 	 * @return string
 
- 	 */
 
- 	public function getBlurb() {
 
- 		$blurb = $this->parser->getAttribute('blurb');
 
- 		if (!$blurb) {
 
- 			$blurb = elgg_get_excerpt($this->getDescription());
 
- 		}
 
- 		return $blurb;
 
- 	}
 
- 	/**
 
- 	 * Returns the license
 
- 	 *
 
- 	 * @return string
 
- 	 */
 
- 	public function getLicense() {
 
- 		// 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.
 
- 	 *
 
- 	 * @return float
 
- 	 */
 
- 	public function getVersion() {
 
- 		return $this->parser->getAttribute('version');
 
- 	}
 
- 	/**
 
- 	 * Returns the plugin author.
 
- 	 *
 
- 	 * @return string
 
- 	 */
 
- 	public function getAuthor() {
 
- 		return $this->parser->getAttribute('author');
 
- 	}
 
- 	/**
 
- 	 * Return the copyright
 
- 	 *
 
- 	 * @return string
 
- 	 */
 
- 	public function getCopyright() {
 
- 		return $this->parser->getAttribute('copyright');
 
- 	}
 
- 	/**
 
- 	 * Return the website
 
- 	 *
 
- 	 * @return string
 
- 	 */
 
- 	public function getWebsite() {
 
- 		return $this->parser->getAttribute('website');
 
- 	}
 
- 	/**
 
- 	 * Return the categories listed for this plugin
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	public function getCategories() {
 
- 		$bundled_plugins = array(
 
- 			'aalborg_theme',
 
- 			'blog',
 
- 			'bookmarks',
 
- 			'categories',
 
- 			'ckeditor',
 
- 			'custom_index',
 
- 			'dashboard',
 
- 			'developers',
 
- 			'diagnostics',
 
- 			'embed',
 
- 			'externalpages',
 
- 			'file',
 
- 			'garbagecollector',
 
- 			'groups',
 
- 			'htmlawed',
 
- 			'invitefriends',
 
- 			'legacy_urls',
 
- 			'likes',
 
- 			'logbrowser',
 
- 			'login_as',
 
- 			'logrotate',
 
- 			'members',
 
- 			'messageboard',
 
- 			'messages',
 
- 			'notifications',
 
- 			'pages',
 
- 			'profile',
 
- 			'reportedcontent',
 
- 			'search',
 
- 			'site_notifications',
 
- 			'tagcloud',
 
- 			'thewire',
 
- 			'twitter_api',
 
- 			'uservalidationbyemail',
 
- 			'web_services',
 
- 			'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;
 
- 	}
 
- 	/**
 
- 	 * Return the screenshots listed.
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	public function getScreenshots() {
 
- 		$ss = $this->parser->getAttribute('screenshot');
 
- 		if (!$ss) {
 
- 			$ss = array();
 
- 		}
 
- 		$normalized = array();
 
- 		foreach ($ss as $s) {
 
- 			$normalized[] = $this->buildStruct($this->screenshotStruct, $s);
 
- 		}
 
- 		return $normalized;
 
- 	}
 
- 	
 
- 	/**
 
- 	 * Return the contributors listed.
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	public function getContributors() {
 
- 		$ss = $this->parser->getAttribute('contributor');
 
- 		if (!$ss) {
 
- 			$ss = array();
 
- 		}
 
- 		$normalized = array();
 
- 		foreach ($ss as $s) {
 
- 			$normalized[] = $this->buildStruct($this->contributorStruct, $s);
 
- 		}
 
- 		return $normalized;
 
- 	}
 
- 	/**
 
- 	 * Return the list of provides by this plugin.
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	public function getProvides() {
 
- 		// normalize for 1.7
 
- 		if ($this->getApiVersion() < 1.8) {
 
- 			$provides = array();
 
- 		} else {
 
- 			$provides = $this->parser->getAttribute('provides');
 
- 		}
 
- 		if (!$provides) {
 
- 			$provides = array();
 
- 		}
 
- 		// always provide ourself if we can
 
- 		if ($this->pluginID) {
 
- 			$provides[] = array(
 
- 				'type' => 'plugin',
 
- 				'name' => $this->getPluginID(),
 
- 				'version' => $this->getVersion()
 
- 			);
 
- 		}
 
- 		$normalized = array();
 
- 		foreach ($provides as $provide) {
 
- 			$normalized[] = $this->buildStruct($this->depsProvidesStruct, $provide);
 
- 		}
 
- 		return $normalized;
 
- 	}
 
- 	/**
 
- 	 * Returns the dependencies listed.
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	public function getRequires() {
 
- 		// rewrite the 1.7 style elgg_version as a real requires.
 
- 		if ($this->apiVersion < 1.8) {
 
- 			$elgg_version = $this->parser->getAttribute('elgg_version');
 
- 			if ($elgg_version) {
 
- 				$reqs = array(
 
- 					array(
 
- 						'type' => 'elgg_version',
 
- 						'version' => $elgg_version,
 
- 						'comparison' => 'ge'
 
- 					)
 
- 				);
 
- 			} else {
 
- 				$reqs = array();
 
- 			}
 
- 		} else {
 
- 			$reqs = $this->parser->getAttribute('requires');
 
- 		}
 
- 		if (!$reqs) {
 
- 			$reqs = array();
 
- 		}
 
- 		$normalized = array();
 
- 		foreach ($reqs as $req) {
 
- 			$normalized[] = $this->normalizeDep($req);
 
- 		}
 
- 		return $normalized;
 
- 	}
 
- 	/**
 
- 	 * Returns the suggests elements.
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	public function getSuggests() {
 
- 		$suggests = $this->parser->getAttribute('suggests');
 
- 		if (!$suggests) {
 
- 			$suggests = array();
 
- 		}
 
- 		$normalized = array();
 
- 		foreach ($suggests as $suggest) {
 
- 			$normalized[] = $this->normalizeDep($suggest);
 
- 		}
 
- 		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_version':
 
- 				$struct = $this->depsStructPhpVersion;
 
- 				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;
 
- 		}
 
- 		// @todo $struct may not have been defined...
 
- 		$normalized_dep = $this->buildStruct($struct, $dep);
 
- 		// normalize comparison operators
 
- 		if (isset($normalized_dep['comparison'])) {
 
- 			switch ($normalized_dep['comparison']) {
 
- 				case '<':
 
- 					$normalized_dep['comparison'] = 'lt';
 
- 					break;
 
- 				case '<=':
 
- 					$normalized_dep['comparison'] = 'le';
 
- 					break;
 
- 				case '>':
 
- 					$normalized_dep['comparison'] = 'gt';
 
- 					break;
 
- 				case '>=':
 
- 					$normalized_dep['comparison'] = 'ge';
 
- 					break;
 
- 				case '==':
 
- 				case 'eq':
 
- 					$normalized_dep['comparison'] = '=';
 
- 					break;
 
- 				case '<>':
 
- 				case 'ne':
 
- 					$normalized_dep['comparison'] = '!=';
 
- 					break;
 
- 			}
 
- 		}
 
- 		return $normalized_dep;
 
- 	}
 
- 	/**
 
- 	 * Returns the conflicts listed
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	public function getConflicts() {
 
- 		// normalize for 1.7
 
- 		if ($this->getApiVersion() < 1.8) {
 
- 			$conflicts = array();
 
- 		} else {
 
- 			$conflicts = $this->parser->getAttribute('conflicts');
 
- 		}
 
- 		if (!$conflicts) {
 
- 			$conflicts = array();
 
- 		}
 
- 		$normalized = array();
 
- 		foreach ($conflicts as $conflict) {
 
- 			$normalized[] = $this->buildStruct($this->depsConflictsStruct, $conflict);
 
- 		}
 
- 		return $normalized;
 
- 	}
 
- 	/**
 
- 	 * 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.
 
- 	 * @param array $array  The array
 
- 	 *
 
- 	 * @return array
 
- 	 */
 
- 	protected function buildStruct(array $struct, array $array) {
 
- 		$return = array();
 
- 		foreach ($struct as $index => $default) {
 
- 			$return[$index] = elgg_extract($index, $array, $default);
 
- 		}
 
- 		return $return;
 
- 	}
 
- 	/**
 
- 	 * 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 string $category The category as defined in the manifest.
 
- 	 * @return string A human-readable category
 
- 	 */
 
- 	static public function getFriendlyCategory($category) {
 
- 		$cat_raw_string = "admin:plugins:category:$category";
 
- 		$cat_display_string = _elgg_services()->translator->translate($cat_raw_string);
 
- 		if ($cat_display_string == $cat_raw_string) {
 
- 			$category = str_replace(array('-', '_'), ' ', $category);
 
- 			$cat_display_string = ucwords($category);
 
- 		}
 
- 		return $cat_display_string;
 
- 	}
 
- }
 
 
  |