From 705c93e8f797a7aa4e4f37fdfd0e49660d43b161 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 16 Nov 2012 18:56:42 +0000 Subject: [PATCH 01/21] Fix crash when loading a DOMDocument node ($loaded not initialised). --- phpQuery/phpQuery/DOMDocumentWrapper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpQuery/phpQuery/DOMDocumentWrapper.php b/phpQuery/phpQuery/DOMDocumentWrapper.php index 47ce35c..a58b1f3 100644 --- a/phpQuery/phpQuery/DOMDocumentWrapper.php +++ b/phpQuery/phpQuery/DOMDocumentWrapper.php @@ -59,6 +59,7 @@ public function load($markup, $contentType = null, $newDocumentID = null) { $this->root = $this->document; $this->charset = $this->document->encoding; // TODO isDocumentFragment + $loaded = true; } else { $loaded = $this->loadMarkup($markup); } @@ -677,4 +678,4 @@ public static function expandEmptyTag($tag, $xml){ } return $xml; } -} \ No newline at end of file +} From 1d1cb898b26693378f07e2a71f92e0ecc4508967 Mon Sep 17 00:00:00 2001 From: Rafal Lindemann Date: Fri, 14 Dec 2012 09:08:40 +0100 Subject: [PATCH 02/21] Removed Zend --- phpQuery/phpQuery/Zend/Exception.php | 30 - phpQuery/phpQuery/Zend/Http/Client.php | 1186 ----------------- .../Zend/Http/Client/Adapter/Exception.php | 33 - .../Zend/Http/Client/Adapter/Interface.php | 78 -- .../Zend/Http/Client/Adapter/Proxy.php | 268 ---- .../Zend/Http/Client/Adapter/Socket.php | 332 ----- .../Zend/Http/Client/Adapter/Test.php | 193 --- .../phpQuery/Zend/Http/Client/Exception.php | 33 - phpQuery/phpQuery/Zend/Http/Cookie.php | 327 ----- phpQuery/phpQuery/Zend/Http/CookieJar.php | 350 ----- phpQuery/phpQuery/Zend/Http/Exception.php | 33 - phpQuery/phpQuery/Zend/Http/Response.php | 625 --------- phpQuery/phpQuery/Zend/Json/Decoder.php | 457 ------- phpQuery/phpQuery/Zend/Json/Encoder.php | 431 ------ phpQuery/phpQuery/Zend/Json/Exception.php | 36 - phpQuery/phpQuery/Zend/Loader.php | 258 ---- phpQuery/phpQuery/Zend/Registry.php | 195 --- phpQuery/phpQuery/Zend/Uri.php | 164 --- phpQuery/phpQuery/Zend/Uri/Exception.php | 37 - phpQuery/phpQuery/Zend/Uri/Http.php | 702 ---------- phpQuery/phpQuery/Zend/Validate/Abstract.php | 348 ----- phpQuery/phpQuery/Zend/Validate/Alnum.php | 120 -- phpQuery/phpQuery/Zend/Validate/Alpha.php | 120 -- phpQuery/phpQuery/Zend/Validate/Barcode.php | 99 -- .../phpQuery/Zend/Validate/Barcode/Ean13.php | 100 -- .../phpQuery/Zend/Validate/Barcode/UpcA.php | 100 -- phpQuery/phpQuery/Zend/Validate/Between.php | 200 --- phpQuery/phpQuery/Zend/Validate/Ccnum.php | 111 -- phpQuery/phpQuery/Zend/Validate/Date.php | 250 ---- phpQuery/phpQuery/Zend/Validate/Digits.php | 100 -- .../phpQuery/Zend/Validate/EmailAddress.php | 245 ---- phpQuery/phpQuery/Zend/Validate/Exception.php | 37 - .../phpQuery/Zend/Validate/File/Count.php | 229 ---- .../phpQuery/Zend/Validate/File/Exists.php | 192 --- .../phpQuery/Zend/Validate/File/Extension.php | 204 --- .../phpQuery/Zend/Validate/File/FilesSize.php | 156 --- .../phpQuery/Zend/Validate/File/ImageSize.php | 335 ----- .../phpQuery/Zend/Validate/File/MimeType.php | 200 --- .../phpQuery/Zend/Validate/File/NotExists.php | 86 -- phpQuery/phpQuery/Zend/Validate/File/Size.php | 308 ----- .../phpQuery/Zend/Validate/File/Upload.php | 216 --- phpQuery/phpQuery/Zend/Validate/Float.php | 75 -- .../phpQuery/Zend/Validate/GreaterThan.php | 114 -- phpQuery/phpQuery/Zend/Validate/Hex.php | 74 - phpQuery/phpQuery/Zend/Validate/Hostname.php | 444 ------ .../phpQuery/Zend/Validate/Hostname/At.php | 50 - .../phpQuery/Zend/Validate/Hostname/Ch.php | 50 - .../phpQuery/Zend/Validate/Hostname/De.php | 58 - .../phpQuery/Zend/Validate/Hostname/Fi.php | 50 - .../phpQuery/Zend/Validate/Hostname/Hu.php | 50 - .../Zend/Validate/Hostname/Interface.php | 52 - .../phpQuery/Zend/Validate/Hostname/Li.php | 50 - .../phpQuery/Zend/Validate/Hostname/No.php | 52 - .../phpQuery/Zend/Validate/Hostname/Se.php | 50 - phpQuery/phpQuery/Zend/Validate/Identical.php | 117 -- phpQuery/phpQuery/Zend/Validate/InArray.php | 138 -- phpQuery/phpQuery/Zend/Validate/Int.php | 75 -- phpQuery/phpQuery/Zend/Validate/Interface.php | 71 - phpQuery/phpQuery/Zend/Validate/Ip.php | 70 - phpQuery/phpQuery/Zend/Validate/LessThan.php | 113 -- phpQuery/phpQuery/Zend/Validate/NotEmpty.php | 74 - phpQuery/phpQuery/Zend/Validate/Regex.php | 125 -- .../phpQuery/Zend/Validate/StringLength.php | 180 --- 63 files changed, 11656 deletions(-) delete mode 100644 phpQuery/phpQuery/Zend/Exception.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Client.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Client/Adapter/Exception.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Client/Adapter/Interface.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Client/Adapter/Proxy.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Client/Adapter/Socket.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Client/Adapter/Test.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Client/Exception.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Cookie.php delete mode 100644 phpQuery/phpQuery/Zend/Http/CookieJar.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Exception.php delete mode 100644 phpQuery/phpQuery/Zend/Http/Response.php delete mode 100644 phpQuery/phpQuery/Zend/Json/Decoder.php delete mode 100644 phpQuery/phpQuery/Zend/Json/Encoder.php delete mode 100644 phpQuery/phpQuery/Zend/Json/Exception.php delete mode 100644 phpQuery/phpQuery/Zend/Loader.php delete mode 100644 phpQuery/phpQuery/Zend/Registry.php delete mode 100644 phpQuery/phpQuery/Zend/Uri.php delete mode 100644 phpQuery/phpQuery/Zend/Uri/Exception.php delete mode 100644 phpQuery/phpQuery/Zend/Uri/Http.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Abstract.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Alnum.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Alpha.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Barcode.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Barcode/Ean13.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Barcode/UpcA.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Between.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Ccnum.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Date.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Digits.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/EmailAddress.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Exception.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/Count.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/Exists.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/Extension.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/FilesSize.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/ImageSize.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/MimeType.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/NotExists.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/Size.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/File/Upload.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Float.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/GreaterThan.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hex.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/At.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/Ch.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/De.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/Fi.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/Hu.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/Interface.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/Li.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/No.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Hostname/Se.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Identical.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/InArray.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Int.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Interface.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Ip.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/LessThan.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/NotEmpty.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/Regex.php delete mode 100644 phpQuery/phpQuery/Zend/Validate/StringLength.php diff --git a/phpQuery/phpQuery/Zend/Exception.php b/phpQuery/phpQuery/Zend/Exception.php deleted file mode 100644 index 599d8a0..0000000 --- a/phpQuery/phpQuery/Zend/Exception.php +++ /dev/null @@ -1,30 +0,0 @@ - 5, - 'strictredirects' => false, - 'useragent' => 'Zend_Http_Client', - 'timeout' => 10, - 'adapter' => 'Zend_Http_Client_Adapter_Socket', - 'httpversion' => self::HTTP_1, - 'keepalive' => false, - 'storeresponse' => true, - 'strict' => true - ); - - /** - * The adapter used to preform the actual connection to the server - * - * @var Zend_Http_Client_Adapter_Interface - */ - protected $adapter = null; - - /** - * Request URI - * - * @var Zend_Uri_Http - */ - protected $uri; - - /** - * Associative array of request headers - * - * @var array - */ - protected $headers = array(); - - /** - * HTTP request method - * - * @var string - */ - protected $method = self::GET; - - /** - * Associative array of GET parameters - * - * @var array - */ - protected $paramsGet = array(); - - /** - * Assiciative array of POST parameters - * - * @var array - */ - protected $paramsPost = array(); - - /** - * Request body content type (for POST requests) - * - * @var string - */ - protected $enctype = null; - - /** - * The raw post data to send. Could be set by setRawData($data, $enctype). - * - * @var string - */ - protected $raw_post_data = null; - - /** - * HTTP Authentication settings - * - * Expected to be an associative array with this structure: - * $this->auth = array('user' => 'username', 'password' => 'password', 'type' => 'basic') - * Where 'type' should be one of the supported authentication types (see the AUTH_* - * constants), for example 'basic' or 'digest'. - * - * If null, no authentication will be used. - * - * @var array|null - */ - protected $auth; - - /** - * File upload arrays (used in POST requests) - * - * An associative array, where each element is of the format: - * 'name' => array('filename.txt', 'text/plain', 'This is the actual file contents') - * - * @var array - */ - protected $files = array(); - - /** - * The client's cookie jar - * - * @var Zend_Http_CookieJar - */ - protected $cookiejar = null; - - /** - * The last HTTP request sent by the client, as string - * - * @var string - */ - protected $last_request = null; - - /** - * The last HTTP response received by the client - * - * @var Zend_Http_Response - */ - protected $last_response = null; - - /** - * Redirection counter - * - * @var int - */ - protected $redirectCounter = 0; - - /** - * Fileinfo magic database resource - * - * This varaiable is populated the first time _detectFileMimeType is called - * and is then reused on every call to this method - * - * @var resource - */ - static protected $_fileInfoDb = null; - - /** - * Contructor method. Will create a new HTTP client. Accepts the target - * URL and optionally configuration array. - * - * @param Zend_Uri_Http|string $uri - * @param array $config Configuration key-value pairs. - */ - public function __construct($uri = null, $config = null) - { - if ($uri !== null) $this->setUri($uri); - if ($config !== null) $this->setConfig($config); - } - - /** - * Set the URI for the next request - * - * @param Zend_Uri_Http|string $uri - * @return Zend_Http_Client - * @throws Zend_Http_Client_Exception - */ - public function setUri($uri) - { - if (is_string($uri)) { - $uri = Zend_Uri::factory($uri); - } - - if (!$uri instanceof Zend_Uri_Http) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('Passed parameter is not a valid HTTP URI.'); - } - - // We have no ports, set the defaults - if (! $uri->getPort()) { - $uri->setPort(($uri->getScheme() == 'https' ? 443 : 80)); - } - - $this->uri = $uri; - - return $this; - } - - /** - * Get the URI for the next request - * - * @param boolean $as_string If true, will return the URI as a string - * @return Zend_Uri_Http|string - */ - public function getUri($as_string = false) - { - if ($as_string && $this->uri instanceof Zend_Uri_Http) { - return $this->uri->__toString(); - } else { - return $this->uri; - } - } - - /** - * Set configuration parameters for this HTTP client - * - * @param array $config - * @return Zend_Http_Client - * @throws Zend_Http_Client_Exception - */ - public function setConfig($config = array()) - { - if (! is_array($config)) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('Expected array parameter, given ' . gettype($config)); - } - - foreach ($config as $k => $v) - $this->config[strtolower($k)] = $v; - - return $this; - } - - /** - * Set the next request's method - * - * Validated the passed method and sets it. If we have files set for - * POST requests, and the new method is not POST, the files are silently - * dropped. - * - * @param string $method - * @return Zend_Http_Client - * @throws Zend_Http_Client_Exception - */ - public function setMethod($method = self::GET) - { - $regex = '/^[^\x00-\x1f\x7f-\xff\(\)<>@,;:\\\\"\/\[\]\?={}\s]+$/'; - if (! preg_match($regex, $method)) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("'{$method}' is not a valid HTTP request method."); - } - - if ($method == self::POST && $this->enctype === null) - $this->setEncType(self::ENC_URLENCODED); - - $this->method = $method; - - return $this; - } - - /** - * Set one or more request headers - * - * This function can be used in several ways to set the client's request - * headers: - * 1. By providing two parameters: $name as the header to set (eg. 'Host') - * and $value as it's value (eg. 'www.example.com'). - * 2. By providing a single header string as the only parameter - * eg. 'Host: www.example.com' - * 3. By providing an array of headers as the first parameter - * eg. array('host' => 'www.example.com', 'x-foo: bar'). In This case - * the function will call itself recursively for each array item. - * - * @param string|array $name Header name, full header string ('Header: value') - * or an array of headers - * @param mixed $value Header value or null - * @return Zend_Http_Client - * @throws Zend_Http_Client_Exception - */ - public function setHeaders($name, $value = null) - { - // If we got an array, go recusive! - if (is_array($name)) { - foreach ($name as $k => $v) { - if (is_string($k)) { - $this->setHeaders($k, $v); - } else { - $this->setHeaders($v, null); - } - } - } else { - // Check if $name needs to be split - if ($value === null && (strpos($name, ':') > 0)) - list($name, $value) = explode(':', $name, 2); - - // Make sure the name is valid if we are in strict mode - if ($this->config['strict'] && (! preg_match('/^[a-zA-Z0-9-]+$/', $name))) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("{$name} is not a valid HTTP header name"); - } - - $normalized_name = strtolower($name); - - // If $value is null or false, unset the header - if ($value === null || $value === false) { - unset($this->headers[$normalized_name]); - - // Else, set the header - } else { - // Header names are storred lowercase internally. - if (is_string($value)) $value = trim($value); - $this->headers[$normalized_name] = array($name, $value); - } - } - - return $this; - } - - /** - * Get the value of a specific header - * - * Note that if the header has more than one value, an array - * will be returned. - * - * @param string $key - * @return string|array|null The header value or null if it is not set - */ - public function getHeader($key) - { - $key = strtolower($key); - if (isset($this->headers[$key])) { - return $this->headers[$key][1]; - } else { - return null; - } - } - - /** - * Set a GET parameter for the request. Wrapper around _setParameter - * - * @param string|array $name - * @param string $value - * @return Zend_Http_Client - */ - public function setParameterGet($name, $value = null) - { - if (is_array($name)) { - foreach ($name as $k => $v) - $this->_setParameter('GET', $k, $v); - } else { - $this->_setParameter('GET', $name, $value); - } - - return $this; - } - - /** - * Set a POST parameter for the request. Wrapper around _setParameter - * - * @param string|array $name - * @param string $value - * @return Zend_Http_Client - */ - public function setParameterPost($name, $value = null) - { - if (is_array($name)) { - foreach ($name as $k => $v) - $this->_setParameter('POST', $k, $v); - } else { - $this->_setParameter('POST', $name, $value); - } - - return $this; - } - - /** - * Set a GET or POST parameter - used by SetParameterGet and SetParameterPost - * - * @param string $type GET or POST - * @param string $name - * @param string $value - * @return null - */ - protected function _setParameter($type, $name, $value) - { - $parray = array(); - $type = strtolower($type); - switch ($type) { - case 'get': - $parray = &$this->paramsGet; - break; - case 'post': - $parray = &$this->paramsPost; - break; - } - - if ($value === null) { - if (isset($parray[$name])) unset($parray[$name]); - } else { - $parray[$name] = $value; - } - } - - /** - * Get the number of redirections done on the last request - * - * @return int - */ - public function getRedirectionsCount() - { - return $this->redirectCounter; - } - - /** - * Set HTTP authentication parameters - * - * $type should be one of the supported types - see the self::AUTH_* - * constants. - * - * To enable authentication: - * - * $this->setAuth('shahar', 'secret', Zend_Http_Client::AUTH_BASIC); - * - * - * To disable authentication: - * - * $this->setAuth(false); - * - * - * @see http://www.faqs.org/rfcs/rfc2617.html - * @param string|false $user User name or false disable authentication - * @param string $password Password - * @param string $type Authentication type - * @return Zend_Http_Client - * @throws Zend_Http_Client_Exception - */ - public function setAuth($user, $password = '', $type = self::AUTH_BASIC) - { - // If we got false or null, disable authentication - if ($user === false || $user === null) { - $this->auth = null; - - // Else, set up authentication - } else { - // Check we got a proper authentication type - if (! defined('self::AUTH_' . strtoupper($type))) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("Invalid or not supported authentication type: '$type'"); - } - - $this->auth = array( - 'user' => (string) $user, - 'password' => (string) $password, - 'type' => $type - ); - } - - return $this; - } - - /** - * Set the HTTP client's cookie jar. - * - * A cookie jar is an object that holds and maintains cookies across HTTP requests - * and responses. - * - * @param Zend_Http_CookieJar|boolean $cookiejar Existing cookiejar object, true to create a new one, false to disable - * @return Zend_Http_Client - * @throws Zend_Http_Client_Exception - */ - public function setCookieJar($cookiejar = true) - { - if (! class_exists('Zend_Http_CookieJar')) - require_once 'Zend/Http/CookieJar.php'; - - if ($cookiejar instanceof Zend_Http_CookieJar) { - $this->cookiejar = $cookiejar; - } elseif ($cookiejar === true) { - $this->cookiejar = new Zend_Http_CookieJar(); - } elseif (! $cookiejar) { - $this->cookiejar = null; - } else { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('Invalid parameter type passed as CookieJar'); - } - - return $this; - } - - /** - * Return the current cookie jar or null if none. - * - * @return Zend_Http_CookieJar|null - */ - public function getCookieJar() - { - return $this->cookiejar; - } - - /** - * Add a cookie to the request. If the client has no Cookie Jar, the cookies - * will be added directly to the headers array as "Cookie" headers. - * - * @param Zend_Http_Cookie|string $cookie - * @param string|null $value If "cookie" is a string, this is the cookie value. - * @return Zend_Http_Client - * @throws Zend_Http_Client_Exception - */ - public function setCookie($cookie, $value = null) - { - if (! class_exists('Zend_Http_Cookie')) - require_once 'Zend/Http/Cookie.php'; - - if (is_array($cookie)) { - foreach ($cookie as $c => $v) { - if (is_string($c)) { - $this->setCookie($c, $v); - } else { - $this->setCookie($v); - } - } - - return $this; - } - - if ($value !== null) $value = urlencode($value); - - if (isset($this->cookiejar)) { - if ($cookie instanceof Zend_Http_Cookie) { - $this->cookiejar->addCookie($cookie); - } elseif (is_string($cookie) && $value !== null) { - $cookie = Zend_Http_Cookie::fromString("{$cookie}={$value}", $this->uri); - $this->cookiejar->addCookie($cookie); - } - } else { - if ($cookie instanceof Zend_Http_Cookie) { - $name = $cookie->getName(); - $value = $cookie->getValue(); - $cookie = $name; - } - - if (preg_match("/[=,; \t\r\n\013\014]/", $cookie)) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("Cookie name cannot contain these characters: =,; \t\r\n\013\014 ({$cookie})"); - } - - $value = addslashes($value); - - if (! isset($this->headers['cookie'])) $this->headers['cookie'] = array('Cookie', ''); - $this->headers['cookie'][1] .= $cookie . '=' . $value . '; '; - } - - return $this; - } - - /** - * Set a file to upload (using a POST request) - * - * Can be used in two ways: - * - * 1. $data is null (default): $filename is treated as the name if a local file which - * will be read and sent. Will try to guess the content type using mime_content_type(). - * 2. $data is set - $filename is sent as the file name, but $data is sent as the file - * contents and no file is read from the file system. In this case, you need to - * manually set the content-type ($ctype) or it will default to - * application/octet-stream. - * - * @param string $filename Name of file to upload, or name to save as - * @param string $formname Name of form element to send as - * @param string $data Data to send (if null, $filename is read and sent) - * @param string $ctype Content type to use (if $data is set and $ctype is - * null, will be application/octet-stream) - * @return Zend_Http_Client - * @throws Zend_Http_Client_Exception - */ - public function setFileUpload($filename, $formname, $data = null, $ctype = null) - { - if ($data === null) { - if (($data = @file_get_contents($filename)) === false) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("Unable to read file '{$filename}' for upload"); - } - - if (! $ctype) $ctype = $this->_detectFileMimeType($filename); - } - - // Force enctype to multipart/form-data - $this->setEncType(self::ENC_FORMDATA); - - $this->files[$formname] = array(basename($filename), $ctype, $data); - - return $this; - } - - /** - * Set the encoding type for POST data - * - * @param string $enctype - * @return Zend_Http_Client - */ - public function setEncType($enctype = self::ENC_URLENCODED) - { - $this->enctype = $enctype; - - return $this; - } - - /** - * Set the raw (already encoded) POST data. - * - * This function is here for two reasons: - * 1. For advanced user who would like to set their own data, already encoded - * 2. For backwards compatibilty: If someone uses the old post($data) method. - * this method will be used to set the encoded data. - * - * @param string $data - * @param string $enctype - * @return Zend_Http_Client - */ - public function setRawData($data, $enctype = null) - { - $this->raw_post_data = $data; - $this->setEncType($enctype); - - return $this; - } - - /** - * Clear all GET and POST parameters - * - * Should be used to reset the request parameters if the client is - * used for several concurrent requests. - * - * @return Zend_Http_Client - */ - public function resetParameters() - { - // Reset parameter data - $this->paramsGet = array(); - $this->paramsPost = array(); - $this->files = array(); - $this->raw_post_data = null; - - // Clear outdated headers - if (isset($this->headers['content-type'])) unset($this->headers['content-type']); - if (isset($this->headers['content-length'])) unset($this->headers['content-length']); - - return $this; - } - - /** - * Get the last HTTP request as string - * - * @return string - */ - public function getLastRequest() - { - return $this->last_request; - } - - /** - * Get the last HTTP response received by this client - * - * If $config['storeresponse'] is set to false, or no response was - * stored yet, will return null - * - * @return Zend_Http_Response or null if none - */ - public function getLastResponse() - { - return $this->last_response; - } - - /** - * Load the connection adapter - * - * While this method is not called more than one for a client, it is - * seperated from ->request() to preserve logic and readability - * - * @param Zend_Http_Client_Adapter_Interface|string $adapter - * @return null - * @throws Zend_Http_Client_Exception - */ - public function setAdapter($adapter) - { - if (is_string($adapter)) { - try { - Zend_Loader::loadClass($adapter); - } catch (Zend_Exception $e) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("Unable to load adapter '$adapter': {$e->getMessage()}"); - } - - $adapter = new $adapter; - } - - if (! $adapter instanceof Zend_Http_Client_Adapter_Interface) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('Passed adapter is not a HTTP connection adapter'); - } - - $this->adapter = $adapter; - $config = $this->config; - unset($config['adapter']); - $this->adapter->setConfig($config); - } - - /** - * Send the HTTP request and return an HTTP response object - * - * @param string $method - * @return Zend_Http_Response - * @throws Zend_Http_Client_Exception - */ - public function request($method = null) - { - if (! $this->uri instanceof Zend_Uri_Http) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('No valid URI has been passed to the client'); - } - - if ($method) $this->setMethod($method); - $this->redirectCounter = 0; - $response = null; - - // Make sure the adapter is loaded - if ($this->adapter == null) $this->setAdapter($this->config['adapter']); - - // Send the first request. If redirected, continue. - do { - // Clone the URI and add the additional GET parameters to it - $uri = clone $this->uri; - if (! empty($this->paramsGet)) { - $query = $uri->getQuery(); - if (! empty($query)) $query .= '&'; - $query .= http_build_query($this->paramsGet, null, '&'); - - $uri->setQuery($query); - } - - $body = $this->_prepareBody(); - $headers = $this->_prepareHeaders(); - - // Open the connection, send the request and read the response - $this->adapter->connect($uri->getHost(), $uri->getPort(), - ($uri->getScheme() == 'https' ? true : false)); - - $this->last_request = $this->adapter->write($this->method, - $uri, $this->config['httpversion'], $headers, $body); - - $response = $this->adapter->read(); - if (! $response) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('Unable to read response, or response is empty'); - } - - $response = Zend_Http_Response::fromString($response); - if ($this->config['storeresponse']) $this->last_response = $response; - - // Load cookies into cookie jar - if (isset($this->cookiejar)) $this->cookiejar->addCookiesFromResponse($response, $uri); - - // If we got redirected, look for the Location header - if ($response->isRedirect() && ($location = $response->getHeader('location'))) { - - // Check whether we send the exact same request again, or drop the parameters - // and send a GET request - if ($response->getStatus() == 303 || - ((! $this->config['strictredirects']) && ($response->getStatus() == 302 || - $response->getStatus() == 301))) { - - $this->resetParameters(); - $this->setMethod(self::GET); - } - - // If we got a well formed absolute URI - if (Zend_Uri_Http::check($location)) { - $this->setHeaders('host', null); - $this->setUri($location); - - } else { - - // Split into path and query and set the query - if (strpos($location, '?') !== false) { - list($location, $query) = explode('?', $location, 2); - } else { - $query = ''; - } - $this->uri->setQuery($query); - - // Else, if we got just an absolute path, set it - if(strpos($location, '/') === 0) { - $this->uri->setPath($location); - - // Else, assume we have a relative path - } else { - // Get the current path directory, removing any trailing slashes - $path = $this->uri->getPath(); - $path = rtrim(substr($path, 0, strrpos($path, '/')), "/"); - $this->uri->setPath($path . '/' . $location); - } - } - ++$this->redirectCounter; - - } else { - // If we didn't get any location, stop redirecting - break; - } - - } while ($this->redirectCounter < $this->config['maxredirects']); - - return $response; - } - - /** - * Prepare the request headers - * - * @return array - */ - protected function _prepareHeaders() - { - $headers = array(); - - // Set the host header - if (! isset($this->headers['host'])) { - $host = $this->uri->getHost(); - - // If the port is not default, add it - if (! (($this->uri->getScheme() == 'http' && $this->uri->getPort() == 80) || - ($this->uri->getScheme() == 'https' && $this->uri->getPort() == 443))) { - $host .= ':' . $this->uri->getPort(); - } - - $headers[] = "Host: {$host}"; - } - - // Set the connection header - if (! isset($this->headers['connection'])) { - if (! $this->config['keepalive']) $headers[] = "Connection: close"; - } - - // Set the Accept-encoding header if not set - depending on whether - // zlib is available or not. - if (! isset($this->headers['accept-encoding'])) { - if (function_exists('gzinflate')) { - $headers[] = 'Accept-encoding: gzip, deflate'; - } else { - $headers[] = 'Accept-encoding: identity'; - } - } - - // Set the content-type header - if ($this->method == self::POST && - (! isset($this->headers['content-type']) && isset($this->enctype))) { - - $headers[] = "Content-type: {$this->enctype}"; - } - - // Set the user agent header - if (! isset($this->headers['user-agent']) && isset($this->config['useragent'])) { - $headers[] = "User-agent: {$this->config['useragent']}"; - } - - // Set HTTP authentication if needed - if (is_array($this->auth)) { - $auth = self::encodeAuthHeader($this->auth['user'], $this->auth['password'], $this->auth['type']); - $headers[] = "Authorization: {$auth}"; - } - - // Load cookies from cookie jar - if (isset($this->cookiejar)) { - $cookstr = $this->cookiejar->getMatchingCookies($this->uri, - true, Zend_Http_CookieJar::COOKIE_STRING_CONCAT); - - if ($cookstr) $headers[] = "Cookie: {$cookstr}"; - } - - // Add all other user defined headers - foreach ($this->headers as $header) { - list($name, $value) = $header; - if (is_array($value)) - $value = implode(', ', $value); - - $headers[] = "$name: $value"; - } - - return $headers; - } - - /** - * Prepare the request body (for POST and PUT requests) - * - * @return string - * @throws Zend_Http_Client_Exception - */ - protected function _prepareBody() - { - // According to RFC2616, a TRACE request should not have a body. - if ($this->method == self::TRACE) { - return ''; - } - - // If we have raw_post_data set, just use it as the body. - if (isset($this->raw_post_data)) { - $this->setHeaders('Content-length', strlen($this->raw_post_data)); - return $this->raw_post_data; - } - - $body = ''; - - // If we have files to upload, force enctype to multipart/form-data - if (count ($this->files) > 0) $this->setEncType(self::ENC_FORMDATA); - - // If we have POST parameters or files, encode and add them to the body - if (count($this->paramsPost) > 0 || count($this->files) > 0) { - switch($this->enctype) { - case self::ENC_FORMDATA: - // Encode body as multipart/form-data - $boundary = '---ZENDHTTPCLIENT-' . md5(microtime()); - $this->setHeaders('Content-type', self::ENC_FORMDATA . "; boundary={$boundary}"); - - // Get POST parameters and encode them - $params = $this->_getParametersRecursive($this->paramsPost); - foreach ($params as $pp) { - $body .= self::encodeFormData($boundary, $pp[0], $pp[1]); - } - - // Encode files - foreach ($this->files as $name => $file) { - $fhead = array('Content-type' => $file[1]); - $body .= self::encodeFormData($boundary, $name, $file[2], $file[0], $fhead); - } - - $body .= "--{$boundary}--\r\n"; - break; - - case self::ENC_URLENCODED: - // Encode body as application/x-www-form-urlencoded - $this->setHeaders('Content-type', self::ENC_URLENCODED); - $body = http_build_query($this->paramsPost, '', '&'); - break; - - default: - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("Cannot handle content type '{$this->enctype}' automatically." . - " Please use Zend_Http_Client::setRawData to send this kind of content."); - break; - } - } - - // Set the content-length if we have a body or if request is POST/PUT - if ($body || $this->method == self::POST || $this->method == self::PUT) { - $this->setHeaders('Content-length', strlen($body)); - } - - return $body; - } - - /** - * Helper method that gets a possibly multi-level parameters array (get or - * post) and flattens it. - * - * The method returns an array of (key, value) pairs (because keys are not - * necessarily unique. If one of the parameters in as array, it will also - * add a [] suffix to the key. - * - * @param array $parray The parameters array - * @param bool $urlencode Whether to urlencode the name and value - * @return array - */ - protected function _getParametersRecursive($parray, $urlencode = false) - { - if (! is_array($parray)) return $parray; - $parameters = array(); - - foreach ($parray as $name => $value) { - if ($urlencode) $name = urlencode($name); - - // If $value is an array, iterate over it - if (is_array($value)) { - $name .= ($urlencode ? '%5B%5D' : '[]'); - foreach ($value as $subval) { - if ($urlencode) $subval = urlencode($subval); - $parameters[] = array($name, $subval); - } - } else { - if ($urlencode) $value = urlencode($value); - $parameters[] = array($name, $value); - } - } - - return $parameters; - } - - /** - * Attempt to detect the MIME type of a file using available extensions - * - * This method will try to detect the MIME type of a file. If the fileinfo - * extension is available, it will be used. If not, the mime_magic - * extension which is deprected but is still available in many PHP setups - * will be tried. - * - * If neither extension is available, the default application/octet-stream - * MIME type will be returned - * - * @param string $file File path - * @return string MIME type - */ - protected function _detectFileMimeType($file) - { - $type = null; - - // First try with fileinfo functions - if (function_exists('finfo_open')) { - if (self::$_fileInfoDb === null) { - self::$_fileInfoDb = @finfo_open(FILEINFO_MIME); - } - - if (self::$_fileInfoDb) { - $type = finfo_file(self::$_fileInfoDb, $file); - } - - } elseif (function_exists('mime_content_type')) { - $type = mime_content_type($file); - } - - // Fallback to the default application/octet-stream - if (! $type) { - $type = 'application/octet-stream'; - } - - return $type; - } - - /** - * Encode data to a multipart/form-data part suitable for a POST request. - * - * @param string $boundary - * @param string $name - * @param mixed $value - * @param string $filename - * @param array $headers Associative array of optional headers @example ("Content-transfer-encoding" => "binary") - * @return string - */ - public static function encodeFormData($boundary, $name, $value, $filename = null, $headers = array()) { - $ret = "--{$boundary}\r\n" . - 'Content-disposition: form-data; name="' . $name .'"'; - - if ($filename) $ret .= '; filename="' . $filename . '"'; - $ret .= "\r\n"; - - foreach ($headers as $hname => $hvalue) { - $ret .= "{$hname}: {$hvalue}\r\n"; - } - $ret .= "\r\n"; - - $ret .= "{$value}\r\n"; - - return $ret; - } - - /** - * Create a HTTP authentication "Authorization:" header according to the - * specified user, password and authentication method. - * - * @see http://www.faqs.org/rfcs/rfc2617.html - * @param string $user - * @param string $password - * @param string $type - * @return string - * @throws Zend_Http_Client_Exception - */ - public static function encodeAuthHeader($user, $password, $type = self::AUTH_BASIC) - { - $authHeader = null; - - switch ($type) { - case self::AUTH_BASIC: - // In basic authentication, the user name cannot contain ":" - if (strpos($user, ':') !== false) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("The user name cannot contain ':' in 'Basic' HTTP authentication"); - } - - $authHeader = 'Basic ' . base64_encode($user . ':' . $password); - break; - - //case self::AUTH_DIGEST: - /** - * @todo Implement digest authentication - */ - // break; - - default: - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("Not a supported HTTP authentication type: '$type'"); - } - - return $authHeader; - } -} diff --git a/phpQuery/phpQuery/Zend/Http/Client/Adapter/Exception.php b/phpQuery/phpQuery/Zend/Http/Client/Adapter/Exception.php deleted file mode 100644 index dfbe904..0000000 --- a/phpQuery/phpQuery/Zend/Http/Client/Adapter/Exception.php +++ /dev/null @@ -1,33 +0,0 @@ - 'ssl', - 'proxy_host' => '', - 'proxy_port' => 8080, - 'proxy_user' => '', - 'proxy_pass' => '', - 'proxy_auth' => Zend_Http_Client::AUTH_BASIC, - 'persistent' => false - ); - - /** - * Whether HTTPS CONNECT was already negotiated with the proxy or not - * - * @var boolean - */ - protected $negotiated = false; - - /** - * Connect to the remote server - * - * Will try to connect to the proxy server. If no proxy was set, will - * fall back to the target server (behave like regular Socket adapter) - * - * @param string $host - * @param int $port - * @param boolean $secure - * @param int $timeout - */ - public function connect($host, $port = 80, $secure = false) - { - // If no proxy is set, fall back to Socket adapter - if (! $this->config['proxy_host']) return parent::connect($host, $port, $secure); - - // Go through a proxy - the connection is actually to the proxy server - $host = $this->config['proxy_host']; - $port = $this->config['proxy_port']; - - // If we are connected to the wrong proxy, disconnect first - if (($this->connected_to[0] != $host || $this->connected_to[1] != $port)) { - if (is_resource($this->socket)) $this->close(); - } - - // Now, if we are not connected, connect - if (! is_resource($this->socket) || ! $this->config['keepalive']) { - $this->socket = @fsockopen($host, $port, $errno, $errstr, (int) $this->config['timeout']); - if (! $this->socket) { - $this->close(); - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception( - 'Unable to Connect to proxy server ' . $host . ':' . $port . '. Error #' . $errno . ': ' . $errstr); - } - - // Set the stream timeout - if (!stream_set_timeout($this->socket, (int) $this->config['timeout'])) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Unable to set the connection timeout'); - } - - // Update connected_to - $this->connected_to = array($host, $port); - } - } - - /** - * Send request to the proxy server - * - * @param string $method - * @param Zend_Uri_Http $uri - * @param string $http_ver - * @param array $headers - * @param string $body - * @return string Request as string - */ - public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') - { - // If no proxy is set, fall back to default Socket adapter - if (! $this->config['proxy_host']) return parent::write($method, $uri, $http_ver, $headers, $body); - - // Make sure we're properly connected - if (! $this->socket) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are not connected"); - } - - $host = $this->config['proxy_host']; - $port = $this->config['proxy_port']; - - if ($this->connected_to[0] != $host || $this->connected_to[1] != $port) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are connected to the wrong proxy server"); - } - - // Add Proxy-Authorization header - if ($this->config['proxy_user'] && ! isset($headers['proxy-authorization'])) - $headers['proxy-authorization'] = Zend_Http_Client::encodeAuthHeader( - $this->config['proxy_user'], $this->config['proxy_pass'], $this->config['proxy_auth'] - ); - - // if we are proxying HTTPS, preform CONNECT handshake with the proxy - if ($uri->getScheme() == 'https' && (! $this->negotiated)) { - $this->connectHandshake($uri->getHost(), $uri->getPort(), $http_ver, $headers); - $this->negotiated = true; - } - - // Save request method for later - $this->method = $method; - - // Build request headers - $request = "{$method} {$uri->__toString()} HTTP/{$http_ver}\r\n"; - - // Add all headers to the request string - foreach ($headers as $k => $v) { - if (is_string($k)) $v = "$k: $v"; - $request .= "$v\r\n"; - } - - // Add the request body - $request .= "\r\n" . $body; - - // Send the request - if (! @fwrite($this->socket, $request)) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception("Error writing request to proxy server"); - } - - return $request; - } - - /** - * Preform handshaking with HTTPS proxy using CONNECT method - * - * @param string $host - * @param integer $port - * @param string $http_ver - * @param array $headers - */ - protected function connectHandshake($host, $port = 443, $http_ver = '1.1', array &$headers = array()) - { - $request = "CONNECT $host:$port HTTP/$http_ver\r\n" . - "Host: " . $this->config['proxy_host'] . "\r\n"; - - // Add the user-agent header - if (isset($this->config['useragent'])) { - $request .= "User-agent: " . $this->config['useragent'] . "\r\n"; - } - - // If the proxy-authorization header is set, send it to proxy but remove - // it from headers sent to target host - if (isset($headers['proxy-authorization'])) { - $request .= "Proxy-authorization: " . $headers['proxy-authorization'] . "\r\n"; - unset($headers['proxy-authorization']); - } - - $request .= "\r\n"; - - // Send the request - if (! @fwrite($this->socket, $request)) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception("Error writing request to proxy server"); - } - - // Read response headers only - $response = ''; - $gotStatus = false; - while ($line = @fgets($this->socket)) { - $gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false); - if ($gotStatus) { - $response .= $line; - if (!chop($line)) break; - } - } - - // Check that the response from the proxy is 200 - if (Zend_Http_Response::extractCode($response) != 200) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception("Unable to connect to HTTPS proxy. Server response: " . $response); - } - - // If all is good, switch socket to secure mode. We have to fall back - // through the different modes - $modes = array( - STREAM_CRYPTO_METHOD_TLS_CLIENT, - STREAM_CRYPTO_METHOD_SSLv3_CLIENT, - STREAM_CRYPTO_METHOD_SSLv23_CLIENT, - STREAM_CRYPTO_METHOD_SSLv2_CLIENT - ); - - $success = false; - foreach($modes as $mode) { - $success = stream_socket_enable_crypto($this->socket, true, $mode); - if ($success) break; - } - - if (! $success) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception("Unable to connect to" . - " HTTPS server through proxy: could not negotiate secure connection."); - } - } - - /** - * Close the connection to the server - * - */ - public function close() - { - parent::close(); - $this->negotiated = false; - } - - /** - * Destructor: make sure the socket is disconnected - * - */ - public function __destruct() - { - if ($this->socket) $this->close(); - } -} diff --git a/phpQuery/phpQuery/Zend/Http/Client/Adapter/Socket.php b/phpQuery/phpQuery/Zend/Http/Client/Adapter/Socket.php deleted file mode 100644 index 01b6ef3..0000000 --- a/phpQuery/phpQuery/Zend/Http/Client/Adapter/Socket.php +++ /dev/null @@ -1,332 +0,0 @@ - false, - 'ssltransport' => 'ssl', - 'sslcert' => null, - 'sslpassphrase' => null - ); - - /** - * Request method - will be set by write() and might be used by read() - * - * @var string - */ - protected $method = null; - - /** - * Adapter constructor, currently empty. Config is set using setConfig() - * - */ - public function __construct() - { - } - - /** - * Set the configuration array for the adapter - * - * @param array $config - */ - public function setConfig($config = array()) - { - if (! is_array($config)) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception( - '$config expects an array, ' . gettype($config) . ' recieved.'); - } - - foreach ($config as $k => $v) { - $this->config[strtolower($k)] = $v; - } - } - - /** - * Connect to the remote server - * - * @param string $host - * @param int $port - * @param boolean $secure - * @param int $timeout - */ - public function connect($host, $port = 80, $secure = false) - { - // If the URI should be accessed via SSL, prepend the Hostname with ssl:// - $host = ($secure ? $this->config['ssltransport'] : 'tcp') . '://' . $host; - - // If we are connected to the wrong host, disconnect first - if (($this->connected_to[0] != $host || $this->connected_to[1] != $port)) { - if (is_resource($this->socket)) $this->close(); - } - - // Now, if we are not connected, connect - if (! is_resource($this->socket) || ! $this->config['keepalive']) { - $context = stream_context_create(); - if ($secure) { - if ($this->config['sslcert'] !== null) { - if (! stream_context_set_option($context, 'ssl', 'local_cert', - $this->config['sslcert'])) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Unable to set sslcert option'); - } - } - if ($this->config['sslpassphrase'] !== null) { - if (! stream_context_set_option($context, 'ssl', 'passphrase', - $this->config['sslpassphrase'])) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Unable to set sslpassphrase option'); - } - } - } - - $flags = STREAM_CLIENT_CONNECT; - if ($this->config['persistent']) $flags |= STREAM_CLIENT_PERSISTENT; - - $this->socket = @stream_socket_client($host . ':' . $port, - $errno, - $errstr, - (int) $this->config['timeout'], - $flags, - $context); - if (! $this->socket) { - $this->close(); - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception( - 'Unable to Connect to ' . $host . ':' . $port . '. Error #' . $errno . ': ' . $errstr); - } - - // Set the stream timeout - if (! stream_set_timeout($this->socket, (int) $this->config['timeout'])) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Unable to set the connection timeout'); - } - - // Update connected_to - $this->connected_to = array($host, $port); - } - } - - /** - * Send request to the remote server - * - * @param string $method - * @param Zend_Uri_Http $uri - * @param string $http_ver - * @param array $headers - * @param string $body - * @return string Request as string - */ - public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') - { - // Make sure we're properly connected - if (! $this->socket) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are not connected'); - } - - $host = $uri->getHost(); - $host = (strtolower($uri->getScheme()) == 'https' ? $this->config['ssltransport'] : 'tcp') . '://' . $host; - if ($this->connected_to[0] != $host || $this->connected_to[1] != $uri->getPort()) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are connected to the wrong host'); - } - - // Save request method for later - $this->method = $method; - - // Build request headers - $path = $uri->getPath(); - if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); - $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; - foreach ($headers as $k => $v) { - if (is_string($k)) $v = ucfirst($k) . ": $v"; - $request .= "$v\r\n"; - } - - // Add the request body - $request .= "\r\n" . $body; - - // Send the request - if (! @fwrite($this->socket, $request)) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Error writing request to server'); - } - - return $request; - } - - /** - * Read response from server - * - * @return string - */ - public function read() - { - // First, read headers only - $response = ''; - $gotStatus = false; - while ($line = @fgets($this->socket)) { - $gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false); - if ($gotStatus) { - $response .= $line; - if (!chop($line)) break; - } - } - - $statusCode = Zend_Http_Response::extractCode($response); - - // Handle 100 and 101 responses internally by restarting the read again - if ($statusCode == 100 || $statusCode == 101) return $this->read(); - - /** - * Responses to HEAD requests and 204 or 304 responses are not expected - * to have a body - stop reading here - */ - if ($statusCode == 304 || $statusCode == 204 || - $this->method == Zend_Http_Client::HEAD) return $response; - - // Check headers to see what kind of connection / transfer encoding we have - $headers = Zend_Http_Response::extractHeaders($response); - - // if the connection is set to close, just read until socket closes - if (isset($headers['connection']) && $headers['connection'] == 'close') { - while ($buff = @fread($this->socket, 8192)) { - $response .= $buff; - } - - $this->close(); - - // Else, if we got a transfer-encoding header (chunked body) - } elseif (isset($headers['transfer-encoding'])) { - if ($headers['transfer-encoding'] == 'chunked') { - do { - $chunk = ''; - $line = @fgets($this->socket); - $chunk .= $line; - - $hexchunksize = ltrim(chop($line), '0'); - $hexchunksize = strlen($hexchunksize) ? strtolower($hexchunksize) : 0; - - $chunksize = hexdec(chop($line)); - if (dechex($chunksize) != $hexchunksize) { - @fclose($this->socket); - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Invalid chunk size "' . - $hexchunksize . '" unable to read chunked body'); - } - - $left_to_read = $chunksize; - while ($left_to_read > 0) { - $line = @fread($this->socket, $left_to_read); - $chunk .= $line; - $left_to_read -= strlen($line); - } - - $chunk .= @fgets($this->socket); - $response .= $chunk; - } while ($chunksize > 0); - } else { - throw new Zend_Http_Client_Adapter_Exception('Cannot handle "' . - $headers['transfer-encoding'] . '" transfer encoding'); - } - - // Else, if we got the content-length header, read this number of bytes - } elseif (isset($headers['content-length'])) { - $left_to_read = $headers['content-length']; - $chunk = ''; - while ($left_to_read > 0) { - $chunk = @fread($this->socket, $left_to_read); - $left_to_read -= strlen($chunk); - $response .= $chunk; - } - - // Fallback: just read the response (should not happen) - } else { - while ($buff = @fread($this->socket, 8192)) { - $response .= $buff; - } - - $this->close(); - } - - return $response; - } - - /** - * Close the connection to the server - * - */ - public function close() - { - if (is_resource($this->socket)) @fclose($this->socket); - $this->socket = null; - $this->connected_to = array(null, null); - } - - /** - * Destructor: make sure the socket is disconnected - * - * If we are in persistent TCP mode, will not close the connection - * - */ - public function __destruct() - { - if (! $this->config['persistent']) { - if ($this->socket) $this->close(); - } - } -} diff --git a/phpQuery/phpQuery/Zend/Http/Client/Adapter/Test.php b/phpQuery/phpQuery/Zend/Http/Client/Adapter/Test.php deleted file mode 100644 index ce5c468..0000000 --- a/phpQuery/phpQuery/Zend/Http/Client/Adapter/Test.php +++ /dev/null @@ -1,193 +0,0 @@ - $v) { - $this->config[strtolower($k)] = $v; - } - } - - /** - * Connect to the remote server - * - * @param string $host - * @param int $port - * @param boolean $secure - * @param int $timeout - */ - public function connect($host, $port = 80, $secure = false) - { } - - /** - * Send request to the remote server - * - * @param string $method - * @param Zend_Uri_Http $uri - * @param string $http_ver - * @param array $headers - * @param string $body - * @return string Request as string - */ - public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') - { - $host = $uri->getHost(); - $host = (strtolower($uri->getScheme()) == 'https' ? 'sslv2://' . $host : $host); - - // Build request headers - $path = $uri->getPath(); - if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); - $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; - foreach ($headers as $k => $v) { - if (is_string($k)) $v = ucfirst($k) . ": $v"; - $request .= "$v\r\n"; - } - - // Add the request body - $request .= "\r\n" . $body; - - // Do nothing - just return the request as string - - return $request; - } - - /** - * Return the response set in $this->setResponse() - * - * @return string - */ - public function read() - { - if ($this->responseIndex >= count($this->responses)) { - $this->responseIndex = 0; - } - return $this->responses[$this->responseIndex++]; - } - - /** - * Close the connection (dummy) - * - */ - public function close() - { } - - /** - * Set the HTTP response(s) to be returned by this adapter - * - * @param Zend_Http_Response|array|string $response - */ - public function setResponse($response) - { - if ($response instanceof Zend_Http_Response) { - $response = $response->asString(); - } - - $this->responses = (array)$response; - $this->responseIndex = 0; - } - - /** - * Add another response to the response buffer. - * - * @param string $response - */ - public function addResponse($response) - { - $this->responses[] = $response; - } - - /** - * Sets the position of the response buffer. Selects which - * response will be returned on the next call to read(). - * - * @param integer $index - */ - public function setResponseIndex($index) - { - if ($index < 0 || $index >= count($this->responses)) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception( - 'Index out of range of response buffer size'); - } - $this->responseIndex = $index; - } -} diff --git a/phpQuery/phpQuery/Zend/Http/Client/Exception.php b/phpQuery/phpQuery/Zend/Http/Client/Exception.php deleted file mode 100644 index 70c8e01..0000000 --- a/phpQuery/phpQuery/Zend/Http/Client/Exception.php +++ /dev/null @@ -1,33 +0,0 @@ -name = (string) $name) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Cookies must have a name'); - } - - if (! $this->domain = (string) $domain) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Cookies must have a domain'); - } - - $this->value = (string) $value; - $this->expires = ($expires === null ? null : (int) $expires); - $this->path = ($path ? $path : '/'); - $this->secure = $secure; - } - - /** - * Get Cookie name - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Get cookie value - * - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * Get cookie domain - * - * @return string - */ - public function getDomain() - { - return $this->domain; - } - - /** - * Get the cookie path - * - * @return string - */ - public function getPath() - { - return $this->path; - } - - /** - * Get the expiry time of the cookie, or null if no expiry time is set - * - * @return int|null - */ - public function getExpiryTime() - { - return $this->expires; - } - - /** - * Check whether the cookie should only be sent over secure connections - * - * @return boolean - */ - public function isSecure() - { - return $this->secure; - } - - /** - * Check whether the cookie has expired - * - * Always returns false if the cookie is a session cookie (has no expiry time) - * - * @param int $now Timestamp to consider as "now" - * @return boolean - */ - public function isExpired($now = null) - { - if ($now === null) $now = time(); - if (is_int($this->expires) && $this->expires < $now) { - return true; - } else { - return false; - } - } - - /** - * Check whether the cookie is a session cookie (has no expiry time set) - * - * @return boolean - */ - public function isSessionCookie() - { - return ($this->expires === null); - } - - /** - * Checks whether the cookie should be sent or not in a specific scenario - * - * @param string|Zend_Uri_Http $uri URI to check against (secure, domain, path) - * @param boolean $matchSessionCookies Whether to send session cookies - * @param int $now Override the current time when checking for expiry time - * @return boolean - */ - public function match($uri, $matchSessionCookies = true, $now = null) - { - if (is_string ($uri)) { - $uri = Zend_Uri_Http::factory($uri); - } - - // Make sure we have a valid Zend_Uri_Http object - if (! ($uri->valid() && ($uri->getScheme() == 'http' || $uri->getScheme() =='https'))) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Passed URI is not a valid HTTP or HTTPS URI'); - } - - // Check that the cookie is secure (if required) and not expired - if ($this->secure && $uri->getScheme() != 'https') return false; - if ($this->isExpired($now)) return false; - if ($this->isSessionCookie() && ! $matchSessionCookies) return false; - - // Validate domain and path - // Domain is validated using tail match, while path is validated using head match - $domain_preg = preg_quote($this->getDomain(), "/"); - if (! preg_match("/{$domain_preg}$/", $uri->getHost())) return false; - $path_preg = preg_quote($this->getPath(), "/"); - if (! preg_match("/^{$path_preg}/", $uri->getPath())) return false; - - // If we didn't die until now, return true. - return true; - } - - /** - * Get the cookie as a string, suitable for sending as a "Cookie" header in an - * HTTP request - * - * @return string - */ - public function __toString() - { - return $this->name . '=' . urlencode($this->value) . ';'; - } - - /** - * Generate a new Cookie object from a cookie string - * (for example the value of the Set-Cookie HTTP header) - * - * @param string $cookieStr - * @param Zend_Uri_Http|string $ref_uri Reference URI for default values (domain, path) - * @return Zend_Http_Cookie A new Zend_Http_Cookie object or false on failure. - */ - public static function fromString($cookieStr, $ref_uri = null) - { - // Set default values - if (is_string($ref_uri)) { - $ref_uri = Zend_Uri_Http::factory($ref_uri); - } - - $name = ''; - $value = ''; - $domain = ''; - $path = ''; - $expires = null; - $secure = false; - $parts = explode(';', $cookieStr); - - // If first part does not include '=', fail - if (strpos($parts[0], '=') === false) return false; - - // Get the name and value of the cookie - list($name, $value) = explode('=', trim(array_shift($parts)), 2); - $name = trim($name); - $value = urldecode(trim($value)); - - // Set default domain and path - if ($ref_uri instanceof Zend_Uri_Http) { - $domain = $ref_uri->getHost(); - $path = $ref_uri->getPath(); - $path = substr($path, 0, strrpos($path, '/')); - } - - // Set other cookie parameters - foreach ($parts as $part) { - $part = trim($part); - if (strtolower($part) == 'secure') { - $secure = true; - continue; - } - - $keyValue = explode('=', $part, 2); - if (count($keyValue) == 2) { - list($k, $v) = $keyValue; - switch (strtolower($k)) { - case 'expires': - $expires = strtotime($v); - break; - case 'path': - $path = $v; - break; - case 'domain': - $domain = $v; - break; - default: - break; - } - } - } - - if ($name !== '') { - return new Zend_Http_Cookie($name, $value, $domain, $expires, $path, $secure); - } else { - return false; - } - } -} diff --git a/phpQuery/phpQuery/Zend/Http/CookieJar.php b/phpQuery/phpQuery/Zend/Http/CookieJar.php deleted file mode 100644 index c11174e..0000000 --- a/phpQuery/phpQuery/Zend/Http/CookieJar.php +++ /dev/null @@ -1,350 +0,0 @@ -getDomain(); - $path = $cookie->getPath(); - if (! isset($this->cookies[$domain])) $this->cookies[$domain] = array(); - if (! isset($this->cookies[$domain][$path])) $this->cookies[$domain][$path] = array(); - $this->cookies[$domain][$path][$cookie->getName()] = $cookie; - } else { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Supplient argument is not a valid cookie string or object'); - } - } - - /** - * Parse an HTTP response, adding all the cookies set in that response - * to the cookie jar. - * - * @param Zend_Http_Response $response - * @param Zend_Uri_Http|string $ref_uri Requested URI - */ - public function addCookiesFromResponse($response, $ref_uri) - { - if (! $response instanceof Zend_Http_Response) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('$response is expected to be a Response object, ' . - gettype($response) . ' was passed'); - } - - $cookie_hdrs = $response->getHeader('Set-Cookie'); - - if (is_array($cookie_hdrs)) { - foreach ($cookie_hdrs as $cookie) { - $this->addCookie($cookie, $ref_uri); - } - } elseif (is_string($cookie_hdrs)) { - $this->addCookie($cookie_hdrs, $ref_uri); - } - } - - /** - * Get all cookies in the cookie jar as an array - * - * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings - * @return array|string - */ - public function getAllCookies($ret_as = self::COOKIE_OBJECT) - { - $cookies = $this->_flattenCookiesArray($this->cookies, $ret_as); - return $cookies; - } - - /** - * Return an array of all cookies matching a specific request according to the request URI, - * whether session cookies should be sent or not, and the time to consider as "now" when - * checking cookie expiry time. - * - * @param string|Zend_Uri_Http $uri URI to check against (secure, domain, path) - * @param boolean $matchSessionCookies Whether to send session cookies - * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings - * @param int $now Override the current time when checking for expiry time - * @return array|string - */ - public function getMatchingCookies($uri, $matchSessionCookies = true, - $ret_as = self::COOKIE_OBJECT, $now = null) - { - if (is_string($uri)) $uri = Zend_Uri::factory($uri); - if (! $uri instanceof Zend_Uri_Http) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception("Invalid URI string or object passed"); - } - - // Set path - $path = $uri->getPath(); - $path = substr($path, 0, strrpos($path, '/')); - if (! $path) $path = '/'; - - // First, reduce the array of cookies to only those matching domain and path - $cookies = $this->_matchDomain($uri->getHost()); - $cookies = $this->_matchPath($cookies, $path); - $cookies = $this->_flattenCookiesArray($cookies, self::COOKIE_OBJECT); - - // Next, run Cookie->match on all cookies to check secure, time and session mathcing - $ret = array(); - foreach ($cookies as $cookie) - if ($cookie->match($uri, $matchSessionCookies, $now)) - $ret[] = $cookie; - - // Now, use self::_flattenCookiesArray again - only to convert to the return format ;) - $ret = $this->_flattenCookiesArray($ret, $ret_as); - - return $ret; - } - - /** - * Get a specific cookie according to a URI and name - * - * @param Zend_Uri_Http|string $uri The uri (domain and path) to match - * @param string $cookie_name The cookie's name - * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings - * @return Zend_Http_Cookie|string - */ - public function getCookie($uri, $cookie_name, $ret_as = self::COOKIE_OBJECT) - { - if (is_string($uri)) { - $uri = Zend_Uri::factory($uri); - } - - if (! $uri instanceof Zend_Uri_Http) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Invalid URI specified'); - } - - // Get correct cookie path - $path = $uri->getPath(); - $path = substr($path, 0, strrpos($path, '/')); - if (! $path) $path = '/'; - - if (isset($this->cookies[$uri->getHost()][$path][$cookie_name])) { - $cookie = $this->cookies[$uri->getHost()][$path][$cookie_name]; - - switch ($ret_as) { - case self::COOKIE_OBJECT: - return $cookie; - break; - - case self::COOKIE_STRING_ARRAY: - case self::COOKIE_STRING_CONCAT: - return $cookie->__toString(); - break; - - default: - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception("Invalid value passed for \$ret_as: {$ret_as}"); - break; - } - } else { - return false; - } - } - - /** - * Helper function to recursivly flatten an array. Shoud be used when exporting the - * cookies array (or parts of it) - * - * @param Zend_Http_Cookie|array $ptr - * @param int $ret_as What value to return - * @return array|string - */ - protected function _flattenCookiesArray($ptr, $ret_as = self::COOKIE_OBJECT) { - if (is_array($ptr)) { - $ret = ($ret_as == self::COOKIE_STRING_CONCAT ? '' : array()); - foreach ($ptr as $item) { - if ($ret_as == self::COOKIE_STRING_CONCAT) { - $ret .= $this->_flattenCookiesArray($item, $ret_as); - } else { - $ret = array_merge($ret, $this->_flattenCookiesArray($item, $ret_as)); - } - } - return $ret; - } elseif ($ptr instanceof Zend_Http_Cookie) { - switch ($ret_as) { - case self::COOKIE_STRING_ARRAY: - return array($ptr->__toString()); - break; - - case self::COOKIE_STRING_CONCAT: - return $ptr->__toString(); - break; - - case self::COOKIE_OBJECT: - default: - return array($ptr); - break; - } - } - - return null; - } - - /** - * Return a subset of the cookies array matching a specific domain - * - * Returned array is actually an array of pointers to items in the $this->cookies array. - * - * @param string $domain - * @return array - */ - protected function _matchDomain($domain) { - $ret = array(); - - foreach (array_keys($this->cookies) as $cdom) { - $regex = "/" . preg_quote($cdom, "/") . "$/i"; - if (preg_match($regex, $domain)) $ret[$cdom] = &$this->cookies[$cdom]; - } - - return $ret; - } - - /** - * Return a subset of a domain-matching cookies that also match a specified path - * - * Returned array is actually an array of pointers to items in the $passed array. - * - * @param array $dom_array - * @param string $path - * @return array - */ - protected function _matchPath($domains, $path) { - $ret = array(); - if (substr($path, -1) != '/') $path .= '/'; - - foreach ($domains as $dom => $paths_array) { - foreach (array_keys($paths_array) as $cpath) { - $regex = "|^" . preg_quote($cpath, "|") . "|i"; - if (preg_match($regex, $path)) { - if (! isset($ret[$dom])) $ret[$dom] = array(); - $ret[$dom][$cpath] = &$paths_array[$cpath]; - } - } - } - - return $ret; - } - - /** - * Create a new CookieJar object and automatically load into it all the - * cookies set in an Http_Response object. If $uri is set, it will be - * considered as the requested URI for setting default domain and path - * of the cookie. - * - * @param Zend_Http_Response $response HTTP Response object - * @param Zend_Uri_Http|string $uri The requested URI - * @return Zend_Http_CookieJar - * @todo Add the $uri functionality. - */ - public static function fromResponse(Zend_Http_Response $response, $ref_uri) - { - $jar = new self(); - $jar->addCookiesFromResponse($response, $ref_uri); - return $jar; - } -} diff --git a/phpQuery/phpQuery/Zend/Http/Exception.php b/phpQuery/phpQuery/Zend/Http/Exception.php deleted file mode 100644 index 76e2a8d..0000000 --- a/phpQuery/phpQuery/Zend/Http/Exception.php +++ /dev/null @@ -1,33 +0,0 @@ - 'Continue', - 101 => 'Switching Protocols', - - // Success 2xx - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - - // Redirection 3xx - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', // 1.1 - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - // 306 is deprecated but reserved - 307 => 'Temporary Redirect', - - // Client Error 4xx - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - - // Server Error 5xx - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 509 => 'Bandwidth Limit Exceeded' - ); - - /** - * The HTTP version (1.0, 1.1) - * - * @var string - */ - protected $version; - - /** - * The HTTP response code - * - * @var int - */ - protected $code; - - /** - * The HTTP response code as string - * (e.g. 'Not Found' for 404 or 'Internal Server Error' for 500) - * - * @var string - */ - protected $message; - - /** - * The HTTP response headers array - * - * @var array - */ - protected $headers = array(); - - /** - * The HTTP response body - * - * @var string - */ - protected $body; - - /** - * HTTP response constructor - * - * In most cases, you would use Zend_Http_Response::fromString to parse an HTTP - * response string and create a new Zend_Http_Response object. - * - * NOTE: The constructor no longer accepts nulls or empty values for the code and - * headers and will throw an exception if the passed values do not form a valid HTTP - * responses. - * - * If no message is passed, the message will be guessed according to the response code. - * - * @param int $code Response code (200, 404, ...) - * @param array $headers Headers array - * @param string $body Response body - * @param string $version HTTP version - * @param string $message Response code as text - * @throws Zend_Http_Exception - */ - public function __construct($code, $headers, $body = null, $version = '1.1', $message = null) - { - // Make sure the response code is valid and set it - if (self::responseCodeAsText($code) === null) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception("{$code} is not a valid HTTP response code"); - } - - $this->code = $code; - - // Make sure we got valid headers and set them - if (! is_array($headers)) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('No valid headers were passed'); - } - - foreach ($headers as $name => $value) { - if (is_int($name)) - list($name, $value) = explode(": ", $value, 1); - - $this->headers[ucwords(strtolower($name))] = $value; - } - - // Set the body - $this->body = $body; - - // Set the HTTP version - if (! preg_match('|^\d\.\d$|', $version)) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception("Invalid HTTP response version: $version"); - } - - $this->version = $version; - - // If we got the response message, set it. Else, set it according to - // the response code - if (is_string($message)) { - $this->message = $message; - } else { - $this->message = self::responseCodeAsText($code); - } - } - - /** - * Check whether the response is an error - * - * @return boolean - */ - public function isError() - { - $restype = floor($this->code / 100); - if ($restype == 4 || $restype == 5) { - return true; - } - - return false; - } - - /** - * Check whether the response in successful - * - * @return boolean - */ - public function isSuccessful() - { - $restype = floor($this->code / 100); - if ($restype == 2 || $restype == 1) { // Shouldn't 3xx count as success as well ??? - return true; - } - - return false; - } - - /** - * Check whether the response is a redirection - * - * @return boolean - */ - public function isRedirect() - { - $restype = floor($this->code / 100); - if ($restype == 3) { - return true; - } - - return false; - } - - /** - * Get the response body as string - * - * This method returns the body of the HTTP response (the content), as it - * should be in it's readable version - that is, after decoding it (if it - * was decoded), deflating it (if it was gzip compressed), etc. - * - * If you want to get the raw body (as transfered on wire) use - * $this->getRawBody() instead. - * - * @return string - */ - public function getBody() - { - $body = ''; - - // Decode the body if it was transfer-encoded - switch ($this->getHeader('transfer-encoding')) { - - // Handle chunked body - case 'chunked': - $body = self::decodeChunkedBody($this->body); - break; - - // No transfer encoding, or unknown encoding extension: - // return body as is - default: - $body = $this->body; - break; - } - - // Decode any content-encoding (gzip or deflate) if needed - switch (strtolower($this->getHeader('content-encoding'))) { - - // Handle gzip encoding - case 'gzip': - $body = self::decodeGzip($body); - break; - - // Handle deflate encoding - case 'deflate': - $body = self::decodeDeflate($body); - break; - - default: - break; - } - - return $body; - } - - /** - * Get the raw response body (as transfered "on wire") as string - * - * If the body is encoded (with Transfer-Encoding, not content-encoding - - * IE "chunked" body), gzip compressed, etc. it will not be decoded. - * - * @return string - */ - public function getRawBody() - { - return $this->body; - } - - /** - * Get the HTTP version of the response - * - * @return string - */ - public function getVersion() - { - return $this->version; - } - - /** - * Get the HTTP response status code - * - * @return int - */ - public function getStatus() - { - return $this->code; - } - - /** - * Return a message describing the HTTP response code - * (Eg. "OK", "Not Found", "Moved Permanently") - * - * @return string - */ - public function getMessage() - { - return $this->message; - } - - /** - * Get the response headers - * - * @return array - */ - public function getHeaders() - { - return $this->headers; - } - - /** - * Get a specific header as string, or null if it is not set - * - * @param string$header - * @return string|array|null - */ - public function getHeader($header) - { - $header = ucwords(strtolower($header)); - if (! is_string($header) || ! isset($this->headers[$header])) return null; - - return $this->headers[$header]; - } - - /** - * Get all headers as string - * - * @param boolean $status_line Whether to return the first status line (IE "HTTP 200 OK") - * @param string $br Line breaks (eg. "\n", "\r\n", "
") - * @return string - */ - public function getHeadersAsString($status_line = true, $br = "\n") - { - $str = ''; - - if ($status_line) { - $str = "HTTP/{$this->version} {$this->code} {$this->message}{$br}"; - } - - // Iterate over the headers and stringify them - foreach ($this->headers as $name => $value) - { - if (is_string($value)) - $str .= "{$name}: {$value}{$br}"; - - elseif (is_array($value)) { - foreach ($value as $subval) { - $str .= "{$name}: {$subval}{$br}"; - } - } - } - - return $str; - } - - /** - * Get the entire response as string - * - * @param string $br Line breaks (eg. "\n", "\r\n", "
") - * @return string - */ - public function asString($br = "\n") - { - return $this->getHeadersAsString(true, $br) . $br . $this->getRawBody(); - } - - /** - * A convenience function that returns a text representation of - * HTTP response codes. Returns 'Unknown' for unknown codes. - * Returns array of all codes, if $code is not specified. - * - * Conforms to HTTP/1.1 as defined in RFC 2616 (except for 'Unknown') - * See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 for reference - * - * @param int $code HTTP response code - * @param boolean $http11 Use HTTP version 1.1 - * @return string - */ - public static function responseCodeAsText($code = null, $http11 = true) - { - $messages = self::$messages; - if (! $http11) $messages[302] = 'Moved Temporarily'; - - if ($code === null) { - return $messages; - } elseif (isset($messages[$code])) { - return $messages[$code]; - } else { - return 'Unknown'; - } - } - - /** - * Extract the response code from a response string - * - * @param string $response_str - * @return int - */ - public static function extractCode($response_str) - { - preg_match("|^HTTP/[\d\.x]+ (\d+)|", $response_str, $m); - - if (isset($m[1])) { - return (int) $m[1]; - } else { - return false; - } - } - - /** - * Extract the HTTP message from a response - * - * @param string $response_str - * @return string - */ - public static function extractMessage($response_str) - { - preg_match("|^HTTP/[\d\.x]+ \d+ ([^\r\n]+)|", $response_str, $m); - - if (isset($m[1])) { - return $m[1]; - } else { - return false; - } - } - - /** - * Extract the HTTP version from a response - * - * @param string $response_str - * @return string - */ - public static function extractVersion($response_str) - { - preg_match("|^HTTP/([\d\.x]+) \d+|", $response_str, $m); - - if (isset($m[1])) { - return $m[1]; - } else { - return false; - } - } - - /** - * Extract the headers from a response string - * - * @param string $response_str - * @return array - */ - public static function extractHeaders($response_str) - { - $headers = array(); - - // First, split body and headers - $parts = preg_split('|(?:\r?\n){2}|m', $response_str, 2); - if (! $parts[0]) return $headers; - - // Split headers part to lines - $lines = explode("\n", $parts[0]); - unset($parts); - $last_header = null; - - foreach($lines as $line) { - $line = trim($line, "\r\n"); - if ($line == "") break; - - if (preg_match("|^([\w-]+):\s+(.+)|", $line, $m)) { - unset($last_header); - $h_name = strtolower($m[1]); - $h_value = $m[2]; - - if (isset($headers[$h_name])) { - if (! is_array($headers[$h_name])) { - $headers[$h_name] = array($headers[$h_name]); - } - - $headers[$h_name][] = $h_value; - } else { - $headers[$h_name] = $h_value; - } - $last_header = $h_name; - } elseif (preg_match("|^\s+(.+)$|", $line, $m) && $last_header !== null) { - if (is_array($headers[$last_header])) { - end($headers[$last_header]); - $last_header_key = key($headers[$last_header]); - $headers[$last_header][$last_header_key] .= $m[1]; - } else { - $headers[$last_header] .= $m[1]; - } - } - } - - return $headers; - } - - /** - * Extract the body from a response string - * - * @param string $response_str - * @return string - */ - public static function extractBody($response_str) - { - $parts = preg_split('|(?:\r?\n){2}|m', $response_str, 2); - if (isset($parts[1])) { - return $parts[1]; - } else { - return ''; - } - } - - /** - * Decode a "chunked" transfer-encoded body and return the decoded text - * - * @param string $body - * @return string - */ - public static function decodeChunkedBody($body) - { - $decBody = ''; - - while (trim($body)) { - if (! preg_match("/^([\da-fA-F]+)[^\r\n]*\r\n/sm", $body, $m)) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception("Error parsing body - doesn't seem to be a chunked message"); - } - - $length = hexdec(trim($m[1])); - $cut = strlen($m[0]); - - $decBody .= substr($body, $cut, $length); - $body = substr($body, $cut + $length + 2); - } - - return $decBody; - } - - /** - * Decode a gzip encoded message (when Content-encoding = gzip) - * - * Currently requires PHP with zlib support - * - * @param string $body - * @return string - */ - public static function decodeGzip($body) - { - if (! function_exists('gzinflate')) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Unable to decode gzipped response ' . - 'body: perhaps the zlib extension is not loaded?'); - } - - return gzinflate(substr($body, 10)); - } - - /** - * Decode a zlib deflated message (when Content-encoding = deflate) - * - * Currently requires PHP with zlib support - * - * @param string $body - * @return string - */ - public static function decodeDeflate($body) - { - if (! function_exists('gzuncompress')) { - require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Unable to decode deflated response ' . - 'body: perhaps the zlib extension is not loaded?'); - } - - return gzuncompress($body); - } - - /** - * Create a new Zend_Http_Response object from a string - * - * @param string $response_str - * @return Zend_Http_Response - */ - public static function fromString($response_str) - { - $code = self::extractCode($response_str); - $headers = self::extractHeaders($response_str); - $body = self::extractBody($response_str); - $version = self::extractVersion($response_str); - $message = self::extractMessage($response_str); - - return new Zend_Http_Response($code, $headers, $body, $version, $message); - } -} diff --git a/phpQuery/phpQuery/Zend/Json/Decoder.php b/phpQuery/phpQuery/Zend/Json/Decoder.php deleted file mode 100644 index b9bf8ba..0000000 --- a/phpQuery/phpQuery/Zend/Json/Decoder.php +++ /dev/null @@ -1,457 +0,0 @@ -_source = $source; - $this->_sourceLength = strlen($source); - $this->_token = self::EOF; - $this->_offset = 0; - - // Normalize and set $decodeType - if (!in_array($decodeType, array(Zend_Json::TYPE_ARRAY, Zend_Json::TYPE_OBJECT))) - { - $decodeType = Zend_Json::TYPE_ARRAY; - } - $this->_decodeType = $decodeType; - - // Set pointer at first token - $this->_getNextToken(); - } - - /** - * Decode a JSON source string - * - * Decodes a JSON encoded string. The value returned will be one of the - * following: - * - integer - * - float - * - boolean - * - null - * - StdClass - * - array - * - array of one or more of the above types - * - * By default, decoded objects will be returned as associative arrays; to - * return a StdClass object instead, pass {@link Zend_Json::TYPE_OBJECT} to - * the $objectDecodeType parameter. - * - * Throws a Zend_Json_Exception if the source string is null. - * - * @static - * @access public - * @param string $source String to be decoded - * @param int $objectDecodeType How objects should be decoded; should be - * either or {@link Zend_Json::TYPE_ARRAY} or - * {@link Zend_Json::TYPE_OBJECT}; defaults to TYPE_ARRAY - * @return mixed - * @throws Zend_Json_Exception - */ - public static function decode($source = null, $objectDecodeType = Zend_Json::TYPE_ARRAY) - { - if (null === $source) { - throw new Zend_Json_Exception('Must specify JSON encoded source for decoding'); - } elseif (!is_string($source)) { - throw new Zend_Json_Exception('Can only decode JSON encoded strings'); - } - - $decoder = new self($source, $objectDecodeType); - - return $decoder->_decodeValue(); - } - - - /** - * Recursive driving rountine for supported toplevel tops - * - * @return mixed - */ - protected function _decodeValue() - { - switch ($this->_token) { - case self::DATUM: - $result = $this->_tokenValue; - $this->_getNextToken(); - return($result); - break; - case self::LBRACE: - return($this->_decodeObject()); - break; - case self::LBRACKET: - return($this->_decodeArray()); - break; - default: - return null; - break; - } - } - - /** - * Decodes an object of the form: - * { "attribute: value, "attribute2" : value,...} - * - * If Zend_Json_Encoder was used to encode the original object then - * a special attribute called __className which specifies a class - * name that should wrap the data contained within the encoded source. - * - * Decodes to either an array or StdClass object, based on the value of - * {@link $_decodeType}. If invalid $_decodeType present, returns as an - * array. - * - * @return array|StdClass - */ - protected function _decodeObject() - { - $members = array(); - $tok = $this->_getNextToken(); - - while ($tok && $tok != self::RBRACE) { - if ($tok != self::DATUM || ! is_string($this->_tokenValue)) { - throw new Zend_Json_Exception('Missing key in object encoding: ' . $this->_source); - } - - $key = $this->_tokenValue; - $tok = $this->_getNextToken(); - - if ($tok != self::COLON) { - throw new Zend_Json_Exception('Missing ":" in object encoding: ' . $this->_source); - } - - $tok = $this->_getNextToken(); - $members[$key] = $this->_decodeValue(); - $tok = $this->_token; - - if ($tok == self::RBRACE) { - break; - } - - if ($tok != self::COMMA) { - throw new Zend_Json_Exception('Missing "," in object encoding: ' . $this->_source); - } - - $tok = $this->_getNextToken(); - } - - switch ($this->_decodeType) { - case Zend_Json::TYPE_OBJECT: - // Create new StdClass and populate with $members - $result = new StdClass(); - foreach ($members as $key => $value) { - $result->$key = $value; - } - break; - case Zend_Json::TYPE_ARRAY: - default: - $result = $members; - break; - } - - $this->_getNextToken(); - return $result; - } - - /** - * Decodes a JSON array format: - * [element, element2,...,elementN] - * - * @return array - */ - protected function _decodeArray() - { - $result = array(); - $starttok = $tok = $this->_getNextToken(); // Move past the '[' - $index = 0; - - while ($tok && $tok != self::RBRACKET) { - $result[$index++] = $this->_decodeValue(); - - $tok = $this->_token; - - if ($tok == self::RBRACKET || !$tok) { - break; - } - - if ($tok != self::COMMA) { - throw new Zend_Json_Exception('Missing "," in array encoding: ' . $this->_source); - } - - $tok = $this->_getNextToken(); - } - - $this->_getNextToken(); - return($result); - } - - - /** - * Removes whitepsace characters from the source input - */ - protected function _eatWhitespace() - { - if (preg_match( - '/([\t\b\f\n\r ])*/s', - $this->_source, - $matches, - PREG_OFFSET_CAPTURE, - $this->_offset) - && $matches[0][1] == $this->_offset) - { - $this->_offset += strlen($matches[0][0]); - } - } - - - /** - * Retrieves the next token from the source stream - * - * @return int Token constant value specified in class definition - */ - protected function _getNextToken() - { - $this->_token = self::EOF; - $this->_tokenValue = null; - $this->_eatWhitespace(); - - if ($this->_offset >= $this->_sourceLength) { - return(self::EOF); - } - - $str = $this->_source; - $str_length = $this->_sourceLength; - $i = $this->_offset; - $start = $i; - - switch ($str{$i}) { - case '{': - $this->_token = self::LBRACE; - break; - case '}': - $this->_token = self::RBRACE; - break; - case '[': - $this->_token = self::LBRACKET; - break; - case ']': - $this->_token = self::RBRACKET; - break; - case ',': - $this->_token = self::COMMA; - break; - case ':': - $this->_token = self::COLON; - break; - case '"': - $result = ''; - do { - $i++; - if ($i >= $str_length) { - break; - } - - $chr = $str{$i}; - if ($chr == '\\') { - $i++; - if ($i >= $str_length) { - break; - } - $chr = $str{$i}; - switch ($chr) { - case '"' : - $result .= '"'; - break; - case '\\': - $result .= '\\'; - break; - case '/' : - $result .= '/'; - break; - case 'b' : - $result .= chr(8); - break; - case 'f' : - $result .= chr(12); - break; - case 'n' : - $result .= chr(10); - break; - case 'r' : - $result .= chr(13); - break; - case 't' : - $result .= chr(9); - break; - case '\'' : - $result .= '\''; - break; - default: - throw new Zend_Json_Exception("Illegal escape " - . "sequence '" . $chr . "'"); - } - } elseif ($chr == '"') { - break; - } else { - $result .= $chr; - } - } while ($i < $str_length); - - $this->_token = self::DATUM; - //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1); - $this->_tokenValue = $result; - break; - case 't': - if (($i+ 3) < $str_length && substr($str, $start, 4) == "true") { - $this->_token = self::DATUM; - } - $this->_tokenValue = true; - $i += 3; - break; - case 'f': - if (($i+ 4) < $str_length && substr($str, $start, 5) == "false") { - $this->_token = self::DATUM; - } - $this->_tokenValue = false; - $i += 4; - break; - case 'n': - if (($i+ 3) < $str_length && substr($str, $start, 4) == "null") { - $this->_token = self::DATUM; - } - $this->_tokenValue = NULL; - $i += 3; - break; - } - - if ($this->_token != self::EOF) { - $this->_offset = $i + 1; // Consume the last token character - return($this->_token); - } - - $chr = $str{$i}; - if ($chr == '-' || $chr == '.' || ($chr >= '0' && $chr <= '9')) { - if (preg_match('/-?([0-9])*(\.[0-9]*)?((e|E)((-|\+)?)[0-9]+)?/s', - $str, $matches, PREG_OFFSET_CAPTURE, $start) && $matches[0][1] == $start) { - - $datum = $matches[0][0]; - - if (is_numeric($datum)) { - if (preg_match('/^0\d+$/', $datum)) { - throw new Zend_Json_Exception("Octal notation not supported by JSON (value: $datum)"); - } else { - $val = intval($datum); - $fVal = floatval($datum); - $this->_tokenValue = ($val == $fVal ? $val : $fVal); - } - } else { - throw new Zend_Json_Exception("Illegal number format: $datum"); - } - - $this->_token = self::DATUM; - $this->_offset = $start + strlen($datum); - } - } else { - throw new Zend_Json_Exception('Illegal Token'); - } - - return($this->_token); - } -} - diff --git a/phpQuery/phpQuery/Zend/Json/Encoder.php b/phpQuery/phpQuery/Zend/Json/Encoder.php deleted file mode 100644 index ce2024a..0000000 --- a/phpQuery/phpQuery/Zend/Json/Encoder.php +++ /dev/null @@ -1,431 +0,0 @@ -_cycleCheck = $cycleCheck; - $this->_options = $options; - } - - /** - * Use the JSON encoding scheme for the value specified - * - * @param mixed $value The value to be encoded - * @param boolean $cycleCheck Whether or not to check for possible object recursion when encoding - * @param array $options Additional options used during encoding - * @return string The encoded value - */ - public static function encode($value, $cycleCheck = false, $options = array()) - { - $encoder = new self(($cycleCheck) ? true : false, $options); - - return $encoder->_encodeValue($value); - } - - /** - * Recursive driver which determines the type of value to be encoded - * and then dispatches to the appropriate method. $values are either - * - objects (returns from {@link _encodeObject()}) - * - arrays (returns from {@link _encodeArray()}) - * - basic datums (e.g. numbers or strings) (returns from {@link _encodeDatum()}) - * - * @param $value mixed The value to be encoded - * @return string Encoded value - */ - protected function _encodeValue(&$value) - { - if (is_object($value)) { - return $this->_encodeObject($value); - } else if (is_array($value)) { - return $this->_encodeArray($value); - } - - return $this->_encodeDatum($value); - } - - - - /** - * Encode an object to JSON by encoding each of the public properties - * - * A special property is added to the JSON object called '__className' - * that contains the name of the class of $value. This is used to decode - * the object on the client into a specific class. - * - * @param $value object - * @return string - * @throws Zend_Json_Exception If recursive checks are enabled and the object has been serialized previously - */ - protected function _encodeObject(&$value) - { - if ($this->_cycleCheck) { - if ($this->_wasVisited($value)) { - - if (isset($this->_options['silenceCyclicalExceptions']) - && $this->_options['silenceCyclicalExceptions']===true) { - - return '"* RECURSION (' . get_class($value) . ') *"'; - - } else { - throw new Zend_Json_Exception( - 'Cycles not supported in JSON encoding, cycle introduced by ' - . 'class "' . get_class($value) . '"' - ); - } - } - - $this->_visited[] = $value; - } - - $props = ''; - foreach (get_object_vars($value) as $name => $propValue) { - if (isset($propValue)) { - $props .= ',' - . $this->_encodeValue($name) - . ':' - . $this->_encodeValue($propValue); - } - } - - return '{"__className":"' . get_class($value) . '"' - . $props . '}'; - } - - - /** - * Determine if an object has been serialized already - * - * @param mixed $value - * @return boolean - */ - protected function _wasVisited(&$value) - { - if (in_array($value, $this->_visited, true)) { - return true; - } - - return false; - } - - - /** - * JSON encode an array value - * - * Recursively encodes each value of an array and returns a JSON encoded - * array string. - * - * Arrays are defined as integer-indexed arrays starting at index 0, where - * the last index is (count($array) -1); any deviation from that is - * considered an associative array, and will be encoded as such. - * - * @param $array array - * @return string - */ - protected function _encodeArray(&$array) - { - $tmpArray = array(); - - // Check for associative array - if (!empty($array) && (array_keys($array) !== range(0, count($array) - 1))) { - // Associative array - $result = '{'; - foreach ($array as $key => $value) { - $key = (string) $key; - $tmpArray[] = $this->_encodeString($key) - . ':' - . $this->_encodeValue($value); - } - $result .= implode(',', $tmpArray); - $result .= '}'; - } else { - // Indexed array - $result = '['; - $length = count($array); - for ($i = 0; $i < $length; $i++) { - $tmpArray[] = $this->_encodeValue($array[$i]); - } - $result .= implode(',', $tmpArray); - $result .= ']'; - } - - return $result; - } - - - /** - * JSON encode a basic data type (string, number, boolean, null) - * - * If value type is not a string, number, boolean, or null, the string - * 'null' is returned. - * - * @param $value mixed - * @return string - */ - protected function _encodeDatum(&$value) - { - $result = 'null'; - - if (is_int($value) || is_float($value)) { - $result = (string)$value; - } elseif (is_string($value)) { - $result = $this->_encodeString($value); - } elseif (is_bool($value)) { - $result = $value ? 'true' : 'false'; - } - - return $result; - } - - - /** - * JSON encode a string value by escaping characters as necessary - * - * @param $value string - * @return string - */ - protected function _encodeString(&$string) - { - // Escape these characters with a backslash: - // " \ / \n \r \t \b \f - $search = array('\\', "\n", "\t", "\r", "\b", "\f", '"'); - $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'); - $string = str_replace($search, $replace, $string); - - // Escape certain ASCII characters: - // 0x08 => \b - // 0x0c => \f - $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string); - - return '"' . $string . '"'; - } - - - /** - * Encode the constants associated with the ReflectionClass - * parameter. The encoding format is based on the class2 format - * - * @param $cls ReflectionClass - * @return string Encoded constant block in class2 format - */ - private static function _encodeConstants(ReflectionClass $cls) - { - $result = "constants : {"; - $constants = $cls->getConstants(); - - $tmpArray = array(); - if (!empty($constants)) { - foreach ($constants as $key => $value) { - $tmpArray[] = "$key: " . self::encode($value); - } - - $result .= implode(', ', $tmpArray); - } - - return $result . "}"; - } - - - /** - * Encode the public methods of the ReflectionClass in the - * class2 format - * - * @param $cls ReflectionClass - * @return string Encoded method fragment - * - */ - private static function _encodeMethods(ReflectionClass $cls) - { - $methods = $cls->getMethods(); - $result = 'methods:{'; - - $started = false; - foreach ($methods as $method) { - if (! $method->isPublic() || !$method->isUserDefined()) { - continue; - } - - if ($started) { - $result .= ','; - } - $started = true; - - $result .= '' . $method->getName(). ':function('; - - if ('__construct' != $method->getName()) { - $parameters = $method->getParameters(); - $paramCount = count($parameters); - $argsStarted = false; - - $argNames = "var argNames=["; - foreach ($parameters as $param) { - if ($argsStarted) { - $result .= ','; - } - - $result .= $param->getName(); - - if ($argsStarted) { - $argNames .= ','; - } - - $argNames .= '"' . $param->getName() . '"'; - - $argsStarted = true; - } - $argNames .= "];"; - - $result .= "){" - . $argNames - . 'var result = ZAjaxEngine.invokeRemoteMethod(' - . "this, '" . $method->getName() - . "',argNames,arguments);" - . 'return(result);}'; - } else { - $result .= "){}"; - } - } - - return $result . "}"; - } - - - /** - * Encode the public properties of the ReflectionClass in the class2 - * format. - * - * @param $cls ReflectionClass - * @return string Encode properties list - * - */ - private static function _encodeVariables(ReflectionClass $cls) - { - $properties = $cls->getProperties(); - $propValues = get_class_vars($cls->getName()); - $result = "variables:{"; - $cnt = 0; - - $tmpArray = array(); - foreach ($properties as $prop) { - if (! $prop->isPublic()) { - continue; - } - - $tmpArray[] = $prop->getName() - . ':' - . self::encode($propValues[$prop->getName()]); - } - $result .= implode(',', $tmpArray); - - return $result . "}"; - } - - /** - * Encodes the given $className into the class2 model of encoding PHP - * classes into JavaScript class2 classes. - * NOTE: Currently only public methods and variables are proxied onto - * the client machine - * - * @param $className string The name of the class, the class must be - * instantiable using a null constructor - * @param $package string Optional package name appended to JavaScript - * proxy class name - * @return string The class2 (JavaScript) encoding of the class - * @throws Zend_Json_Exception - */ - public static function encodeClass($className, $package = '') - { - $cls = new ReflectionClass($className); - if (! $cls->isInstantiable()) { - throw new Zend_Json_Exception("$className must be instantiable"); - } - - return "Class.create('$package$className',{" - . self::_encodeConstants($cls) ."," - . self::_encodeMethods($cls) ."," - . self::_encodeVariables($cls) .'});'; - } - - - /** - * Encode several classes at once - * - * Returns JSON encoded classes, using {@link encodeClass()}. - * - * @param array $classNames - * @param string $package - * @return string - */ - public static function encodeClasses(array $classNames, $package = '') - { - $result = ''; - foreach ($classNames as $className) { - $result .= self::encodeClass($className, $package); - } - - return $result; - } - -} - diff --git a/phpQuery/phpQuery/Zend/Json/Exception.php b/phpQuery/phpQuery/Zend/Json/Exception.php deleted file mode 100644 index 5b99095..0000000 --- a/phpQuery/phpQuery/Zend/Json/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ - $dir) { - if ($dir == '.') { - $dirs[$key] = $dirPath; - } else { - $dir = rtrim($dir, '\\/'); - $dirs[$key] = $dir . DIRECTORY_SEPARATOR . $dirPath; - } - } - $file = basename($file); - self::loadFile($file, $dirs, true); - } else { - self::_securityCheck($file); - include_once $file; - } - - if (!class_exists($class, false) && !interface_exists($class, false)) { - require_once 'Zend/Exception.php'; - throw new Zend_Exception("File \"$file\" does not exist or class \"$class\" was not found in the file"); - } - } - - /** - * Loads a PHP file. This is a wrapper for PHP's include() function. - * - * $filename must be the complete filename, including any - * extension such as ".php". Note that a security check is performed that - * does not permit extended characters in the filename. This method is - * intended for loading Zend Framework files. - * - * If $dirs is a string or an array, it will search the directories - * in the order supplied, and attempt to load the first matching file. - * - * If the file was not found in the $dirs, or if no $dirs were specified, - * it will attempt to load it from PHP's include_path. - * - * If $once is TRUE, it will use include_once() instead of include(). - * - * @param string $filename - * @param string|array $dirs - OPTIONAL either a path or array of paths - * to search. - * @param boolean $once - * @return boolean - * @throws Zend_Exception - */ - public static function loadFile($filename, $dirs = null, $once = false) - { - self::_securityCheck($filename); - - /** - * Search in provided directories, as well as include_path - */ - $incPath = false; - if (!empty($dirs) && (is_array($dirs) || is_string($dirs))) { - if (is_array($dirs)) { - $dirs = implode(PATH_SEPARATOR, $dirs); - } - $incPath = get_include_path(); - set_include_path($dirs . PATH_SEPARATOR . $incPath); - } - - /** - * Try finding for the plain filename in the include_path. - */ - if ($once) { - include_once $filename; - } else { - include $filename; - } - - /** - * If searching in directories, reset include_path - */ - if ($incPath) { - set_include_path($incPath); - } - - return true; - } - - /** - * Returns TRUE if the $filename is readable, or FALSE otherwise. - * This function uses the PHP include_path, where PHP's is_readable() - * does not. - * - * @param string $filename - * @return boolean - */ - public static function isReadable($filename) - { - if (!$fh = @fopen($filename, 'r', true)) { - return false; - } - @fclose($fh); - return true; - } - - /** - * spl_autoload() suitable implementation for supporting class autoloading. - * - * Attach to spl_autoload() using the following: - * - * spl_autoload_register(array('Zend_Loader', 'autoload')); - * - * - * @param string $class - * @return string|false Class name on success; false on failure - */ - public static function autoload($class) - { - try { - self::loadClass($class); - return $class; - } catch (Exception $e) { - return false; - } - } - - /** - * Register {@link autoload()} with spl_autoload() - * - * @param string $class (optional) - * @param boolean $enabled (optional) - * @return void - * @throws Zend_Exception if spl_autoload() is not found - * or if the specified class does not have an autoload() method. - */ - public static function registerAutoload($class = 'Zend_Loader', $enabled = true) - { - if (!function_exists('spl_autoload_register')) { - require_once 'Zend/Exception.php'; - throw new Zend_Exception('spl_autoload does not exist in this PHP installation'); - } - - self::loadClass($class); - $methods = get_class_methods($class); - if (!in_array('autoload', (array) $methods)) { - require_once 'Zend/Exception.php'; - throw new Zend_Exception("The class \"$class\" does not have an autoload() method"); - } - - if ($enabled === true) { - spl_autoload_register(array($class, 'autoload')); - } else { - spl_autoload_unregister(array($class, 'autoload')); - } - } - - /** - * Ensure that filename does not contain exploits - * - * @param string $filename - * @return void - * @throws Zend_Exception - */ - protected static function _securityCheck($filename) - { - /** - * Security check - */ - if (preg_match('/[^a-z0-9\\/\\\\_.-]/i', $filename)) { - require_once 'Zend/Exception.php'; - throw new Zend_Exception('Security check: Illegal character in filename'); - } - } - - /** - * Attempt to include() the file. - * - * include() is not prefixed with the @ operator because if - * the file is loaded and contains a parse error, execution - * will halt silently and this is difficult to debug. - * - * Always set display_errors = Off on production servers! - * - * @param string $filespec - * @param boolean $once - * @return boolean - * @deprecated Since 1.5.0; use loadFile() instead - */ - protected static function _includeFile($filespec, $once = false) - { - if ($once) { - return include_once $filespec; - } else { - return include $filespec ; - } - } -} diff --git a/phpQuery/phpQuery/Zend/Registry.php b/phpQuery/phpQuery/Zend/Registry.php deleted file mode 100644 index 62d9ceb..0000000 --- a/phpQuery/phpQuery/Zend/Registry.php +++ /dev/null @@ -1,195 +0,0 @@ -offsetExists($index)) { - require_once 'Zend/Exception.php'; - throw new Zend_Exception("No entry is registered for key '$index'"); - } - - return $instance->offsetGet($index); - } - - /** - * setter method, basically same as offsetSet(). - * - * This method can be called from an object of type Zend_Registry, or it - * can be called statically. In the latter case, it uses the default - * static instance stored in the class. - * - * @param string $index The location in the ArrayObject in which to store - * the value. - * @param mixed $value The object to store in the ArrayObject. - * @return void - */ - public static function set($index, $value) - { - $instance = self::getInstance(); - $instance->offsetSet($index, $value); - } - - /** - * Returns TRUE if the $index is a named value in the registry, - * or FALSE if $index was not found in the registry. - * - * @param string $index - * @return boolean - */ - public static function isRegistered($index) - { - if (self::$_registry === null) { - return false; - } - return self::$_registry->offsetExists($index); - } - - /** - * @param string $index - * @returns mixed - * - * Workaround for http://bugs.php.net/bug.php?id=40442 (ZF-960). - */ - public function offsetExists($index) - { - return array_key_exists($index, $this); - } - -} diff --git a/phpQuery/phpQuery/Zend/Uri.php b/phpQuery/phpQuery/Zend/Uri.php deleted file mode 100644 index 4c5776b..0000000 --- a/phpQuery/phpQuery/Zend/Uri.php +++ /dev/null @@ -1,164 +0,0 @@ -getUri(); - } - - /** - * Convenience function, checks that a $uri string is well-formed - * by validating it but not returning an object. Returns TRUE if - * $uri is a well-formed URI, or FALSE otherwise. - * - * @param string $uri The URI to check - * @return boolean - */ - public static function check($uri) - { - try { - $uri = self::factory($uri); - } catch (Exception $e) { - return false; - } - - return $uri->valid(); - } - - /** - * Create a new Zend_Uri object for a URI. If building a new URI, then $uri should contain - * only the scheme (http, ftp, etc). Otherwise, supply $uri with the complete URI. - * - * @param string $uri The URI form which a Zend_Uri instance is created - * @throws Zend_Uri_Exception When an empty string was supplied for the scheme - * @throws Zend_Uri_Exception When an illegal scheme is supplied - * @throws Zend_Uri_Exception When the scheme is not supported - * @return Zend_Uri - * @link http://www.faqs.org/rfcs/rfc2396.html - */ - public static function factory($uri = 'http') - { - // Separate the scheme from the scheme-specific parts - $uri = explode(':', $uri, 2); - $scheme = strtolower($uri[0]); - $schemeSpecific = isset($uri[1]) === true ? $uri[1] : ''; - - if (strlen($scheme) === 0) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('An empty string was supplied for the scheme'); - } - - // Security check: $scheme is used to load a class file, so only alphanumerics are allowed. - if (ctype_alnum($scheme) === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Illegal scheme supplied, only alphanumeric characters are permitted'); - } - - /** - * Create a new Zend_Uri object for the $uri. If a subclass of Zend_Uri exists for the - * scheme, return an instance of that class. Otherwise, a Zend_Uri_Exception is thrown. - */ - switch ($scheme) { - case 'http': - // Break intentionally omitted - case 'https': - $className = 'Zend_Uri_Http'; - break; - - case 'mailto': - // TODO - default: - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception("Scheme \"$scheme\" is not supported"); - break; - } - - Zend_Loader::loadClass($className); - $schemeHandler = new $className($scheme, $schemeSpecific); - - return $schemeHandler; - } - - /** - * Get the URI's scheme - * - * @return string|false Scheme or false if no scheme is set. - */ - public function getScheme() - { - if (empty($this->_scheme) === false) { - return $this->_scheme; - } else { - return false; - } - } - - /** - * Zend_Uri and its subclasses cannot be instantiated directly. - * Use Zend_Uri::factory() to return a new Zend_Uri object. - * - * @param string $scheme The scheme of the URI - * @param string $schemeSpecific The scheme-specific part of the URI - */ - abstract protected function __construct($scheme, $schemeSpecific = ''); - - /** - * Return a string representation of this URI. - * - * @return string - */ - abstract public function getUri(); - - /** - * Returns TRUE if this URI is valid, or FALSE otherwise. - * - * @return boolean - */ - abstract public function valid(); -} diff --git a/phpQuery/phpQuery/Zend/Uri/Exception.php b/phpQuery/phpQuery/Zend/Uri/Exception.php deleted file mode 100644 index d327f3c..0000000 --- a/phpQuery/phpQuery/Zend/Uri/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ -_scheme = $scheme; - - // Set up grammar rules for validation via regular expressions. These - // are to be used with slash-delimited regular expression strings. - $this->_regex['alphanum'] = '[^\W_]'; - $this->_regex['escaped'] = '(?:%[\da-fA-F]{2})'; - $this->_regex['mark'] = '[-_.!~*\'()\[\]]'; - $this->_regex['reserved'] = '[;\/?:@&=+$,]'; - $this->_regex['unreserved'] = '(?:' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . ')'; - $this->_regex['segment'] = '(?:(?:' . $this->_regex['unreserved'] . '|' . $this->_regex['escaped'] - . '|[:@&=+$,;])*)'; - $this->_regex['path'] = '(?:\/' . $this->_regex['segment'] . '?)+'; - $this->_regex['uric'] = '(?:' . $this->_regex['reserved'] . '|' . $this->_regex['unreserved'] . '|' - . $this->_regex['escaped'] . ')'; - // If no scheme-specific part was supplied, the user intends to create - // a new URI with this object. No further parsing is required. - if (strlen($schemeSpecific) === 0) { - return; - } - - // Parse the scheme-specific URI parts into the instance variables. - $this->_parseUri($schemeSpecific); - - // Validate the URI - if ($this->valid() === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Invalid URI supplied'); - } - } - - /** - * Creates a Zend_Uri_Http from the given string - * - * @param string $uri String to create URI from, must start with - * 'http://' or 'https://' - * @throws InvalidArgumentException When the given $uri is not a string or - * does not start with http:// or https:// - * @throws Zend_Uri_Exception When the given $uri is invalid - * @return Zend_Uri_Http - */ - public static function fromString($uri) - { - if (is_string($uri) === false) { - throw new InvalidArgumentException('$uri is not a string'); - } - - $uri = explode(':', $uri, 2); - $scheme = strtolower($uri[0]); - $schemeSpecific = isset($uri[1]) === true ? $uri[1] : ''; - - if (in_array($scheme, array('http', 'https')) === false) { - throw new Zend_Uri_Exception("Invalid scheme: '$scheme'"); - } - - $schemeHandler = new Zend_Uri_Http($scheme, $schemeSpecific); - return $schemeHandler; - } - - /** - * Parse the scheme-specific portion of the URI and place its parts into instance variables. - * - * @param string $schemeSpecific The scheme-specific portion to parse - * @throws Zend_Uri_Exception When scheme-specific decoposition fails - * @throws Zend_Uri_Exception When authority decomposition fails - * @return void - */ - protected function _parseUri($schemeSpecific) - { - // High-level decomposition parser - $pattern = '~^((//)([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?$~'; - $status = @preg_match($pattern, $schemeSpecific, $matches); - if ($status === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Internal error: scheme-specific decomposition failed'); - } - - // Failed decomposition; no further processing needed - if ($status === false) { - return; - } - - // Save URI components that need no further decomposition - $this->_path = isset($matches[4]) === true ? $matches[4] : ''; - $this->_query = isset($matches[6]) === true ? $matches[6] : ''; - $this->_fragment = isset($matches[8]) === true ? $matches[8] : ''; - - // Additional decomposition to get username, password, host, and port - $combo = isset($matches[3]) === true ? $matches[3] : ''; - $pattern = '~^(([^:@]*)(:([^@]*))?@)?([^:]+)(:(.*))?$~'; - $status = @preg_match($pattern, $combo, $matches); - if ($status === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Internal error: authority decomposition failed'); - } - - // Failed decomposition; no further processing needed - if ($status === false) { - return; - } - - // Save remaining URI components - $this->_username = isset($matches[2]) === true ? $matches[2] : ''; - $this->_password = isset($matches[4]) === true ? $matches[4] : ''; - $this->_host = isset($matches[5]) === true ? $matches[5] : ''; - $this->_port = isset($matches[7]) === true ? $matches[7] : ''; - - } - - /** - * Returns a URI based on current values of the instance variables. If any - * part of the URI does not pass validation, then an exception is thrown. - * - * @throws Zend_Uri_Exception When one or more parts of the URI are invalid - * @return string - */ - public function getUri() - { - if ($this->valid() === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('One or more parts of the URI are invalid'); - } - - $password = strlen($this->_password) > 0 ? ":$this->_password" : ''; - $auth = strlen($this->_username) > 0 ? "$this->_username$password@" : ''; - $port = strlen($this->_port) > 0 ? ":$this->_port" : ''; - $query = strlen($this->_query) > 0 ? "?$this->_query" : ''; - $fragment = strlen($this->_fragment) > 0 ? "#$this->_fragment" : ''; - - return $this->_scheme - . '://' - . $auth - . $this->_host - . $port - . $this->_path - . $query - . $fragment; - } - - /** - * Validate the current URI from the instance variables. Returns true if and only if all - * parts pass validation. - * - * @return boolean - */ - public function valid() - { - // Return true if and only if all parts of the URI have passed validation - return $this->validateUsername() - and $this->validatePassword() - and $this->validateHost() - and $this->validatePort() - and $this->validatePath() - and $this->validateQuery() - and $this->validateFragment(); - } - - /** - * Returns the username portion of the URL, or FALSE if none. - * - * @return string - */ - public function getUsername() - { - return strlen($this->_username) > 0 ? $this->_username : false; - } - - /** - * Returns true if and only if the username passes validation. If no username is passed, - * then the username contained in the instance variable is used. - * - * @param string $username The HTTP username - * @throws Zend_Uri_Exception When username validation fails - * @return boolean - * @link http://www.faqs.org/rfcs/rfc2396.html - */ - public function validateUsername($username = null) - { - if ($username === null) { - $username = $this->_username; - } - - // If the username is empty, then it is considered valid - if (strlen($username) === 0) { - return true; - } - - // Check the username against the allowed values - $status = @preg_match('/^(' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . '|' - . $this->_regex['escaped'] . '|[;:&=+$,])+$/', $username); - if ($status === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Internal error: username validation failed'); - } - - return $status === 1; - } - - /** - * Sets the username for the current URI, and returns the old username - * - * @param string $username The HTTP username - * @throws Zend_Uri_Exception When $username is not a valid HTTP username - * @return string - */ - public function setUsername($username) - { - if ($this->validateUsername($username) === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception("Username \"$username\" is not a valid HTTP username"); - } - - $oldUsername = $this->_username; - $this->_username = $username; - - return $oldUsername; - } - - /** - * Returns the password portion of the URL, or FALSE if none. - * - * @return string - */ - public function getPassword() - { - return strlen($this->_password) > 0 ? $this->_password : false; - } - - /** - * Returns true if and only if the password passes validation. If no password is passed, - * then the password contained in the instance variable is used. - * - * @param string $password The HTTP password - * @throws Zend_Uri_Exception When password validation fails - * @return boolean - * @link http://www.faqs.org/rfcs/rfc2396.html - */ - public function validatePassword($password = null) - { - if ($password === null) { - $password = $this->_password; - } - - // If the password is empty, then it is considered valid - if (strlen($password) === 0) { - return true; - } - - // If the password is nonempty, but there is no username, then it is considered invalid - if (strlen($password) > 0 and strlen($this->_username) === 0) { - return false; - } - - // Check the password against the allowed values - $status = @preg_match('/^(' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . '|' - . $this->_regex['escaped'] . '|[;:&=+$,])+$/', $password); - if ($status === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Internal error: password validation failed.'); - } - - return $status == 1; - } - - /** - * Sets the password for the current URI, and returns the old password - * - * @param string $password The HTTP password - * @throws Zend_Uri_Exception When $password is not a valid HTTP password - * @return string - */ - public function setPassword($password) - { - if ($this->validatePassword($password) === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception("Password \"$password\" is not a valid HTTP password."); - } - - $oldPassword = $this->_password; - $this->_password = $password; - - return $oldPassword; - } - - /** - * Returns the domain or host IP portion of the URL, or FALSE if none. - * - * @return string - */ - public function getHost() - { - return strlen($this->_host) > 0 ? $this->_host : false; - } - - /** - * Returns true if and only if the host string passes validation. If no host is passed, - * then the host contained in the instance variable is used. - * - * @param string $host The HTTP host - * @return boolean - * @uses Zend_Filter - */ - public function validateHost($host = null) - { - if ($host === null) { - $host = $this->_host; - } - - // If the host is empty, then it is considered invalid - if (strlen($host) === 0) { - return false; - } - - // Check the host against the allowed values; delegated to Zend_Filter. - $validate = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_ALL); - - return $validate->isValid($host); - } - - /** - * Sets the host for the current URI, and returns the old host - * - * @param string $host The HTTP host - * @throws Zend_Uri_Exception When $host is nota valid HTTP host - * @return string - */ - public function setHost($host) - { - if ($this->validateHost($host) === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception("Host \"$host\" is not a valid HTTP host"); - } - - $oldHost = $this->_host; - $this->_host = $host; - - return $oldHost; - } - - /** - * Returns the TCP port, or FALSE if none. - * - * @return string - */ - public function getPort() - { - return strlen($this->_port) > 0 ? $this->_port : false; - } - - /** - * Returns true if and only if the TCP port string passes validation. If no port is passed, - * then the port contained in the instance variable is used. - * - * @param string $port The HTTP port - * @return boolean - */ - public function validatePort($port = null) - { - if ($port === null) { - $port = $this->_port; - } - - // If the port is empty, then it is considered valid - if (strlen($port) === 0) { - return true; - } - - // Check the port against the allowed values - return ctype_digit((string) $port) and 1 <= $port and $port <= 65535; - } - - /** - * Sets the port for the current URI, and returns the old port - * - * @param string $port The HTTP port - * @throws Zend_Uri_Exception When $port is not a valid HTTP port - * @return string - */ - public function setPort($port) - { - if ($this->validatePort($port) === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception("Port \"$port\" is not a valid HTTP port."); - } - - $oldPort = $this->_port; - $this->_port = $port; - - return $oldPort; - } - - /** - * Returns the path and filename portion of the URL, or FALSE if none. - * - * @return string - */ - public function getPath() - { - return strlen($this->_path) > 0 ? $this->_path : '/'; - } - - /** - * Returns true if and only if the path string passes validation. If no path is passed, - * then the path contained in the instance variable is used. - * - * @param string $path The HTTP path - * @throws Zend_Uri_Exception When path validation fails - * @return boolean - */ - public function validatePath($path = null) - { - if ($path === null) { - $path = $this->_path; - } - - // If the path is empty, then it is considered valid - if (strlen($path) === 0) { - return true; - } - - // Determine whether the path is well-formed - $pattern = '/^' . $this->_regex['path'] . '$/'; - $status = @preg_match($pattern, $path); - if ($status === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Internal error: path validation failed'); - } - - return (boolean) $status; - } - - /** - * Sets the path for the current URI, and returns the old path - * - * @param string $path The HTTP path - * @throws Zend_Uri_Exception When $path is not a valid HTTP path - * @return string - */ - public function setPath($path) - { - if ($this->validatePath($path) === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception("Path \"$path\" is not a valid HTTP path"); - } - - $oldPath = $this->_path; - $this->_path = $path; - - return $oldPath; - } - - /** - * Returns the query portion of the URL (after ?), or FALSE if none. - * - * @return string - */ - public function getQuery() - { - return strlen($this->_query) > 0 ? $this->_query : false; - } - - /** - * Returns true if and only if the query string passes validation. If no query is passed, - * then the query string contained in the instance variable is used. - * - * @param string $query The query to validate - * @throws Zend_Uri_Exception When query validation fails - * @return boolean - * @link http://www.faqs.org/rfcs/rfc2396.html - */ - public function validateQuery($query = null) - { - if ($query === null) { - $query = $this->_query; - } - - // If query is empty, it is considered to be valid - if (strlen($query) === 0) { - return true; - } - - // Determine whether the query is well-formed - $pattern = '/^' . $this->_regex['uric'] . '*$/'; - $status = @preg_match($pattern, $query); - if ($status === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Internal error: query validation failed'); - } - - return $status == 1; - } - - /** - * Set the query string for the current URI, and return the old query - * string This method accepts both strings and arrays. - * - * @param string|array $query The query string or array - * @throws Zend_Uri_Exception When $query is not a valid query string - * @return string Old query string - */ - public function setQuery($query) - { - $oldQuery = $this->_query; - - // If query is empty, set an empty string - if (empty($query) === true) { - $this->_query = ''; - return $oldQuery; - } - - // If query is an array, make a string out of it - if (is_array($query) === true) { - $query = http_build_query($query, '', '&'); - } else { - // If it is a string, make sure it is valid. If not parse and encode it - $query = (string) $query; - if ($this->validateQuery($query) === false) { - parse_str($query, $queryArray); - $query = http_build_query($queryArray, '', '&'); - } - } - - // Make sure the query is valid, and set it - if ($this->validateQuery($query) === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception("'$query' is not a valid query string"); - } - - $this->_query = $query; - - return $oldQuery; - } - - /** - * Returns the fragment portion of the URL (after #), or FALSE if none. - * - * @return string|false - */ - public function getFragment() - { - return strlen($this->_fragment) > 0 ? $this->_fragment : false; - } - - /** - * Returns true if and only if the fragment passes validation. If no fragment is passed, - * then the fragment contained in the instance variable is used. - * - * @param string $fragment Fragment of an URI - * @throws Zend_Uri_Exception When fragment validation fails - * @return boolean - * @link http://www.faqs.org/rfcs/rfc2396.html - */ - public function validateFragment($fragment = null) - { - if ($fragment === null) { - $fragment = $this->_fragment; - } - - // If fragment is empty, it is considered to be valid - if (strlen($fragment) === 0) { - return true; - } - - // Determine whether the fragment is well-formed - $pattern = '/^' . $this->_regex['uric'] . '*$/'; - $status = @preg_match($pattern, $fragment); - if ($status === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception('Internal error: fragment validation failed'); - } - - return (boolean) $status; - } - - /** - * Sets the fragment for the current URI, and returns the old fragment - * - * @param string $fragment Fragment of the current URI - * @throws Zend_Uri_Exception When $fragment is not a valid HTTP fragment - * @return string - */ - public function setFragment($fragment) - { - if ($this->validateFragment($fragment) === false) { - require_once 'Zend/Uri/Exception.php'; - throw new Zend_Uri_Exception("Fragment \"$fragment\" is not a valid HTTP fragment"); - } - - $oldFragment = $this->_fragment; - $this->_fragment = $fragment; - - return $oldFragment; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/Abstract.php b/phpQuery/phpQuery/Zend/Validate/Abstract.php deleted file mode 100644 index 1c11d54..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Abstract.php +++ /dev/null @@ -1,348 +0,0 @@ -_messages; - } - - /** - * Returns an array of the names of variables that are used in constructing validation failure messages - * - * @return array - */ - public function getMessageVariables() - { - return array_keys($this->_messageVariables); - } - - /** - * Sets the validation failure message template for a particular key - * - * @param string $messageString - * @param string $messageKey OPTIONAL - * @return Zend_Validate_Abstract Provides a fluent interface - * @throws Zend_Validate_Exception - */ - public function setMessage($messageString, $messageKey = null) - { - if ($messageKey === null) { - $keys = array_keys($this->_messageTemplates); - $messageKey = current($keys); - } - if (!isset($this->_messageTemplates[$messageKey])) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("No message template exists for key '$messageKey'"); - } - $this->_messageTemplates[$messageKey] = $messageString; - return $this; - } - - /** - * Sets validation failure message templates given as an array, where the array keys are the message keys, - * and the array values are the message template strings. - * - * @param array $messages - * @return Zend_Validate_Abstract - */ - public function setMessages(array $messages) - { - foreach ($messages as $key => $message) { - $this->setMessage($message, $key); - } - return $this; - } - - /** - * Magic function returns the value of the requested property, if and only if it is the value or a - * message variable. - * - * @param string $property - * @return mixed - * @throws Zend_Validate_Exception - */ - public function __get($property) - { - if ($property == 'value') { - return $this->_value; - } - if (array_key_exists($property, $this->_messageVariables)) { - return $this->{$this->_messageVariables[$property]}; - } - /** - * @see Zend_Validate_Exception - */ - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("No property exists by the name '$property'"); - } - - /** - * Constructs and returns a validation failure message with the given message key and value. - * - * Returns null if and only if $messageKey does not correspond to an existing template. - * - * If a translator is available and a translation exists for $messageKey, - * the translation will be used. - * - * @param string $messageKey - * @param string $value - * @return string - */ - protected function _createMessage($messageKey, $value) - { - if (!isset($this->_messageTemplates[$messageKey])) { - return null; - } - - $message = $this->_messageTemplates[$messageKey]; - - if (null !== ($translator = $this->getTranslator())) { - if ($translator->isTranslated($message)) { - $message = $translator->translate($message); - } elseif ($translator->isTranslated($messageKey)) { - $message = $translator->translate($messageKey); - } - } - - if ($this->getObscureValue()) { - $value = str_repeat('*', strlen($value)); - } - - $message = str_replace('%value%', (string) $value, $message); - foreach ($this->_messageVariables as $ident => $property) { - $message = str_replace("%$ident%", $this->$property, $message); - } - return $message; - } - - /** - * @param string $messageKey OPTIONAL - * @param string $value OPTIONAL - * @return void - */ - protected function _error($messageKey = null, $value = null) - { - if ($messageKey === null) { - $keys = array_keys($this->_messageTemplates); - $messageKey = current($keys); - } - if ($value === null) { - $value = $this->_value; - } - $this->_errors[] = $messageKey; - $this->_messages[$messageKey] = $this->_createMessage($messageKey, $value); - } - - /** - * Sets the value to be validated and clears the messages and errors arrays - * - * @param mixed $value - * @return void - */ - protected function _setValue($value) - { - $this->_value = $value; - $this->_messages = array(); - $this->_errors = array(); - } - - /** - * Returns array of validation failure message codes - * - * @return array - * @deprecated Since 1.5.0 - */ - public function getErrors() - { - return $this->_errors; - } - - /** - * Set flag indicating whether or not value should be obfuscated in messages - * - * @param bool $flag - * @return Zend_Validate_Abstract - */ - public function setObscureValue($flag) - { - $this->_obscureValue = (bool) $flag; - return $this; - } - - /** - * Retrieve flag indicating whether or not value should be obfuscated in - * messages - * - * @return bool - */ - public function getObscureValue() - { - return $this->_obscureValue; - } - - /** - * Set translation object - * - * @param Zend_Translate|Zend_Translate_Adapter|null $translator - * @return Zend_Validate_Abstract - */ - public function setTranslator($translator = null) - { - if ((null === $translator) || ($translator instanceof Zend_Translate_Adapter)) { - $this->_translator = $translator; - } elseif ($translator instanceof Zend_Translate) { - $this->_translator = $translator->getAdapter(); - } else { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception('Invalid translator specified'); - } - return $this; - } - - /** - * Return translation object - * - * @return Zend_Translate_Adapter|null - */ - public function getTranslator() - { - if (null === $this->_translator) { - return self::getDefaultTranslator(); - } - - return $this->_translator; - } - - /** - * Set default translation object for all validate objects - * - * @param Zend_Translate|Zend_Translate_Adapter|null $translator - * @return void - */ - public static function setDefaultTranslator($translator = null) - { - if ((null === $translator) || ($translator instanceof Zend_Translate_Adapter)) { - self::$_defaultTranslator = $translator; - } elseif ($translator instanceof Zend_Translate) { - self::$_defaultTranslator = $translator->getAdapter(); - } else { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception('Invalid translator specified'); - } - } - - /** - * Get default translation object for all validate objects - * - * @return Zend_Translate_Adapter|null - */ - public static function getDefaultTranslator() - { - if (null === self::$_defaultTranslator) { - require_once 'Zend/Registry.php'; - if (Zend_Registry::isRegistered('Zend_Translate')) { - $translator = Zend_Registry::get('Zend_Translate'); - if ($translator instanceof Zend_Translate_Adapter) { - return $translator; - } elseif ($translator instanceof Zend_Translate) { - return $translator->getAdapter(); - } - } - } - return self::$_defaultTranslator; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/Alnum.php b/phpQuery/phpQuery/Zend/Validate/Alnum.php deleted file mode 100644 index 36b0adc..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Alnum.php +++ /dev/null @@ -1,120 +0,0 @@ - "'%value%' has not only alphabetic and digit characters", - self::STRING_EMPTY => "'%value%' is an empty string" - ); - - /** - * Sets default option values for this instance - * - * @param boolean $allowWhiteSpace - * @return void - */ - public function __construct($allowWhiteSpace = false) - { - $this->allowWhiteSpace = (boolean) $allowWhiteSpace; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value contains only alphabetic and digit characters - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - if ('' === $valueString) { - $this->_error(self::STRING_EMPTY); - return false; - } - - if (null === self::$_filter) { - /** - * @see Zend_Filter_Alnum - */ - require_once 'Zend/Filter/Alnum.php'; - self::$_filter = new Zend_Filter_Alnum(); - } - - self::$_filter->allowWhiteSpace = $this->allowWhiteSpace; - - if ($valueString !== self::$_filter->filter($valueString)) { - $this->_error(self::NOT_ALNUM); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Alpha.php b/phpQuery/phpQuery/Zend/Validate/Alpha.php deleted file mode 100644 index 0f2298e..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Alpha.php +++ /dev/null @@ -1,120 +0,0 @@ - "'%value%' has not only alphabetic characters", - self::STRING_EMPTY => "'%value%' is an empty string" - ); - - /** - * Sets default option values for this instance - * - * @param boolean $allowWhiteSpace - * @return void - */ - public function __construct($allowWhiteSpace = false) - { - $this->allowWhiteSpace = (boolean) $allowWhiteSpace; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value contains only alphabetic characters - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - if ('' === $valueString) { - $this->_error(self::STRING_EMPTY); - return false; - } - - if (null === self::$_filter) { - /** - * @see Zend_Filter_Alpha - */ - require_once 'Zend/Filter/Alpha.php'; - self::$_filter = new Zend_Filter_Alpha(); - } - - self::$_filter->allowWhiteSpace = $this->allowWhiteSpace; - - if ($valueString !== self::$_filter->filter($valueString)) { - $this->_error(self::NOT_ALPHA); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Barcode.php b/phpQuery/phpQuery/Zend/Validate/Barcode.php deleted file mode 100644 index d51f11b..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Barcode.php +++ /dev/null @@ -1,99 +0,0 @@ -setType($barcodeType); - } - - /** - * Sets a new barcode validator - * - * @param string $barcodeType - Barcode validator to use - * @return void - * @throws Zend_Validate_Exception - */ - public function setType($barcodeType) - { - switch (strtolower($barcodeType)) { - case 'upc': - case 'upc-a': - $className = 'UpcA'; - break; - case 'ean13': - case 'ean-13': - $className = 'Ean13'; - break; - default: - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("Barcode type '$barcodeType' is not supported'"); - break; - } - - require_once 'Zend/Validate/Barcode/' . $className . '.php'; - - $class = 'Zend_Validate_Barcode_' . $className; - $this->_barcodeValidator = new $class; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value contains a valid barcode - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - return call_user_func(array($this->_barcodeValidator, 'isValid'), $value); - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/Barcode/Ean13.php b/phpQuery/phpQuery/Zend/Validate/Barcode/Ean13.php deleted file mode 100644 index 7be797d..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Barcode/Ean13.php +++ /dev/null @@ -1,100 +0,0 @@ - "'%value%' is an invalid EAN-13 barcode", - self::INVALID_LENGTH => "'%value%' should be 13 characters", - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value contains a valid barcode - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - $this->_setValue($valueString); - - if (strlen($valueString) !== 13) { - $this->_error(self::INVALID_LENGTH); - return false; - } - - $barcode = strrev(substr($valueString, 0, -1)); - $oddSum = 0; - $evenSum = 0; - - for ($i = 0; $i < 12; $i++) { - if ($i % 2 === 0) { - $oddSum += $barcode[$i] * 3; - } elseif ($i % 2 === 1) { - $evenSum += $barcode[$i]; - } - } - - $calculation = ($oddSum + $evenSum) % 10; - $checksum = ($calculation === 0) ? 0 : 10 - $calculation; - - if ($valueString[12] != $checksum) { - $this->_error(self::INVALID); - return false; - } - - return true; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/Barcode/UpcA.php b/phpQuery/phpQuery/Zend/Validate/Barcode/UpcA.php deleted file mode 100644 index c584e81..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Barcode/UpcA.php +++ /dev/null @@ -1,100 +0,0 @@ - "'%value%' is an invalid UPC-A barcode", - self::INVALID_LENGTH => "'%value%' should be 12 characters", - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value contains a valid barcode - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - $this->_setValue($valueString); - - if (strlen($valueString) !== 12) { - $this->_error(self::INVALID_LENGTH); - return false; - } - - $barcode = substr($valueString, 0, -1); - $oddSum = 0; - $evenSum = 0; - - for ($i = 0; $i < 11; $i++) { - if ($i % 2 === 0) { - $oddSum += $barcode[$i] * 3; - } elseif ($i % 2 === 1) { - $evenSum += $barcode[$i]; - } - } - - $calculation = ($oddSum + $evenSum) % 10; - $checksum = ($calculation === 0) ? 0 : 10 - $calculation; - - if ($valueString[11] != $checksum) { - $this->_error(self::INVALID); - return false; - } - - return true; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/Between.php b/phpQuery/phpQuery/Zend/Validate/Between.php deleted file mode 100644 index bb0b726..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Between.php +++ /dev/null @@ -1,200 +0,0 @@ - "'%value%' is not between '%min%' and '%max%', inclusively", - self::NOT_BETWEEN_STRICT => "'%value%' is not strictly between '%min%' and '%max%'" - ); - - /** - * Additional variables available for validation failure messages - * - * @var array - */ - protected $_messageVariables = array( - 'min' => '_min', - 'max' => '_max' - ); - - /** - * Minimum value - * - * @var mixed - */ - protected $_min; - - /** - * Maximum value - * - * @var mixed - */ - protected $_max; - - /** - * Whether to do inclusive comparisons, allowing equivalence to min and/or max - * - * If false, then strict comparisons are done, and the value may equal neither - * the min nor max options - * - * @var boolean - */ - protected $_inclusive; - - /** - * Sets validator options - * - * @param mixed $min - * @param mixed $max - * @param boolean $inclusive - * @return void - */ - public function __construct($min, $max, $inclusive = true) - { - $this->setMin($min) - ->setMax($max) - ->setInclusive($inclusive); - } - - /** - * Returns the min option - * - * @return mixed - */ - public function getMin() - { - return $this->_min; - } - - /** - * Sets the min option - * - * @param mixed $min - * @return Zend_Validate_Between Provides a fluent interface - */ - public function setMin($min) - { - $this->_min = $min; - return $this; - } - - /** - * Returns the max option - * - * @return mixed - */ - public function getMax() - { - return $this->_max; - } - - /** - * Sets the max option - * - * @param mixed $max - * @return Zend_Validate_Between Provides a fluent interface - */ - public function setMax($max) - { - $this->_max = $max; - return $this; - } - - /** - * Returns the inclusive option - * - * @return boolean - */ - public function getInclusive() - { - return $this->_inclusive; - } - - /** - * Sets the inclusive option - * - * @param boolean $inclusive - * @return Zend_Validate_Between Provides a fluent interface - */ - public function setInclusive($inclusive) - { - $this->_inclusive = $inclusive; - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is between min and max options, inclusively - * if inclusive option is true. - * - * @param mixed $value - * @return boolean - */ - public function isValid($value) - { - $this->_setValue($value); - - if ($this->_inclusive) { - if ($this->_min > $value || $value > $this->_max) { - $this->_error(self::NOT_BETWEEN); - return false; - } - } else { - if ($this->_min >= $value || $value >= $this->_max) { - $this->_error(self::NOT_BETWEEN_STRICT); - return false; - } - } - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Ccnum.php b/phpQuery/phpQuery/Zend/Validate/Ccnum.php deleted file mode 100644 index 227a4ec..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Ccnum.php +++ /dev/null @@ -1,111 +0,0 @@ - "'%value%' must contain between 13 and 19 digits", - self::CHECKSUM => "Luhn algorithm (mod-10 checksum) failed on '%value%'" - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value follows the Luhn algorithm (mod-10 checksum) - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $this->_setValue($value); - - if (null === self::$_filter) { - /** - * @see Zend_Filter_Digits - */ - require_once 'Zend/Filter/Digits.php'; - self::$_filter = new Zend_Filter_Digits(); - } - - $valueFiltered = self::$_filter->filter($value); - - $length = strlen($valueFiltered); - - if ($length < 13 || $length > 19) { - $this->_error(self::LENGTH); - return false; - } - - $sum = 0; - $weight = 2; - - for ($i = $length - 2; $i >= 0; $i--) { - $digit = $weight * $valueFiltered[$i]; - $sum += floor($digit / 10) + $digit % 10; - $weight = $weight % 2 + 1; - } - - if ((10 - $sum % 10) % 10 != $valueFiltered[$length - 1]) { - $this->_error(self::CHECKSUM, $valueFiltered); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Date.php b/phpQuery/phpQuery/Zend/Validate/Date.php deleted file mode 100644 index 220b0ee..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Date.php +++ /dev/null @@ -1,250 +0,0 @@ - "'%value%' is not of the format YYYY-MM-DD", - self::INVALID => "'%value%' does not appear to be a valid date", - self::FALSEFORMAT => "'%value%' does not fit given date format" - ); - - /** - * Optional format - * - * @var string|null - */ - protected $_format; - - /** - * Optional locale - * - * @var string|Zend_Locale|null - */ - protected $_locale; - - /** - * Sets validator options - * - * @param string $format OPTIONAL - * @param string|Zend_Locale $locale OPTIONAL - * @return void - */ - public function __construct($format = null, $locale = null) - { - $this->setFormat($format); - $this->setLocale($locale); - } - - /** - * Returns the locale option - * - * @return string|Zend_Locale|null - */ - public function getLocale() - { - return $this->_locale; - } - - /** - * Sets the locale option - * - * @param string|Zend_Locale $locale - * @return Zend_Validate_Date provides a fluent interface - */ - public function setLocale($locale = null) - { - if ($locale === null) { - $this->_locale = null; - return $this; - } - - require_once 'Zend/Locale.php'; - if (!Zend_Locale::isLocale($locale, true)) { - if (!Zend_Locale::isLocale($locale, false)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The locale '$locale' is no known locale"); - } - - $locale = new Zend_Locale($locale); - } - - $this->_locale = (string) $locale; - return $this; - } - - /** - * Returns the locale option - * - * @return string|null - */ - public function getFormat() - { - return $this->_format; - } - - /** - * Sets the format option - * - * @param string $format - * @return Zend_Validate_Date provides a fluent interface - */ - public function setFormat($format = null) - { - $this->_format = $format; - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if $value is a valid date of the format YYYY-MM-DD - * If optional $format or $locale is set the date format is checked - * according to Zend_Date, see Zend_Date::isDate() - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - if (($this->_format !== null) or ($this->_locale !== null)) { - require_once 'Zend/Date.php'; - if (!Zend_Date::isDate($value, $this->_format, $this->_locale)) { - if ($this->_checkFormat($value) === false) { - $this->_error(self::FALSEFORMAT); - } else { - $this->_error(self::INVALID); - } - return false; - } - } else { - if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $valueString)) { - $this->_error(self::NOT_YYYY_MM_DD); - return false; - } - - list($year, $month, $day) = sscanf($valueString, '%d-%d-%d'); - - if (!checkdate($month, $day, $year)) { - $this->_error(self::INVALID); - return false; - } - } - - return true; - } - - /** - * Check if the given date fits the given format - * - * @param string $value Date to check - * @return boolean False when date does not fit the format - */ - private function _checkFormat($value) - { - try { - require_once 'Zend/Locale/Format.php'; - $parsed = Zend_Locale_Format::getDate($value, array( - 'date_format' => $this->_format, 'format_type' => 'iso', - 'fix_date' => false)); - if (isset($parsed['year']) and ((strpos(strtoupper($this->_format), 'YY') !== false) and - (strpos(strtoupper($this->_format), 'YYYY') === false))) { - $parsed['year'] = Zend_Date::_century($parsed['year']); - } - } catch (Exception $e) { - // Date can not be parsed - return false; - } - - if (((strpos($this->_format, 'Y') !== false) or (strpos($this->_format, 'y') !== false)) and - (!isset($parsed['year']))) { - // Year expected but not found - return false; - } - - if ((strpos($this->_format, 'M') !== false) and (!isset($parsed['month']))) { - // Month expected but not found - return false; - } - - if ((strpos($this->_format, 'd') !== false) and (!isset($parsed['day']))) { - // Day expected but not found - return false; - } - - if (((strpos($this->_format, 'H') !== false) or (strpos($this->_format, 'h') !== false)) and - (!isset($parsed['hour']))) { - // Hour expected but not found - return false; - } - - if ((strpos($this->_format, 'm') !== false) and (!isset($parsed['minute']))) { - // Minute expected but not found - return false; - } - - if ((strpos($this->_format, 's') !== false) and (!isset($parsed['second']))) { - // Second expected but not found - return false; - } - - // Date fits the format - return true; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/Digits.php b/phpQuery/phpQuery/Zend/Validate/Digits.php deleted file mode 100644 index c42ec0a..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Digits.php +++ /dev/null @@ -1,100 +0,0 @@ - "'%value%' contains not only digit characters", - self::STRING_EMPTY => "'%value%' is an empty string" - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value only contains digit characters - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - if ('' === $valueString) { - $this->_error(self::STRING_EMPTY); - return false; - } - - if (null === self::$_filter) { - /** - * @see Zend_Filter_Digits - */ - require_once 'Zend/Filter/Digits.php'; - self::$_filter = new Zend_Filter_Digits(); - } - - if ($valueString !== self::$_filter->filter($valueString)) { - $this->_error(self::NOT_DIGITS); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/EmailAddress.php b/phpQuery/phpQuery/Zend/Validate/EmailAddress.php deleted file mode 100644 index d8e9595..0000000 --- a/phpQuery/phpQuery/Zend/Validate/EmailAddress.php +++ /dev/null @@ -1,245 +0,0 @@ - "'%value%' is not a valid email address in the basic format local-part@hostname", - self::INVALID_HOSTNAME => "'%hostname%' is not a valid hostname for email address '%value%'", - self::INVALID_MX_RECORD => "'%hostname%' does not appear to have a valid MX record for the email address '%value%'", - self::DOT_ATOM => "'%localPart%' not matched against dot-atom format", - self::QUOTED_STRING => "'%localPart%' not matched against quoted-string format", - self::INVALID_LOCAL_PART => "'%localPart%' is not a valid local part for email address '%value%'" - ); - - /** - * @var array - */ - protected $_messageVariables = array( - 'hostname' => '_hostname', - 'localPart' => '_localPart' - ); - - /** - * Local object for validating the hostname part of an email address - * - * @var Zend_Validate_Hostname - */ - public $hostnameValidator; - - /** - * Whether we check for a valid MX record via DNS - * - * @var boolean - */ - protected $_validateMx = false; - - /** - * @var string - */ - protected $_hostname; - - /** - * @var string - */ - protected $_localPart; - - /** - * Instantiates hostname validator for local use - * - * You can pass a bitfield to determine what types of hostnames are allowed. - * These bitfields are defined by the ALLOW_* constants in Zend_Validate_Hostname - * The default is to allow DNS hostnames only - * - * @param integer $allow OPTIONAL - * @param bool $validateMx OPTIONAL - * @param Zend_Validate_Hostname $hostnameValidator OPTIONAL - * @return void - */ - public function __construct($allow = Zend_Validate_Hostname::ALLOW_DNS, $validateMx = false, Zend_Validate_Hostname $hostnameValidator = null) - { - $this->setValidateMx($validateMx); - $this->setHostnameValidator($hostnameValidator, $allow); - } - - /** - * @param Zend_Validate_Hostname $hostnameValidator OPTIONAL - * @param int $allow OPTIONAL - * @return void - */ - public function setHostnameValidator(Zend_Validate_Hostname $hostnameValidator = null, $allow = Zend_Validate_Hostname::ALLOW_DNS) - { - if ($hostnameValidator === null) { - $hostnameValidator = new Zend_Validate_Hostname($allow); - } - $this->hostnameValidator = $hostnameValidator; - } - - /** - * Whether MX checking via dns_get_mx is supported or not - * - * This currently only works on UNIX systems - * - * @return boolean - */ - public function validateMxSupported() - { - return function_exists('dns_get_mx'); - } - - /** - * Set whether we check for a valid MX record via DNS - * - * This only applies when DNS hostnames are validated - * - * @param boolean $allowed Set allowed to true to validate for MX records, and false to not validate them - */ - public function setValidateMx($allowed) - { - $this->_validateMx = (bool) $allowed; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is a valid email address - * according to RFC2822 - * - * @link http://www.ietf.org/rfc/rfc2822.txt RFC2822 - * @link http://www.columbia.edu/kermit/ascii.html US-ASCII characters - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - // Split email address up - if (!preg_match('/^(.+)@([^@]+)$/', $valueString, $matches)) { - $this->_error(self::INVALID); - return false; - } - - $this->_localPart = $matches[1]; - $this->_hostname = $matches[2]; - - // Match hostname part - $hostnameResult = $this->hostnameValidator->setTranslator($this->getTranslator()) - ->isValid($this->_hostname); - if (!$hostnameResult) { - $this->_error(self::INVALID_HOSTNAME); - - // Get messages and errors from hostnameValidator - foreach ($this->hostnameValidator->getMessages() as $message) { - $this->_messages[] = $message; - } - foreach ($this->hostnameValidator->getErrors() as $error) { - $this->_errors[] = $error; - } - } - - // MX check on hostname via dns_get_record() - if ($this->_validateMx) { - if ($this->validateMxSupported()) { - $result = dns_get_mx($this->_hostname, $mxHosts); - if (count($mxHosts) < 1) { - $hostnameResult = false; - $this->_error(self::INVALID_MX_RECORD); - } - } else { - /** - * MX checks are not supported by this system - * @see Zend_Validate_Exception - */ - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception('Internal error: MX checking not available on this system'); - } - } - - // First try to match the local part on the common dot-atom format - $localResult = false; - - // Dot-atom characters are: 1*atext *("." 1*atext) - // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*", - // "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~" - $atext = 'a-zA-Z0-9\x21\x23\x24\x25\x26\x27\x2a\x2b\x2d\x2f\x3d\x3f\x5e\x5f\x60\x7b\x7c\x7d'; - if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->_localPart)) { - $localResult = true; - } else { - // Try quoted string format - - // Quoted-string characters are: DQUOTE *([FWS] qtext/quoted-pair) [FWS] DQUOTE - // qtext: Non white space controls, and the rest of the US-ASCII characters not - // including "\" or the quote character - $noWsCtl = '\x01-\x08\x0b\x0c\x0e-\x1f\x7f'; - $qtext = $noWsCtl . '\x21\x23-\x5b\x5d-\x7e'; - $ws = '\x20\x09'; - if (preg_match('/^\x22([' . $ws . $qtext . '])*[$ws]?\x22$/', $this->_localPart)) { - $localResult = true; - } else { - $this->_error(self::DOT_ATOM); - $this->_error(self::QUOTED_STRING); - $this->_error(self::INVALID_LOCAL_PART); - } - } - - // If both parts valid, return true - if ($localResult && $hostnameResult) { - return true; - } else { - return false; - } - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Exception.php b/phpQuery/phpQuery/Zend/Validate/Exception.php deleted file mode 100644 index a38077e..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ - "Too much files, only '%value%' are allowed", - self::TOO_LESS => "Too less files, minimum '%value%' must be given" - ); - - /** - * @var array Error message template variables - */ - protected $_messageVariables = array( - 'min' => '_min', - 'max' => '_max' - ); - - /** - * Minimum file count - * - * If null, there is no minimum file count - * - * @var integer - */ - protected $_min; - - /** - * Maximum file count - * - * If null, there is no maximum file count - * - * @var integer|null - */ - protected $_max; - - /** - * Internal file array - * @var array - */ - protected $_files; - - /** - * Sets validator options - * - * Min limits the file count, when used with max=null it is the maximum file count - * It also accepts an array with the keys 'min' and 'max' - * - * @param integer|array $min Minimum file count - * @param integer $max Maximum file count - * @return void - */ - public function __construct($min, $max = null) - { - $this->_files = array(); - if (is_array($min) === true) { - if (isset($min['max']) === true) { - $max = $min['max']; - } - - if (isset($min['min']) === true) { - $min = $min['min']; - } - - if (isset($min[0]) === true) { - if (count($min) === 2) { - $max = $min[1]; - $min = $min[0]; - } else { - $max = $min[0]; - $min = null; - } - } - } - - if (empty($max) === true) { - $max = $min; - $min = null; - } - - $this->setMin($min); - $this->setMax($max); - } - - /** - * Returns the minimum file count - * - * @return integer - */ - public function getMin() - { - $min = $this->_min; - - return $min; - } - - /** - * Sets the minimum file count - * - * @param integer $min The minimum file count - * @return Zend_Validate_File_Size Provides a fluent interface - * @throws Zend_Validate_Exception When min is greater than max - */ - public function setMin($min) - { - if ($min === null) { - $this->_min = null; - } else if (($this->_max !== null) and ($min > $this->_max)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception('The minimum must be less than or equal to the maximum file count, but ' - . " {$min} > {$this->_max}"); - } else { - $this->_min = max(0, (integer) $min); - } - - return $this; - } - - /** - * Returns the maximum file count - * - * @return integer|null - */ - public function getMax() - { - return $this->_max; - } - - /** - * Sets the maximum file count - * - * @param integer|null $max The maximum file count - * @throws Zend_Validate_Exception When max is smaller than min - * @return Zend_Validate_StringLength Provides a fluent interface - */ - public function setMax($max) - { - if ($max === null) { - $this->_max = null; - } else if (($this->_min !== null) and ($max < $this->_min)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The maximum must be greater than or equal to the minimum file count, but " - . "{$max} < {$this->_min}"); - } else { - $this->_max = (integer) $max; - } - - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the file count of all checked files is at least min and - * not bigger than max (when max is not null). Attention: When checking with set min you - * must give all files with the first call, otherwise you will get an false. - * - * @param string|array $value Filenames to check for count - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - if (is_string($value)) { - $value = array($value); - } - - foreach ($value as $file) { - if (!isset($this->_files[$file])) { - $this->_files[$file] = $file; - } - } - - if (($this->_max !== null) && (count($this->_files) > $this->_max)) { - $this->_value = $this->_max; - $this->_error(self::TOO_MUCH); - return false; - } - - if (($this->_min !== null) && (count($this->_files) < $this->_min)) { - $this->_value = $this->_min; - $this->_error(self::TOO_LESS); - return false; - } - - return true; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/File/Exists.php b/phpQuery/phpQuery/Zend/Validate/File/Exists.php deleted file mode 100644 index 268090b..0000000 --- a/phpQuery/phpQuery/Zend/Validate/File/Exists.php +++ /dev/null @@ -1,192 +0,0 @@ - "The file '%value%' does not exist" - ); - - /** - * Internal list of directories - * @var string - */ - protected $_directory = ''; - - /** - * @var array Error message template variables - */ - protected $_messageVariables = array( - 'directory' => '_directory' - ); - - /** - * Sets validator options - * - * @param string|array $directory - * @return void - */ - public function __construct($directory = array()) - { - $this->setDirectory($directory); - } - - /** - * Returns the set file directories which are checked - * - * @param boolean $asArray Returns the values as array, when false an concated string is returned - * @return string - */ - public function getDirectory($asArray = false) - { - $asArray = (bool) $asArray; - $directory = (string) $this->_directory; - if ($asArray) { - $directory = explode(',', $directory); - } - - return $directory; - } - - /** - * Sets the file directory which will be checked - * - * @param string|array $directory The directories to validate - * @return Zend_Validate_File_Extension Provides a fluent interface - */ - public function setDirectory($directory) - { - $this->_directory = null; - $this->addDirectory($directory); - return $this; - } - - /** - * Adds the file directory which will be checked - * - * @param string|array $directory The directory to add for validation - * @return Zend_Validate_File_Extension Provides a fluent interface - */ - public function addDirectory($directory) - { - $directories = $this->getDirectory(true); - if (is_string($directory)) { - $directory = explode(',', $directory); - } - - foreach ($directory as $content) { - if (empty($content) || !is_string($content)) { - continue; - } - - $directories[] = trim($content); - } - $directories = array_unique($directories); - - // Sanity check to ensure no empty values - foreach ($directories as $key => $dir) { - if (empty($dir)) { - unset($directories[$key]); - } - } - - $this->_directory = implode(',', $directories); - - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the file already exists in the set directories - * - * @param string $value Real file to check for existance - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - $directories = $this->getDirectory(true); - if (($file !== null) and (!empty($file['destination']))) { - $directories[] = $file['destination']; - } else if (!isset($file['name'])) { - $file['name'] = $value; - } - - $check = false; - foreach ($directories as $directory) { - if (empty($directory)) { - continue; - } - - $check = true; - if (!file_exists($directory . DIRECTORY_SEPARATOR . $file['name'])) { - $this->_throw($file, self::DOES_NOT_EXIST); - return false; - } - } - - if (!$check) { - $this->_throw($file, self::DOES_NOT_EXIST); - return false; - } - - return true; - } - - /** - * Throws an error of the given type - * - * @param string $file - * @param string $errorType - * @return false - */ - protected function _throw($file, $errorType) - { - if ($file !== null) { - $this->_value = $file['name']; - } - - $this->_error($errorType); - return false; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/File/Extension.php b/phpQuery/phpQuery/Zend/Validate/File/Extension.php deleted file mode 100644 index 62577b3..0000000 --- a/phpQuery/phpQuery/Zend/Validate/File/Extension.php +++ /dev/null @@ -1,204 +0,0 @@ - "The file '%value%' has a false extension", - self::NOT_FOUND => "The file '%value%' was not found" - ); - - /** - * Internal list of extensions - * @var string - */ - protected $_extension = ''; - - /** - * Validate case sensitive - * - * @var boolean - */ - protected $_case = false; - - /** - * @var array Error message template variables - */ - protected $_messageVariables = array( - 'extension' => '_extension' - ); - - /** - * Sets validator options - * - * @param string|array $extension - * @param boolean $case If true validation is done case sensitive - * @return void - */ - public function __construct($extension, $case = false) - { - $this->_case = (boolean) $case; - $this->setExtension($extension); - } - - /** - * Returns the set file extension - * - * @param boolean $asArray Returns the values as array, when false an concated string is returned - * @return string - */ - public function getExtension($asArray = false) - { - $asArray = (bool) $asArray; - $extension = (string) $this->_extension; - if ($asArray) { - $extension = explode(',', $extension); - } - - return $extension; - } - - /** - * Sets the file extensions - * - * @param string|array $extension The extensions to validate - * @return Zend_Validate_File_Extension Provides a fluent interface - */ - public function setExtension($extension) - { - $this->_extension = null; - $this->addExtension($extension); - return $this; - } - - /** - * Adds the file extensions - * - * @param string|array $extension The extensions to add for validation - * @return Zend_Validate_File_Extension Provides a fluent interface - */ - public function addExtension($extension) - { - $extensions = $this->getExtension(true); - if (is_string($extension)) { - $extension = explode(',', $extension); - } - - foreach ($extension as $content) { - if (empty($content) || !is_string($content)) { - continue; - } - - $extensions[] = trim($content); - } - $extensions = array_unique($extensions); - - // Sanity check to ensure no empty values - foreach ($extensions as $key => $ext) { - if (empty($ext)) { - unset($extensions[$key]); - } - } - - $this->_extension = implode(',', $extensions); - - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the fileextension of $value is included in the - * set extension list - * - * @param string $value Real file to check for extension - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - // Is file readable ? - if (!@is_readable($value)) { - $this->_throw($file, self::NOT_FOUND); - return false; - } - - if ($file !== null) { - $info['extension'] = substr($file['name'], strpos($file['name'], '.') + 1); - } else { - $info = @pathinfo($value); - } - - $extensions = $this->getExtension(true); - - if ($this->_case and (in_array($info['extension'], $extensions))) { - return true; - } else if (!$this->_case) { - foreach ($extensions as $extension) { - if (strtolower($extension) == strtolower($info['extension'])) { - return true; - } - } - } - - $this->_throw($file, self::FALSE_EXTENSION); - return false; - } - - /** - * Throws an error of the given type - * - * @param string $file - * @param string $errorType - * @return false - */ - protected function _throw($file, $errorType) - { - if ($file !== null) { - $this->_value = $file['name']; - } - - $this->_error($errorType); - return false; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/File/FilesSize.php b/phpQuery/phpQuery/Zend/Validate/File/FilesSize.php deleted file mode 100644 index e8b060d..0000000 --- a/phpQuery/phpQuery/Zend/Validate/File/FilesSize.php +++ /dev/null @@ -1,156 +0,0 @@ - "The files in sum exceed the maximum allowed size", - self::TOO_SMALL => "All files are in sum smaller than required", - self::NOT_READABLE => "One or more files can not be read" - ); - - /** - * @var array Error message template variables - */ - protected $_messageVariables = array( - 'min' => '_min', - 'max' => '_max' - ); - - /** - * Minimum filesize - * - * @var integer - */ - protected $_min; - - /** - * Maximum filesize - * - * @var integer|null - */ - protected $_max; - - /** - * Internal file array - * - * @var array - */ - protected $_files; - - /** - * Internal file size counter - * - * @var integer - */ - protected $_size; - - /** - * Sets validator options - * - * Min limits the used diskspace for all files, when used with max=null it is the maximum filesize - * It also accepts an array with the keys 'min' and 'max' - * - * @param integer|array $min Minimum diskspace for all files - * @param integer $max Maximum diskspace for all files - * @return void - */ - public function __construct($min, $max = null) - { - $this->_files = array(); - $this->_size = 0; - parent::__construct($min, $max); - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the disk usage of all files is at least min and - * not bigger than max (when max is not null). - * - * @param string|array $value Real file to check for size - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - if (is_string($value)) { - $value = array($value); - } - - foreach ($value as $files) { - // Is file readable ? - if (!@is_readable($files)) { - $this->_throw($file, self::NOT_READABLE); - return false; - } - - if (!isset($this->_files[$files])) { - $this->_files[$files] = $files; - } else { - // file already counted... do not count twice - continue; - } - - // limited to 2GB files - $size = @filesize($files); - $this->_size += $size; - $this->_setValue($this->_size); - if (($this->_max !== null) && ($this->_max < $this->_size)) { - $this->_throw($file, self::TOO_BIG); - } - } - - // Check that aggregate files are >= minimum size - if (($this->_min !== null) && ($this->_size < $this->_min)) { - $this->_throw($file, self::TOO_SMALL); - } - - if (count($this->_messages) > 0) { - return false; - } else { - return true; - } - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/File/ImageSize.php b/phpQuery/phpQuery/Zend/Validate/File/ImageSize.php deleted file mode 100644 index 6c27ef6..0000000 --- a/phpQuery/phpQuery/Zend/Validate/File/ImageSize.php +++ /dev/null @@ -1,335 +0,0 @@ - "Width of the image '%value%' is bigger than allowed", - self::WIDTH_TOO_SMALL => "Width of the image '%value%' is smaller than allowed", - self::HEIGHT_TOO_BIG => "Height of the image '%value%' is bigger than allowed", - self::HEIGHT_TOO_SMALL => "Height of the image '%value%' is smaller than allowed", - self::NOT_DETECTED => "Size of the image '%value%' could not be detected", - self::NOT_READABLE => "The image '%value%' can not be read" - ); - - /** - * @var array Error message template variables - */ - protected $_messageVariables = array( - 'minwidth' => '_minwidth', - 'maxwidth' => '_maxwidth', - 'minheight' => '_minheight', - 'maxheight' => '_maxheight' - ); - - /** - * Minimum image width - * - * @var integer - */ - protected $_minwidth; - - /** - * Maximum image width - * - * @var integer - */ - protected $_maxwidth; - - /** - * Minimum image height - * - * @var integer - */ - protected $_minheight; - - /** - * Maximum image height - * - * @var integer - */ - protected $_maxheight; - - /** - * Sets validator options - * - * Min limits the filesize, when used with max=null if is the maximum filesize - * It also accepts an array with the keys 'min' and 'max' - * - * @param integer|array $max Maximum filesize - * @param integer $max Maximum filesize - * @return void - */ - public function __construct($minwidth = 0, $minheight = 0, $maxwidth = null, $maxheight = null) - { - if (is_array($minwidth) === true) { - if (isset($minwidth['maxheight']) === true) { - $maxheight = $minwidth['maxheight']; - } - - if (isset($minwidth['minheight']) === true) { - $minheight = $minwidth['minheight']; - } - - if (isset($minwidth['maxwidth']) === true) { - $maxwidth = $minwidth['maxwidth']; - } - - if (isset($minwidth['minwidth']) === true) { - $minwidth = $minwidth['minwidth']; - } - - if (isset($minwidth[0]) === true) { - $maxheight = $minwidth[3]; - $maxwidth = $minwidth[2]; - $minheight = $minwidth[1]; - $minwidth = $minwidth[0]; - } - } - - $this->setImageMin($minwidth, $minheight); - $this->setImageMax($maxwidth, $maxheight); - } - - /** - * Returns the set minimum image sizes - * - * @return array - */ - public function getImageMin() - { - return array($this->_minwidth, $this->_minheight); - } - - /** - * Returns the set maximum image sizes - * - * @return array - */ - public function getImageMax() - { - return array($this->_maxwidth, $this->_maxheight); - } - - /** - * Returns the set image width sizes - * - * @return array - */ - public function getImageWidth() - { - return array($this->_minwidth, $this->_maxwidth); - } - - /** - * Returns the set image height sizes - * - * @return array - */ - public function getImageHeight() - { - return array($this->_minheight, $this->_maxheight); - } - - /** - * Sets the minimum image size - * - * @param integer $minwidth The minimum image width - * @param integer $minheight The minimum image height - * @throws Zend_Validate_Exception When minwidth is greater than maxwidth - * @throws Zend_Validate_Exception When minheight is greater than maxheight - * @return Zend_Validate_File_ImageSize Provides a fluent interface - */ - public function setImageMin($minwidth, $minheight) - { - if (($this->_maxwidth !== null) and ($minwidth > $this->_maxwidth)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The minimum image width must be less than or equal to the " - . " maximum image width, but {$minwidth} > {$this->_maxwidth}"); - } - - if (($this->_maxheight !== null) and ($minheight > $this->_maxheight)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The minimum image height must be less than or equal to the " - . " maximum image height, but {$minheight} > {$this->_maxheight}"); - } - - $this->_minwidth = max(0, (integer) $minwidth); - $this->_minheight = max(0, (integer) $minheight); - return $this; - } - - /** - * Sets the maximum image size - * - * @param integer $maxwidth The maximum image width - * @param integer $maxheight The maximum image height - * @throws Zend_Validate_Exception When maxwidth is smaller than minwidth - * @throws Zend_Validate_Exception When maxheight is smaller than minheight - * @return Zend_Validate_StringLength Provides a fluent interface - */ - public function setImageMax($maxwidth, $maxheight) - { - if ($maxwidth === null) { - $tempwidth = null; - } else if (($this->_minwidth !== null) and ($maxwidth < $this->_minwidth)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The maximum image width must be greater than or equal to the " - . "minimum image width, but {$maxwidth} < {$this->_minwidth}"); - } else { - $tempwidth = (integer) $maxwidth; - } - - if ($maxheight === null) { - $tempheight = null; - } else if (($this->_minheight !== null) and ($maxheight < $this->_minheight)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The maximum image height must be greater than or equal to the " - . "minimum image height, but {$maxheight} < {$this->_minwidth}"); - } else { - $tempheight = (integer) $maxheight; - } - - $this->_maxwidth = $tempwidth; - $this->_maxheight = $tempheight; - return $this; - } - - /** - * Sets the mimimum and maximum image width - * - * @param integer $minwidth The minimum image width - * @param integer $maxwidth The maximum image width - * @return Zend_Validate_File_ImageSize Provides a fluent interface - */ - public function setImageWidth($minwidth, $maxwidth) - { - $this->setImageMin($minwidth, $this->_minheight); - $this->setImageMax($maxwidth, $this->_maxheight); - return $this; - } - - /** - * Sets the mimimum and maximum image height - * - * @param integer $minheight The minimum image height - * @param integer $maxheight The maximum image height - * @return Zend_Validate_File_ImageSize Provides a fluent interface - */ - public function setImageHeight($minheight, $maxheight) - { - $this->setImageMin($this->_minwidth, $minheight); - $this->setImageMax($this->_maxwidth, $maxheight); - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the imagesize of $value is at least min and - * not bigger than max - * - * @param string $value Real file to check for image size - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - // Is file readable ? - if (@is_readable($value) === false) { - $this->_throw($file, self::NOT_READABLE); - return false; - } - - $size = @getimagesize($value); - $this->_setValue($file); - - if (empty($size) or ($size[0] === 0) or ($size[1] === 0)) { - $this->_throw($file, self::NOT_DETECTED); - return false; - } - - if ($size[0] < $this->_minwidth) { - $this->_throw($file, self::WIDTH_TOO_SMALL); - } - - if ($size[1] < $this->_minheight) { - $this->_throw($file, self::HEIGHT_TOO_SMALL); - } - - if (($this->_maxwidth !== null) and ($this->_maxwidth < $size[0])) { - $this->_throw($file, self::WIDTH_TOO_BIG); - } - - if (($this->_maxheight !== null) and ($this->_maxheight < $size[1])) { - $this->_throw($file, self::HEIGHT_TOO_BIG); - } - - if (count($this->_messages) > 0) { - return false; - } else { - return true; - } - } - - /** - * Throws an error of the given type - * - * @param string $file - * @param string $errorType - * @return false - */ - protected function _throw($file, $errorType) - { - if ($file !== null) { - $this->_value = $file['name']; - } - - $this->_error($errorType); - return false; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/File/MimeType.php b/phpQuery/phpQuery/Zend/Validate/File/MimeType.php deleted file mode 100644 index 8f7e9cd..0000000 --- a/phpQuery/phpQuery/Zend/Validate/File/MimeType.php +++ /dev/null @@ -1,200 +0,0 @@ - "The file '%value%' has a false mimetype", - self::NOT_DETECTED => "The mimetype of file '%value%' has not been detected", - self::NOT_READABLE => "The file '%value%' can not be read" - ); - - /** - * @var array - */ - protected $_messageVariables = array( - 'mimetype' => '_mimetype' - ); - - /** - * Mimetypes - * - * If null, there is no mimetype - * - * @var string|null - */ - protected $_mimetype; - - /** - * Sets validator options - * - * Mimetype to accept - * - * @param string|array $mimetype MimeType - * @return void - */ - public function __construct($mimetype) - { - $this->setMimeType($mimetype); - } - - /** - * Returns the set mimetypes - * - * @param boolean $asArray Returns the values as array, when false an concated string is returned - * @return integer - */ - public function getMimeType($asArray = false) - { - $asArray = (bool) $asArray; - $mimetype = (string) $this->_mimetype; - if ($asArray) { - $mimetype = explode(',', $mimetype); - } - - return $mimetype; - } - - /** - * Sets the mimetypes - * - * @param string|array $mimetype The mimetypes to validate - * @return Zend_Validate_File_Extension Provides a fluent interface - */ - public function setMimeType($mimetype) - { - $this->_mimetype = null; - $this->addMimeType($mimetype); - return $this; - } - - /** - * Adds the mimetypes - * - * @param string|array $mimetype The mimetypes to add for validation - * @return Zend_Validate_File_Extension Provides a fluent interface - */ - public function addMimeType($mimetype) - { - $mimetypes = $this->getMimeType(true); - if (is_string($mimetype)) { - $mimetype = explode(',', $mimetype); - } - - foreach ($mimetype as $content) { - if (empty($content) || !is_string($content)) { - continue; - } - $mimetypes[] = trim($content); - } - $mimetypes = array_unique($mimetypes); - - // Sanity check to ensure no empty values - foreach ($mimetypes as $key => $mt) { - if (empty($mt)) { - unset($mimetypes[$key]); - } - } - - $this->_mimetype = implode(',', $mimetypes); - - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if the mimetype of the file matches the given ones. Also parts - * of mimetypes can be checked. If you give for example "image" all image - * mime types will be accepted like "image/gif", "image/jpeg" and so on. - * - * @param string $value Real file to check for mimetype - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - // Is file readable ? - if (!@is_readable($value)) { - $this->_throw($file, self::NOT_READABLE); - return false; - } - - if ($file !== null) { - $info['type'] = $file['type']; - } else { - $this->_throw($file, self::NOT_DETECTED); - return false; - } - - $mimetype = $this->getMimeType(true); - if (in_array($info['type'], $mimetype)) { - return true; - } - - foreach($mimetype as $mime) { - $types = explode('/', $info['type']); - if (in_array($mime, $types)) { - return true; - } - } - - $this->_throw($file, self::FALSE_TYPE); - return false; - } - - /** - * Throws an error of the given type - * - * @param string $file - * @param string $errorType - * @return false - */ - protected function _throw($file, $errorType) - { - if ($file !== null) { - $this->_value = $file['name']; - } - - $this->_error($errorType); - return false; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/File/NotExists.php b/phpQuery/phpQuery/Zend/Validate/File/NotExists.php deleted file mode 100644 index 2b812fc..0000000 --- a/phpQuery/phpQuery/Zend/Validate/File/NotExists.php +++ /dev/null @@ -1,86 +0,0 @@ - "The file '%value%' does exist" - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the file does not exist in the set destinations - * - * @param string $value Real file to check for - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - $directories = $this->getDirectory(true); - if (($file !== null) and (!empty($file['destination']))) { - $directories[] = $file['destination']; - } else if (!isset($file['name'])) { - $file['name'] = $value; - } - - foreach ($directories as $directory) { - if (empty($directory)) { - continue; - } - - $check = true; - if (file_exists($directory . DIRECTORY_SEPARATOR . $file['name'])) { - $this->_throw($file, self::DOES_EXIST); - return false; - } - } - - if (!isset($check)) { - $this->_throw($file, self::DOES_EXIST); - return false; - } - - return true; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/File/Size.php b/phpQuery/phpQuery/Zend/Validate/File/Size.php deleted file mode 100644 index 2adaeb3..0000000 --- a/phpQuery/phpQuery/Zend/Validate/File/Size.php +++ /dev/null @@ -1,308 +0,0 @@ - "The file '%value%' is bigger than allowed", - self::TOO_SMALL => "The file '%value%' is smaller than allowed", - self::NOT_FOUND => "The file '%value%' could not be found" - ); - - /** - * @var array Error message template variables - */ - protected $_messageVariables = array( - 'min' => '_min', - 'max' => '_max' - ); - - /** - * Minimum filesize - * @var integer - */ - protected $_min; - - /** - * Maximum filesize - * - * If null, there is no maximum filesize - * - * @var integer|null - */ - protected $_max; - - /** - * Sets validator options - * - * Min limits the filesize, when used with max=null it is the maximum filesize - * It also accepts an array with the keys 'min' and 'max' - * - * @param integer|array $min Minimum filesize - * @param integer $max Maximum filesize - * @return void - */ - public function __construct($min, $max = null) - { - if (is_array($min)) { - $count = count($min); - if (array_key_exists('min', $min)) { - if (array_key_exists('max', $min)) { - $max = $min['max']; - } - - $min = $min['min']; - } elseif ($count === 2) { - $minValue = array_shift($min); - $max = array_shift($min); - $min = $minValue; - } elseif($count === 1) { - $min = array_shift($min); - $max = null; - } else { - $min = 0; - $max = null; - } - } - - if (empty($max)) { - $max = $min; - $min = 0; - } - - $this->setMin($min); - $this->setMax($max); - } - - /** - * Returns the minimum filesize - * - * @param boolean $unit Return the value with unit, when false the plan bytes will be returned - * @return integer - */ - public function getMin($unit = true) - { - $unit = (bool) $unit; - $min = $this->_min; - if ($unit) { - $min = $this->_toByteString($min); - } - return $min; - } - - /** - * Sets the minimum filesize - * - * @param integer $min The minimum filesize - * @return Zend_Validate_File_Size Provides a fluent interface - * @throws Zend_Validate_Exception When min is greater than max - */ - public function setMin($min) - { - $min = (integer) $this->_fromByteString($min); - if (($this->_max !== null) && ($min > $this->_max)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The minimum must be less than or equal to the maximum filesize, but $min >" - . " {$this->_max}"); - } - - $this->_min = max(0, $min); - return $this; - } - - /** - * Returns the maximum filesize - * - * @param boolean $unit Return the value with unit, when false the plan bytes will be returned - * @return integer|null - */ - public function getMax($unit = true) - { - $unit = (bool) $unit; - $max = $this->_max; - if ($unit) { - $max = $this->_toByteString($max); - } - return $max; - } - - /** - * Sets the maximum filesize - * - * @param integer|null $max The maximum filesize - * @return Zend_Validate_StringLength Provides a fluent interface - * @throws Zend_Validate_Exception When max is smaller than min - */ - public function setMax($max) - { - $max = (integer) $this->_fromByteString($max); - if (($this->_min !== null) && ($max < $this->_min)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The maximum must be greater than or equal to the minimum filesize, but " - . "$max < {$this->_min}"); - } else { - $this->_max = $max; - } - - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the filesize of $value is at least min and - * not bigger than max (when max is not null). - * - * @param string $value Real file to check for size - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - // Is file readable ? - if (!@is_readable($value)) { - $this->_throw($file, self::NOT_FOUND); - return false; - } - - // limited to 4GB files - $size = sprintf("%u",@filesize($value)); - $this->_setValue($size); - - // Check to see if it's smaller than min size - if (($this->_min !== null) && ($size < $this->_min)) { - $this->_throw($file, self::TOO_SMALL); - } - - // Check to see if it's larger than max size - if (($this->_max !== null) && ($this->_max < $size)) { - $this->_throw($file, self::TOO_BIG); - } - - if (count($this->_messages) > 0) { - return false; - } else { - return true; - } - } - - /** - * Returns the formatted size - * - * @param integer $size - * @return string - */ - protected function _toByteString($size) - { - $sizes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); - for ($i=0; $size > 1024 && $i < 9; $i++) { - $size /= 1024; - } - return round($size, 2).$sizes[$i]; - } - - /** - * Returns the unformatted size - * - * @param string $size - * @return integer - */ - protected function _fromByteString($size) - { - if (is_numeric($size)) { - return (integer) $size; - } - - $type = trim(substr($size, -2)); - $value = substr($size, 0, -2); - switch (strtoupper($type)) { - case 'YB': - $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024); - break; - case 'ZB': - $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024); - break; - case 'EB': - $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024); - break; - case 'PB': - $value *= (1024 * 1024 * 1024 * 1024 * 1024); - break; - case 'TB': - $value *= (1024 * 1024 * 1024 * 1024); - break; - case 'GB': - $value *= (1024 * 1024 * 1024); - break; - case 'MB': - $value *= (1024 * 1024); - break; - case 'KB': - $value *= 1024; - break; - default: - break; - } - - return $value; - } - - /** - * Throws an error of the given type - * - * @param string $file - * @param string $errorType - * @return false - */ - protected function _throw($file, $errorType) - { - if ($file !== null) { - $this->_value = $file['name']; - } - - $this->_error($errorType); - return false; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/File/Upload.php b/phpQuery/phpQuery/Zend/Validate/File/Upload.php deleted file mode 100644 index a56cf14..0000000 --- a/phpQuery/phpQuery/Zend/Validate/File/Upload.php +++ /dev/null @@ -1,216 +0,0 @@ - "The file '%value%' exceeds the defined ini size", - self::FORM_SIZE => "The file '%value%' exceeds the defined form size", - self::PARTIAL => "The file '%value%' was only partially uploaded", - self::NO_FILE => "The file '%value%' was not uploaded", - self::NO_TMP_DIR => "No temporary directory was found for the file '%value%'", - self::CANT_WRITE => "The file '%value%' can't be written", - self::EXTENSION => "The extension returned an error while uploading the file '%value%'", - self::ATTACK => "The file '%value%' was illegal uploaded, possible attack", - self::FILE_NOT_FOUND => "The file '%value%' was not found", - self::UNKNOWN => "Unknown error while uploading the file '%value%'" - ); - - /** - * Internal array of files - * @var array - */ - protected $_files = array(); - - /** - * Sets validator options - * - * The array $files must be given in syntax of Zend_File_Transfer to be checked - * If no files are given the $_FILES array will be used automatically. - * NOTE: This validator will only work with HTTP POST uploads! - * - * @param array $files Array of files in syntax of Zend_File_Transfer - * @return void - */ - public function __construct($files = array()) - { - $this->setFiles($files); - } - - /** - * Returns the array of set files - * - * @param string $files (Optional) The file to return in detail - * @return array - * @throws Zend_Validate_Exception If file is not found - */ - public function getFiles($file = null) - { - if ($file !== null) { - $return = array(); - foreach ($this->_files as $name => $content) { - if ($name === $file) { - $return[$file] = $this->_files[$name]; - } - - if ($content['name'] === $file) { - $return[$name] = $this->_files[$name]; - } - } - - if (count($return) === 0) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The file '$file' was not found"); - } - - return $return; - } - - return $this->_files; - } - - /** - * Sets the minimum filesize - * - * @param array $files The files to check in syntax of Zend_File_Transfer - * @return Zend_Validate_File_Upload Provides a fluent interface - */ - public function setFiles($files = array()) - { - if (count($files) === 0) { - $this->_files = $_FILES; - } else { - $this->_files = $files; - } - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the file was uploaded without errors - * - * @param string $value Single file to check for upload errors, when giving null the $_FILES array - * from initialization will be used - * @return boolean - */ - public function isValid($value) - { - if (array_key_exists($value, $this->_files)) { - $files[$value] = $this->_files[$value]; - } else { - foreach ($this->_files as $file => $content) { - if ($content['name'] === $value) { - $files[$file] = $this->_files[$file]; - } - - if ($content['tmp_name'] === $value) { - $files[$file] = $this->_files[$file]; - } - } - } - - if (empty($files)) { - $this->_error(self::FILE_NOT_FOUND); - return false; - } - - foreach ($files as $file => $content) { - $this->_value = $file; - switch($content['error']) { - case 0: - if (!is_uploaded_file($content['tmp_name'])) { - $this->_error(self::ATTACK); - } - break; - - case 1: - $this->_error(self::INI_SIZE); - break; - - case 2: - $this->_error(self::FORM_SIZE); - break; - - case 3: - $this->_error(self::PARTIAL); - break; - - case 4: - $this->_error(self::NO_FILE); - break; - - case 6: - $this->_error(self::NO_TMP_DIR); - break; - - case 7: - $this->_error(self::CANT_WRITE); - break; - - case 8: - $this->_error(self::EXTENSION); - break; - - default: - $this->_error(self::UNKNOWN); - break; - } - } - - if (count($this->_messages) > 0) { - return false; - } else { - return true; - } - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/Float.php b/phpQuery/phpQuery/Zend/Validate/Float.php deleted file mode 100644 index 0405161..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Float.php +++ /dev/null @@ -1,75 +0,0 @@ - "'%value%' does not appear to be a float" - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is a floating-point value - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - $locale = localeconv(); - - $valueFiltered = str_replace($locale['thousands_sep'], '', $valueString); - $valueFiltered = str_replace($locale['decimal_point'], '.', $valueFiltered); - - if (strval(floatval($valueFiltered)) != $valueFiltered) { - $this->_error(); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/GreaterThan.php b/phpQuery/phpQuery/Zend/Validate/GreaterThan.php deleted file mode 100644 index 35e658c..0000000 --- a/phpQuery/phpQuery/Zend/Validate/GreaterThan.php +++ /dev/null @@ -1,114 +0,0 @@ - "'%value%' is not greater than '%min%'" - ); - - /** - * @var array - */ - protected $_messageVariables = array( - 'min' => '_min' - ); - - /** - * Minimum value - * - * @var mixed - */ - protected $_min; - - /** - * Sets validator options - * - * @param mixed $min - * @return void - */ - public function __construct($min) - { - $this->setMin($min); - } - - /** - * Returns the min option - * - * @return mixed - */ - public function getMin() - { - return $this->_min; - } - - /** - * Sets the min option - * - * @param mixed $min - * @return Zend_Validate_GreaterThan Provides a fluent interface - */ - public function setMin($min) - { - $this->_min = $min; - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is greater than min option - * - * @param mixed $value - * @return boolean - */ - public function isValid($value) - { - $this->_setValue($value); - - if ($this->_min >= $value) { - $this->_error(); - return false; - } - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Hex.php b/phpQuery/phpQuery/Zend/Validate/Hex.php deleted file mode 100644 index 9512eda..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Hex.php +++ /dev/null @@ -1,74 +0,0 @@ - "'%value%' has not only hexadecimal digit characters" - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value contains only hexadecimal digit characters - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - if (!ctype_xdigit($valueString)) { - $this->_error(); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Hostname.php b/phpQuery/phpQuery/Zend/Validate/Hostname.php deleted file mode 100644 index ea79c24..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Hostname.php +++ /dev/null @@ -1,444 +0,0 @@ - "'%value%' appears to be an IP address, but IP addresses are not allowed", - self::UNKNOWN_TLD => "'%value%' appears to be a DNS hostname but cannot match TLD against known list", - self::INVALID_DASH => "'%value%' appears to be a DNS hostname but contains a dash (-) in an invalid position", - self::INVALID_HOSTNAME_SCHEMA => "'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'", - self::UNDECIPHERABLE_TLD => "'%value%' appears to be a DNS hostname but cannot extract TLD part", - self::INVALID_HOSTNAME => "'%value%' does not match the expected structure for a DNS hostname", - self::INVALID_LOCAL_NAME => "'%value%' does not appear to be a valid local network name", - self::LOCAL_NAME_NOT_ALLOWED => "'%value%' appears to be a local network name but local network names are not allowed" - ); - - /** - * @var array - */ - protected $_messageVariables = array( - 'tld' => '_tld' - ); - - /** - * Allows Internet domain names (e.g., example.com) - */ - const ALLOW_DNS = 1; - - /** - * Allows IP addresses - */ - const ALLOW_IP = 2; - - /** - * Allows local network names (e.g., localhost, www.localdomain) - */ - const ALLOW_LOCAL = 4; - - /** - * Allows all types of hostnames - */ - const ALLOW_ALL = 7; - - /** - * Whether IDN domains are validated - * - * @var boolean - */ - private $_validateIdn = true; - - /** - * Whether TLDs are validated against a known list - * - * @var boolean - */ - private $_validateTld = true; - - /** - * Bit field of ALLOW constants; determines which types of hostnames are allowed - * - * @var integer - */ - protected $_allow; - - /** - * Bit field of CHECK constants; determines what additional hostname checks to make - * - * @var unknown_type - */ - // protected $_check; - - /** - * Array of valid top-level-domains - * - * @var array - * @see ftp://data.iana.org/TLD/tlds-alpha-by-domain.txt List of all TLDs by domain - */ - protected $_validTlds = array( - 'ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', - 'aq', 'ar', 'arpa', 'as', 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', - 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo', - 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd', - 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop', - 'cr', 'cu', 'cv', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', - 'dz', 'ec', 'edu', 'ee', 'eg', 'er', 'es', 'et', 'eu', 'fi', 'fj', - 'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', - 'gi', 'gl', 'gm', 'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', - 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', - 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', - 'jo', 'jobs', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', - 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', - 'lv', 'ly', 'ma', 'mc', 'md', 'me', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm', - 'mn', 'mo', 'mobi', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', - 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng', - 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa', 'pe', - 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'pro', 'ps', 'pt', - 'pw', 'py', 'qa', 're', 'ro', 'rs', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', - 'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr', - 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td', 'tel', 'tf', 'tg', 'th', 'tj', - 'tk', 'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw', - 'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've', - 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm', - 'zw' - ); - - /** - * @var string - */ - protected $_tld; - - /** - * Sets validator options - * - * @param integer $allow OPTIONAL Set what types of hostname to allow (default ALLOW_DNS) - * @param boolean $validateIdn OPTIONAL Set whether IDN domains are validated (default true) - * @param boolean $validateTld OPTIONAL Set whether the TLD element of a hostname is validated (default true) - * @param Zend_Validate_Ip $ipValidator OPTIONAL - * @return void - * @see http://www.iana.org/cctld/specifications-policies-cctlds-01apr02.htm Technical Specifications for ccTLDs - */ - public function __construct($allow = self::ALLOW_DNS, $validateIdn = true, $validateTld = true, Zend_Validate_Ip $ipValidator = null) - { - // Set allow options - $this->setAllow($allow); - - // Set validation options - $this->_validateIdn = $validateIdn; - $this->_validateTld = $validateTld; - - $this->setIpValidator($ipValidator); - } - - /** - * @param Zend_Validate_Ip $ipValidator OPTIONAL - * @return void; - */ - public function setIpValidator(Zend_Validate_Ip $ipValidator = null) - { - if ($ipValidator === null) { - $ipValidator = new Zend_Validate_Ip(); - } - $this->_ipValidator = $ipValidator; - } - - /** - * Returns the allow option - * - * @return integer - */ - public function getAllow() - { - return $this->_allow; - } - - /** - * Sets the allow option - * - * @param integer $allow - * @return Zend_Validate_Hostname Provides a fluent interface - */ - public function setAllow($allow) - { - $this->_allow = $allow; - return $this; - } - - /** - * Set whether IDN domains are validated - * - * This only applies when DNS hostnames are validated - * - * @param boolean $allowed Set allowed to true to validate IDNs, and false to not validate them - */ - public function setValidateIdn ($allowed) - { - $this->_validateIdn = (bool) $allowed; - } - - /** - * Set whether the TLD element of a hostname is validated - * - * This only applies when DNS hostnames are validated - * - * @param boolean $allowed Set allowed to true to validate TLDs, and false to not validate them - */ - public function setValidateTld ($allowed) - { - $this->_validateTld = (bool) $allowed; - } - - /** - * Sets the check option - * - * @param integer $check - * @return Zend_Validate_Hostname Provides a fluent interface - */ - /* - public function setCheck($check) - { - $this->_check = $check; - return $this; - } - */ - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the $value is a valid hostname with respect to the current allow option - * - * @param string $value - * @throws Zend_Validate_Exception if a fatal error occurs for validation process - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - // Check input against IP address schema - if ($this->_ipValidator->setTranslator($this->getTranslator())->isValid($valueString)) { - if (!($this->_allow & self::ALLOW_IP)) { - $this->_error(self::IP_ADDRESS_NOT_ALLOWED); - return false; - } else{ - return true; - } - } - - // Check input against DNS hostname schema - $domainParts = explode('.', $valueString); - if ((count($domainParts) > 1) && (strlen($valueString) >= 4) && (strlen($valueString) <= 254)) { - $status = false; - - do { - // First check TLD - if (preg_match('/([a-z]{2,10})$/i', end($domainParts), $matches)) { - - reset($domainParts); - - // Hostname characters are: *(label dot)(label dot label); max 254 chars - // label: id-prefix [*ldh{61} id-prefix]; max 63 chars - // id-prefix: alpha / digit - // ldh: alpha / digit / dash - - // Match TLD against known list - $this->_tld = strtolower($matches[1]); - if ($this->_validateTld) { - if (!in_array($this->_tld, $this->_validTlds)) { - $this->_error(self::UNKNOWN_TLD); - $status = false; - break; - } - } - - /** - * Match against IDN hostnames - * @see Zend_Validate_Hostname_Interface - */ - $labelChars = 'a-z0-9'; - $utf8 = false; - $classFile = 'Zend/Validate/Hostname/' . ucfirst($this->_tld) . '.php'; - if ($this->_validateIdn) { - if (Zend_Loader::isReadable($classFile)) { - - // Load additional characters - $className = 'Zend_Validate_Hostname_' . ucfirst($this->_tld); - Zend_Loader::loadClass($className); - $labelChars .= call_user_func(array($className, 'getCharacters')); - $utf8 = true; - } - } - - // Keep label regex short to avoid issues with long patterns when matching IDN hostnames - $regexLabel = '/^[' . $labelChars . '\x2d]{1,63}$/i'; - if ($utf8) { - $regexLabel .= 'u'; - } - - // Check each hostname part - $valid = true; - foreach ($domainParts as $domainPart) { - - // Check dash (-) does not start, end or appear in 3rd and 4th positions - if (strpos($domainPart, '-') === 0 || - (strlen($domainPart) > 2 && strpos($domainPart, '-', 2) == 2 && strpos($domainPart, '-', 3) == 3) || - strrpos($domainPart, '-') === strlen($domainPart) - 1) { - - $this->_error(self::INVALID_DASH); - $status = false; - break 2; - } - - // Check each domain part - $status = @preg_match($regexLabel, $domainPart); - if ($status === false) { - /** - * Regex error - * @see Zend_Validate_Exception - */ - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception('Internal error: DNS validation failed'); - } elseif ($status === 0) { - $valid = false; - } - } - - // If all labels didn't match, the hostname is invalid - if (!$valid) { - $this->_error(self::INVALID_HOSTNAME_SCHEMA); - $status = false; - } - - } else { - // Hostname not long enough - $this->_error(self::UNDECIPHERABLE_TLD); - $status = false; - } - } while (false); - - // If the input passes as an Internet domain name, and domain names are allowed, then the hostname - // passes validation - if ($status && ($this->_allow & self::ALLOW_DNS)) { - return true; - } - } else { - $this->_error(self::INVALID_HOSTNAME); - } - - // Check input against local network name schema; last chance to pass validation - $regexLocal = '/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/'; - $status = @preg_match($regexLocal, $valueString); - if (false === $status) { - /** - * Regex error - * @see Zend_Validate_Exception - */ - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception('Internal error: local network name validation failed'); - } - - // If the input passes as a local network name, and local network names are allowed, then the - // hostname passes validation - $allowLocal = $this->_allow & self::ALLOW_LOCAL; - if ($status && $allowLocal) { - return true; - } - - // If the input does not pass as a local network name, add a message - if (!$status) { - $this->_error(self::INVALID_LOCAL_NAME); - } - - // If local network names are not allowed, add a message - if ($status && !$allowLocal) { - $this->_error(self::LOCAL_NAME_NOT_ALLOWED); - } - - return false; - } - - /** - * Throws an exception if a regex for $type does not exist - * - * @param string $type - * @throws Zend_Validate_Exception - * @return Zend_Validate_Hostname Provides a fluent interface - */ - /* - protected function _checkRegexType($type) - { - if (!isset($this->_regex[$type])) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("'$type' must be one of ('" . implode(', ', array_keys($this->_regex)) - . "')"); - } - return $this; - } - */ - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Hostname/At.php b/phpQuery/phpQuery/Zend/Validate/Hostname/At.php deleted file mode 100644 index fff6bf2..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Hostname/At.php +++ /dev/null @@ -1,50 +0,0 @@ - 'Tokens do not match', - self::MISSING_TOKEN => 'No token was provided to match against', - ); - - /** - * Original token against which to validate - * @var string - */ - protected $_token; - - /** - * Sets validator options - * - * @param string $token - * @return void - */ - public function __construct($token = null) - { - if (null !== $token) { - $this->setToken($token); - } - } - - /** - * Set token against which to compare - * - * @param string $token - * @return Zend_Validate_Identical - */ - public function setToken($token) - { - $this->_token = (string) $token; - return $this; - } - - /** - * Retrieve token - * - * @return string - */ - public function getToken() - { - return $this->_token; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if a token has been set and the provided value - * matches that token. - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $this->_setValue($value); - $token = $this->getToken(); - - if (empty($token)) { - $this->_error(self::MISSING_TOKEN); - return false; - } - - if ($value !== $token) { - $this->_error(self::NOT_SAME); - return false; - } - - return true; - } -} diff --git a/phpQuery/phpQuery/Zend/Validate/InArray.php b/phpQuery/phpQuery/Zend/Validate/InArray.php deleted file mode 100644 index 1c7725a..0000000 --- a/phpQuery/phpQuery/Zend/Validate/InArray.php +++ /dev/null @@ -1,138 +0,0 @@ - "'%value%' was not found in the haystack" - ); - - /** - * Haystack of possible values - * - * @var array - */ - protected $_haystack; - - /** - * Whether a strict in_array() invocation is used - * - * @var boolean - */ - protected $_strict; - - /** - * Sets validator options - * - * @param array $haystack - * @param boolean $strict - * @return void - */ - public function __construct(array $haystack, $strict = false) - { - $this->setHaystack($haystack) - ->setStrict($strict); - } - - /** - * Returns the haystack option - * - * @return mixed - */ - public function getHaystack() - { - return $this->_haystack; - } - - /** - * Sets the haystack option - * - * @param mixed $haystack - * @return Zend_Validate_InArray Provides a fluent interface - */ - public function setHaystack(array $haystack) - { - $this->_haystack = $haystack; - return $this; - } - - /** - * Returns the strict option - * - * @return boolean - */ - public function getStrict() - { - return $this->_strict; - } - - /** - * Sets the strict option - * - * @param boolean $strict - * @return Zend_Validate_InArray Provides a fluent interface - */ - public function setStrict($strict) - { - $this->_strict = $strict; - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is contained in the haystack option. If the strict - * option is true, then the type of $value is also checked. - * - * @param mixed $value - * @return boolean - */ - public function isValid($value) - { - $this->_setValue($value); - if (!in_array($value, $this->_haystack, $this->_strict)) { - $this->_error(); - return false; - } - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Int.php b/phpQuery/phpQuery/Zend/Validate/Int.php deleted file mode 100644 index 0bde2cb..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Int.php +++ /dev/null @@ -1,75 +0,0 @@ - "'%value%' does not appear to be an integer" - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is a valid integer - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - $locale = localeconv(); - - $valueFiltered = str_replace($locale['decimal_point'], '.', $valueString); - $valueFiltered = str_replace($locale['thousands_sep'], '', $valueFiltered); - - if (strval(intval($valueFiltered)) != $valueFiltered) { - $this->_error(); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Interface.php b/phpQuery/phpQuery/Zend/Validate/Interface.php deleted file mode 100644 index 4fcd525..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Interface.php +++ /dev/null @@ -1,71 +0,0 @@ - "'%value%' does not appear to be a valid IP address" - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is a valid IP address - * - * @param mixed $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - if (ip2long($valueString) === false) { - $this->_error(); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/LessThan.php b/phpQuery/phpQuery/Zend/Validate/LessThan.php deleted file mode 100644 index 9f7b72c..0000000 --- a/phpQuery/phpQuery/Zend/Validate/LessThan.php +++ /dev/null @@ -1,113 +0,0 @@ - "'%value%' is not less than '%max%'" - ); - - /** - * @var array - */ - protected $_messageVariables = array( - 'max' => '_max' - ); - - /** - * Maximum value - * - * @var mixed - */ - protected $_max; - - /** - * Sets validator options - * - * @param mixed $max - * @return void - */ - public function __construct($max) - { - $this->setMax($max); - } - - /** - * Returns the max option - * - * @return mixed - */ - public function getMax() - { - return $this->_max; - } - - /** - * Sets the max option - * - * @param mixed $max - * @return Zend_Validate_LessThan Provides a fluent interface - */ - public function setMax($max) - { - $this->_max = $max; - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is less than max option - * - * @param mixed $value - * @return boolean - */ - public function isValid($value) - { - $this->_setValue($value); - if ($this->_max <= $value) { - $this->_error(); - return false; - } - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/NotEmpty.php b/phpQuery/phpQuery/Zend/Validate/NotEmpty.php deleted file mode 100644 index dcf3662..0000000 --- a/phpQuery/phpQuery/Zend/Validate/NotEmpty.php +++ /dev/null @@ -1,74 +0,0 @@ - "Value is empty, but a non-empty value is required" - ); - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value is not an empty value. - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $this->_setValue((string) $value); - - if (is_string($value) - && (('' === $value) - || preg_match('/^\s+$/s', $value)) - ) { - $this->_error(); - return false; - } elseif (!is_string($value) && empty($value)) { - $this->_error(); - return false; - } - - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/Regex.php b/phpQuery/phpQuery/Zend/Validate/Regex.php deleted file mode 100644 index 1566f07..0000000 --- a/phpQuery/phpQuery/Zend/Validate/Regex.php +++ /dev/null @@ -1,125 +0,0 @@ - "'%value%' does not match against pattern '%pattern%'" - ); - - /** - * @var array - */ - protected $_messageVariables = array( - 'pattern' => '_pattern' - ); - - /** - * Regular expression pattern - * - * @var string - */ - protected $_pattern; - - /** - * Sets validator options - * - * @param string $pattern - * @return void - */ - public function __construct($pattern) - { - $this->setPattern($pattern); - } - - /** - * Returns the pattern option - * - * @return string - */ - public function getPattern() - { - return $this->_pattern; - } - - /** - * Sets the pattern option - * - * @param string $pattern - * @return Zend_Validate_Regex Provides a fluent interface - */ - public function setPattern($pattern) - { - $this->_pattern = (string) $pattern; - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if $value matches against the pattern option - * - * @param string $value - * @throws Zend_Validate_Exception if there is a fatal error in pattern matching - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - - $this->_setValue($valueString); - - $status = @preg_match($this->_pattern, $valueString); - if (false === $status) { - /** - * @see Zend_Validate_Exception - */ - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("Internal error matching pattern '$this->_pattern' against value '$valueString'"); - } - if (!$status) { - $this->_error(); - return false; - } - return true; - } - -} diff --git a/phpQuery/phpQuery/Zend/Validate/StringLength.php b/phpQuery/phpQuery/Zend/Validate/StringLength.php deleted file mode 100644 index c43f2ca..0000000 --- a/phpQuery/phpQuery/Zend/Validate/StringLength.php +++ /dev/null @@ -1,180 +0,0 @@ - "'%value%' is less than %min% characters long", - self::TOO_LONG => "'%value%' is greater than %max% characters long" - ); - - /** - * @var array - */ - protected $_messageVariables = array( - 'min' => '_min', - 'max' => '_max' - ); - - /** - * Minimum length - * - * @var integer - */ - protected $_min; - - /** - * Maximum length - * - * If null, there is no maximum length - * - * @var integer|null - */ - protected $_max; - - /** - * Sets validator options - * - * @param integer $min - * @param integer $max - * @return void - */ - public function __construct($min = 0, $max = null) - { - $this->setMin($min); - $this->setMax($max); - } - - /** - * Returns the min option - * - * @return integer - */ - public function getMin() - { - return $this->_min; - } - - /** - * Sets the min option - * - * @param integer $min - * @throws Zend_Validate_Exception - * @return Zend_Validate_StringLength Provides a fluent interface - */ - public function setMin($min) - { - if (null !== $this->_max && $min > $this->_max) { - /** - * @see Zend_Validate_Exception - */ - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The minimum must be less than or equal to the maximum length, but $min >" - . " $this->_max"); - } - $this->_min = max(0, (integer) $min); - return $this; - } - - /** - * Returns the max option - * - * @return integer|null - */ - public function getMax() - { - return $this->_max; - } - - /** - * Sets the max option - * - * @param integer|null $max - * @throws Zend_Validate_Exception - * @return Zend_Validate_StringLength Provides a fluent interface - */ - public function setMax($max) - { - if (null === $max) { - $this->_max = null; - } else if ($max < $this->_min) { - /** - * @see Zend_Validate_Exception - */ - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("The maximum must be greater than or equal to the minimum length, but " - . "$max < $this->_min"); - } else { - $this->_max = (integer) $max; - } - - return $this; - } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the string length of $value is at least the min option and - * no greater than the max option (when the max option is not null). - * - * @param string $value - * @return boolean - */ - public function isValid($value) - { - $valueString = (string) $value; - $this->_setValue($valueString); - $length = iconv_strlen($valueString); - if ($length < $this->_min) { - $this->_error(self::TOO_SHORT); - } - if (null !== $this->_max && $this->_max < $length) { - $this->_error(self::TOO_LONG); - } - if (count($this->_messages)) { - return false; - } else { - return true; - } - } - -} From bb912f645e3a4d88970eb2a1865b61304ad49156 Mon Sep 17 00:00:00 2001 From: Rafal Lindemann Date: Fri, 14 Dec 2012 09:12:02 +0100 Subject: [PATCH 03/21] composer.json --- composer.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 composer.json diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..3de931b --- /dev/null +++ b/composer.json @@ -0,0 +1,16 @@ +{ + "name": "stamina/phpquery", + "type": "library", + "description": "phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library", + "keywords": [], + "homepage": "http://code.google.com/p/phpquery/", + "license": "MIT", + "authors": [ + { + "name": "Tobiasz Cudnik" + } + ], + "autoload": { + "classmap": ["phpQuery/"] + } +} From b2aa01967540c940f9175714cc1357a72d0f6abf Mon Sep 17 00:00:00 2001 From: Ralph Tice Date: Thu, 24 Jan 2013 16:51:19 -0600 Subject: [PATCH 04/21] added WebBrowser->browserDownload for retrieving response body directly, for example to retrieve a generated excel file --- phpQuery/phpQuery/plugins/WebBrowser.php | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/phpQuery/phpQuery/plugins/WebBrowser.php b/phpQuery/phpQuery/plugins/WebBrowser.php index 6688d3f..e5e83d0 100644 --- a/phpQuery/phpQuery/plugins/WebBrowser.php +++ b/phpQuery/phpQuery/plugins/WebBrowser.php @@ -84,6 +84,26 @@ public static function location($self, $url = null) { } return $return; } + + + public static function download($self, $url = null) { + $xhr = isset($self->document->xhr) + ? $self->document->xhr + : null; + $xhr = phpQuery::ajax(array( + 'url' => $url, + ), $xhr); + $return = false; + if ($xhr->getLastResponse()->isSuccessful()) { + $return = phpQueryPlugin_WebBrowser::browserDownload($xhr); + if (isset($self->document->WebBrowserCallback)) + phpQuery::callbackRun( + $self->document->WebBrowserCallback, + array($return) + ); + } + return $return; + } } class phpQueryPlugin_WebBrowser { /** @@ -246,6 +266,17 @@ public static function browserReceive($xhr) { } else return $pq; } + + /** + * @param Zend_Http_Client $xhr + */ + public static function browserDownload($xhr) { + phpQuery::debug("[WebBrowser] Received from ".$xhr->getUri(true)); + // TODO handle meta redirects + $body = $xhr->getLastResponse()->getBody(); + + return $body; + } /** * * @param $e From ca72bd3cddd011ecd9f3a4fb8b23d141ab925825 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 1 Feb 2013 15:45:24 +0000 Subject: [PATCH 05/21] Add an attrs() method. Returns attributes for all matched elements, not just the first one. E.g. the href attribute of all matching links. --- phpQuery/phpQuery/phpQueryObject.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/phpQuery/phpQuery/phpQueryObject.php b/phpQuery/phpQuery/phpQueryObject.php index 9693cb9..99f1ac0 100644 --- a/phpQuery/phpQuery/phpQueryObject.php +++ b/phpQuery/phpQuery/phpQueryObject.php @@ -2631,6 +2631,21 @@ public function attr($attr = null, $value = null) { return is_null($value) ? '' : $this; } + + /** + * @return The same attribute of each matching element, like + * attr() but returns an array with one entry per matched element. + * Read only. + */ + public function attrs($attr = null) { + $results = array(); + foreach($this->stack(1) as $node) { + $results[] = $node->hasAttribute($attr) + ? $node->getAttribute($attr) + : null; + } + return $results; + } /** * @access private */ From 4e2e30fd593eec688205c3901db2aadb0990dbac Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 19 Mar 2013 14:44:18 +0000 Subject: [PATCH 06/21] Add a .texts() method like .attrs(). --- phpQuery/phpQuery/phpQueryObject.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/phpQuery/phpQuery/phpQueryObject.php b/phpQuery/phpQuery/phpQueryObject.php index 99f1ac0..f0dfa1d 100644 --- a/phpQuery/phpQuery/phpQueryObject.php +++ b/phpQuery/phpQuery/phpQueryObject.php @@ -2264,6 +2264,20 @@ public function text($text = null, $callback1 = null, $callback2 = null, $callba } return $return; } + + /** + * @return The text content of each matching element, like + * text() but returns an array with one entry per matched element. + * Read only. + */ + public function texts($attr = null) { + $results = array(); + foreach($this->elements as $node) { + $results[] = $node->textContent; + } + return $results; + } + /** * Enter description here... * @@ -2646,6 +2660,7 @@ public function attrs($attr = null) { } return $results; } + /** * @access private */ From 6cb8afcfe8cd4ce45f2f8c27d561383037c27a3a Mon Sep 17 00:00:00 2001 From: Didier Belot Date: Thu, 21 Mar 2013 13:39:33 +0100 Subject: [PATCH 07/21] initial package release, version bumped to 0.9.6 --- README | 0 README.md | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ composer.json | 22 ++++++++++----- 3 files changed, 92 insertions(+), 7 deletions(-) delete mode 100644 README create mode 100644 README.md diff --git a/README b/README deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md new file mode 100644 index 0000000..63b6870 --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +## phpQuery, one more fork! + +My intent is to have it easily integrated in differents projects, so available on packagist. +I've gathered some fix and new features here and there, as will keep looking for new stuff on github about phpQuery + +### github repos i've integrated: + +* https://github.com/ralph-tice/phpquery (one commit: added WebBrowser->browserDownload) +* https://github.com/aptivate/phpquery (three commits) +* https://github.com/panrafal/phpquery (remove zend) + +### github repos i've looked at: + +* https://github.com/denis-isaev/phpquery +* https://github.com/fmorrow/pQuery--PHPQuery- (big project so far) +* https://github.com/r-sal/phpquery +* https://github.com/damien-list/phpquery-1 +* https://github.com/nev3rm0re/phpquery +* https://github.com/Aurielle/phpquery +* https://github.com/kevee/phpquery (include php-css-parser) +* https://github.com/lucassouza1/phpquery + +## Extracts from fmorrow README.md: + +### Whats phpQuery? +To quote the phpQuery *(orignally concieved and developed by Tobiasz Cudnik, available on Google Code and Github)* project documentation: + +>phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library. +> +>Library is written in PHP5 and provides additional Command Line Interface (CLI). + +### Example usage + +(copied from http://code.google.com/p/phpquery/wiki/Basics) + +Complete working example: + +```php +html(); + +// And output the result +echo '

Title:

'; +echo '

' . htmlentities( $title) . '

'; + +?> +``` + +==== + +Source for test.html: + +```html + + + + +Hello World! + + + + +``` + diff --git a/composer.json b/composer.json index 3de931b..2ea5d66 100644 --- a/composer.json +++ b/composer.json @@ -1,13 +1,21 @@ { - "name": "stamina/phpquery", - "type": "library", - "description": "phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library", - "keywords": [], - "homepage": "http://code.google.com/p/phpquery/", - "license": "MIT", - "authors": [ + "name": "electrolinux/phpquery" + ,"type": "library" + ,"description": "phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library" + ,"version": "0.9.6" + ,"keywords": [] + ,"homepage": "http://code.google.com/p/phpquery/" + ,"license": "MIT" + ,"authors": [ { "name": "Tobiasz Cudnik" + ,"email": "tobiasz.cudnik@gmail.com" + ,"homepage": "https://github.com/TobiaszCudnik" + ,"role": "Developer" + } + ,{ + "name": "didier Belot" + ,"role": "Packager" } ], "autoload": { From 2f417c1e5d5a1062c2331d21bc4684af311347f3 Mon Sep 17 00:00:00 2001 From: lsowen Date: Sun, 6 Oct 2013 14:39:24 -0400 Subject: [PATCH 08/21] fix nth-child implementation The previous nth-child('an+b') implementation could only have a and b values that were single digit (eg 5n-7). Patterns like 13n+14 were not supported, and were interpreted as nth-child('13'). --- phpQuery/phpQuery/phpQueryObject.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/phpQuery/phpQuery/phpQueryObject.php b/phpQuery/phpQuery/phpQueryObject.php index f0dfa1d..ece90b6 100644 --- a/phpQuery/phpQuery/phpQueryObject.php +++ b/phpQuery/phpQuery/phpQueryObject.php @@ -1052,18 +1052,20 @@ protected function pseudoClasses($class) { return null;'), new CallbackParam(), $param ); - else if (mb_strlen($param) > 1 && $param{1} == 'n') + else if (mb_strlen($param) > 1 && preg_match('/^(\d*)n([-+]?)(\d*)/', $param) === 1) // an+b $mapped = $this->map( create_function('$node, $param', '$prevs = pq($node)->prevAll()->size(); $index = 1+$prevs; - $b = mb_strlen($param) > 3 - ? $param{3} - : 0; - $a = $param{0}; - if ($b && $param{2} == "-") - $b = -$b; + + preg_match("/^(\d*)n([-+]?)(\d*)/", $param, $matches); + $a = intval($matches[1]); + $b = intval($matches[3]); + if( $matches[2] === "-" ) { + $b = -$b; + } + if ($a > 0) { return ($index-$b)%$a == 0 ? $node From e60db4df9ed3c1ec19d35fdf2ca3b2751799c66d Mon Sep 17 00:00:00 2001 From: urmaul Date: Wed, 9 Jul 2014 17:16:55 +0300 Subject: [PATCH 09/21] syntax fix --- test-cases/document-types/document-utf8.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-cases/document-types/document-utf8.php b/test-cases/document-types/document-utf8.php index 35353c7..b6e2893 100644 --- a/test-cases/document-types/document-utf8.php +++ b/test-cases/document-types/document-utf8.php @@ -8,6 +8,6 @@ Hello World! ąśżźć - '>Attr test + '>Attr test From 84e2570191be0fa3078051eea82b88f5f2d1bc03 Mon Sep 17 00:00:00 2001 From: Alexander Frolov Date: Tue, 30 Dec 2014 16:37:08 +0300 Subject: [PATCH 10/21] Update README.md fmorrow's repo is no longer available --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 63b6870..f9c33f7 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ I've gathered some fix and new features here and there, as will keep looking for ### github repos i've looked at: * https://github.com/denis-isaev/phpquery -* https://github.com/fmorrow/pQuery--PHPQuery- (big project so far) * https://github.com/r-sal/phpquery * https://github.com/damien-list/phpquery-1 * https://github.com/nev3rm0re/phpquery From 9304d8a0db27c605e06f3e847426037c4600d71e Mon Sep 17 00:00:00 2001 From: Haoran Date: Mon, 7 Dec 2015 10:06:53 +1100 Subject: [PATCH 11/21] Replace deprecated functions split() and join() with explode() and implode(). --- phpQuery/phpQuery/phpQueryObject.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpQuery/phpQuery/phpQueryObject.php b/phpQuery/phpQuery/phpQueryObject.php index ece90b6..2308540 100644 --- a/phpQuery/phpQuery/phpQueryObject.php +++ b/phpQuery/phpQuery/phpQueryObject.php @@ -3101,7 +3101,7 @@ protected function getNodeXpath($oneNode = null, $namespace = null) { : "{$node->tagName}[{$i}]"; $node = $node->parentNode; } - $xpath = join('/', array_reverse($xpath)); + $xpath = implode('/', array_reverse($xpath)); $return[] = '/'.$xpath; } return $oneNode @@ -3123,7 +3123,7 @@ public function whois($oneNode = null) { .($node->getAttribute('id') ? '#'.$node->getAttribute('id'):'') .($node->getAttribute('class') - ? '.'.join('.', split(' ', $node->getAttribute('class'))):'') + ? '.'.implode('.', explode(' ', $node->getAttribute('class'))):'') .($node->getAttribute('name') ? '[name="'.$node->getAttribute('name').'"]':'') .($node->getAttribute('value') && strpos($node->getAttribute('value'), '<'.'?php') === false From c7380d73241fd8666b6425bacc79e2fe8d0f82d0 Mon Sep 17 00:00:00 2001 From: Steve Meyers Date: Sat, 2 Jan 2016 10:59:52 -0700 Subject: [PATCH 12/21] Converted google code wiki to markdown --- wiki/Ajax.md | 70 ++++++++++++++++++++++++++ wiki/Attributes.md | 33 ++++++++++++ wiki/Basics.md | 54 ++++++++++++++++++++ wiki/CSS.md | 1 + wiki/Callbacks.md | 91 ++++++++++++++++++++++++++++++++++ wiki/Chains.md | 1 + wiki/CommandLineInterface.md | 14 ++++++ wiki/Debugging.md | 16 ++++++ wiki/Dependencies.md | 14 ++++++ wiki/Events.md | 47 ++++++++++++++++++ wiki/LibrarySections.md | 1 + wiki/Manipulation.md | 45 +++++++++++++++++ wiki/Manual.md | 21 ++++++++ wiki/MultiDocumentSupport.md | 53 ++++++++++++++++++++ wiki/PHPSupport.md | 78 +++++++++++++++++++++++++++++ wiki/PluginsClientSidePorts.md | 7 +++ wiki/PluginsServerSide.md | 77 ++++++++++++++++++++++++++++ wiki/ReleasePackages.md | 11 ++++ wiki/ScriptsPlugin.md | 24 +++++++++ wiki/Selectors.md | 76 ++++++++++++++++++++++++++++ wiki/Traversing.md | 34 +++++++++++++ wiki/Utilities.md | 20 ++++++++ wiki/WebBrowser.md | 37 ++++++++++++++ wiki/jQueryDifferences.md | 1 + wiki/jQueryHelpers.md | 3 ++ wiki/jQueryPortingState.md | 29 +++++++++++ wiki/jQueryServer.md | 16 ++++++ wiki/jQueryServerSidePorts.md | 6 +++ wiki/test.md | 1 + 29 files changed, 881 insertions(+) create mode 100644 wiki/Ajax.md create mode 100644 wiki/Attributes.md create mode 100644 wiki/Basics.md create mode 100644 wiki/CSS.md create mode 100644 wiki/Callbacks.md create mode 100644 wiki/Chains.md create mode 100644 wiki/CommandLineInterface.md create mode 100644 wiki/Debugging.md create mode 100644 wiki/Dependencies.md create mode 100644 wiki/Events.md create mode 100644 wiki/LibrarySections.md create mode 100644 wiki/Manipulation.md create mode 100644 wiki/Manual.md create mode 100644 wiki/MultiDocumentSupport.md create mode 100644 wiki/PHPSupport.md create mode 100644 wiki/PluginsClientSidePorts.md create mode 100644 wiki/PluginsServerSide.md create mode 100644 wiki/ReleasePackages.md create mode 100644 wiki/ScriptsPlugin.md create mode 100644 wiki/Selectors.md create mode 100644 wiki/Traversing.md create mode 100644 wiki/Utilities.md create mode 100644 wiki/WebBrowser.md create mode 100644 wiki/jQueryDifferences.md create mode 100644 wiki/jQueryHelpers.md create mode 100644 wiki/jQueryPortingState.md create mode 100644 wiki/jQueryServer.md create mode 100644 wiki/jQueryServerSidePorts.md create mode 100644 wiki/test.md diff --git a/wiki/Ajax.md b/wiki/Ajax.md new file mode 100644 index 0000000..3da8e25 --- /dev/null +++ b/wiki/Ajax.md @@ -0,0 +1,70 @@ +## Example +``` +pq('#element')->load('http://somesite.com/page .inline-selector')->... +``` +# Table of Contents + * [Server Side Ajax](#Server_Side_Ajax.md) + * [Cross Domain Ajax](#Cross_Domain_Ajax.md) + * [Ajax Requests](#Ajax_Requests.md) + * [Ajax Events](#Ajax_Events.md) + * [Misc](#Misc.md) +## Server Side Ajax +Ajax, standing for _Asynchronous JavaScript and XML_ is combination of HTTP Client and XML parser which doesn't lock program's thread (doing request in asynchronous way). + +**phpQuery** also offers such functionality, making use of solid quality [Zend\_Http\_Client](http://framework.zend.com/manual/en/zend.http.html). Unfortunately requests aren't asynchronous, but nothing is impossible. For today, instead of [XMLHttpRequest](http://en.wikipedia.org/wiki/XMLHttpRequest) you always get Zend\_Http\_Client instance. API unification is [planned](http://code.google.com/p/phpquery/issues/detail?id=44). +## Cross Domain Ajax +For security reasons, by default **phpQuery** doesn't allow connections to hosts other than actual `$_SERVER['HTTP_HOST']`. Developer needs to grant rights to other hosts before making an [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) request. + +There are 2 methods for allowing other hosts + * phpQuery::**ajaxAllowURL**($url) + * phpQuery::**ajaxAllowHost**($host) + +``` +// connect to google.com +phpQuery::ajaxAllowHost('google.com'); +phpQuery::get('http://google.com/ig'); +// or using same string +$url = 'http://google.com/ig'; +phpQuery::ajaxAllowURL($url); +phpQuery::get($url); +``` +## Ajax Requests + * **[phpQuery::ajax](http://docs.jquery.com/Ajax/jQuery.ajax)**[($options)](http://docs.jquery.com/Ajax/jQuery.ajax) Load a remote page using an HTTP request. + * **[load](http://docs.jquery.com/Ajax/load)**[($url, $data, $callback)](http://docs.jquery.com/Ajax/load) Load HTML from a remote file and inject it into the DOM. + * **[phpQuery::get](http://docs.jquery.com/Ajax/jQuery.get)**[($url, $data, $callback)](http://docs.jquery.com/Ajax/jQuery.get) Load a remote page using an HTTP GET request. + * **[phpQuery::getJSON](http://docs.jquery.com/Ajax/jQuery.getJSON)**[($url, $data, $callback)](http://docs.jquery.com/Ajax/jQuery.getJSON) Load JSON data using an HTTP GET request. + * **[phpQuery::getScript](http://docs.jquery.com/Ajax/jQuery.getScript)**[($url, $callback)](http://docs.jquery.com/Ajax/jQuery.getScript) Loads, and executes, a local JavaScript file using an HTTP GET request. + * **[phpQuery::post](http://docs.jquery.com/Ajax/jQuery.post)**[($url, $data, $callback, $type)](http://docs.jquery.com/Ajax/jQuery.post) Load a remote page using an HTTP POST request. +## Ajax Events + * **[ajaxComplete](http://docs.jquery.com/Ajax/ajaxComplete)**[($callback)](http://docs.jquery.com/Ajax/ajaxComplete) Attach a function to be executed whenever an AJAX request completes. This is an Ajax Event. + * **[ajaxError](http://docs.jquery.com/Ajax/ajaxError)**[($callback)](http://docs.jquery.com/Ajax/ajaxError) Attach a function to be executed whenever an AJAX request fails. This is an Ajax Event. + * **[ajaxSend](http://docs.jquery.com/Ajax/ajaxSend)**[($callback)](http://docs.jquery.com/Ajax/ajaxSend) Attach a function to be executed before an AJAX request is sent. This is an Ajax Event. + * **[ajaxStart](http://docs.jquery.com/Ajax/ajaxStart)**[($callback)](http://docs.jquery.com/Ajax/ajaxStart) Attach a function to be executed whenever an AJAX request begins and there is none already active. This is an Ajax Event. + * **[ajaxStop](http://docs.jquery.com/Ajax/ajaxStop)**[($callback)](http://docs.jquery.com/Ajax/ajaxStop) Attach a function to be executed whenever all AJAX requests have ended. This is an Ajax Event. + * **[ajaxSuccess](http://docs.jquery.com/Ajax/ajaxSuccess)**[($callback)](http://docs.jquery.com/Ajax/ajaxSuccess) Attach a function to be executed whenever an AJAX request completes successfully. This is an Ajax Event. +## Misc + * **[phpQuery::ajaxSetup](http://docs.jquery.com/Ajax/jQuery.ajaxSetup)**[($options)](http://docs.jquery.com/Ajax/jQuery.ajaxSetup) Setup global settings for AJAX requests. + * **[serialize](http://docs.jquery.com/Ajax/serialize)**[()](http://docs.jquery.com/Ajax/serialize) Serializes a set of input elements into a string of data. This will serialize all given elements. + * **[serializeArray](http://docs.jquery.com/Ajax/serializeArray)**[()](http://docs.jquery.com/Ajax/serializeArray) Serializes all forms and form elements (like the .serialize() method) but returns a JSON data structure for you to work with. +## Options +Detailed options description in available at [jQuery Documentation Site](http://docs.jquery.com/Ajax/jQuery.ajax#toptions). + * **`async`** `Boolean` + * **`beforeSend`** `Function` + * **`cache`** `Boolean` + * **`complete`** `Function` + * **`contentType`** `String` + * **`data`** `Object, String` + * **`dataType`** `String` + * **`error`** `Function` + * **`global`** `Boolean` + * **`ifModified`** `Boolean` + * **`jsonp`** `String` + * **`password`** `String` + * **`processData`** `Boolean` + * **`success`** `Function` + * **`timeout`** `Number` + * **`type`** `String` + * **`url`** `String` + * **`username`** `String` + +Read more at [Ajax](http://docs.jquery.com/Ajax) section on [jQuery Documentation Site](http://docs.jquery.com/). \ No newline at end of file diff --git a/wiki/Attributes.md b/wiki/Attributes.md new file mode 100644 index 0000000..c4ca398 --- /dev/null +++ b/wiki/Attributes.md @@ -0,0 +1,33 @@ +## Example +``` +pq('a')->attr('href', 'newVal')->removeClass('className')->html('newHtml')->... +``` +# Table of Contents + * [Attr](#Attr.md) + * [Class](#Class.md) + * [HTML](#HTML.md) + * [Text](#Text.md) + * [Value](#Value.md) +## Attr + * **[attr](http://docs.jquery.com/Attributes/attr)**[($name)](http://docs.jquery.com/Attributes/attr) Access a property on the first matched element. This method makes it easy to retrieve a property value from the first matched element. If the element does not have an attribute with such a name, undefined is returned. + * **[attr](http://docs.jquery.com/Attributes/attr)**[($properties)](http://docs.jquery.com/Attributes/attr) Set a key/value object as properties to all matched elements. + * **[attr](http://docs.jquery.com/Attributes/attr)**[($key, $value)](http://docs.jquery.com/Attributes/attr) Set a single property to a value, on all matched elements. + * **[attr](http://docs.jquery.com/Attributes/attr)**[($key, $fn)](http://docs.jquery.com/Attributes/attr) Set a single property to a computed value, on all matched elements. + * **[removeAttr](http://docs.jquery.com/Attributes/removeAttr)**[($name)](http://docs.jquery.com/Attributes/removeAttr) Remove an attribute from each of the matched elements. +## Class + * **[addClass](http://docs.jquery.com/Attributes/addClass)**[($class)](http://docs.jquery.com/Attributes/addClass) Adds the specified class(es) to each of the set of matched elements. + * **[hasClass](http://docs.jquery.com/Attributes/hasClass)**[($class)](http://docs.jquery.com/Attributes/hasClass) Returns true if the specified class is present on at least one of the set of matched elements. + * **[removeClass](http://docs.jquery.com/Attributes/removeClass)**[($class)](http://docs.jquery.com/Attributes/removeClass) Removes all or the specified class(es) from the set of matched elements. + * **[toggleClass](http://docs.jquery.com/Attributes/toggleClass)**[($class)](http://docs.jquery.com/Attributes/toggleClass) Adds the specified class if it is not present, removes the specified class if it is present. +## HTML + * **[html](http://docs.jquery.com/Attributes/html)**[()](http://docs.jquery.com/Attributes/html) Get the html contents (innerHTML) of the first matched element. This property is not available on XML documents (although it will work for XHTML documents). + * **[html](http://docs.jquery.com/Attributes/html)**[($val)](http://docs.jquery.com/Attributes/html) Set the html contents of every matched element. This property is not available on XML documents (although it will work for XHTML documents). +## Text + * **[text](http://docs.jquery.com/Attributes/text)**[()](http://docs.jquery.com/Attributes/text) Get the combined text contents of all matched elements. + * **[text](http://docs.jquery.com/Attributes/text)**[($val)](http://docs.jquery.com/Attributes/text) Set the text contents of all matched elements. +## Value + * **[val](http://docs.jquery.com/Attributes/val)**[()](http://docs.jquery.com/Attributes/val) Get the content of the value attribute of the first matched element. + * **[val](http://docs.jquery.com/Attributes/val)**[($val)](http://docs.jquery.com/Attributes/val) Set the value attribute of every matched element. + * **[val](http://docs.jquery.com/Attributes/val)**[($val)](http://docs.jquery.com/Attributes/val) Checks, or selects, all the radio buttons, checkboxes, and select options that match the set of values. + +Read more at [Attributes](http://docs.jquery.com/Attributes) section on [jQuery Documentation Site](http://docs.jquery.com/). \ No newline at end of file diff --git a/wiki/Basics.md b/wiki/Basics.md new file mode 100644 index 0000000..a942b59 --- /dev/null +++ b/wiki/Basics.md @@ -0,0 +1,54 @@ +## Example +``` +phpQuery::newDocumentFileXHTML('my-xhtml.html')->find('p'); +$ul = pq('ul'); +``` +# Table of Contents + * [Loading documents](#Loading_documents.md) + * [pq() function](#pq_function.md) + +## Loading documents + * phpQuery::**newDocument**($html, $contentType = null) Creates new document from markup. If no $contentType, autodetection is made (based on markup). If it fails, text/html in utf-8 is used. + * phpQuery::**newDocumentFile**($file, $contentType = null) Creates new document from file. Works like newDocument() + * phpQuery::**newDocumentHTML**($html, $charset = 'utf-8') + * phpQuery::**newDocumentXHTML**($html, $charset = 'utf-8') + * phpQuery::**newDocumentXML**($html, $charset = 'utf-8') + * phpQuery::**newDocumentPHP**($html, $contentType = null) Read more about it on [PHPSupport page](http://code.google.com/p/phpquery/wiki/PHPSupport) + * phpQuery::**newDocumentFileHTML**($file, $charset = 'utf-8') + * phpQuery::**newDocumentFileXHTML**($file, $charset = 'utf-8') + * phpQuery::**newDocumentFileXML**($file, $charset = 'utf-8') + * phpQuery::**newDocumentFilePHP**($file, $contentType) Read more about it on [PHPSupport page](http://code.google.com/p/phpquery/wiki/PHPSupport) +## pq function +**`pq($param, $context = null);`** + +**pq();** function is equivalent of jQuery's **$();**. It's used for 3 type of things: + 1. Importing markup +``` +// Import into selected document: +// doesn't accept text nodes at beginning of input string +pq('
') +// Import into document with ID from $pq->getDocumentID(): +pq('
', $pq->getDocumentID()) +// Import into same document as DOMNode belongs to: +pq('
', DOMNode) +// Import into document from phpQuery object: +pq('
', $pq) +``` + 1. Running queries +``` +// Run query on last selected document: +pq('div.myClass') +// Run query on document with ID from $pq->getDocumentID(): +pq('div.myClass', $pq->getDocumentID()) +// Run query on same document as DOMNode belongs to and use node(s)as root for query: +pq('div.myClass', DOMNode) +// Run query on document from phpQuery object +// and use object's stack as root node(s) for query: +pq('div.myClass', $pq) +``` + 1. Wrapping DOMNodes with phpQuery objects +``` +foreach(pq('li') as $li) + // $li is pure DOMNode, change it to phpQuery object + pq($li); +``` \ No newline at end of file diff --git a/wiki/CSS.md b/wiki/CSS.md new file mode 100644 index 0000000..e1a913a --- /dev/null +++ b/wiki/CSS.md @@ -0,0 +1 @@ +Work in progress. Scheduled before 1.0. \ No newline at end of file diff --git a/wiki/Callbacks.md b/wiki/Callbacks.md new file mode 100644 index 0000000..8c6645d --- /dev/null +++ b/wiki/Callbacks.md @@ -0,0 +1,91 @@ +# Table of Contents + * [What are callbacks](#What_are_callbacks.md) + * [phpQuery callback system](#phpQuery_callbacks.md) + * [Callback class](#Callback.md) + * [CallbackParam class](#CallbackParam.md) + * [CallbackReference class](#CallbackReference.md) + * [Scope Pseudo-Inheritance](#Scope_Pseudo_Inheritance.md) +## What are callbacks +Callbacks are functions _called back_ by other functions in proper moment (eg on [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) request error). + +In **JavaScript** this pattern can be very flexible due to [Closures](http://en.wikipedia.org/wiki/Closure_(computer_science)) support, which can be inline (no code break) and inherits scope (no need to passing params). + +**PHP** has only simple [support for callbacks](http://pl2.php.net/manual/en/function.call-user-func-array.php) so the case is more complicated. That's why phpQuery extends callback support by it's own. +## phpQuery callback system +phpQuery uses it's own approach to callbacks. This task is achieved thou **Callback**, **CallbackParam** and **CallbackReference** classes. +### Callback +Callback class is used for wrapping valid callbacks with params. +#### Example 1 +``` +function myCallback($param1, $param2) { + var_dump($param1); + var_dump($param2); +} +phpQuery::get($url, + new Callback('myCallback', 'myParam1', new CallbackParam) +); +// now $param1 in myCallback will have value 'myParam1' +// and $param2 will be parameter passed by function calling callback +// which in this example would be ajax request result +``` +### CallbackParam +As we can see in [last example](#Example_1.md), new instance of CallbackParam class is used for defining places, where original callback parameter(s) will be placed. Such pattern can be used also without Callback class for some methods. +#### Example 2 +``` +phpQuery::each( + // first param is array which will be iterated + array(1,2,3), + // second param is callback (string or array to call objects method) + 'myCallback', + // rest of params are ParamStructure + // CallbackParam objects will be changed to $i and $v by phpQuery::each method + 'param1', new CallbackParam, new CallbackParam, 'param4' +); +function myCallback($param1, $i, $v, $param4) { + print "Index: $i; Value: $v"; +} +``` +Methods supporting CallbackParam **without** using Callback class: + * `phpQuery::each()` + * `phpQuery::map()` + * `pq()->each()` + * `pq()->map()` +### CallbackReference +Finally, CallbackReference can be used when we don't really want a callback, only parameter passed to it. CallbackReference takes first parameter's value and passes it to reference. Thanks to that, we can use **if statement** instead of **callback function**. +#### Example 3 +``` +$html; +phpQuery::get($url, new CallbackReference($html)); +if ($html) { + // callback triggered, value non-false + phpQuery::get($url, new CallbackReference($html)); + if ($html) { + // we just skipped 2 function declarations + } +} +``` +## Scope Pseudo Inheritance +There is an easy way to pseudo inherit scope in PHP. [Scope](http://en.wikipedia.org/wiki/Scope_(programming)) means _variables accessible in specified point of code_ (which in other words means _any variable you can use_). It's achieved using [compact()](http://php.net/compact) and [extract()](http://php.net/extract) functions. +#### Example 4 +Look at this modified [example 2](#Example_2.md). Previous comments were removed. +``` +$a = 'foo'; +$b = 'bar'; +phpQuery::each( + array(1,2,3), + 'myCallback', + // notice that 'param1' changed to compact('a', 'b') + // where 'a' and 'b' are variable names accessible in actual scope + compact('a', 'b'), new CallbackParam, new CallbackParam, 'param4' +); +function myCallback($scope, $i, $v, $param4) { + // this is the place where variables from $scope array + // are forwarded to actual function's scope + extract($scope); + print "Var a: $a"; // will print 'Var a: foo' + print "Var b: $b"; // will print 'Var a: bar' + print "Index: $i; Value: $v"; +} +``` +## Future +In the future this functionality will be extended and more methods will support it. Check [Issue Tracker entry #48](http://code.google.com/p/phpquery/issues/detail?id=48) if you're interested in any way. \ No newline at end of file diff --git a/wiki/Chains.md b/wiki/Chains.md new file mode 100644 index 0000000..2ff4028 --- /dev/null +++ b/wiki/Chains.md @@ -0,0 +1 @@ +TODO ;) \ No newline at end of file diff --git a/wiki/CommandLineInterface.md b/wiki/CommandLineInterface.md new file mode 100644 index 0000000..f3e4d9d --- /dev/null +++ b/wiki/CommandLineInterface.md @@ -0,0 +1,14 @@ +phpQuery features CommandLineInterface aka CLI. +``` +Usage: phpquery URL --method1 arg1 arg2 argN --method2 arg1 arg2 argN ... +Example: phpquery 'http://localhost' --find 'div > p' --contents +Pipe: cat index.html | phpquery --find 'div > p' --contents +Docs: http://code.google.com/p/phpquery/wiki/ +``` +## Example +Fetch number of downloads of all release packages. +``` +phpquery 'http://code.google.com/p/phpquery/downloads/list?can=1' \ + --find '.vt.col_4 a' --contents \ + --getString null array_sum +``` \ No newline at end of file diff --git a/wiki/Debugging.md b/wiki/Debugging.md new file mode 100644 index 0000000..b608806 --- /dev/null +++ b/wiki/Debugging.md @@ -0,0 +1,16 @@ +## Enabling debugging +``` +// enable debugging messages +phpQuery::$debug = 1; +// enable extensive debugging messages +// used to debug document loading errors from phpQuery::newDocument() +phpQuery::$debug = 2; +``` +## Debugging methods +``` +// debug inside chain +pq('.foo')->dump()->...; +pq('.foo')->dumpWhois()->...; +pq('.foo')->dumpTree()->...; +pq('.foo')->dumpDie()->...; +``` \ No newline at end of file diff --git a/wiki/Dependencies.md b/wiki/Dependencies.md new file mode 100644 index 0000000..4a4108d --- /dev/null +++ b/wiki/Dependencies.md @@ -0,0 +1,14 @@ +**phpQuery** depends on following code parts: + * [PHP5](#PHP5.md) + * [PHP5 DOM extension](#DOM_extension.md) + * [Zend Framework](#Zend_Framework.md) + +## PHP5 +Required version of PHP is [PHP5](http://www.php.net/), **5.2** recommended. + +## DOM extension +PHP5's build-in [DOM extension](http://php.net/manual/en/book.dom.php) is required. Users of +[windows XAMPP](http://www.apachefriends.org/en/xampp-windows.html) (and maybe other unofficial PHP distributions) need to disable depracated [DOM XML](http://php.net/manual/en/ref.domxml.php) extension. More information can be found in [this post on mrclay.org](http://mrclay.org/index.php/2008/10/08/getting-phpquery-running-under-xampp-for-windows/) + +## Zend Framework +[Zend Framework](http://framework.zend.com/) is used as HTTP Client and JSON encoder. Those who already have Zend Framework in their applications, can remove directory **/phpQuery/Zend**. Only condition is having proper include path set for own copy of the library. \ No newline at end of file diff --git a/wiki/Events.md b/wiki/Events.md new file mode 100644 index 0000000..65ef2b1 --- /dev/null +++ b/wiki/Events.md @@ -0,0 +1,47 @@ +# Table of Contents + * [Example](#Example.md) + * [Server Side Events](#Server_Side_Events.md) + * [Page Load](#Page_Load.md) + * [Event Handling](#Event_Handling.md) + * [Interaction Helpers](#Interaction_Helpers.md) + * [Event Helpers](#Event_Helpers.md) + +## Example +``` +pq('form')->bind('submit', 'submitHandler')->trigger('submit')->... +function submitHandler($e) { + print 'Target: '.$e->target->tagName; + print 'Bubbling ? '.$e->currentTarget->tagName; +} +``` + +## Server Side Events +phpQuery support **server-side** events, same as jQuery handle client-side ones. On server there isn't, of course, events such as _mouseover_ (but they can be triggered). + +By default, phpQuery automatically fires up only **change** event for form elements. If you load WebBrowser plugin, **submit** and **click** will be handled properly - eg submitting form with inputs' data to action URL via new [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) request. + +$this (`this` in JS) context for handler scope **isn't available**. You have to use one of following manually: + * $event->**target** + * $event->**currentTarget** + * $event->**relatedTarget** + +## Page Load +_none_ + +## Event Handling + * **[bind](http://docs.jquery.com/Events/bind)**[($type, $data, $fn)](http://docs.jquery.com/Events/bind) Binds a handler to one or more events (like click) for each matched element. Can also bind custom events. + * **[one](http://docs.jquery.com/Events/one)**[($type, $data, $fn)](http://docs.jquery.com/Events/one) Binds a handler to one or more events to be executed once for each matched element. + * **[trigger](http://docs.jquery.com/Events/trigger)**[($type , $data )](http://docs.jquery.com/Events/trigger) Trigger a type of event on every matched element. + * **[triggerHandler](http://docs.jquery.com/Events/triggerHandler)**[($type , $data )](http://docs.jquery.com/Events/triggerHandler) This particular method triggers all bound event handlers on an element (for a specific event type) WITHOUT executing the browsers default actions. + * **[unbind](http://docs.jquery.com/Events/unbind)**[($type , $data )](http://docs.jquery.com/Events/unbind) This does the opposite of bind, it removes bound events from each of the matched elements. + +## Interaction Helpers +_none_ + +## Event Helpers + * **[change](http://docs.jquery.com/Events/change)**[()](http://docs.jquery.com/Events/change) Triggers the change event of each matched element. + * **[change](http://docs.jquery.com/Events/change)**[($fn)](http://docs.jquery.com/Events/change) Binds a function to the change event of each matched element. + * **[submit](http://docs.jquery.com/Events/submit)**[()](http://docs.jquery.com/Events/submit) Trigger the submit event of each matched element. + * **[submit](http://docs.jquery.com/Events/submit)**[($fn)](http://docs.jquery.com/Events/submit) Bind a function to the submit event of each matched element. + +Read more at [Events](http://docs.jquery.com/Events) section on [jQuery Documentation Site](http://docs.jquery.com/). \ No newline at end of file diff --git a/wiki/LibrarySections.md b/wiki/LibrarySections.md new file mode 100644 index 0000000..d6a3885 --- /dev/null +++ b/wiki/LibrarySections.md @@ -0,0 +1 @@ +Renamed to [Manual](http://code.google.com/p/phpquery/wiki/Manual). \ No newline at end of file diff --git a/wiki/Manipulation.md b/wiki/Manipulation.md new file mode 100644 index 0000000..255df6a --- /dev/null +++ b/wiki/Manipulation.md @@ -0,0 +1,45 @@ +## Example +``` +pq('div.old')->replaceWith( pq('div.new')->clone() )->appendTo('.trash')->prepend('Deleted')->... +``` +# Table of Contents + * [Changing Contents](#Changing_Contents.md) + * [Inserting Inside](#Inserting_Inside.md) + * [Inserting Outside](#Inserting_Outside.md) + * [Inserting Around](#Inserting_Around.md) + * [Replacing](#Replacing.md) + * [Removing](#Removing.md) + * [Copying](#Copying.md) +## Changing Contents + * **[html](http://docs.jquery.com/Manipulation/html)**[()](http://docs.jquery.com/Manipulation/html) Get the html contents (innerHTML) of the first matched element. This property is not available on XML documents (although it will work for XHTML documents). + * **[html](http://docs.jquery.com/Manipulation/html)**[($val)](http://docs.jquery.com/Manipulation/html) Set the html contents of every matched element. This property is not available on XML documents (although it will work for XHTML documents). + * **[text](http://docs.jquery.com/Manipulation/text)**[()](http://docs.jquery.com/Manipulation/text) Get the combined text contents of all matched elements. + * **[text](http://docs.jquery.com/Manipulation/text)**[($val)](http://docs.jquery.com/Manipulation/text) Set the text contents of all matched elements. +## Inserting Inside + * **[append](http://docs.jquery.com/Manipulation/append)**[($content)](http://docs.jquery.com/Manipulation/append) Append content to the inside of every matched element. + * **[appendTo](http://docs.jquery.com/Manipulation/appendTo)**[($content)](http://docs.jquery.com/Manipulation/appendTo) Append all of the matched elements to another, specified, set of elements. + * **[prepend](http://docs.jquery.com/Manipulation/prepend)**[($content)](http://docs.jquery.com/Manipulation/prepend) Prepend content to the inside of every matched element. + * **[prependTo](http://docs.jquery.com/Manipulation/prependTo)**[($content)](http://docs.jquery.com/Manipulation/prependTo) Prepend all of the matched elements to another, specified, set of elements. +## Inserting Outside + * **[after](http://docs.jquery.com/Manipulation/after)**[($content)](http://docs.jquery.com/Manipulation/after) Insert content after each of the matched elements. + * **[before](http://docs.jquery.com/Manipulation/before)**[($content)](http://docs.jquery.com/Manipulation/before) Insert content before each of the matched elements. + * **[insertAfter](http://docs.jquery.com/Manipulation/insertAfter)**[($content)](http://docs.jquery.com/Manipulation/insertAfter) Insert all of the matched elements after another, specified, set of elements. + * **[insertBefore](http://docs.jquery.com/Manipulation/insertBefore)**[($content)](http://docs.jquery.com/Manipulation/insertBefore) Insert all of the matched elements before another, specified, set of elements. +## Inserting Around + * **[wrap](http://docs.jquery.com/Manipulation/wrap)**[($html)](http://docs.jquery.com/Manipulation/wrap) Wrap each matched element with the specified HTML content. + * **[wrap](http://docs.jquery.com/Manipulation/wrap)**[($elem)](http://docs.jquery.com/Manipulation/wrap) Wrap each matched element with the specified element. + * **[wrapAll](http://docs.jquery.com/Manipulation/wrapAll)**[($html)](http://docs.jquery.com/Manipulation/wrapAll) Wrap all the elements in the matched set into a single wrapper element. + * **[wrapAll](http://docs.jquery.com/Manipulation/wrapAll)**[($elem)](http://docs.jquery.com/Manipulation/wrapAll) Wrap all the elements in the matched set into a single wrapper element. + * **[wrapInner](http://docs.jquery.com/Manipulation/wrapInner)**[($html)](http://docs.jquery.com/Manipulation/wrapInner) Wrap the inner child contents of each matched element (including text nodes) with an HTML structure. + * **[wrapInner](http://docs.jquery.com/Manipulation/wrapInner)**[($elem)](http://docs.jquery.com/Manipulation/wrapInner) Wrap the inner child contents of each matched element (including text nodes) with a DOM element. +## Replacing + * **[replaceWith](http://docs.jquery.com/Manipulation/replaceWith)**[($content)](http://docs.jquery.com/Manipulation/replaceWith) Replaces all matched elements with the specified HTML or DOM elements. + * **[replaceAll](http://docs.jquery.com/Manipulation/replaceAll)**[($selector)](http://docs.jquery.com/Manipulation/replaceAll) Replaces the elements matched by the specified selector with the matched elements. +## Removing + * **[empty](http://docs.jquery.com/Manipulation/empty)**[()](http://docs.jquery.com/Manipulation/empty) Remove all child nodes from the set of matched elements. + * **[remove](http://docs.jquery.com/Manipulation/remove)**[($expr)](http://docs.jquery.com/Manipulation/remove) Removes all matched elements from the DOM. +## Copying + * **[clone](http://docs.jquery.com/Manipulation/clone)**[()](http://docs.jquery.com/Manipulation/clone) Clone matched DOM Elements and select the clones. + * **[clone](http://docs.jquery.com/Manipulation/clone)**[($true)](http://docs.jquery.com/Manipulation/clone) Clone matched DOM Elements, and all their event handlers, and select the clones. + +Read more at [Manipulation](http://docs.jquery.com/Manipulation) section on [jQuery Documentation Site](http://docs.jquery.com/). \ No newline at end of file diff --git a/wiki/Manual.md b/wiki/Manual.md new file mode 100644 index 0000000..8eb8868 --- /dev/null +++ b/wiki/Manual.md @@ -0,0 +1,21 @@ + 1. [Basics](http://code.google.com/p/phpquery/wiki/Basics) + 1. [Ported jQuery sections](http://code.google.com/p/phpquery/wiki/jQueryPortingState) + 1. [Selectors](http://code.google.com/p/phpquery/wiki/Selectors) + 1. [Attributes](http://code.google.com/p/phpquery/wiki/Attributes) + 1. [Traversing](http://code.google.com/p/phpquery/wiki/Traversing) + 1. [Manipulation](http://code.google.com/p/phpquery/wiki/Manipulation) + 1. [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) + 1. [Events](http://code.google.com/p/phpquery/wiki/Events) + 1. [Utilities](http://code.google.com/p/phpquery/wiki/Utilities) + 1. [Plugin ports](http://code.google.com/p/phpquery/wiki/PluginsClientSidePorts) + 1. [PHP Support](http://code.google.com/p/phpquery/wiki/PHPSupport) + 1. [Command Line Interface](http://code.google.com/p/phpquery/wiki/CommandLineInterface) + 1. [Multi document support](http://code.google.com/p/phpquery/wiki/MultiDocumentSupport) + 1. [Plugins](http://code.google.com/p/phpquery/wiki/PluginsServerSide) + 1. [WebBrowser](http://code.google.com/p/phpquery/wiki/WebBrowser) + 1. [Scripts](http://code.google.com/p/phpquery/wiki/ScriptsPlugin) + 1. [jQueryServer](http://code.google.com/p/phpquery/wiki/jQueryServer) + 1. [Debugging](http://code.google.com/p/phpquery/wiki/Debugging) + 1. Bootstrap file + +**[API Reference](http://meta20.net/phpquery-api/)** is also available. \ No newline at end of file diff --git a/wiki/MultiDocumentSupport.md b/wiki/MultiDocumentSupport.md new file mode 100644 index 0000000..6febb38 --- /dev/null +++ b/wiki/MultiDocumentSupport.md @@ -0,0 +1,53 @@ +## What MultiDocumentSupport is + * support for working on several documents in same time + * easy importing of nodes from one document to another + * pointing document thought + * phpQuery object + * [DOMNode](http://www.php.net/manual/en/class.domnode.php) object + * [DOMDocument](http://www.php.net/manual/en/class.domdocument.php) object + * internal document ID + * last created (or selected) document is assumed to be default in pq(); +## What MultiDocumentSupport is NOT + * it's **not possible** to fetch nodes from several document in one query + * it's **not possible** to operate on nodes from several document in one phpQuery object + +## Example +``` +// first three documents are wrapped inside phpQuery +$doc1 = phpQuery::newDocumentFile('my-file.html'); +$doc2 = phpQuery::newDocumentFile('my-file.html'); +$doc3 = phpQuery::newDocumentFile('my-other-file.html'); +// $doc4 is plain DOMDocument +$doc4 = new DOMDocument; +$doc4->loadHTMLFile('my-file.html'); +// find first UL list in $doc1 +$doc1->find('ul:first') + // append all LIs from $doc2 (node import) + ->append( $doc2->find('li') ) + // append UL (with new LIs) into $doc3 BODY (node import) + ->appendTo( $doc3->find('body') ); +// this will find all LIs from $doc3 +// thats because it was created as last one +pq('li'); +// this will find all LIs inside first UL in $doc2 (context query) +pq('li', $doc2->find('ul:first')->get()); +// this will find all LIs in whole $doc2 (not a context query) +pq('li', $doc2->find('ul:first')->getDocumentID()); +// this will transparently load $doc4 into phpQuery::$documents +// and then all LIs will be found +// TODO this example must be verified +pq('li', $doc4); +``` +## Static Methods + * phpQuery::**newDocument**($html) Creates new document from markup + * phpQuery::**newDocumentFile**($file) Creates new document from file + * phpQuery::**getDocument**($id = null) Returns phpQueryObject containing document with id $id or default document (last created/selected) + * phpQuery::**selectDocument**($id) Sets default document to $id + * phpQuery::**unloadDocuments**($id = null) Unloades all or specified document from memory + * phpQuery::**getDocumentID**($source) Returns $source's document ID + * phpQuery::**getDOMDocument**($source) Get DOMDocument object related to $source +## Object Methods + * $pq->**getDocument**() Returns object with stack set to document root + * $pq->**getDocumentID**() Get object's Document ID + * $pq->**getDocumentIDRef**(&$documentID) Saves object's DocumentID to $var by reference + * $pq->**unloadDocument**() Unloads whole document from memory \ No newline at end of file diff --git a/wiki/PHPSupport.md b/wiki/PHPSupport.md new file mode 100644 index 0000000..95d00a0 --- /dev/null +++ b/wiki/PHPSupport.md @@ -0,0 +1,78 @@ +Although **phpQuery** is a [jQuery port](http://code.google.com/p/phpquery/wiki/jQueryPortingState), there is extensive PHP-specific support. + +# Table of Contents + * [Class Interfaces](#Class_Interfaces.md) + * [Iterator Interface](#Iterator.md) + * [ArrayAccess](#Array_Access.md) + * [Countable Interface](#Countable.md) + * [Callbacks](http://code.google.com/p/phpquery/wiki/Callbacks) + * [PHP Code Support](#PHP_Code_Support.md) + * [Opening PHP files as DOM](#Opening_PHP_files_as_DOM.md) + * [Inputting PHP code](#Inputting_PHP_code.md) + * [Outputting PHP code](#Outputting_PHP_code.md) + +## Class Interfaces +phpQuery implements some of [Standard PHP Library (SPL)](http://pl.php.net/spl) interfaces. +#### Iterator +Iterator interface allows looping objects thou native PHP **foreach loop**. Example: +``` +// get all direct LI elements from UL list of class 'im-the-list' +$LIs = pq('ul.im-the-list > li'); +foreach($LIs as $li) { + pq($li)->addClass('foreached'); +} +``` +Now there is a catch above. Foreach loop **doesn't return phpQuery object**. Instead it returns pure DOMNode. That's how jQuery does, because not always you need **phpQuery** when you found interesting nodes. +#### Array Access +If you like writing arrays, with phpQuery you can still do it, thanks to the ArrayAccess interface. +``` +$pq = phpQuery::newDocumentFile('somefile.html'); +// print first list outer HTML +print $pq['ul:first']; +// change INNER HTML of second LI directly in first UL +$pq['ul:first > li:eq(1)'] = 'new inner html of second LI directly in first UL'; +// now look at the difference (outer vs inner) +print $pq['ul:first > li:eq(1)']; +// will print
  • new inner html of second LI directly in first UL
  • +``` +#### Countable +If used to do `count($something)` you can still do this that way, instead of eg `pq('p')->size()`. +``` +// count all direct LIs in first list +print count(pq('ul:first > li')); +``` +## Callbacks +There is a special [Callbacks](http://code.google.com/p/phpquery/wiki/Callbacks) wiki section, to which you should refer to. +## PHP Code Support +#### Opening PHP files as DOM +PHP files can be opened using **phpQuery::newDocumentPHP($markup)** or **phpQuery::newDocumentFilePHP($file)**. Such files are visible as DOM, where: + * PHP tags beetween DOM elements are available (queryable) as ` ...code... ` + * PHP tags inside attributes are HTML entities + * PHP tags between DOM element's attributes are **not yet supported** +#### Inputting PHP code +Additional methods allows placing PHP code inside DOM. Below each method visible is it's logic equivalent. + * **attrPHP**($attr, $code) + * [attr](http://docs.jquery.com/Attributes/attr)($attr, "") + * **addClassPHP**($code) + * [addClass](http://docs.jquery.com/Attributes/addClass)("") + * **beforePHP**($code) + * [before](http://docs.jquery.com/Manipulation/before)("") + * **afterPHP**($code) + * [after](http://docs.jquery.com/Manipulation/after)("") + * **prependPHP**($code) + * [prepend](http://docs.jquery.com/Manipulation/prepend)("") + * **appendPHP**($code) + * [append](http://docs.jquery.com/Manipulation/append)("") + * **php**($code) + * [html](http://docs.jquery.com/Manipulation/html)("") + * **wrapAllPHP**($codeBefore, $codeAfter) + * [wrapAll](http://docs.jquery.com/Manipulation/wrapAll)("") + * **wrapPHP**($codeBefore, $codeAfter) + * [wrap](http://docs.jquery.com/Manipulation/wrap)("") + * **wrapInnerPHP**($codeBefore, $codeAfter) + * [wrapInner](http://docs.jquery.com/Manipulation/wrapInner)("") + * **replaceWithPHP**($code) + * [replaceWith](http://docs.jquery.com/Manipulation/replaceWith)("") +#### Outputting PHP code +Code inserted with methods above won't be returned as valid (runnable) using classic output methods such as **html()**. To make it work, **php()** method without parameter have to be used. Optionaly **phpQuery::markupToPHP($markup)** can activate tags in string outputed before. +**REMEMBER** Outputing runnable code and placing it on webserver is always dangerous ! \ No newline at end of file diff --git a/wiki/PluginsClientSidePorts.md b/wiki/PluginsClientSidePorts.md new file mode 100644 index 0000000..d7a2e28 --- /dev/null +++ b/wiki/PluginsClientSidePorts.md @@ -0,0 +1,7 @@ +In [Issue Tracker](http://code.google.com/p/phpquery/issues/list) there is a list of [plugins which are planned to be ported](http://code.google.com/p/phpquery/issues/list?can=2&q=label%3APort). +## JSON +Port of [JSON](http://jollytoad.googlepages.com/json.js) plugin. +``` +$jsonString = phpQuery::toJSON( pq('form')->serializeArray() ); +$array = phpQuery::parseJSON('{"foo": "bar"}'); +``` \ No newline at end of file diff --git a/wiki/PluginsServerSide.md b/wiki/PluginsServerSide.md new file mode 100644 index 0000000..641e34f --- /dev/null +++ b/wiki/PluginsServerSide.md @@ -0,0 +1,77 @@ +If you need to write plugin only for simple task, write a **script** using ScriptsPlugin. + +## Using plugins +Plugins are loaded using **plugin** method from phpQueryObject or phpQuery static namespace. +``` +// all calls to plugin below are equal +phpQuery::plugin('example') +phpQuery::plugin('example', 'example.php') +pq('ul')->plugin('example') +pq('ul')->plugin('example', 'example.php') +``` +## Writing plugins +Plugin consist from 2 classes - first extending **phpQueryObjects** (result of pq(); function) and second, extending static **phpQuery::$plugins** namespace. Plugin classes are never intialized, just method calls are forwarded in static way from phpQuery. + +#### Extending phpQueryObject +``` +/** + * phpQuery plugin class extending phpQuery object. + * Methods from this class are callable on every phpQuery object. + * + * Class name prefix 'phpQueryObjectPlugin_' must be preserved. + */ +abstract class phpQueryObjectPlugin_example { + /** + * Limit binded methods. + * + * null means all public. + * array means only specified ones. + * + * @var array|null + */ + public static $phpQueryMethods = null; + /** + * Enter description here... + * + * @param phpQueryObject $self + */ + public static function example($self, $arg1) { + // this method can be called on any phpQuery object, like this: + // pq('div')->example('$arg1 Value') + + // do something + $self->append('Im just an example !'); + // change stack of result object + return $self->find('div'); + } + protected static function helperFunction() { + // this method WONT be avaible as phpQuery method, + // because it isn't publicly callable + } +} +``` +#### Extending phpQuery +``` +/** + * phpQuery plugin class extending phpQuery static namespace. + * Methods from this class are callable as follows: + * phpQuery::$plugins->staticMethod() + * + * Class name prefix 'phpQueryPlugin_' must be preserved. + */ +abstract class phpQueryPlugin_example { + /** + * Limit binded methods. + * + * null means all public. + * array means only specified ones. + * + * @var array|null + */ + public static $phpQueryMethods = null; + public static function staticMethod() { + // this method can be called within phpQuery class namespace, like this: + // phpQuery::$plugins->staticMethod() + } +} +``` \ No newline at end of file diff --git a/wiki/ReleasePackages.md b/wiki/ReleasePackages.md new file mode 100644 index 0000000..c5929ca --- /dev/null +++ b/wiki/ReleasePackages.md @@ -0,0 +1,11 @@ +# This page is TODO + +## Formats + * RPM + * ZIP + +## Forms + * Standard + * OneFile + * Broken plugins support ? + * ZendFramework not included \ No newline at end of file diff --git a/wiki/ScriptsPlugin.md b/wiki/ScriptsPlugin.md new file mode 100644 index 0000000..f8e5921 --- /dev/null +++ b/wiki/ScriptsPlugin.md @@ -0,0 +1,24 @@ +ScriptsPlugin simplifies writing short code scripts which can be easily reused (chained). It removes plugin overhead allowing script to be one-line command. + +## Using scripts +Before using any script, you need to load **Scripts** plugin, like so: +``` +phpQuery::plugin('Scripts'); +// or inside a chain +pq('li')->plugin('Scripts'); +``` +After that, any available script can be used thou **script** method. +``` +print pq('div')->script('safe_print'); +``` +## Writing scripts +Scripts are placed in **/phpQuery/plugins/Scripts**. Each script has it's own file. Each file has access to 4 variables: + * **$self** Represents $this + * **$params** Represents parameters passed to script() method (without script name) + * **$return** If not null, will be used as method result + * **$config** Content of config.php file +By default each script returns $self aka $this. +##### Example script +``` +$return = $self->find($params[0]); +``` \ No newline at end of file diff --git a/wiki/Selectors.md b/wiki/Selectors.md new file mode 100644 index 0000000..0d737bc --- /dev/null +++ b/wiki/Selectors.md @@ -0,0 +1,76 @@ +Selectors are the heart of jQuery-like interface. Most of [CSS Level 3](http://www.w3.org/TR/2005/WD-css3-selectors-20051215/) syntax is implemented (in state same as in jQuery). +## Example +``` +pq(".class ul > li[rel='foo']:first:has(a)")->appendTo('.append-target-wrapper div')->... +``` +# Table of Contents + * [Basics](#Basics.md) + * [Hierarchy](#Hierarchy.md) + * [Basic Filters](#Basic_Filters.md) + * [Content Filters](#Content_Filters.md) + * [Visibility Filters](#Visibility_Filters.md) + * [Attribute Filters](#Attribute_Filters.md) + * [Child Filters](#Child_Filters.md) + * [Forms](#Forms.md) + * [Form Filters](#Form_Filters.md) +## Basics + * **[#id](http://docs.jquery.com/Selectors/id)** Matches a single element with the given id attribute. + * **[element](http://docs.jquery.com/Selectors/element)** Matches all elements with the given name. + * **[.class](http://docs.jquery.com/Selectors/class)** Matches all elements with the given class. + * **[\*](http://docs.jquery.com/Selectors/all)** Matches all elements. + * **[selector1, selector2, selectorN](http://docs.jquery.com/Selectors/multiple)** Matches the combined results of all the specified selectors. +## Hierarchy + * **[ancestor descendant](http://docs.jquery.com/Selectors/descendant)** Matches all descendant elements specified by "descendant" of elements specified by "ancestor". + * **[parent > child](http://docs.jquery.com/Selectors/child)** Matches all child elements specified by "child" of elements specified by "parent". + * **[prev + next](http://docs.jquery.com/Selectors/next)** Matches all next elements specified by "next" that are next to elements specified by "prev". + * **[prev ~ siblings](http://docs.jquery.com/Selectors/siblings)** Matches all sibling elements after the "prev" element that match the filtering "siblings" selector. +## Basic Filters + * **[:first](http://docs.jquery.com/Selectors/first)** Matches the first selected element. + * **[:last](http://docs.jquery.com/Selectors/last)** Matches the last selected element. + * **[:not(selector)](http://docs.jquery.com/Selectors/not)** Filters out all elements matching the given selector. + * **[:even](http://docs.jquery.com/Selectors/even)** Matches even elements, zero-indexed. + * **[:odd](http://docs.jquery.com/Selectors/odd)** Matches odd elements, zero-indexed. + * **[:eq(index)](http://docs.jquery.com/Selectors/eq)** Matches a single element by its index. + * **[:gt(index)](http://docs.jquery.com/Selectors/gt)** Matches all elements with an index above the given one. + * **[:lt(index)](http://docs.jquery.com/Selectors/lt)** Matches all elements with an index below the given one. + * **[:header](http://docs.jquery.com/Selectors/header)** Matches all elements that are headers, like h1, h2, h3 and so on. + * **[:animated](http://docs.jquery.com/Selectors/animated)** Matches all elements that are currently being animated. +## Content Filters + * **[:contains(text)](http://docs.jquery.com/Selectors/contains)** Matches elements which contain the given text. + * **[:empty](http://docs.jquery.com/Selectors/empty)** Matches all elements that have no children (including text nodes). + * **[:has(selector)](http://docs.jquery.com/Selectors/has)** Matches elements which contain at least one element that matches the specified selector. + * **[:parent](http://docs.jquery.com/Selectors/parent)** Matches all elements that are parents - they have child elements, including text. +## Visibility Filters +_none_ +## Attribute Filters + * **[[attribute](http://docs.jquery.com/Selectors/attributeHas)]** Matches elements that have the specified attribute. + * **[[attribute=value](http://docs.jquery.com/Selectors/attributeEquals)]** Matches elements that have the specified attribute with a certain value. + * **[[attribute!=value](http://docs.jquery.com/Selectors/attributeNotEqual)]** Matches elements that don't have the specified attribute with a certain value. + * **[[attribute^=value](http://docs.jquery.com/Selectors/attributeStartsWith)]** Matches elements that have the specified attribute and it starts with a certain value. + * **[[attribute$=value](http://docs.jquery.com/Selectors/attributeEndsWith)]** Matches elements that have the specified attribute and it ends with a certain value. + * **[[attribute\*=value](http://docs.jquery.com/Selectors/attributeContains)]** Matches elements that have the specified attribute and it contains a certain value. + * **[[selector1](http://docs.jquery.com/Selectors/attributeMultiple)[selector2](selector2.md)[selectorN](selectorN.md)]** Matches elements that have the specified attribute and it contains a certain value. +## Child Filters + * **[:nth-child(index/even/odd/equation)](http://docs.jquery.com/Selectors/nthChild)** Matches all elements that are the nth-child of their parent or that are the parent's even or odd children. + * **[:first-child](http://docs.jquery.com/Selectors/firstChild)** Matches all elements that are the first child of their parent. + * **[:last-child](http://docs.jquery.com/Selectors/lastChild)** Matches all elements that are the last child of their parent. + * **[:only-child](http://docs.jquery.com/Selectors/onlyChild)** Matches all elements that are the only child of their parent. +## Forms + * **[:input](http://docs.jquery.com/Selectors/input)** Matches all input, textarea, select and button elements. + * **[:text](http://docs.jquery.com/Selectors/text)** Matches all input elements of type text. + * **[:password](http://docs.jquery.com/Selectors/password)** Matches all input elements of type password. + * **[:radio](http://docs.jquery.com/Selectors/radio)** Matches all input elements of type radio. + * **[:checkbox](http://docs.jquery.com/Selectors/checkbox)** Matches all input elements of type checkbox. + * **[:submit](http://docs.jquery.com/Selectors/submit)** Matches all input elements of type submit. + * **[:image](http://docs.jquery.com/Selectors/image)** Matches all input elements of type image. + * **[:reset](http://docs.jquery.com/Selectors/reset)** Matches all input elements of type reset. + * **[:button](http://docs.jquery.com/Selectors/button)** Matches all button elements and input elements of type button. + * **[:file](http://docs.jquery.com/Selectors/file)** Matches all input elements of type file. + * **[:hidden](http://docs.jquery.com/Selectors/hidden)** Matches all elements that are hidden, or input elements of type "hidden". +## Form Filters + * **[:enabled](http://docs.jquery.com/Selectors/enabled)** Matches all elements that are enabled. + * **[:disabled](http://docs.jquery.com/Selectors/disabled)** Matches all elements that are disabled. + * **[:checked](http://docs.jquery.com/Selectors/checked)** Matches all elements that are checked. + * **[:selected](http://docs.jquery.com/Selectors/selected)** Matches all elements that are selected. + +Read more at [Selectors](http://docs.jquery.com/Selectors) section on [jQuery Documentation Site](http://docs.jquery.com/). \ No newline at end of file diff --git a/wiki/Traversing.md b/wiki/Traversing.md new file mode 100644 index 0000000..cc89f5b --- /dev/null +++ b/wiki/Traversing.md @@ -0,0 +1,34 @@ +## Example +``` +pq('div > p')->add('div > ul')->filter(':has(a)')->find('p:first')->nextAll()->andSelf()->... +``` +# Table of Contents + * [Filtering](#Filtering.md) + * [Finding](#Finding.md) + * [Chaining](#Chaining.md) +## Filtering + * **[eq](http://docs.jquery.com/Traversing/eq)**[($index)](http://docs.jquery.com/Traversing/eq) Reduce the set of matched elements to a single element. + * **[hasClass](http://docs.jquery.com/Traversing/hasClass)**[($class)](http://docs.jquery.com/Traversing/hasClass) Checks the current selection against a class and returns true, if at least one element of the selection has the given class. + * **[filter](http://docs.jquery.com/Traversing/filter)**[($expr)](http://docs.jquery.com/Traversing/filter) Removes all elements from the set of matched elements that do not match the specified expression(s). + * **[filter](http://docs.jquery.com/Traversing/filter)**[($fn)](http://docs.jquery.com/Traversing/filter) Removes all elements from the set of matched elements that does not match the specified function. + * **[is](http://docs.jquery.com/Traversing/is)**[($expr)](http://docs.jquery.com/Traversing/is) Checks the current selection against an expression and returns true, if at least one element of the selection fits the given expression. + * **[map](http://docs.jquery.com/Traversing/map)**[($callback)](http://docs.jquery.com/Traversing/map) Translate a set of elements in the jQuery object into another set of values in an array (which may, or may not, be elements). + * **[not](http://docs.jquery.com/Traversing/not)**[($expr)](http://docs.jquery.com/Traversing/not) Removes elements matching the specified expression from the set of matched elements. + * **[slice](http://docs.jquery.com/Traversing/slice)**[($start, $end)](http://docs.jquery.com/Traversing/slice) Selects a subset of the matched elements. +## Finding + * **[add](http://docs.jquery.com/Traversing/add)**[($expr)](http://docs.jquery.com/Traversing/add) Adds more elements, matched by the given expression, to the set of matched elements. + * **[children](http://docs.jquery.com/Traversing/children)**[($expr)](http://docs.jquery.com/Traversing/children) Get a set of elements containing all of the unique immediate children of each of the matched set of elements. + * **[contents](http://docs.jquery.com/Traversing/contents)**[()](http://docs.jquery.com/Traversing/contents) Find all the child nodes inside the matched elements (including text nodes), or the content document, if the element is an iframe. + * **[find](http://docs.jquery.com/Traversing/find)**[($expr)](http://docs.jquery.com/Traversing/find) Searches for all elements that match the specified expression. This method is a good way to find additional descendant elements with which to process. + * **[next](http://docs.jquery.com/Traversing/next)**[($expr)](http://docs.jquery.com/Traversing/next) Get a set of elements containing the unique next siblings of each of the given set of elements. + * **[nextAll](http://docs.jquery.com/Traversing/nextAll)**[($expr)](http://docs.jquery.com/Traversing/nextAll) Find all sibling elements after the current element. + * **[parent](http://docs.jquery.com/Traversing/parent)**[($expr)](http://docs.jquery.com/Traversing/parent) Get a set of elements containing the unique parents of the matched set of elements. + * **[parents](http://docs.jquery.com/Traversing/parents)**[($expr)](http://docs.jquery.com/Traversing/parents) Get a set of elements containing the unique ancestors of the matched set of elements (except for the root element). The matched elements can be filtered with an optional expression. + * **[prev](http://docs.jquery.com/Traversing/prev)**[($expr)](http://docs.jquery.com/Traversing/prev) Get a set of elements containing the unique previous siblings of each of the matched set of elements. + * **[prevAll](http://docs.jquery.com/Traversing/prevAll)**[($expr)](http://docs.jquery.com/Traversing/prevAll) Find all sibling elements before the current element. + * **[siblings](http://docs.jquery.com/Traversing/siblings)**[($expr)](http://docs.jquery.com/Traversing/siblings) Get a set of elements containing all of the unique siblings of each of the matched set of elements. Can be filtered with an optional expressions. +## Chaining + * **[andSelf](http://docs.jquery.com/Traversing/andSelf)**[()](http://docs.jquery.com/Traversing/andSelf) Add the previous selection to the current selection. + * **[end](http://docs.jquery.com/Traversing/end)**[()](http://docs.jquery.com/Traversing/end) Revert the most recent 'destructive' operation, changing the set of matched elements to its previous state (right before the destructive operation). + +Read more at [Traversing](http://docs.jquery.com/Traversing) section on [jQuery Documentation Site](http://docs.jquery.com/). \ No newline at end of file diff --git a/wiki/Utilities.md b/wiki/Utilities.md new file mode 100644 index 0000000..b42720a --- /dev/null +++ b/wiki/Utilities.md @@ -0,0 +1,20 @@ +# Table of Contents + * [User Agent](#User_Agent.md) + * [Array and Object operations](#Array_and_Object_operations.md) + * [Test operations](#Test_operations.md) + * [String operations](#String_operations.md) +## User Agent +_none_ +## Array and Object operations + * **[phpQuery::each](http://docs.jquery.com/Utilities/jQuery.each)**[($object, $callback)](http://docs.jquery.com/Utilities/jQuery.each) A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. + * **[phpQuery::grep](http://docs.jquery.com/Utilities/jQuery.grep)**[($array, $callback, $invert)](http://docs.jquery.com/Utilities/jQuery.grep) Filter items out of an array, by using a filter function. + * **[phpQuery::makeArray](http://docs.jquery.com/Utilities/jQuery.makeArray)**[($obj)](http://docs.jquery.com/Utilities/jQuery.makeArray) Turns an array-like object into a true array. + * **[phpQuery::map](http://docs.jquery.com/Utilities/jQuery.map)**[($array, $callback)](http://docs.jquery.com/Utilities/jQuery.map) Translate all items in an array to another array of items. + * **[phpQuery::inArray](http://docs.jquery.com/Utilities/jQuery.inArray)**[($value, $array)](http://docs.jquery.com/Utilities/jQuery.inArray) Determine the index of the first parameter in the Array (-1 if not found). + * **[phpQuery::unique](http://docs.jquery.com/Utilities/jQuery.unique)**[($array)](http://docs.jquery.com/Utilities/jQuery.unique) Remove all duplicate elements from an array of elements. +## Test operations + * **[phpQuery::isFunction](http://docs.jquery.com/Utilities/jQuery.isFunction)**[($obj)](http://docs.jquery.com/Utilities/jQuery.isFunction) Determine if the parameter passed is a function. +## String operations + * **[phpQuery::trim](http://docs.jquery.com/Utilities/jQuery.trim)**[($str)](http://docs.jquery.com/Utilities/jQuery.trim) Remove the whitespace from the beginning and end of a string. + +Read more at [Utilities](http://docs.jquery.com/Utilities) section on [jQuery Documentation Site](http://docs.jquery.com/). \ No newline at end of file diff --git a/wiki/WebBrowser.md b/wiki/WebBrowser.md new file mode 100644 index 0000000..a4d4071 --- /dev/null +++ b/wiki/WebBrowser.md @@ -0,0 +1,37 @@ +**WebBrowser** is a phpQuery [plugin](http://code.google.com/p/phpquery/wiki/PluginsServerSide) that mimics behaviors of web browser. Thanks to that developer can simulate user's behavior inside a PHP script. + +## Supported + * Link navigation (click event) + * Form navigation (submit event) + * Cookies (thought [Zend\_Http\_CookieJar](http://framework.zend.com/manual/en/zend.http.cookies.html)) + * Relative links + * document.location (not an object, yet) + +## Use cases + * Fill forms and submit them easly + * Login to secure pages and collect content + * Write test cases reproducing browsing proccess + +## Example 1 +Adding web browser functionality to existing phpQuery object and submiting the form. +``` +->WebBrowser('callback')->find('form')->submit()->... +``` + +## Example 2 +Querying Google against "search phrase": +``` +require_once('phpQuery/phpQuery.php'); +phpQuery::browserGet('http://www.google.com/', 'success1'); +function success1($browser) { + $browser + ->WebBrowser('success2') + ->find('input[name=q]') + ->val('search phrase') + ->parents('form') + ->submit(); +} +function success2($browser) { + print $browser; +} +``` \ No newline at end of file diff --git a/wiki/jQueryDifferences.md b/wiki/jQueryDifferences.md new file mode 100644 index 0000000..4cc32f2 --- /dev/null +++ b/wiki/jQueryDifferences.md @@ -0,0 +1 @@ +Renamed to [jQueryPortingState](http://code.google.com/p/phpquery/wiki/jQueryPortingState). \ No newline at end of file diff --git a/wiki/jQueryHelpers.md b/wiki/jQueryHelpers.md new file mode 100644 index 0000000..2df052a --- /dev/null +++ b/wiki/jQueryHelpers.md @@ -0,0 +1,3 @@ +jQuery helper libraries written in PHP + * [jquery-php](http://code.google.com/p/jquery-php/) + * [PQuery](http://www.ngcoders.com/php/pquery-php-and-jquery) \ No newline at end of file diff --git a/wiki/jQueryPortingState.md b/wiki/jQueryPortingState.md new file mode 100644 index 0000000..e3e3cfc --- /dev/null +++ b/wiki/jQueryPortingState.md @@ -0,0 +1,29 @@ +phpQuery is almost a full port of the [jQuery JavaScript Library](http://jquery.com/). + +## Ported Sections + 1. [Selectors](http://code.google.com/p/phpquery/wiki/Selectors) + 1. [Attributes](http://code.google.com/p/phpquery/wiki/Attributes) + 1. [Traversing](http://code.google.com/p/phpquery/wiki/Traversing) + 1. [Manipulation](http://code.google.com/p/phpquery/wiki/Manipulation) + 1. [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) + 1. [Events](http://code.google.com/p/phpquery/wiki/Events) + 1. [Utilities](http://code.google.com/p/phpquery/wiki/Utilities) + 1. [Plugin ports](http://code.google.com/p/phpquery/wiki/PluginsClientSidePorts) + +## Additional methods +phpQuery features many additional methods comparing to jQuery: + * htmlOuter() + * xml() + * xmlOuter() + * markup() + * markupOuter() + * getString() + * reverse() + * contentsUnwrap() + * switchWith() + * all from [PHPSupport](http://code.google.com/p/phpquery/wiki/PHPSupport) + * all from [Basic](http://code.google.com/p/phpquery/wiki/Basic) + * all from [MultiDocumentSupport](http://code.google.com/p/phpquery/wiki/MultiDocumentSupport) + +## Other Differences + * [Server Side Events](http://code.google.com/p/phpquery/wiki/Events?ts=1225458859&updated=Events#Server_Side_Events) \ No newline at end of file diff --git a/wiki/jQueryServer.md b/wiki/jQueryServer.md new file mode 100644 index 0000000..3bbec90 --- /dev/null +++ b/wiki/jQueryServer.md @@ -0,0 +1,16 @@ +**jQueryServer** is a jQuery plugin giving unobstrusive, client-side bindings to server-side implementation of jQuery. + +## Example scenario + 1. Connect to server and make an [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) request to somewhere ([crossdomain allowed](http://code.google.com/p/phpquery/wiki/CrossDomainAjax)) + 1. Do some manipulations, you can even trigger a [server-side event](http://code.google.com/p/phpquery/wiki/Events#Server_Side_Events) + 1. Get processed date back to the browser + +## Example code +``` +$.server({url: 'http://somesite.com'}) + .find('.my-class') + .client(function(response){ + $('.destination').html(response); +}); +``` +Since version **0.5.1** (this is **not** phpQuery release version number) there is a support for config file which **authorizes** [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) hosts and referers. \ No newline at end of file diff --git a/wiki/jQueryServerSidePorts.md b/wiki/jQueryServerSidePorts.md new file mode 100644 index 0000000..5a6eeb5 --- /dev/null +++ b/wiki/jQueryServerSidePorts.md @@ -0,0 +1,6 @@ +jQuery ports to server-side languages: + * **PHP** - [phpQuery](http://code.google.com/p/phpquery/) + * **ActionScript** - [as3query](http://tech.nitoyon.com/blog/2008/01/as3query_alpha.html) + * **Ruby** - [hpricot](http://code.whytheluckystiff.net/hpricot/) + * **Perl** - [pQuery](http://search.cpan.org/~ingy/pQuery/lib/pQuery.pm) + * **Python** - [PyQuery](http://pypi.python.org/pypi/pyquery) \ No newline at end of file diff --git a/wiki/test.md b/wiki/test.md new file mode 100644 index 0000000..34c92c2 --- /dev/null +++ b/wiki/test.md @@ -0,0 +1 @@ +lorem ipsum \ No newline at end of file From 13a34f656d061a4fdcae2603a95591178123a8dd Mon Sep 17 00:00:00 2001 From: Steve Meyers Date: Sat, 2 Jan 2016 11:02:01 -0700 Subject: [PATCH 13/21] renamed Manual to README, removed test --- wiki/{Manual.md => README.md} | 0 wiki/test.md | 1 - 2 files changed, 1 deletion(-) rename wiki/{Manual.md => README.md} (100%) delete mode 100644 wiki/test.md diff --git a/wiki/Manual.md b/wiki/README.md similarity index 100% rename from wiki/Manual.md rename to wiki/README.md diff --git a/wiki/test.md b/wiki/test.md deleted file mode 100644 index 34c92c2..0000000 --- a/wiki/test.md +++ /dev/null @@ -1 +0,0 @@ -lorem ipsum \ No newline at end of file From 7aa44be9f319e7a0abb720b4f116c9d63ecbb130 Mon Sep 17 00:00:00 2001 From: Steve Meyers Date: Sat, 2 Jan 2016 11:09:22 -0700 Subject: [PATCH 14/21] fixed links back to old google code wiki --- wiki/Ajax.md | 2 +- wiki/Basics.md | 4 ++-- wiki/Callbacks.md | 2 +- wiki/Events.md | 2 +- wiki/LibrarySections.md | 2 +- wiki/PHPSupport.md | 6 +++--- wiki/README.md | 37 ++++++++++++++++++------------------- wiki/WebBrowser.md | 2 +- wiki/jQueryDifferences.md | 2 +- wiki/jQueryPortingState.md | 22 +++++++++++----------- wiki/jQueryServer.md | 4 ++-- 11 files changed, 42 insertions(+), 43 deletions(-) diff --git a/wiki/Ajax.md b/wiki/Ajax.md index 3da8e25..fe9a24e 100644 --- a/wiki/Ajax.md +++ b/wiki/Ajax.md @@ -13,7 +13,7 @@ Ajax, standing for _Asynchronous JavaScript and XML_ is combination of HTTP Clie **phpQuery** also offers such functionality, making use of solid quality [Zend\_Http\_Client](http://framework.zend.com/manual/en/zend.http.html). Unfortunately requests aren't asynchronous, but nothing is impossible. For today, instead of [XMLHttpRequest](http://en.wikipedia.org/wiki/XMLHttpRequest) you always get Zend\_Http\_Client instance. API unification is [planned](http://code.google.com/p/phpquery/issues/detail?id=44). ## Cross Domain Ajax -For security reasons, by default **phpQuery** doesn't allow connections to hosts other than actual `$_SERVER['HTTP_HOST']`. Developer needs to grant rights to other hosts before making an [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) request. +For security reasons, by default **phpQuery** doesn't allow connections to hosts other than actual `$_SERVER['HTTP_HOST']`. Developer needs to grant rights to other hosts before making an [Ajax](Ajax.md) request. There are 2 methods for allowing other hosts * phpQuery::**ajaxAllowURL**($url) diff --git a/wiki/Basics.md b/wiki/Basics.md index a942b59..dedd006 100644 --- a/wiki/Basics.md +++ b/wiki/Basics.md @@ -13,11 +13,11 @@ $ul = pq('ul'); * phpQuery::**newDocumentHTML**($html, $charset = 'utf-8') * phpQuery::**newDocumentXHTML**($html, $charset = 'utf-8') * phpQuery::**newDocumentXML**($html, $charset = 'utf-8') - * phpQuery::**newDocumentPHP**($html, $contentType = null) Read more about it on [PHPSupport page](http://code.google.com/p/phpquery/wiki/PHPSupport) + * phpQuery::**newDocumentPHP**($html, $contentType = null) Read more about it on [PHPSupport page](PHPSupport.md) * phpQuery::**newDocumentFileHTML**($file, $charset = 'utf-8') * phpQuery::**newDocumentFileXHTML**($file, $charset = 'utf-8') * phpQuery::**newDocumentFileXML**($file, $charset = 'utf-8') - * phpQuery::**newDocumentFilePHP**($file, $contentType) Read more about it on [PHPSupport page](http://code.google.com/p/phpquery/wiki/PHPSupport) + * phpQuery::**newDocumentFilePHP**($file, $contentType) Read more about it on [PHPSupport page](PHPSupport.md) ## pq function **`pq($param, $context = null);`** diff --git a/wiki/Callbacks.md b/wiki/Callbacks.md index 8c6645d..856bccf 100644 --- a/wiki/Callbacks.md +++ b/wiki/Callbacks.md @@ -6,7 +6,7 @@ * [CallbackReference class](#CallbackReference.md) * [Scope Pseudo-Inheritance](#Scope_Pseudo_Inheritance.md) ## What are callbacks -Callbacks are functions _called back_ by other functions in proper moment (eg on [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) request error). +Callbacks are functions _called back_ by other functions in proper moment (eg on [Ajax](Ajax.md) request error). In **JavaScript** this pattern can be very flexible due to [Closures](http://en.wikipedia.org/wiki/Closure_(computer_science)) support, which can be inline (no code break) and inherits scope (no need to passing params). diff --git a/wiki/Events.md b/wiki/Events.md index 65ef2b1..0fd4f4d 100644 --- a/wiki/Events.md +++ b/wiki/Events.md @@ -18,7 +18,7 @@ function submitHandler($e) { ## Server Side Events phpQuery support **server-side** events, same as jQuery handle client-side ones. On server there isn't, of course, events such as _mouseover_ (but they can be triggered). -By default, phpQuery automatically fires up only **change** event for form elements. If you load WebBrowser plugin, **submit** and **click** will be handled properly - eg submitting form with inputs' data to action URL via new [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) request. +By default, phpQuery automatically fires up only **change** event for form elements. If you load WebBrowser plugin, **submit** and **click** will be handled properly - eg submitting form with inputs' data to action URL via new [Ajax](Ajax.md) request. $this (`this` in JS) context for handler scope **isn't available**. You have to use one of following manually: * $event->**target** diff --git a/wiki/LibrarySections.md b/wiki/LibrarySections.md index d6a3885..3d323e3 100644 --- a/wiki/LibrarySections.md +++ b/wiki/LibrarySections.md @@ -1 +1 @@ -Renamed to [Manual](http://code.google.com/p/phpquery/wiki/Manual). \ No newline at end of file +Renamed to [Manual](Manual.md). \ No newline at end of file diff --git a/wiki/PHPSupport.md b/wiki/PHPSupport.md index 95d00a0..f5e9987 100644 --- a/wiki/PHPSupport.md +++ b/wiki/PHPSupport.md @@ -1,11 +1,11 @@ -Although **phpQuery** is a [jQuery port](http://code.google.com/p/phpquery/wiki/jQueryPortingState), there is extensive PHP-specific support. +Although **phpQuery** is a [jQuery port](jQueryPortingState.md), there is extensive PHP-specific support. # Table of Contents * [Class Interfaces](#Class_Interfaces.md) * [Iterator Interface](#Iterator.md) * [ArrayAccess](#Array_Access.md) * [Countable Interface](#Countable.md) - * [Callbacks](http://code.google.com/p/phpquery/wiki/Callbacks) + * [Callbacks](Callbacks.md) * [PHP Code Support](#PHP_Code_Support.md) * [Opening PHP files as DOM](#Opening_PHP_files_as_DOM.md) * [Inputting PHP code](#Inputting_PHP_code.md) @@ -42,7 +42,7 @@ If used to do `count($something)` you can still do this that way, instead of eg print count(pq('ul:first > li')); ``` ## Callbacks -There is a special [Callbacks](http://code.google.com/p/phpquery/wiki/Callbacks) wiki section, to which you should refer to. +There is a special [Callbacks](Callbacks.md) wiki section, to which you should refer to. ## PHP Code Support #### Opening PHP files as DOM PHP files can be opened using **phpQuery::newDocumentPHP($markup)** or **phpQuery::newDocumentFilePHP($file)**. Such files are visible as DOM, where: diff --git a/wiki/README.md b/wiki/README.md index 8eb8868..10f5684 100644 --- a/wiki/README.md +++ b/wiki/README.md @@ -1,21 +1,20 @@ - 1. [Basics](http://code.google.com/p/phpquery/wiki/Basics) - 1. [Ported jQuery sections](http://code.google.com/p/phpquery/wiki/jQueryPortingState) - 1. [Selectors](http://code.google.com/p/phpquery/wiki/Selectors) - 1. [Attributes](http://code.google.com/p/phpquery/wiki/Attributes) - 1. [Traversing](http://code.google.com/p/phpquery/wiki/Traversing) - 1. [Manipulation](http://code.google.com/p/phpquery/wiki/Manipulation) - 1. [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) - 1. [Events](http://code.google.com/p/phpquery/wiki/Events) - 1. [Utilities](http://code.google.com/p/phpquery/wiki/Utilities) - 1. [Plugin ports](http://code.google.com/p/phpquery/wiki/PluginsClientSidePorts) - 1. [PHP Support](http://code.google.com/p/phpquery/wiki/PHPSupport) - 1. [Command Line Interface](http://code.google.com/p/phpquery/wiki/CommandLineInterface) - 1. [Multi document support](http://code.google.com/p/phpquery/wiki/MultiDocumentSupport) - 1. [Plugins](http://code.google.com/p/phpquery/wiki/PluginsServerSide) - 1. [WebBrowser](http://code.google.com/p/phpquery/wiki/WebBrowser) - 1. [Scripts](http://code.google.com/p/phpquery/wiki/ScriptsPlugin) - 1. [jQueryServer](http://code.google.com/p/phpquery/wiki/jQueryServer) - 1. [Debugging](http://code.google.com/p/phpquery/wiki/Debugging) + 1. [Basics](Basics.md) + 1. [Ported jQuery sections](jQueryPortingState.md) + 1. [Selectors](Selectors.md) + 1. [Attributes](Attributes.md) + 1. [Traversing](Traversing.md) + 1. [Manipulation](Manipulation.md) + 1. [Ajax](Ajax.md) + 1. [Events](Events.md) + 1. [Utilities](Utilities.md) + 1. [Plugin ports](PluginsClientSidePorts.md) + 1. [PHP Support](PHPSupport.md) + 1. [Command Line Interface](CommandLineInterface.md) + 1. [Multi document support](MultiDocumentSupport.md) + 1. [Plugins](PluginsServerSide.md) + 1. [WebBrowser](WebBrowser.md) + 1. [Scripts](ScriptsPlugin.md) + 1. [jQueryServer](jQueryServer.md) + 1. [Debugging](Debugging.md) 1. Bootstrap file -**[API Reference](http://meta20.net/phpquery-api/)** is also available. \ No newline at end of file diff --git a/wiki/WebBrowser.md b/wiki/WebBrowser.md index a4d4071..6b189c1 100644 --- a/wiki/WebBrowser.md +++ b/wiki/WebBrowser.md @@ -1,4 +1,4 @@ -**WebBrowser** is a phpQuery [plugin](http://code.google.com/p/phpquery/wiki/PluginsServerSide) that mimics behaviors of web browser. Thanks to that developer can simulate user's behavior inside a PHP script. +**WebBrowser** is a phpQuery [plugin](PluginsServerSide.md) that mimics behaviors of web browser. Thanks to that developer can simulate user's behavior inside a PHP script. ## Supported * Link navigation (click event) diff --git a/wiki/jQueryDifferences.md b/wiki/jQueryDifferences.md index 4cc32f2..2d87ca9 100644 --- a/wiki/jQueryDifferences.md +++ b/wiki/jQueryDifferences.md @@ -1 +1 @@ -Renamed to [jQueryPortingState](http://code.google.com/p/phpquery/wiki/jQueryPortingState). \ No newline at end of file +Renamed to [jQueryPortingState](jQueryPortingState.md). \ No newline at end of file diff --git a/wiki/jQueryPortingState.md b/wiki/jQueryPortingState.md index e3e3cfc..d4d75b5 100644 --- a/wiki/jQueryPortingState.md +++ b/wiki/jQueryPortingState.md @@ -1,14 +1,14 @@ phpQuery is almost a full port of the [jQuery JavaScript Library](http://jquery.com/). ## Ported Sections - 1. [Selectors](http://code.google.com/p/phpquery/wiki/Selectors) - 1. [Attributes](http://code.google.com/p/phpquery/wiki/Attributes) - 1. [Traversing](http://code.google.com/p/phpquery/wiki/Traversing) - 1. [Manipulation](http://code.google.com/p/phpquery/wiki/Manipulation) - 1. [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) - 1. [Events](http://code.google.com/p/phpquery/wiki/Events) - 1. [Utilities](http://code.google.com/p/phpquery/wiki/Utilities) - 1. [Plugin ports](http://code.google.com/p/phpquery/wiki/PluginsClientSidePorts) + 1. [Selectors](Selectors.md) + 1. [Attributes](Attributes.md) + 1. [Traversing](Traversing.md) + 1. [Manipulation](Manipulation.md) + 1. [Ajax](Ajax.md) + 1. [Events](Events.md) + 1. [Utilities](Utilities.md) + 1. [Plugin ports](PluginsClientSidePorts.md) ## Additional methods phpQuery features many additional methods comparing to jQuery: @@ -21,9 +21,9 @@ phpQuery features many additional methods comparing to jQuery: * reverse() * contentsUnwrap() * switchWith() - * all from [PHPSupport](http://code.google.com/p/phpquery/wiki/PHPSupport) - * all from [Basic](http://code.google.com/p/phpquery/wiki/Basic) - * all from [MultiDocumentSupport](http://code.google.com/p/phpquery/wiki/MultiDocumentSupport) + * all from [PHPSupport](PHPSupport.md) + * all from [Basic](Basic.md) + * all from [MultiDocumentSupport](MultiDocumentSupport.md) ## Other Differences * [Server Side Events](http://code.google.com/p/phpquery/wiki/Events?ts=1225458859&updated=Events#Server_Side_Events) \ No newline at end of file diff --git a/wiki/jQueryServer.md b/wiki/jQueryServer.md index 3bbec90..3be1b27 100644 --- a/wiki/jQueryServer.md +++ b/wiki/jQueryServer.md @@ -1,7 +1,7 @@ **jQueryServer** is a jQuery plugin giving unobstrusive, client-side bindings to server-side implementation of jQuery. ## Example scenario - 1. Connect to server and make an [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) request to somewhere ([crossdomain allowed](http://code.google.com/p/phpquery/wiki/CrossDomainAjax)) + 1. Connect to server and make an [Ajax](Ajax.md) request to somewhere ([crossdomain allowed](CrossDomainAjax.md)) 1. Do some manipulations, you can even trigger a [server-side event](http://code.google.com/p/phpquery/wiki/Events#Server_Side_Events) 1. Get processed date back to the browser @@ -13,4 +13,4 @@ $.server({url: 'http://somesite.com'}) $('.destination').html(response); }); ``` -Since version **0.5.1** (this is **not** phpQuery release version number) there is a support for config file which **authorizes** [Ajax](http://code.google.com/p/phpquery/wiki/Ajax) hosts and referers. \ No newline at end of file +Since version **0.5.1** (this is **not** phpQuery release version number) there is a support for config file which **authorizes** [Ajax](Ajax.md) hosts and referers. \ No newline at end of file From 3fd928e9b153b3fe0104e7be4ca0356f5c580533 Mon Sep 17 00:00:00 2001 From: Steve Meyers Date: Sat, 2 Jan 2016 11:19:16 -0700 Subject: [PATCH 15/21] added link to manual from main README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f9c33f7..6287d32 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,10 @@ I've gathered some fix and new features here and there, as will keep looking for * https://github.com/kevee/phpquery (include php-css-parser) * https://github.com/lucassouza1/phpquery +## Manual + +* [Manual](wiki/README.md) imported from http://code.google.com/p/phpquery/wiki + ## Extracts from fmorrow README.md: ### Whats phpQuery? From 88995d85179f45ce84f3655b7b06d8cfacb9dc37 Mon Sep 17 00:00:00 2001 From: Steve Meyers Date: Sat, 2 Jan 2016 11:19:33 -0700 Subject: [PATCH 16/21] added license information to wiki README.md --- wiki/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wiki/README.md b/wiki/README.md index 10f5684..79c4866 100644 --- a/wiki/README.md +++ b/wiki/README.md @@ -18,3 +18,7 @@ 1. [Debugging](Debugging.md) 1. Bootstrap file + +This manual is copied from http://code.google.com/p/phpquery/wiki/Manual + +The wiki was downloaded from the [Google Code source repository for phpQuery](https://code.google.com/p/phpquery/source/browse/#svn%2Fwiki), which is under the MIT License. From 6c13c01b121dc14b1d3bf170ebe793127e83b18d Mon Sep 17 00:00:00 2001 From: lauripiisang Date: Wed, 27 Jan 2016 17:46:49 +0200 Subject: [PATCH 17/21] Fixed getString(0) and getStrings(0) null check --- phpQuery/phpQuery/phpQueryObject.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpQuery/phpQuery/phpQueryObject.php b/phpQuery/phpQuery/phpQueryObject.php index 2308540..febb53a 100644 --- a/phpQuery/phpQuery/phpQueryObject.php +++ b/phpQuery/phpQuery/phpQueryObject.php @@ -502,7 +502,7 @@ public function get($index = null, $callback1 = null, $callback2 = null, $callba * @todo maybe other name... */ public function getString($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { - if ($index) + if ($index != null && is_int($index)) $return = $this->eq($index)->text(); else { $return = array(); @@ -529,7 +529,7 @@ public function getString($index = null, $callback1 = null, $callback2 = null, $ * @todo maybe other name... */ public function getStrings($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { - if ($index) + if ($index != null && is_int($index)) $return = $this->eq($index)->text(); else { $return = array(); From 4e27b079112b08ad75198fb3df5a3438d5a0c209 Mon Sep 17 00:00:00 2001 From: lauripiisang Date: Thu, 28 Jan 2016 10:33:01 +0200 Subject: [PATCH 18/21] fixed null check - implicit conversion made 0 == null - now checking for exact null instead --- phpQuery/phpQuery/phpQueryObject.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpQuery/phpQuery/phpQueryObject.php b/phpQuery/phpQuery/phpQueryObject.php index febb53a..51087a4 100644 --- a/phpQuery/phpQuery/phpQueryObject.php +++ b/phpQuery/phpQuery/phpQueryObject.php @@ -502,7 +502,7 @@ public function get($index = null, $callback1 = null, $callback2 = null, $callba * @todo maybe other name... */ public function getString($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { - if ($index != null && is_int($index)) + if (!is_null($index) && is_int($index)) $return = $this->eq($index)->text(); else { $return = array(); @@ -529,7 +529,7 @@ public function getString($index = null, $callback1 = null, $callback2 = null, $ * @todo maybe other name... */ public function getStrings($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { - if ($index != null && is_int($index)) + if (!is_null($index) && is_int($index)) $return = $this->eq($index)->text(); else { $return = array(); From 71a64a3064c38a193e085f790dc7133a352abe68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E9=9B=86?= Date: Thu, 24 Mar 2016 10:45:21 +0800 Subject: [PATCH 19/21] fixed makeArray() --- phpQuery/phpQuery.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpQuery/phpQuery.php b/phpQuery/phpQuery.php index 08f22fc..be094d7 100644 --- a/phpQuery/phpQuery.php +++ b/phpQuery/phpQuery.php @@ -998,7 +998,7 @@ public static function getDOMDocument($source) { * @return unknown_type * @link http://docs.jquery.com/Utilities/jQuery.makeArray */ - public static function makeArray($obj) { + public static function makeArray($object) { $array = array(); if (is_object($object) && $object instanceof DOMNODELIST) { foreach($object as $value) From ec73fc88a7eef9da7361d0a58f17978d320f5e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E9=9B=86?= Date: Thu, 24 Mar 2016 12:33:56 +0800 Subject: [PATCH 20/21] fixed bugs --- phpQuery/phpQuery/DOMDocumentWrapper.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/phpQuery/phpQuery/DOMDocumentWrapper.php b/phpQuery/phpQuery/DOMDocumentWrapper.php index a58b1f3..aae5ee0 100644 --- a/phpQuery/phpQuery/DOMDocumentWrapper.php +++ b/phpQuery/phpQuery/DOMDocumentWrapper.php @@ -314,8 +314,6 @@ protected function isXML($markup) { } protected function contentTypeToArray($contentType) { - $test = null; - $test = $matches = explode(';', trim(strtolower($contentType))); if (isset($matches[1])) { $matches[1] = explode('=', $matches[1]); @@ -351,7 +349,7 @@ protected function charsetFromHTML($markup) { return $contentType[1]; } protected function charsetFromXML($markup) { - $matches; + $matches = array(); // find declaration preg_match('@<'.'?xml[^>]+encoding\\s*=\\s*(["|\'])(.*?)\\1@i', $markup, $matches From cfe1a0b5a7f903c6630c58a78819b2fb4d83d210 Mon Sep 17 00:00:00 2001 From: Starikov Date: Wed, 6 Dec 2017 11:22:39 +0300 Subject: [PATCH 21/21] The selector class does not find if the separator is a new line --- phpQuery/phpQuery/phpQueryObject.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpQuery/phpQuery/phpQueryObject.php b/phpQuery/phpQuery/phpQueryObject.php index 51087a4..7832370 100644 --- a/phpQuery/phpQuery/phpQueryObject.php +++ b/phpQuery/phpQuery/phpQueryObject.php @@ -587,7 +587,7 @@ protected function matchClasses($class, $node) { if ( mb_strpos($class, '.', 1)) { $classes = explode('.', substr($class, 1)); $classesCount = count( $classes ); - $nodeClasses = explode(' ', $node->getAttribute('class') ); + $nodeClasses = preg_split("/[\s\t\r\n]+/", $node->getAttribute('class'),-1, PREG_SPLIT_NO_EMPTY); $nodeClassesCount = count( $nodeClasses ); if ( $classesCount > $nodeClassesCount ) return false; @@ -605,7 +605,7 @@ protected function matchClasses($class, $node) { // strip leading dot from class name substr($class, 1), // get classes for element as array - explode(' ', $node->getAttribute('class') ) + preg_split("/[\s\t\r\n]+/", $node->getAttribute('class'),-1, PREG_SPLIT_NO_EMPTY) ); } }